/* ═══════════════════════════════════════════════════════════════════════════
   SISTONS BURGERS — Sistema visual
   ───────────────────────────────────────────────────────────────────────────
   Dirección de arte: «SALA OSCURA».

   El sitio no es una carta: es la sala de noche. Superficie negra cálida —el
   negro sacado del tono de la madera de la tabla, no del negro puro— y una
   sola fuente de luz, el dorado del letrero. La fotografía manda; la
   tipografía sostiene el ritmo entre foto y foto.

   Reglas duras del sistema:
     · Una sola familia (Archivo variable) recorriendo peso 100–900 y ancho
       62–125%. No hay segunda tipografía: la voz sale de los ejes.
     · El dorado es luz, nunca relleno. Si un dorado no ilumina algo, sobra.
     · Radio 0 salvo en los blancos táctiles redondos. Cero sombras de caja.
     · Ninguna sección repite la geometría de otra.
     · La carta es la última y la más callada de todas.

   Índice
     1.  Tokens
     2.  Base tipográfica
     3.  Retícula y utilidades
     4.  Cabecera
     5.  Hero — secuencia del armado
     6.  Umbral
     7.  Experiencia
     8.  Hamburguesas
     9.  Barra
     10. Galería
     11. Opiniones
     12. Carta
     13. Visita y pie
     14. Cursor
     15. Movimiento
     16. Responsive
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══ 1. TOKENS ═══════════════════════════════════════════════════════════ */

:root{
  /* Superficies. El negro sale de oscurecer la madera de la tabla (#312923),
     no de bajar el brillo a cero: por eso tiene temperatura. */
  --noche:  #0B0908;
  --carbon: #131010;

  /* Luz — el dorado del letrero, muestreado del último cuadro del vídeo */
  --oro:      #E8B45C;
  --oro-vivo: #F5C97A;
  --oro-hondo:#8A6520;

  /* Texto (pares verificados contra WCAG 2.1 sobre --noche) */
  --tx:    #F2EDE4;   /* 17.8:1 — AAA */
  --tx-2:  #A79B8C;   /*  7.3:1 — AAA */
  --tx-3:  #857A6C;   /*  4.9:1 — AA, sólo para rótulos de apoyo */

  --linea:       rgba(242,237,228,.14);
  --linea-sutil: rgba(242,237,228,.06);
  --linea-oro:   rgba(232,180,92,.34);

  --sans: 'Archivo', system-ui, -apple-system, 'Helvetica Neue', sans-serif;

  /* Escala. El salto entre el despliegue y el cuerpo es deliberadamente
     brutal: es lo que hace que una lista de nombres se lea como cartel. */
  --t-colosal: clamp(3rem, 13vw, 15rem);
  --t-hero:    clamp(2.4rem, 5.6vw, 7rem);
  --t-titulo:  clamp(2rem, 5.4vw, 5.5rem);
  --t-medio:   clamp(1.5rem, 3vw, 2.75rem);
  --t-lead:    clamp(1.0625rem, 1rem + .4vw, 1.3125rem);
  --t-cuerpo:  1rem;
  --t-chico:   .875rem;
  --t-micro:   .6875rem;

  --e2:.5rem; --e3:.75rem; --e4:1rem; --e5:1.5rem; --e6:2rem; --e7:3rem;
  --aire: clamp(5rem, 3rem + 7vw, 10.5rem);

  --marco: clamp(1.25rem, .5rem + 3.4vw, 5rem);
  --ancho: 1760px;

  --curva: cubic-bezier(.16,1,.3,1);

  --cabecera: 4.75rem;
}


/* ═══ 2. BASE TIPOGRÁFICA ═════════════════════════════════════════════════ */

/* Un solo archivo, con los ejes de peso y ancho intactos. Toda la voz del
   sitio —desde el rótulo de 11 px hasta el cartel de 15 rem— sale de
   recorrer esos dos ejes. No hay segunda familia que descargar. */
@font-face{
  font-family:'Archivo';
  src:url('../assets/fonts/archivo-variable.woff2') format('woff2');
  font-weight:100 900; font-stretch:62% 125%;
  font-style:normal; font-display:swap;
}
/* Respaldo con métricas calibradas: sin esto el intercambio de fuente
   reflowea los titulares y arruina el CLS. */
@font-face{
  font-family:'Archivo-fb';
  src:local('Helvetica Neue'), local('Helvetica'), local('Arial');
  size-adjust:99.3%; ascent-override:94%; descent-override:24%; line-gap-override:0%;
}

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

html{
  -webkit-text-size-adjust:100%;
  scroll-padding-top:calc(var(--cabecera) + 2rem);
  background:var(--noche);
}

body{
  margin:0;
  background:var(--noche);
  color:var(--tx);
  font-family:var(--sans),'Archivo-fb',sans-serif;
  font-size:var(--t-cuerpo);
  font-weight:400;
  font-variation-settings:'wdth' 100;
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  overflow-x:clip;
}

img,svg,canvas,video{ display:block; max-width:100% }
a{ color:inherit; text-decoration:none }
button,input,select,textarea{ font:inherit; color:inherit }
p{ margin:0 }
ul,ol,dl,dd{ margin:0; padding:0; list-style:none }
h1,h2,h3,h4{ margin:0; font-weight:400 }

::selection{ background:var(--oro); color:var(--noche) }

/* ─── Voces tipográficas ───
   El despliegue es masa gráfica, no «texto grande»: ancho condensado, peso
   alto y interlínea por debajo de 1 para que el bloque se lea como objeto. */
.display{
  font-variation-settings:'wght' 800,'wdth' 68;
  text-transform:uppercase;
  line-height:.84;
  letter-spacing:-.025em;
  text-wrap:balance;
}

/* Rótulo: el único sitio donde la tipografía se abre y se espacia. Marca
   los datos y los índices, y por contraste hace que el resto pese más. */
.rotulo{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro);
  letter-spacing:.22em;
  text-transform:uppercase;
  color:var(--oro);
}
.rotulo--mudo{ color:var(--tx-2) }

.lead{
  font-size:var(--t-lead);
  line-height:1.5;
  color:var(--tx-2);
  max-width:44ch;
  text-wrap:pretty;
}
.prosa{ color:var(--tx-2); max-width:56ch; text-wrap:pretty }

.salto{
  position:absolute; left:var(--marco); top:-120%;
  z-index:400; padding:.875rem 1.5rem;
  background:var(--oro); color:var(--noche);
  font-variation-settings:'wght' 620,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
}
.salto:focus{ top:1rem }

:focus-visible{ outline:2px solid var(--oro); outline-offset:4px }


/* ═══ 3. RETÍCULA Y UTILIDADES ════════════════════════════════════════════ */

.marco{
  width:100%; max-width:var(--ancho);
  margin-inline:auto;
  padding-inline:var(--marco);
}

.seccion{ position:relative; padding-block:var(--aire) }

/* Los ítems de grilla traen `min-width:auto`: un titular que no puede
   partirse ensancha su celda y desborda la página. Se anula de una vez. */
.umbral-cols > *, .barra-int > *, .visita-cols > *, .carta-cols > *{ min-width:0 }

/* Encabezado de sección: índice, título y una regla que ocupa el resto */
.encabezado{
  display:flex; align-items:baseline; gap:var(--e4);
  padding-bottom:var(--e4);
  border-bottom:1px solid var(--linea);
}
.encabezado .n{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; color:var(--tx-2);
}

/* Enlace de acción: la regla se completa con luz al pasar el cursor */
.accion{
  display:inline-flex; align-items:center; gap:.75rem;
  padding-block:.625rem;
  font-variation-settings:'wght' 600,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  color:var(--tx); position:relative;
}
.accion::after{
  content:''; position:absolute; left:0; right:0; bottom:0; height:1px;
  background:var(--linea);
}
.accion::before{
  content:''; position:absolute; left:0; bottom:0; height:1px; width:0;
  background:var(--oro); z-index:2;
  transition:width .55s var(--curva);
}
.accion:hover::before,.accion:focus-visible::before{ width:100% }
.accion svg{ width:.9375rem; height:.9375rem; transition:transform .45s var(--curva) }
.accion:hover svg{ transform:translateX(4px) }

/* Botón: sólo donde hay una conversión real. Es el letrero encendido. */
.boton{
  display:inline-flex; align-items:center; gap:.75rem;
  padding:1.0625rem 1.875rem;
  background:var(--oro); color:var(--noche);
  font-variation-settings:'wght' 680,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  border:0; cursor:pointer;
  transition:background-color .4s var(--curva), color .4s var(--curva);
}
.boton:hover{ background:var(--oro-vivo) }
.boton svg{ width:.9375rem; height:.9375rem; transition:transform .45s var(--curva) }
.boton:hover svg{ transform:translateX(4px) }

/* Botón secundario. Existe sólo donde hay dos salidas legítimas y una tiene
   que pesar más que la otra: dos botones sólidos del mismo color no son una
   jerarquía, son una duda. Mantiene la misma caja y la misma tipografía para
   que se lean como pareja, y cambia únicamente el relleno. */
.boton--fantasma{
  background:transparent; color:var(--oro);
  box-shadow:inset 0 0 0 1px var(--linea-oro);
}
.boton--fantasma:hover{ background:var(--oro); color:var(--noche) }

/* Hueco de fotografía pendiente. No es un adorno: reserva la proporción
   exacta que va a ocupar la foto real, así el día que entre no se rediseña
   nada y el CLS sigue siendo cero. */
.hueco{
  position:relative;
  background:
    linear-gradient(135deg, transparent 49.6%, var(--linea-sutil) 49.6% 50.4%, transparent 50.4%),
    var(--carbon);
  display:grid; place-items:center;
  overflow:hidden;
}
.hueco::after{
  content:attr(data-nota);
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  color:var(--tx-2); text-align:center; padding:var(--e5); max-width:26ch;
}


/* ═══ 4. CABECERA ═════════════════════════════════════════════════════════ */

.cabecera{
  position:fixed; inset:0 0 auto 0; z-index:200;
  transition:background-color .5s var(--curva), border-color .5s var(--curva);
  border-bottom:1px solid transparent;
}
.cabecera.fija{
  background:rgba(11,9,8,.78);
  backdrop-filter:blur(18px); -webkit-backdrop-filter:blur(18px);
  border-bottom-color:var(--linea-sutil);
}
.cabecera-int{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--e5); height:var(--cabecera);
}
.marca{ display:block; flex:none }
.marca img{ height:1.5rem; width:auto }

/* .nav-carta comparte toda la apariencia con .nav y ninguno de sus cambios de
   comportamiento: en móvil .nav se pliega en un panel que abre el botón
   hamburguesa de main.js, y /carta.html no carga main.js. Por eso son dos
   clases y no una — el detalle, en §12b. */
.nav, .nav-carta{ display:flex; align-items:center; gap:var(--e6) }
.nav a, .nav-carta a{
  position:relative;
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  color:var(--tx-2);
  transition:color .35s var(--curva);
  padding-block:.5rem;
}
.nav a::after, .nav-carta a::after{
  content:''; position:absolute; left:0; right:0; bottom:0; height:1px;
  background:var(--oro); transform:scaleX(0); transform-origin:left;
  transition:transform .5s var(--curva);
}
.nav a:hover, .nav-carta a:hover{ color:var(--tx) }
.nav a:hover::after, .nav-carta a:hover::after{ transform:scaleX(1) }

.hamburguesa{
  display:none; width:2.75rem; height:2.75rem;
  background:transparent; border:1px solid var(--linea);
  cursor:pointer; align-items:center; justify-content:center; flex:none;
}
.hamburguesa i{ display:block; width:1.125rem; height:1px; background:var(--tx); position:relative }
.hamburguesa i::before,.hamburguesa i::after{
  content:''; position:absolute; left:0; width:1.125rem; height:1px; background:var(--tx);
  transition:transform .4s var(--curva), top .4s var(--curva);
}
.hamburguesa i::before{ top:-.3125rem } .hamburguesa i::after{ top:.3125rem }
body.menu-abierto .hamburguesa i{ background:transparent }
body.menu-abierto .hamburguesa i::before{ top:0; transform:rotate(45deg) }
body.menu-abierto .hamburguesa i::after{ top:0; transform:rotate(-45deg) }


/* ═══ 5. HERO — SECUENCIA DEL ARMADO ══════════════════════════════════════ */

/* La sección mide varias pantallas de alto; lo que se queda quieto es
   `.hero-fijo`, con `position:sticky`. Se fija con CSS y no con el `pin` de
   ScrollTrigger a propósito: el pin inserta un espaciador y reposiciona el
   elemento al soltarlo, y cualquier desajuste entre esa altura y la de la
   sección deja un hueco negro al final del recorrido. Con sticky el rango
   de fijado y el del scrub son literalmente el mismo tramo. */
.hero{ position:relative; height:520svh }

.hero-fijo{
  position:sticky; top:0;
  height:100svh;
  display:grid;
  grid-template-columns:minmax(0,.9fr) minmax(0,1.5fr);
  align-items:center;
  overflow:hidden;
}

/* El lienzo desborda su celda hacia la derecha para que la hamburguesa ocupe
   pantalla de verdad; lo que sobra lo recorta `.hero-fijo`.

   El rectángulo de la imagen se elimina en dos pasos y el orden importa:

   1. El negro de los cuadros ya viene igualado al de la página desde el
      pipeline (ver scripts/generar_secuencia.mjs). Sin eso, ninguna máscara
      alcanza: el borde se vería igual, sólo que difuminado.
   2. Estas máscaras existen únicamente para lo que sí tiene brillo y llega
      al borde — la tabla de madera, que cruza el cuadro de lado a lado y
      abajo termina en un canto recto. Sobre el fondo negro no hacen nada,
      porque desvanecer negro contra el mismo negro no cambia nada.

   El desvanecido inferior es más largo que el resto: la tabla se disuelve en
   la página en vez de cortarse, y la hamburguesa queda apoyada en nada. */
/* Luz de ambiente: el mismo cuadro a 64×48, desenfocado y a media opacidad,
   ocupando el hero entero por detrás de todo. No es un degradado decorativo
   —es la propia fotografía— y por eso conecta: el resplandor que rodea a la
   hamburguesa sigue existiendo fuera del recuadro del lienzo, hacia el texto
   y por debajo de la tabla. Es lo que hace que la imagen deje de tener un
   contorno donde termina.

   La máscara radial la concentra donde está el sujeto y la apaga hacia la
   izquierda, así detrás del texto queda apenas una insinuación y no una
   mancha. */
.hero-halo{
  /* Fila 1 a la última: en vertical la rejilla tiene una segunda fila con el
     rail, y si el halo se queda en la primera se corta justo ahí. */
  grid-area:1 / 1 / -1 / -1;
  width:100%; height:100%;
  object-fit:cover;
  z-index:0;
  opacity:.3;
  filter:blur(72px) saturate(1.1);
  transform:scale(1.22);
  pointer-events:none;
  /* Radio grande y caída larga: si el degradado de la máscara termina cerca,
     el propio halo dibuja un borde y se cambia un rectángulo por una mancha. */
  -webkit-mask-image:radial-gradient(145% 125% at 76% 50%, #000 0%, #000 20%, transparent 96%);
  mask-image:radial-gradient(145% 125% at 76% 50%, #000 0%, #000 20%, transparent 96%);
}

/* La proporción la fija el JS con la variante de secuencia que cargó. Es
   deliberado: mientras el elemento fue cuadrado y la imagen se acomodaba
   dentro con `contain`, la fotografía ocupaba el 11%–89% de la caja y el
   último tramo de la máscara caía sobre el letterbox, sin tocar la imagen.
   El fundido nunca llegaba a cerrar y quedaba una línea recta justo donde
   terminaba la foto. Con el elemento a la proporción exacta del cuadro, los
   porcentajes de la máscara y la imagen son lo mismo. */
.hero-lienzo{
  grid-column:2; grid-row:1;
  z-index:1;
  width:118%;
  aspect-ratio:var(--proporcion, 1120 / 864);
  height:auto;
  object-fit:contain;
  /* El pie se apaga con una curva, no con una rampa recta: la tabla se va
     perdiendo y la hamburguesa queda intacta. A 86% de la altura —donde
     apoya el pan— la máscara todavía está al 96%. */
  -webkit-mask-image:
    linear-gradient(90deg,transparent 0,#000 13%,#000 92%,transparent 100%),
    linear-gradient(180deg,transparent 0,#000 7%,#000 80%,
      rgba(0,0,0,.96) 86%, rgba(0,0,0,.85) 90%, rgba(0,0,0,.66) 93%,
      rgba(0,0,0,.44) 95.5%, rgba(0,0,0,.24) 97.5%, rgba(0,0,0,.09) 99%,
      transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:
    linear-gradient(90deg,transparent 0,#000 13%,#000 92%,transparent 100%),
    linear-gradient(180deg,transparent 0,#000 7%,#000 80%,
      rgba(0,0,0,.96) 86%, rgba(0,0,0,.85) 90%, rgba(0,0,0,.66) 93%,
      rgba(0,0,0,.44) 95.5%, rgba(0,0,0,.24) 97.5%, rgba(0,0,0,.09) 99%,
      transparent 100%);
  mask-composite:intersect;
}

/* ─── Rail de ingredientes ───
   Columna izquierda: el nombre del ingrediente que está entrando, y debajo
   la escalera de pasos. Es una anotación técnica, no un subtítulo. */
.hero-rail{
  grid-column:1; grid-row:1;
  position:relative; z-index:2;
  padding-left:var(--marco);
  padding-right:var(--e5);
  display:flex; flex-direction:column; justify-content:center;
  gap:var(--e6);
  pointer-events:none;
}

.hero-pasos{ display:grid; gap:.625rem }
.hero-paso{
  display:grid; grid-template-columns:2.25rem 1fr;
  align-items:center; gap:var(--e4);
  font-variation-settings:'wght' 540,'wdth' 86;
  font-size:var(--t-micro); letter-spacing:.18em; text-transform:uppercase;
  color:var(--tx-2); opacity:.34;
  transition:opacity .5s var(--curva), color .5s var(--curva);
}
.hero-paso .barra{
  height:1px; width:100%; background:var(--linea);
  position:relative; overflow:hidden;
}
.hero-paso .barra::after{
  content:''; position:absolute; inset:0;
  background:var(--oro); transform:scaleX(0); transform-origin:left;
  transition:transform .5s var(--curva);
}
.hero-paso.activo{ opacity:1; color:var(--tx) }
.hero-paso.activo .barra::after{ transform:scaleX(1) }
.hero-paso.pasado{ opacity:.62 }
.hero-paso.pasado .barra::after{ transform:scaleX(1); background:var(--oro-hondo) }

/* El nombre en grande: se cruza uno con otro, nunca hay dos legibles a la vez */
.hero-nombres{ position:relative; min-height:clamp(5rem,11vw,10rem) }
.hero-nombre{
  position:absolute; inset:auto auto 0 0;
  width:100%;
  font-size:var(--t-medio);
  font-variation-settings:'wght' 760,'wdth' 70;
  text-transform:uppercase; line-height:.92; letter-spacing:-.02em;
  opacity:0;
}
.hero-nombre em{ font-style:normal; color:var(--oro) }

/* Cierre: cuando la hamburguesa está armada y el letrero encendido, entra
   el titular del sitio y se apaga el rail. */
.hero-cierre{
  position:absolute; inset:auto 0 0 0; z-index:3;
  padding:0 var(--marco) clamp(2.5rem,7vh,5.5rem);
  opacity:0; pointer-events:none;
}
.hero-cierre.visible{ pointer-events:auto }
/* El titular vive en la mitad izquierda: la hamburguesa ocupa la derecha y
   dos masas gráficas encimadas no se leen como decisión, se leen como error.
   El ancho lo fijan los cortes de línea del marcado y la escala, no un
   `max-width`: como `.linea` lleva `overflow:hidden` para la máscara de
   revelado, una caja más angosta que la palabra más larga la recortaría. */
.hero-cierre h1{
  font-size:var(--t-hero);
  font-variation-settings:'wght' 820,'wdth' 66;
  text-transform:uppercase; line-height:.82; letter-spacing:-.03em;
}
.hero-cierre h1 em{ font-style:normal; color:var(--oro) }
/* El hueco lateral era `--e7`, pensado para separar el botón de un renglón de
   texto suelto. Ahora son dos botones y ese aire los desarma como pareja: van
   juntos, con la separación justa para que no se toquen. */
.hero-pie{
  display:flex; flex-wrap:wrap; align-items:center; gap:var(--e4);
  margin-top:clamp(1.5rem,3vw,2.5rem);
  padding-top:var(--e5);
  border-top:1px solid var(--linea);
}

/* Aviso de scroll: desaparece apenas el recorrido arranca */
.hero-pista{
  position:absolute; inset:auto var(--marco) clamp(2rem,5vh,3rem) auto; z-index:4;
  display:flex; align-items:center; gap:var(--e3);
  font-variation-settings:'wght' 540,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  color:var(--tx-2);
}
.hero-pista i{
  display:block; width:1px; height:2.5rem; background:var(--linea);
  position:relative; overflow:hidden;
}
.hero-pista i::after{
  content:''; position:absolute; left:0; top:0; width:1px; height:40%;
  background:var(--oro);
  animation:pista 2.4s var(--curva) infinite;
}
@keyframes pista{
  0%{ transform:translateY(-100%) } 60%,100%{ transform:translateY(250%) }
}


/* ═══ 6. UMBRAL ═══════════════════════════════════════════════════════════ */

/* Primera sección después del hero. Un enunciado grande a la izquierda y una
   columna de datos duros a la derecha, separadas por una regla vertical.
   Es la única sección con esa regla: marca el ingreso al sitio. */
.umbral{ padding-block:clamp(6rem,12vw,13rem) }
.umbral-cols{
  display:grid;
  grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);
  gap:clamp(2.5rem,6vw,7rem);
  align-items:start;
}
.umbral-texto{
  font-size:var(--t-titulo);
  font-variation-settings:'wght' 620,'wdth' 78;
  line-height:1.02; letter-spacing:-.025em;
  max-width:18ch;
  margin-top:clamp(2rem,4vw,3.5rem);
}
.umbral-texto em{ font-style:normal; color:var(--oro) }
.umbral-nota{ margin-top:clamp(2rem,4vw,3rem); color:var(--tx-2); max-width:48ch }

.datos{
  border-left:1px solid var(--linea);
  padding-left:clamp(1.5rem,3vw,3rem);
  margin-top:clamp(2rem,4vw,3.5rem);
}
.dato{ padding-block:var(--e5); border-bottom:1px solid var(--linea-sutil) }
.dato:first-child{ padding-top:0 }
.dato dt{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  color:var(--tx-2); margin-bottom:var(--e3);
}
.dato dd{
  font-variation-settings:'wght' 620,'wdth' 82;
  font-size:clamp(1.0625rem,1.6vw,1.375rem);
  line-height:1.3; letter-spacing:-.01em;
}
.dato dd span{ display:block; color:var(--tx-2); font-variation-settings:'wght' 460,'wdth' 92; font-size:var(--t-chico) }
/* Segundo horario del mismo bloque: necesita aire para no leerse como
   continuación del primero. */
.dato dd .hora{
  color:var(--tx); font-variation-settings:'wght' 620,'wdth' 82;
  font-size:clamp(1.0625rem,1.6vw,1.375rem);
}
.dato dd span + .hora{ margin-top:var(--e4) }


/* ═══ 7. EXPERIENCIA ══════════════════════════════════════════════════════ */

/* Texto a la izquierda, alineado con el resto del sitio, y la nocturna
   ocupando el resto hasta el borde derecho de la pantalla.

   ─── Cómo se tratan las fotografías del sitio ───
   La regla es una sola y se aplica midiendo, no a ojo: un borde se desvanece
   sólo si el tono propio de la foto en ese borde ya está cerca del negro de
   la página. Si el borde es claro, desvanecerlo no lo integra —dibuja un
   degradado oscuro encima, que es un efecto y se nota—; en ese caso el borde
   se manda fuera de pantalla, donde el corte lo da el viewport y no se lee
   como el límite de una imagen.

   `salon` es la única de las cuatro con los cuatro bordes oscuros
   (#05090a arriba, #0f0e08 abajo, #19271d y #2a1607 a los lados), así que es
   la única que puede fundirse de verdad por tres lados. */
.experiencia{ padding-block:var(--aire) }
.experiencia-int{
  display:grid;
  grid-template-columns:minmax(0,24rem) minmax(0,1fr);
  gap:clamp(2rem,5vw,5.5rem);
  align-items:center;
  /* El texto arranca donde arrancan todas las secciones; la foto sigue hasta
     el borde y no lleva padding que la frene. */
  padding-left:max(var(--marco), calc((100vw - var(--ancho)) / 2 + var(--marco)));
}
.experiencia-texto h2{
  font-size:var(--t-titulo);
  font-variation-settings:'wght' 780,'wdth' 68;
  text-transform:uppercase; line-height:.88; letter-spacing:-.025em;
  margin-top:var(--e5);
}
.experiencia-texto h2 em{ font-style:normal; color:var(--oro) }
.experiencia-texto .lead{ margin-top:var(--e5) }

.experiencia-foto{ margin:0; min-width:0 }
.experiencia-foto img{ width:100%; height:auto; will-change:transform }
/* Izquierda, arriba y abajo se disuelven contra la página; la derecha se va
   de pantalla. No hay ningún borde que quede a la vista. */
.experiencia-foto picture{
  display:block;
  /* Recorta la fotografía cuando el paralaje la desplaza dentro del marco. */
  overflow:hidden;
  -webkit-mask-image:
    linear-gradient(90deg,transparent 0,#000 17%,#000 100%),
    linear-gradient(180deg,transparent 0,#000 11%,#000 87%,transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:
    linear-gradient(90deg,transparent 0,#000 17%,#000 100%),
    linear-gradient(180deg,transparent 0,#000 11%,#000 87%,transparent 100%);
  mask-composite:intersect;
}


/* ═══ 8. HAMBURGUESAS ═════════════════════════════════════════════════════ */

/* Una hamburguesa por vez, a pantalla completa, y el scroll pasa a la
   siguiente. El escenario se queda quieto con `sticky` —igual que el hero y
   los dos recorridos horizontales— pero la geometría es propia: acá no se
   desplaza nada de costado, se releva el plato.

   Las imágenes son PNG recortados con canal alfa. Sin fondo no hay caja, no
   hay máscara y no hay canto: la hamburguesa se apoya sobre el negro y ya.
   Es la única sección del sitio donde la fotografía no necesita integrarse,
   porque no trae nada que integrar. */
/* 70svh por ítem (560/8 a ojo con las 8 hamburguesas de hoy). Se calcula
   desde --burgers-n en vez de quedar fijo porque supabase-public.js puede
   reconstruir la sección con otra cantidad; el 8 por defecto hace que, si
   JS nunca corre, el alto sea idéntico al de siempre. */
.burgers{ position:relative; height:calc(var(--burgers-n, 8) * 70svh) }
.burgers-escena{
  position:sticky; top:0;
  height:100svh;
  display:flex; align-items:center;
  overflow:hidden;
}
/* Luz ambiental de la zona del plato. No es un círculo ni un halo con borde:
   es una elipse enorme y muy abierta, centrada donde está la hamburguesa, que
   levanta el fondo unos diez niveles de luminancia en su punto más fuerte y se
   apaga mucho antes de llegar a ningún canto. Va sobre la escena y no sobre el
   plato para que no parpadee al cambiar de hamburguesa. */
.burgers-escena::before{
  content:''; position:absolute; inset:0; z-index:0; pointer-events:none;
  background:radial-gradient(48% 54% at 76% 52%, rgba(232,180,92,.062), transparent 70%);
}

/* Plano técnico de fondo. El tono sale del dorado del sitio a muy baja
   opacidad: sobre el negro da un café oscuro que queda a unos diez niveles de
   luminancia del fondo. Es grande a propósito y la escena lo recorta —tiene
   que leerse como que sigue más allá de la pantalla, no como una figura
   centrada—. */
.burgers-plano{
  position:absolute;
  top:50%; right:-14%;
  translate:0 -50%;
  width:min(126vh, 66rem);
  height:auto;
  z-index:0;
  color:rgba(232,180,92,.055);
  pointer-events:none;
  will-change:transform;
}
.burgers-marco{
  position:relative; z-index:1;
  width:100%; max-width:var(--ancho);
  margin-inline:auto;
  padding-inline:var(--marco);
  display:grid;
  grid-template-columns:minmax(0,11.5rem) minmax(0,1fr);
  gap:clamp(1.5rem,4vw,4rem);
  align-items:center;
}

/* ─── Cabeza e índice ───
   El índice es a la vez indicador de posición y navegación: se ve dónde está
   uno, qué viene y qué quedó atrás, y se puede saltar. La línea de progreso
   corre en paralelo, movida por el mismo scroll. */
.burgers-cabeza{ align-self:center }
.burgers-cabeza .encabezado{ margin-bottom:clamp(1.5rem,3vw,2.5rem) }
/* En una columna de 11,5rem el rótulo entra en un renglón; sin esto «las
   hamburguesas» cae debajo del número y el encabezado se lee partido. */
.burgers-cabeza .encabezado .rotulo{ letter-spacing:.14em }
.burgers-indice{ position:relative; padding-left:var(--e4) }
.burgers-indice::before{
  content:''; position:absolute; left:0; top:0; bottom:0; width:1px;
  background:var(--linea-sutil);
}
.burgers-progreso{ position:absolute; left:0; top:0; bottom:0; width:1px; overflow:hidden }
.burgers-progreso i{
  display:block; width:100%; height:100%;
  background:var(--oro);
  transform:scaleY(0); transform-origin:top;
}
.burgers-indice li + li{ margin-top:.375rem }
.burgers-salto{
  display:flex; align-items:baseline; gap:.5rem;
  background:transparent; border:0; cursor:pointer; padding:.1875rem 0;
  text-align:left; width:100%;
  color:var(--tx-2); opacity:.42;
  transition:opacity .45s var(--curva), color .45s var(--curva);
}
.burgers-salto .n{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.14em;
}
.burgers-salto .t{
  font-variation-settings:'wght' 540,'wdth' 84;
  font-size:var(--t-micro); letter-spacing:.12em; text-transform:uppercase;
}
.burgers-salto:hover{ opacity:.85; color:var(--tx) }
.burgers-indice li.activo .burgers-salto{ opacity:1; color:var(--oro) }

/* ─── Escenario ───
   Las ocho apiladas en la misma celda de rejilla, no metidas y sacadas del
   documento: quedan disponibles para un lector de pantalla, el bloque mide lo
   que la ficha más alta, y desapilarlas es todo lo que hace falta para tener
   la versión sin animación. */
.burgers-escenario{ display:grid; min-width:0 }
.burgers-item{
  grid-area:1 / 1;
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,auto);
  gap:clamp(1.5rem,4vw,4rem);
  align-items:center;
  opacity:0;
  will-change:opacity;
}

.burgers-ficha{ min-width:0 }
.burgers-num{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.22em; color:var(--oro);
  margin-bottom:var(--e3);
}
.burgers-nombre{
  font-size:clamp(2.25rem,5vw,4.5rem);
  font-variation-settings:'wght' 800,'wdth' 66;
  text-transform:uppercase; line-height:.86; letter-spacing:-.03em;
}
.burgers-ing{
  margin-top:clamp(1rem,2vw,1.75rem);
  max-width:32ch;
  color:var(--tx-2);
  font-variation-settings:'wght' 460,'wdth' 94;
  font-size:var(--t-chico); line-height:1.7;
}
.burgers-precio{
  display:flex; flex-wrap:wrap; gap:var(--e3) var(--e6);
  margin-top:clamp(1.25rem,2.5vw,2rem);
  padding-top:var(--e4);
  border-top:1px solid var(--linea-sutil);
  font-variation-settings:'wght' 560,'wdth' 90;
  font-size:1.0625rem; font-variant-numeric:tabular-nums;
}
.burgers-precio b{
  display:block;
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.16em; text-transform:uppercase;
  color:var(--tx-3);
}

.burgers-plato{
  position:relative; margin:0;
  width:min(52vh,30rem);
  justify-self:end;
  will-change:transform;
}
/* Foco muy tenue por detrás: apoya la hamburguesa recortada sobre el negro
   para que no quede flotando en el vacío. Es luz, no una caja. */
.burgers-plato::before{
  content:''; position:absolute; inset:10% -16% -4% -16%;
  background:radial-gradient(56% 44% at 50% 62%, rgba(232,180,92,.14), transparent 70%);
  pointer-events:none;
}
.burgers-plato picture{ position:relative; display:block }
.burgers-plato img{ width:100%; height:auto }
/* Fallback sin foto (`imagen_path` null, ver supabase-public.js): el .hueco
   no tiene proporción propia como un <img> con sus atributos width/height,
   así que hay que dársela — las fotos que sí llegan son 1:1. */
.burgers-plato .hueco{ width:100%; aspect-ratio:1/1 }

/* Sin animación —movimiento reducido o sin GSAP— la escena deja de tener
   sentido: se desapila y quedan todas una debajo de otra, con todo a la
   vista y sin nada que dependa del scroll. */
.burgers-planas .burgers{ height:auto; padding-block:var(--aire) }
/* `relative` y no `static`, y `overflow-x:clip` y no `overflow:visible`.

   Acá había `position:static; overflow:visible`, y las dos mitades se juntaban
   para el mismo desastre. El `.burgers-plano` está puesto a propósito con
   `right:-14%` para salirse por el costado y que la escena lo corte —lo dice el
   comentario de su regla—, pero `visible` le sacaba el recorte y `static` le
   sacaba a la escena el papel de bloque contenedor: al no quedar ningún
   ancestro posicionado hasta `section.burgers`, el SVG absoluto se colgaba de
   ahí y ni siquiera un recorte en la escena lo hubiera alcanzado, porque un
   `overflow` no recorta a un absoluto cuyo contenedor está más arriba.

   El resultado era que la página se arrastraba de costado unos 200px, y sólo le
   pasaba a quien había pedido menos movimiento. `relative` devuelve el
   contenedor sin reponer el `sticky`, y `clip` recorta lo horizontal dejando lo
   vertical libre — que es lo único que el `visible` original hacía falta para
   lograr: desapilada, la escena crece y no puede cortar las ocho hamburguesas.
   `hidden` no sirve: crearía un contenedor de scroll en los dos ejes. */
.burgers-planas .burgers-escena{
  position:relative; height:auto; display:block;
  overflow-x:clip; overflow-y:visible;
}
.burgers-planas .burgers-marco{ grid-template-columns:1fr }
.burgers-planas .burgers-indice{ display:none }
.burgers-planas .burgers-escenario{ display:block }
.burgers-planas .burgers-item{
  opacity:1;
  padding-block:clamp(2.5rem,6vw,4rem);
  border-top:1px solid var(--linea-sutil);
}
.burgers-planas .burgers-item:first-child{ border-top:0 }


/* ═══ 9. BARRA ════════════════════════════════════════════════════════════ */

/* Texto a la izquierda —índice, título y las dos líneas de la barra— y a la
   derecha una composición de dos fotografías superpuestas.

   ─── Por qué acá no hay máscaras ───
   `salon` puede desvanecerse porque sus cuatro bordes ya son casi negros: el
   fundido no se ve y la foto sigue leyéndose entera. Estas dos tienen bordes
   claros —el mural iluminado, los papeles blancos—, y ahí el mismo recurso
   deja de integrar y pasa a pintar un degradado oscuro encima de la
   fotografía: parece que se está borrando.
   La solución no es más fundido sino composición: la bandeja sangra por la
   derecha y el brindis se monta sobre su ángulo inferior izquierdo, de modo
   que cada una tapa bordes de la otra y lo que queda a la vista son cantos de
   fotografía. Una fotografía puede terminar; lo que no puede es desvanecerse
   a medias. */
.barra{ background:var(--carbon) }
.barra-int{
  display:grid;
  grid-template-columns:minmax(0,26rem) minmax(0,1fr);
  gap:clamp(2.5rem,6vw,6rem);
  align-items:center;
  padding-left:max(var(--marco), calc((100vw - var(--ancho)) / 2 + var(--marco)));
}
.barra-texto{ min-width:0 }
.barra-bloque + .barra-bloque{ margin-top:clamp(2.5rem,5vw,4rem) }
.barra-bloque h3{
  font-size:var(--t-medio);
  font-variation-settings:'wght' 760,'wdth' 70;
  text-transform:uppercase; line-height:.94; letter-spacing:-.02em;
  margin-block:var(--e5) var(--e4);
}
.barra-bloque h3 em{ font-style:normal; color:var(--oro) }
/* `.barra-lista` vivía acá: dos listas de cuatro renglones que repetían los
   nombres de las categorías de la carta. Se fueron con el marcado —estiraban
   la sección al doble sin agregar un dato— y en su lugar quedó un enlace al
   grupo de barra de /carta.html, que es donde esos nombres sí vienen con
   precio. */
.barra-pie{ margin-top:clamp(2rem,4vw,3rem) }

/* Las dos comparten una única fila de rejilla y se pisan: la bandeja manda
   —vertical, grande, sangrando por la derecha— y el brindis se monta sobre su
   ángulo inferior izquierdo, apaisado y más chico. El contraste de formatos
   entre una vertical y una apaisada es lo que evita que se lean como dos
   piezas equivalentes puestas una al lado de la otra.

   ─── Qué borde lleva máscara y por qué ───
   Medido sobre las fotografías, no a ojo (fondo de página = 9,4):

     brindis   arriba 60   abajo  2,6   izq 57   der 42
     bandeja   arriba 83   abajo 43     izq 107  der 52

   El pie del brindis está en 2,6 —más oscuro que la propia página— porque el
   recorte cae sobre la banda de sombra entre la pared y la mesa. Ése no lleva
   nada: desaparece solo, igual que los de la nocturna del local. Su lado
   derecho tampoco, porque apoya sobre la bandeja.

   La bandeja no tiene ni un borde oscuro: el mural ilumina todo el cuadro, y
   se probó con plumas cortas en los lados que dan al fondo. No funcionó —un
   degradado sobre un canto claro no lo integra, lo convierte en un rectángulo
   de bordes borrosos, que es peor que un canto limpio—. Así que no lleva
   ninguna: es una fotografía y termina donde termina. Lo que la sostiene es la
   composición, no una máscara. */
.barra-composicion{
  display:grid;
  grid-template-columns:repeat(12,1fr);
  min-width:0;
}
.barra-foto{ margin:0; min-width:0 }
.barra-foto img{ width:100%; height:auto }

.barra-foto--principal{ grid-area:1 / 5 / 2 / 13; align-self:start }

/* El brindis baja hasta pasar el pie de la bandeja: el punto más bajo de la
   composición es el suyo, que es el único borde que se funde solo. */
.barra-foto--contrapunto{
  grid-area:1 / 1 / 2 / 10;
  align-self:end;
  z-index:2;
  margin-bottom:clamp(-4rem,-5vw,-2rem);
}



/* ═══ 9b. MINGA ═══════════════════════════════════════════════════════════ */

/* Mismo mecanismo que la galería —sección más alta que la pantalla, interior
   fijado con `sticky` y una pista que se desplaza en X— y distinta geometría:
   allá es una hilera de piezas sueltas que desfilan, acá es una sola
   superficie continua que se recorre. Sin eso serían dos secciones seguidas
   con la misma composición.

   El ancho del plano lo fijan sus propios contenidos; el recorrido que hace
   GSAP es la diferencia entre ese ancho y el del viewport. El vídeo mide
   88vw a propósito: al terminar el desplazamiento entra completo en pantalla,
   que es el remate de la sección. Si se agranda más, la composición de las
   cinco latas no llega a verse nunca entera. */
.minga{ position:relative; height:200svh }
.minga-int{
  position:sticky; top:0;
  height:100svh;
  display:flex; align-items:center;
  overflow:hidden;
}
.minga-pista{
  display:flex; align-items:center;
  gap:clamp(2.5rem,6vw,7rem);
  padding-inline:var(--marco) clamp(3rem,8vw,10rem);
  will-change:transform;
}

.minga-texto{ flex:0 0 auto; width:min(34rem,46vw) }
.minga-texto .encabezado{ margin-bottom:clamp(1.5rem,4vw,3rem) }
/* El cartel es masa gráfica, no un titular más: va al ancho más condensado y
   al peso más alto de toda la página. */
.minga-cartel{
  font-size:clamp(4rem,11vw,12rem);
  font-variation-settings:'wght' 860,'wdth' 62;
  text-transform:uppercase;
  line-height:.78; letter-spacing:-.045em;
  color:var(--oro);
}
.minga-texto .lead{ margin-top:clamp(1.5rem,3vw,2.5rem); max-width:26ch }

.minga-video{ flex:0 0 auto; margin:0; width:88vw }
.minga-video video{
  width:100%; height:auto; display:block;
  /* ─── Cómo se funde el vídeo con el fondo ───
     La composición del plano llega pegada a los cantos: la primera lata
     arranca en la columna 0 y la última termina en la última. No hay margen
     negro sobre el que degradar, así que el fundido de la izquierda
     necesariamente atraviesa la primera lata — y eso es justamente lo que
     hace que la imagen parezca emerger de la oscuridad en vez de empezar de
     golpe con un canto vertical.

     Las paradas van en píxeles y no en porcentaje para que la transición mida
     lo mismo en cualquier pantalla: unos 155 px a la izquierda y 90 a la
     derecha. En porcentaje, a 1920 se iría a más de 200 y a 1280 se quedaría
     corta.

     Los pasos intermedios son una curva, no una rampa recta: una rampa lineal
     sobre una lata iluminada se lee como una banda gris cruzándola.

     Arriba no lleva nada: el fondo del vídeo ya está igualado al de la página
     desde el encode. El pie sí, que es la superficie reflejada. */
  -webkit-mask-image:
    linear-gradient(90deg,
      transparent 0,
      rgba(0,0,0,.12) 24px,
      rgba(0,0,0,.38) 56px,
      rgba(0,0,0,.68) 94px,
      rgba(0,0,0,.89) 126px,
      #000 155px,
      #000 calc(100% - 90px),
      rgba(0,0,0,.72) calc(100% - 46px),
      rgba(0,0,0,.3) calc(100% - 18px),
      transparent 100%),
    linear-gradient(180deg,#000 0,#000 88%,transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:
    linear-gradient(90deg,
      transparent 0,
      rgba(0,0,0,.12) 24px,
      rgba(0,0,0,.38) 56px,
      rgba(0,0,0,.68) 94px,
      rgba(0,0,0,.89) 126px,
      #000 155px,
      #000 calc(100% - 90px),
      rgba(0,0,0,.72) calc(100% - 46px),
      rgba(0,0,0,.3) calc(100% - 18px),
      transparent 100%),
    linear-gradient(180deg,#000 0,#000 88%,transparent 100%);
  mask-composite:intersect;
}


/* ═══ 10. GALERÍA ═════════════════════════════════════════════════════════ */

/* Tira horizontal recorrida por el scroll. Las piezas no tienen todas el
   mismo alto: la irregularidad es lo que la separa de un carrusel. */
/* La sección mide más de una pantalla y su interior se queda quieto, igual
   que el hero: sin eso la tira ya iba por la mitad de su recorrido cuando la
   sección entraba en pantalla, y las primeras piezas no se veían nunca. */
/* 175svh y no 230: la altura de la sección es el combustible del recorrido
   horizontal, y el recorrido se acortó al pasar a marcos verticales —una foto
   vertical es más angosta que una apaisada, así que la tira mide menos—. Con
   230svh quedaban 1170px de scroll para mover 600 de tira: la mitad del tramo
   era scrollear para ver casi nada moverse. Medido a 1440×900, ahora son 810
   de scroll para 660 de tira. */
.galeria{ position:relative; height:175svh }
.galeria-int{
  position:sticky; top:0;
  height:100svh;
  display:flex; flex-direction:column; justify-content:center;
  gap:clamp(2rem,4vw,3.5rem);
  overflow:hidden;
  /* El bloque se centra en la pantalla menos la cabecera, no en la pantalla
     entera. La cabecera es fija y no ocupa espacio en el flujo, así que sin
     esto el centrado la ignora: con las piezas verticales, que son más altas
     que los marcos apaisados de antes, el rótulo «06 · El local» subía hasta
     los 60px y se metía debajo de la barra de navegación, que empieza en 0 y
     mide 76. Se veía el hueco donde tenía que estar el título. */
  padding-top:var(--cabecera);
}
.galeria-pista{
  display:flex; align-items:center; gap:clamp(1rem,2vw,2rem);
  padding-left:var(--marco);
  will-change:transform;
}
/* Marcos verticales, y la medida que manda es el alto.
   Las cinco fotos del local son verticales (0,66 a 0,74 de proporción). Los
   marcos de antes eran casi cuadrados y apaisados —34×30rem—, así que meterlas
   ahí obligaba a tirar media foto de cada una. Ahora la pieza no tiene ancho
   propio: se le da el alto y el `<img>` con `width:auto` toma el ancho de su
   proporción real. Eso hace dos cosas de una: entran enteras, y como cada foto
   trae una proporción distinta los anchos salen desparejos solos, que es lo
   que esta tira necesitaba para no parecer un carrusel. El alternado de altos
   —una alta, una baja— y el desalineado vertical siguen igual que antes. */
.galeria-pieza{ flex:0 0 auto; position:relative; margin:0 }
.galeria-foto{
  display:block;
  width:auto; max-width:78vw;
  height:min(66vh,43rem);
  object-fit:cover;
  /* El filete no es adorno, y el porqué está medido. Los veinte bordes de las
     cinco fotos van de 14,8 a 134,7 sobre un fondo de 9,3: ninguno se puede
     fundir —la regla del proyecto pide escalones por debajo de ~10 para eso, y
     acá el menor es +5,5 y el mayor +125,4—, así que las piezas son
     rectángulos y punto. El problema es justamente ese +5,5: el canto superior
     de «Bajo el letrero» queda tan cerca del fondo que sin una línea se
     desvanece, y una sola pieza abierta por arriba en una tira de cinco
     cerradas no se lee como decisión sino como imagen rota. Medido en pantalla,
     la fila del filete da 22,3 entre un fondo de 9,3 y una foto que arranca en
     11,0: sin él, el salto del fondo a la foto sería de 1,7 y ese canto no
     existiría. Alcanza para cerrarlo sin dibujar un marco. */
  border:1px solid var(--linea-sutil);
}
.galeria-pieza:nth-child(even) .galeria-foto{ height:min(50vh,32rem) }
.galeria-pieza:nth-child(3n){ align-self:flex-start }
.galeria-pieza:nth-child(4n){ align-self:flex-end }
/* `.galeria-pie` se quitó el 31/08/2026 junto con los cinco `<figcaption>`.
   Rotular «Salón», «Barra» o «Mesa» debajo de una foto de un salón, una barra
   o una mesa es describir lo que ya se ve: el pie de foto sólo gana algo
   cuando aporta lo que la imagen no dice. La descripción sigue existiendo
   donde hace falta, en el `alt` de cada `<img>`, que es para quien no ve la
   foto. Si vuelve un pie, que traiga un dato — no el nombre de lo retratado. */


/* ═══ 11. OPINIONES ═══════════════════════════════════════════════════════ */

/* Llegaron las reseñas: tres <figure class="opinion"> con <blockquote> y
   <figcaption> citando la fuente, tal como preveía el comentario que estaba
   acá. La grilla no cambió — se le cayó el `aspect-ratio` de los huecos, que
   es lo único que tenía sentido mientras no hubiera texto que la midiera. */
.opiniones-lista{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,18rem),1fr));
  gap:clamp(1.5rem,3vw,2.5rem);
  margin-top:clamp(2.5rem,5vw,4rem);
}

/* Columna flex y no bloque, para que la firma pueda irse al pie con
   `margin-top:auto`. Las tres reseñas miden entre 240 y 330 caracteres: con la
   firma pegada al final del texto, las tres caían a tres alturas distintas y
   una fila de fichas desalineadas por abajo se lee como error de maquetado.
   `auto-fit` ya las hace de igual alto; esto aprovecha ese alto. */
.opinion{
  display:flex; flex-direction:column;
  margin:0; padding:clamp(1.5rem,2.5vw,2.25rem);
  background:var(--carbon);
  border:1px solid var(--linea-sutil);
}

.opinion-estrellas{
  margin:0; color:var(--oro);
  font-size:var(--t-chico); letter-spacing:.22em;
}

.opinion-texto{
  /* El navegador le pone a <blockquote> un margen lateral de 40px que acá sólo
     angosta la columna dentro de una ficha ya angosta. */
  margin:var(--e4) 0 0;
  /* Con tres columnas estrechas, la palabra sola en el último renglón no es la
     excepción sino la regla: una por ficha. `pretty` reparte esas viudas. */
  text-wrap:pretty;
}
.opinion-texto p{ margin:0; color:var(--tx) }

/* El corazón es de la reseña, no del sitio: va al tamaño del texto y no se
   deja crecer con la fuente de color del sistema, que en algunas plataformas
   lo dibuja un punto más grande que la línea y le abre el interlineado. */
.opinion-emoji{ font-size:.9em; line-height:1 }

.opinion-firma{
  margin-top:auto; padding-top:var(--e5);
  display:flex; flex-direction:column; gap:.15rem;
}
.opinion-autor{ color:var(--tx-2); font-variation-settings:'wght' 560 }

/* La atribución es el enlace. Un «ver en Google» aparte al lado de un rótulo
   que ya dice «Google» repite la palabra dos veces en el mismo renglón por el
   único motivo de tener dónde hacer clic — y el sitio de la fuente es
   exactamente adónde tiene que llevar la fuente citada.

   `width:fit-content` porque en una columna flex el <a> se estiraría a todo el
   ancho de la ficha y el subrayado del hover aparecería medio palmo más allá de
   donde termina el texto. */
.opinion-fuente{
  width:fit-content;
  font-variation-settings:'wght' 500,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.18em; text-transform:uppercase;
  color:var(--tx-3);
  text-decoration:none;
  border-bottom:1px solid transparent;
  transition:color .2s var(--curva), border-color .2s var(--curva);
}
.opinion-fuente:hover,
.opinion-fuente:focus-visible{ color:var(--oro); border-bottom-color:var(--linea-oro) }


/* ═══ 12. CARTA ═══════════════════════════════════════════════════════════ */

/* Deliberadamente la sección más callada del sitio: sin escala de cartel,
   sin animación de entrada por ítem, en dos columnas densas. Es referencia,
   no espectáculo — la experiencia ya ocurrió más arriba. */
.carta{ background:var(--carbon) }
.carta-cols{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1.45fr);
  gap:clamp(2rem,5vw,7rem);
  margin-top:clamp(2.5rem,5vw,4rem);
  align-items:start;
}
.carta-cols h2{
  font-size:var(--t-medio);
  font-variation-settings:'wght' 680,'wdth' 76;
  text-transform:uppercase; line-height:.98; letter-spacing:-.02em;
  max-width:14ch;
}
.carta-bajada{ margin-top:var(--e5) }

/* Tres bloques, no dieciocho renglones. Lo que se reemplazó acá era un índice
   de dieciocho categorías en dos columnas: largo de recorrer, sin precio y sin
   foto, o sea sin nada que contestara la pregunta que trae quien lo mira. Lo
   que queda es la cifra —lo único que este bloque dice mejor que el botón que
   tiene al lado— y el nombre del grupo.

   Cada bloque es un enlace al ancla del grupo dentro de /carta.html: si el
   número te llamó la atención, el clic te deja parado exactamente ahí. */
.carta-grupos{
  display:grid; gap:var(--e4);
  grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));
}
/* Columna con la unidad empujada al fondo: los tres nombres no ocupan lo mismo
   —«Postres y cafetería» envuelve donde «Cocina» no— y con el flujo normal cada
   rótulo caía a una altura distinta, que en tres cajas iguales lado a lado se
   lee como un error de alineación. Apoyados todos en el borde de abajo, las
   tres fichas vuelven a leerse como una sola fila. */
.carta-grupo{
  display:flex; flex-direction:column;
  text-decoration:none; color:inherit;
  padding:clamp(1.25rem,2.5vw,1.75rem) clamp(1.25rem,2.5vw,1.875rem);
  border:1px solid var(--linea);
  transition:border-color .4s var(--curva), background-color .4s var(--curva);
}
.carta-grupo:hover{ border-color:var(--linea-oro); background:rgba(255,255,255,.02) }
/* La cifra en el ancho angosto de la variable: es un número grande y a esta
   escala el ancho normal lo vuelve un bloque pesado. Tabular para que los de
   dos y tres dígitos apoyen sobre el mismo eje. */
.carta-grupo__n{
  display:block;
  font-variation-settings:'wght' 700,'wdth' 70;
  font-size:clamp(2.75rem,6vw,4rem); line-height:.9; letter-spacing:-.03em;
  color:var(--oro); font-variant-numeric:tabular-nums;
}
.carta-grupo h3{
  margin-top:var(--e3); margin-bottom:auto;
  font-variation-settings:'wght' 620,'wdth' 88;
  font-size:var(--t-chico); letter-spacing:.02em;
}
.carta-grupo__u{
  display:block; margin-top:var(--e3);
  font-size:var(--t-micro); letter-spacing:.14em; text-transform:uppercase;
  font-variation-settings:'wght' 500,'wdth' 88;
  color:var(--tx-2);
}
/* En el teléfono no entran tres columnas legibles y `auto-fit` resuelve dos más
   una huérfana: dos fichas arriba y la tercera sola abajo, con un hueco muerto
   dentro de «Cocina» porque la unidad más larga estira toda la fila.

   Apiladas y en horizontal el problema desaparece y además se lee mejor: la
   cifra a la izquierda, el nombre y la unidad a la derecha. Tres renglones que
   se recorren de un vistazo, que es exactamente lo que este bloque tiene que
   hacer antes de mandar a /carta.html. */
@media (max-width:39.99em){
  .carta-grupos{ grid-template-columns:1fr; gap:var(--e3) }
  .carta-grupo{
    display:grid; align-items:center;
    grid-template-columns:auto minmax(0,1fr);
    column-gap:var(--e4);
    padding:var(--e4) var(--e5);
  }
  .carta-grupo__n{ font-size:2.25rem; grid-row:1/3 }
  .carta-grupo h3{ margin:0; align-self:end }
  .carta-grupo__u{ margin-top:.15rem; align-self:start }
}

.carta-pie{ margin-top:clamp(2rem,4vw,3rem) }


/* ═══ 12b. PÁGINA DE CARTA (/carta.html) ══════════════════════════════════ */

/* Documento aparte, no una sección larga de la portada. Acá el menú sí es el
   protagonista —es la única página donde puede serlo— pero se resuelve como
   documento de consulta, no como espectáculo: sin secuencia, sin scroll
   secuestrado, sin animación de entrada. Alguien lo abre con el teléfono en
   la mano, sentado en la mesa, para decidir qué pide.
   La regla «el menú no es el protagonista» sigue rigiendo la portada, que es
   donde estaba en juego. */

.pagina-carta .menu-pagina{
  padding-block:calc(var(--cabecera) + clamp(3rem,6vw,6rem)) var(--aire);
}

/* Cabecera de esta página: sin botón hamburguesa y sin panel plegable, porque
   no hay main.js que los accione. Los cuatro enlaces se quedan en línea a
   cualquier ancho; en pantallas angostas se esconden los dos del medio, que
   son atajos a secciones de la portada y no salidas necesarias — «Inicio» y
   «Visitanos» sí lo son y no se tocan.
   `display:none` y no `visibility`/opacidad: un enlace que no se ve pero
   sigue en el orden de tabulación es peor que no tenerlo. */
@media (max-width:720px){
  .nav-carta{ gap:var(--e5) }
  .nav-carta .solo-ancho{ display:none }
}

.menu-cab{
  padding-bottom:clamp(2rem,4vw,3rem);
  border-bottom:1px solid var(--linea);
}
/* El margen de abajo es cero desde que se fueron la bajada y el aviso legal
   (31/08/2026): el título quedó siendo el último elemento de la cabecera y su
   margen se sumaba al `padding-bottom` del contenedor, dejando cien píxeles de
   nada entre «Cocina y barra» y la regla. Ese hueco no era aire compuesto, era
   el sitio de dos párrafos que ya no están. */
.menu-titulo{
  font-size:var(--t-titulo);
  font-variation-settings:'wght' 820,'wdth' 66;
  margin-block:var(--e4) 0;
}
/* Acá vivían `.menu-bajada` y `.menu-aviso`. Los dos renglones se quitaron el
   31/08/2026 y las reglas se van con ellos: una clase sin marcado que la use
   es una pista falsa para quien lea el archivo dentro de seis meses. */

.menu-cols{
  display:grid;
  grid-template-columns:minmax(0,13rem) minmax(0,1fr);
  gap:clamp(2rem,5vw,6rem);
  align-items:start;
  margin-top:clamp(2.5rem,5vw,4rem);
}
.menu-cols > *{ min-width:0 }

/* Índice pegajoso. Con 19 categorías, llegar a «Postres» con el dedo son
   varias pantallas; es la única concesión de navegación de la página.
   `overflow:auto` con tope de altura porque el índice completo no entra en
   una pantalla de portátil. */
.menu-indice-caja > summary::-webkit-details-marker{ display:none }
.menu-indice-caja > summary::marker{ content:'' }

/* En escritorio el <details> que envuelve al índice para poder plegarlo en el
   teléfono tiene que desaparecer de la maquetación, no sólo verse invisible.

   No es cosmético, y costó dos intentos. Con el <details> generando caja, su
   altura es la del índice y nada más, así que `position:sticky` sobre el <nav>
   se queda sin recorrido por el que deslizarse: el índice se va con el scroll
   y la página pierde su única navegación.

   `display:contents` sobre el <details> no alcanzó. Chrome envuelve además el
   contenido en `::details-content` —el box que hace posible animar la apertura
   y que lleva el `content-visibility` cuando está cerrado—, y ese box vuelve a
   encerrar al <nav>. Hay que aplanar los dos. En navegadores sin
   `::details-content` la regla se descarta entera y no hace falta: ahí el
   <details> nunca generó ese box.

   Va en `min-width` y no suelto porque abajo de 1000px el <details> sí tiene
   que ser una caja de verdad — es la barra pegada bajo la cabecera. Tenerlo
   aplanado en los dos lados rompía el móvil en silencio.

   Lo detectó validar.mjs, «el índice no quedó pegado al bajar»: justo el tipo
   de rotura que no se ve en una captura fija. */
@media (min-width:1000px){
  .menu-indice-caja,
  .menu-indice-caja::details-content{ display:contents }
  .menu-indice-abrir{ display:none }
}

.menu-indice{
  position:sticky;
  top:calc(var(--cabecera) + 1.5rem);
  max-height:calc(100svh - var(--cabecera) - 3rem);
  overflow-y:auto;
  padding-right:var(--e3);
}
.menu-indice__grupo + .menu-indice__grupo{ margin-top:var(--e5) }
.menu-indice .rotulo{
  display:block;
  padding-bottom:var(--e2);
  border-bottom:1px solid var(--linea-oro);
}
.menu-indice ul{ margin-top:var(--e3) }
.menu-indice a{
  display:block; padding-block:.3125rem;
  font-variation-settings:'wght' 500,'wdth' 92;
  font-size:var(--t-chico);
  color:var(--tx-3);
  transition:color .3s var(--curva);
}
.menu-indice a:hover{ color:var(--tx) }
.menu-indice a.es-actual{ color:var(--oro); font-variation-settings:'wght' 620,'wdth' 92 }

.menu-grupo + .menu-grupo{ margin-top:clamp(3.5rem,7vw,6rem) }
.menu-grupo__titulo{
  font-size:var(--t-medio);
  font-variation-settings:'wght' 800,'wdth' 68;
  padding-bottom:var(--e4);
  border-bottom:1px solid var(--linea);
}

/* ── Categoría plegable ─────────────────────────────────────────────────────
   Cerradas, las dieciocho categorías son dieciocho renglones: la carta entera
   cabe en dos pantallas y se elige antes de leer. El <summary> es la fila
   entera y no sólo el texto, para que el blanco a la derecha también abra —en
   un teléfono, apuntar a las siete letras de «Fries» es puntería innecesaria. */
.menu-cat{ margin-top:clamp(1rem,2vw,1.5rem) }
.menu-cat__cab{
  display:flex; flex-wrap:nowrap; align-items:baseline; gap:var(--e4);
  padding-block:var(--e3);
  border-bottom:1px solid var(--linea-oro);
  cursor:pointer;
  list-style:none;                     /* el triángulo propio sobra: hay flecha */
  -webkit-tap-highlight-color:transparent;
}
.menu-cat__cab::-webkit-details-marker{ display:none }
.menu-cat__cab::marker{ content:'' }
.menu-cat__cab:hover .menu-cat__nombre{ color:var(--tx) }
/* El foco se dibuja sobre la fila entera porque la fila entera es el botón.
   Sin esto el anillo sale pegado al <h3> y parece que lo enfocado es el
   título y no el desplegable. */
.menu-cat__cab:focus-visible{
  outline:2px solid var(--oro); outline-offset:4px;
}
.menu-cat__nombre{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.22em; text-transform:uppercase;
  color:var(--oro);
  transition:color .3s var(--curva);
}
/* La nota operativa —«consultar disponibilidad en canillas»— no es una
   descripción: es una advertencia. Va al lado del rótulo y en el tono más
   callado que hay, para que se lea antes de pedir y no compita con nada.
   Con la categoría cerrada se recorta antes que empujar la cuenta afuera. */
.menu-cat__nota{
  flex:1; min-width:0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  font-size:var(--t-chico); color:var(--tx-3);
  font-variation-settings:'wght' 440,'wdth' 96;
}
/* Cuántos ítems hay adentro. Es el dato que convierte una fila cerrada en
   información: sin él, «Medidas» no dice si esconde tres cosas o treinta. */
.menu-cat__cuenta{
  margin-left:auto; flex:none;
  font-variation-settings:'wght' 500,'wdth' 96;
  font-size:var(--t-chico); color:var(--tx-3);
  font-feature-settings:'tnum' 1;
}
.menu-cat__nota + .menu-cat__cuenta{ margin-left:0 }
.menu-cat__flecha{
  flex:none; width:1rem; height:1rem;
  align-self:center; color:var(--tx-3);
  transition:transform .3s var(--curva), color .3s var(--curva);
}
.menu-cat[open] > .menu-cat__cab .menu-cat__flecha{ transform:rotate(180deg) }
.menu-cat__cab:hover .menu-cat__flecha{ color:var(--oro) }

/* ── Botón de abrir todas ───────────────────────────────────────────────────
   Devuelve lo único que el plegado se lleva: la búsqueda del navegador. */
.menu-herr{ display:flex; justify-content:flex-end; margin-bottom:var(--e4) }
.menu-herr__b{
  display:inline-flex; align-items:center; gap:var(--e3);
  padding:.55rem .9rem;
  background:none; border:1px solid var(--linea); color:var(--tx-3);
  font:inherit; font-size:var(--t-micro);
  font-variation-settings:'wght' 560,'wdth' 88;
  letter-spacing:.16em; text-transform:uppercase;
  cursor:pointer;
  transition:color .3s var(--curva), border-color .3s var(--curva);
}
.menu-herr__b:hover{ color:var(--oro); border-color:var(--linea-oro) }
.menu-herr__b svg{
  width:.9rem; height:.9rem;
  transition:transform .3s var(--curva);
}
.menu-herr__b[aria-expanded="true"] svg{ transform:rotate(180deg) }

/* Dos columnas donde el ancho lo permite. `break-inside:avoid` es lo que
   impide que un plato quede partido entre columnas con el nombre arriba y el
   precio abajo, que en una carta es peor que no tener columnas. */
.menu-items{ margin-top:var(--e4) }
@media (min-width:900px){
  .menu-items{ columns:2; column-gap:clamp(2rem,4vw,4rem) }
}
.menu-item{
  break-inside:avoid;
  padding-block:var(--e3);
  border-bottom:1px solid var(--linea-sutil);
}
/* La foto sólo aparece si el producto la tiene cargada —hoy son 8 de 139— y
   por eso el modificador va en el <li> y no en la regla base: sin `--foto` no
   hay rejilla, no hay sangría y no hay hueco reservado. Reservar el espacio
   «para cuando lleguen» dejaría 131 filas con un vacío a la izquierda, que se
   lee como imágenes rotas y no como una carta sin fotos. */
.menu-item--foto{
  display:grid; grid-template-columns:4.5rem minmax(0,1fr);
  gap:var(--e4); align-items:start;
}
.menu-item__foto{
  width:4.5rem; height:4.5rem; object-fit:cover;
  background:var(--carbon);
}
.menu-item__linea{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:.25rem var(--e4);
  justify-content:space-between;
}
.menu-item__nombre{
  font-variation-settings:'wght' 580,'wdth' 92;
  font-size:1rem;
}
.menu-item__precios{
  display:flex; flex-wrap:wrap; justify-content:flex-end;
  gap:.375rem var(--e4);
  text-align:right;
}
.menu-precio{
  white-space:nowrap;
  font-variation-settings:'wght' 540,'wdth' 92;
  font-size:var(--t-chico);
  font-variant-numeric:tabular-nums;
  color:var(--tx-2);
}
/* La etiqueta de variante (Simple / Doble / Triple) va arriba del número y no
   al lado: pegadas en la misma línea, «Doble $23.000 Triple $26.600» se lee
   como una sola cifra larga. */
.menu-precio--var{ display:inline-flex; flex-direction:column; align-items:flex-end; gap:.0625rem }
.menu-precio--var b{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.14em; text-transform:uppercase;
  color:var(--tx-3);
}
.menu-item__desc{
  margin-top:.25rem;
  max-width:52ch;
  font-size:var(--t-chico); line-height:1.45;
  color:var(--tx-2); text-wrap:pretty;
}
/* Los precios de un producto con variantes, ya no a la derecha del nombre sino
   en bloque debajo de la descripción (ver el porqué en carta-render.js).
   Alineados a la izquierda y no a la derecha: acá dejaron de ser «el precio de
   este renglón» —que se busca en el margen— para ser una lista de versiones
   entre las que se elige, y una lista se lee desde el mismo margen que el
   texto que la presenta. El filete de arriba los separa de la descripción sin
   sumar otro renglón de aire. */
/* Rejilla y no flex envolvente: con flex cada variante ocupa lo que mide su
   nombre, así que «Kingstone Negroni» de la segunda fila no cae bajo
   «Boulevardier» de la primera y las seis quedan en zigzag. En rejilla las
   columnas se alinean y las seis versiones se barren de arriba abajo. El
   `min(…, 100%)` evita que la columna se plante en 10rem dentro de un
   contenedor más angosto y asome fuera de la pantalla, que es el mismo cuidado
   que ya lleva la rejilla de los extras. */
.menu-item__precios--bloque{
  display:grid;
  grid-template-columns:repeat(auto-fill, minmax(min(10rem, 100%), 1fr));
  justify-content:flex-start;
  margin-top:.5rem; padding-top:.5rem;
  text-align:left;
  gap:.5rem var(--e4);
  border-top:1px solid var(--linea-sutil);
}
.menu-item__precios--bloque .menu-precio--var{ align-items:flex-start }

/* ── Extras de una categoría ────────────────────────────────────────────────
   Va al pie de la categoría, después de los platos y separado por una línea:
   pertenece a «Burgers con papas» pero no es una hamburguesa más. El cuerpo
   menor y el rótulo apagado lo dicen sin necesidad de explicarlo.

   Se lista una sola vez por categoría y no colgando de cada hamburguesa, que
   es como viene de yamenu: la misma lista de once repetida dieciséis veces
   ocupa media carta para decir siempre lo mismo.

   La rejilla es de ancho automático y no de columnas fijas: son once renglones
   cortísimos («Extra huevo $1.800») y en un monitor entran de a tres, mientras
   que en un teléfono caen a una sin ninguna media query. */
.menu-extras{
  margin-top:var(--e5);
  padding-top:var(--e4);
  border-top:1px solid var(--linea-sutil);
}
.menu-extras__titulo{
  display:flex; align-items:center; gap:var(--e3);
  color:var(--tx-3);
}
.menu-extras__n{
  font-variation-settings:'wght' 500,'wdth' 96;
  font-feature-settings:'tnum' 1;
  letter-spacing:0;
}
.menu-extras__grupo{ margin-top:var(--e4) }
.menu-extras__nombre{
  font-variation-settings:'wght' 560,'wdth' 92;
  font-size:var(--t-chico);
  color:var(--tx-2);
}
/* El mínimo de columna lo fija el renglón más largo, no un número redondo:
   «Adicional cheddar, bacon y verdeo» mide 210px y con su precio pide unos
   270px. Con los 15rem de antes entraban cuatro columnas de 244px y ese
   renglón —el único que no entraba— partía el precio a una segunda línea.

   El `min(…, 100%)` no es adorno: el mínimo de un `minmax()` es un suelo duro
   y la columna se queda en 19rem aunque el contenedor mida menos, así que a
   320px de ancho la rejilla asomaba 4px fuera de la pantalla. Con 15rem no se
   notaba porque 240px entraban igual; subir el mínimo lo destapó. */
.menu-extras__lista{
  margin-top:var(--e3);
  display:grid; gap:.25rem var(--e5);
  grid-template-columns:repeat(auto-fill, minmax(min(19rem, 100%), 1fr));
}
/* Nombre a la izquierda, precio a la derecha, y si no entran juntos el precio
   baja en vez de desbordar.

   El «nada de punteado de relleno» que decía acá se revirtió el 31/08/2026,
   pedido por el local: «no se llega a entender qué precio es de cada producto
   porque está muy separado». Tenía razón y el motivo es la rejilla — la
   columna mide hasta 19rem y «Extra huevo» queda a doscientos y pico de
   píxeles de su precio, con otro extra justo debajo: los dos números caen en
   la misma vertical y el ojo tiene que volver sobre el renglón para saber cuál
   es cuál. Es el problema para el que se inventó la guía de puntos en una
   carta impresa.

   Lo que sí sigue valiendo de la regla vieja es la razón por la que se la
   había rechazado: el punteado clásico exige `white-space:nowrap`, y
   «Adicional cheddar, bacon y verdeo» sin cortar se sale de la pantalla en un
   teléfono. Por eso la guía es una caja flex vacía que crece y se encoge
   (`flex:1 1 1.5rem`) en vez de un relleno tipográfico: el nombre conserva su
   `min-width:0` y sigue partiéndose en dos líneas cuando hace falta, y cuando
   no queda sitio la guía se encoge hasta media línea en lugar de empujar
   nada. */
.menu-extra{
  display:flex; flex-wrap:wrap; align-items:baseline;
  justify-content:space-between; gap:.125rem var(--e4);
  font-size:var(--t-chico);
  padding-block:.1875rem;
}
.menu-extra__nombre{ color:var(--tx-2); min-width:0 }
/* Una caja vacía y sin altura: al no tener contenido, su línea de base es el
   borde inferior de la caja, así que con `align-items:baseline` el
   `border-bottom` cae sobre la base del texto — que es exactamente donde van
   los puntos en una carta impresa.

   Cuando el precio no entra y baja de renglón, la guía se queda arriba
   terminando el renglón del nombre y el precio cae debajo contra el margen
   derecho, alineado con el resto de la columna por el `margin-left:auto` de
   más abajo. No es el caso ideal, pero sigue leyéndose: la guía empuja hacia
   la derecha y el precio está en la vertical donde el ojo ya lo busca. */
.menu-extra__guia{
  flex:1 1 1.5rem; min-width:.5rem;
  align-self:baseline;
  border-bottom:1px dotted var(--linea);
}
/* Red de seguridad para un nombre más largo que los de hoy: al bajar de línea,
   el precio queda solo en su renglón y `space-between` lo alinearía a la
   izquierda, justo debajo del nombre de la columna anterior — se lee como el
   precio de otro extra. Con `margin-left:auto` cae siempre bajo su columna. */
.menu-extra__precio{ margin-left:auto }
.menu-extra__precio .menu-precio{ color:var(--tx-3) }

.menu-volver{ margin-top:clamp(3rem,6vw,5rem) }

.menu-pie{
  padding-block:var(--e6);
  border-top:1px solid var(--linea);
}
.peque{
  font-variation-settings:'wght' 500,'wdth' 92;
  font-size:var(--t-chico); color:var(--tx-3);
}
.peque + .peque{ margin-top:var(--e2) }
.menu-pie a:hover{ color:var(--oro) }

@media (max-width:999px){
  /* El índice pegajoso deja de tener sentido cuando ocupa el ancho completo:
     pasa a ser un bloque de atajos arriba del contenido.

     Primero se probó como una sola tira horizontal deslizable, y estaba mal:
     de las dieciocho categorías se veían cinco, «Barra» y «Dulce» quedaban
     enteros fuera de cuadro a la derecha, y llegar a «Postres» era arrastrar
     a ciegas sin nada que indicara cuánto faltaba. Un índice que hay que
     explorar para saber qué contiene no es un índice.

     Los tres grupos se apilan y las categorías de cada uno envuelven en varias
     filas, así la página no desplaza en horizontal en ningún ancho — que
     además es lo que mide validar.mjs.

     Lo que sí estaba mal era dejarlo desplegado: «ocupa más alto y está bien»
     resultó falso en el teléfono. Las dieciocho categorías en tres bloques se
     comían la primera pantalla entera y había que pasarla completa para ver el
     primer plato, o sea que el índice tardaba más en recorrerse que la carta
     que indexa. Ahora nace plegado en una sola fila pegada bajo la cabecera,
     con la categoría que se está mirando escrita al lado: se abre cuando hace
     falta, y el resto del tiempo no estorba pero tampoco desaparece. */
  .menu-cols{ grid-template-columns:minmax(0,1fr) }

  /* El botón de abrir todas es navegación, no contenido: va con el índice,
     no con «Cocina». Apilado en una sola columna quedaba a 56 px del índice y
     a 16 del título del grupo, o sea pegado a lo que no le corresponde y
     leyéndose como un rótulo suelto de Cocina. El margen negativo cancela
     parte del hueco de la rejilla —que en una columna sobra— y lo devuelve
     arriba, donde está lo demás que sirve para moverse. */
  .menu-herr{
    margin-top:calc(var(--e6) * -1);
    margin-bottom:var(--e6);
  }

  .menu-indice-caja{
    position:sticky; top:var(--cabecera); z-index:5;
    margin-bottom:var(--e5);
    background:var(--noche);
    border-bottom:1px solid var(--linea);
  }
  .menu-indice-abrir{
    display:flex; align-items:center; gap:var(--e3);
    padding-block:var(--e4);
    cursor:pointer; list-style:none;
    font-variation-settings:'wght' 620,'wdth' 88;
    font-size:var(--t-micro); letter-spacing:.18em; text-transform:uppercase;
    color:var(--oro);
  }
  /* La categoría actual se recorta con puntos suspensivos en vez de empujar
     la flecha fuera de pantalla: es un dato de apoyo, no el título. */
  .menu-indice-abrir__d{
    flex:1; min-width:0;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
    color:var(--tx-3); letter-spacing:.12em;
  }
  .menu-indice-abrir__d:not(:empty)::before{ content:'· ' }
  .menu-indice-abrir svg{
    flex:none; width:1rem; height:1rem; margin-left:auto;
    transition:transform .3s var(--curva);
  }
  .menu-indice-caja[open] .menu-indice-abrir svg{ transform:rotate(180deg) }

  .menu-indice{
    position:static; max-height:none; overflow:visible;
    padding-right:0; padding-bottom:var(--e5);
  }
  .menu-indice__grupo + .menu-indice__grupo{ margin-top:var(--e5) }
  .menu-indice ul{
    display:flex; flex-wrap:wrap;
    gap:var(--e2) var(--e4);
    margin-top:var(--e2);
  }
  /* Área de toque de 44px sin agrandar la tipografía: el relleno vertical
     hace el trabajo y las filas siguen leyéndose como una lista, no como
     botones. */
  .menu-indice a{ padding-block:.5rem }
}

/* ─── Impresión ───
   La carta impresa es el uso más probable después del QR: alguien del local
   la baja para tenerla en papel. Sobre papel, el negro de la sala es un
   desperdicio de tinta y el dorado sobre blanco no se lee. */
@media print{
  .pagina-carta{ background:#fff; color:#000 }
  .pagina-carta .cabecera,
  .pagina-carta .menu-indice-caja,
  .pagina-carta .menu-indice,
  .pagina-carta .menu-volver,
  .pagina-carta .salto,
  .pagina-carta .cursor{ display:none !important }

  .pagina-carta .menu-pagina{ padding-block:0 }
  .pagina-carta .menu-cols{ display:block }
  .pagina-carta .menu-items{ columns:2 }

  .pagina-carta .menu-cat__nombre,
  .pagina-carta .menu-grupo__titulo{ color:#000 }
  .pagina-carta .menu-item__desc,
  .pagina-carta .menu-precio,
  .pagina-carta .menu-cat__nota,
  .pagina-carta .peque{ color:#333 }
  .pagina-carta .menu-precio--var b{ color:#555 }

  .pagina-carta .menu-cat__cab{ border-bottom-color:#000 }
  .pagina-carta .menu-item{ border-bottom-color:#ddd }

  /* El bloque dorado no sirve en papel de ninguna de las dos maneras: si el
     navegador imprime fondos —casi nunca, hay que pedirlo— es media hoja de
     tinta; si no los imprime, que es lo normal, el combo queda sin nada que lo
     distinga del resto y se pierde justo lo que se quiso destacar. Se cambia
     el relleno por un recuadro, que separa igual y no gasta. Y se saca la
     foto: en una carta impresa es tinta que no informa. */
  .pagina-carta .combo-dia{ padding-block:0 var(--e6) }
  .pagina-carta .combo-dia-caja{
    background:none; color:#000;
    border:1.5pt solid #000;
    break-inside:avoid;
  }
  .pagina-carta .combo-dia-caja .rotulo,
  .pagina-carta .combo-dia-caja .combo-dia-precio{ color:#000 }
  .pagina-carta .combo-dia-caja .combo-dia-desc,
  .pagina-carta .combo-dia-caja .combo-dia-condiciones{ color:#333 }
  .pagina-carta .combo-dia-foto{ display:none }

  /* En papel no hay nada que plegar: una carta impresa con las dieciocho
     categorías cerradas son dieciocho renglones y ni un plato. Se fuerza
     abierto sin depender de que el atributo `open` esté puesto —al imprimir,
     lo normal es que no lo esté—. `::details-content` es la caja que Chrome
     genera para el contenido y la que lleva el `content-visibility:hidden`
     cuando está cerrado; sin destaparla, `display:block` en el <ul> no
     alcanza. Los navegadores que no generan esa caja descartan la regla y no
     la necesitan. */
  .pagina-carta .menu-cat::details-content{
    content-visibility:visible !important;
    block-size:auto !important;
  }
  .pagina-carta .menu-cat > .menu-items{ display:block !important }
  .pagina-carta .menu-cat__flecha,
  .pagina-carta .menu-cat__cuenta,
  .pagina-carta .menu-herr{ display:none }

  /* Un grupo por hoja y ninguna categoría cortada al medio. */
  .pagina-carta .menu-grupo{ break-before:page }
  .pagina-carta .menu-grupo:first-child{ break-before:auto }
  .pagina-carta .menu-cat{ break-inside:avoid }
}


/* ═══ 13. COMBO DEL DÍA (inyectado dinámicamente) ═══════════════════════ */

/* Vive sólo en /carta.html. La portada lo mostró un día —el 31/08/2026— y se
   sacó ese mismo día, pedido por el local: la portada es un recorrido con un
   orden pensado, y una promoción que caduca metida entre dos secciones no es
   una sección más, es un cartel que interrumpe. En la carta encabeza, que es
   donde el visitante ya está eligiendo qué pedir.

   La sección sólo aparece cuando hay un combo activo en Supabase. Si no hay
   dato, no existe en el DOM: no hay placeholder.

   Va con el fondo invertido —dorado, texto negro—, también pedido por el
   local: «que se diferencie del resto». El argumento no es de gusto: el combo
   no es un plato más de la lista, es una oferta que caduca, y hasta entonces
   se veía igual que los otros ciento cuarenta ítems.

   El amarillo no se inventó para la ocasión: es `--oro`, el mismo dorado
   muestreado del letrero encendido del local que ya usan los rótulos y los
   acentos de todo el sitio. Un amarillo nuevo, elegido a ojo por llamativo,
   habría sido el primer color del sitio que no sale del material. */

/* Arriba, cero: `.menu-pagina` ya reserva 112px para la cabecera fija, así que
   el `--aire` de `.seccion` no separaría de nada — empujaría. Abajo alcanza
   con menos que una sección normal, porque el bloque dorado ya se separa solo
   del negro que sigue. */
.menu-pagina > .combo-dia{ padding-block:0 var(--e6) }

/* Banda de ancho completo y baja, no bloque cuadrado: así lo pidió el local el
   31/08/2026 —«que en web tenga el ancho completo»— y el formato se lo banca
   mejor de lo que se lo bancaba el bloque recortado, que dejaba cuatrocientos
   píxeles de dorado vacío entre el texto y la foto. Una franja que cruza la
   página y ocupa poco alto dice «esto es de otra categoría» sin quedarse con
   la primera pantalla: el <h1> «Cocina y barra» ahora entra debajo incluso en
   un teléfono, y esa es la razón de haber achicado tipografía, aire y foto a
   la vez. La página es la carta; el combo la encabeza, no la reemplaza.

   La foto es opcional: sin ella la caja queda con un solo hijo, se comporta
   como el bloque de texto de siempre y no reserva ningún hueco — la misma
   regla que las miniaturas de /carta.html. Por eso el ancho de la foto se
   declara en `.combo-dia-foto` y no como columna de la caja.

   `align-items:center` en vez de `flex-start`: con la foto chica y el texto
   corto, alinear por arriba deja la foto colgando de un borde en vez de
   sentada en la franja. Y de paso no la estira, que es lo que había que evitar
   —es cuadrada y estirarla la recortaría distinto según cuánto escriba el
   local en la descripción—. */
.combo-dia-caja{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--e4) var(--e6);
  background:var(--oro);
  color:var(--noche);
  padding:clamp(1rem,2.2vw,1.75rem) clamp(1.25rem,2.6vw,2.25rem);
}

/* Todo lo de adentro estaba pensado para leerse sobre negro y acá el fondo es
   el color del acento: el rótulo dorado desaparecería contra su propio fondo y
   el precio —que era el único dorado del bloque— dejaría de destacar. Se pasa
   la escala entera al negro de la paleta con alfa, que sobre el dorado da los
   mismos escalones de jerarquía que `--tx`, `--tx-2` y `--tx-3` dan sobre la
   noche. Medido sobre el color compuesto, no sobre el declarado: 10,5:1 el
   titular y el precio, 7,7:1 la descripción, 5,9:1 el rótulo y la letra chica
   de las condiciones. La más apagada sigue por encima del 4,5:1, que es la
   línea entre «discreto» e «ilegible a propósito» — y en este bloque importa
   más que en ningún otro, porque las condiciones son las de una promoción.

   El rótulo empezó en .66 (4,99:1). Pasa el mínimo, pero es el texto más chico
   de la página —11px, versalitas— y a esa medida el mínimo justo no alcanza. */
.combo-dia-caja .rotulo{ color:rgba(11,9,8,.72) }
.combo-dia-caja .combo-dia-desc{ color:rgba(11,9,8,.82) }
.combo-dia-caja .combo-dia-precio{ color:var(--noche) }
.combo-dia-caja .combo-dia-condiciones{ color:rgba(11,9,8,.72) }

/* Sin tope de ancho: el que manda es el de cada párrafo. Así el titular ocupa
   un solo renglón en escritorio —que es la mitad del alto que se ahorra— y la
   descripción y las condiciones siguen cortando en una medida legible en vez
   de cruzar la pantalla entera. */
.combo-dia-int{
  display:flex;
  flex-direction:column;
  gap:var(--e3);
  flex:1 1 20rem;
}
.combo-dia-nombre{
  font-size:clamp(1.25rem,2vw,1.75rem);
  font-variation-settings:'wght' 680,'wdth' 76;
  text-transform:uppercase;
  line-height:1;
  letter-spacing:-.02em;
  margin-top:var(--e2);
}
.combo-dia-desc{
  color:var(--tx-2);
  max-width:56ch;
  font-size:var(--t-chico);
  text-wrap:pretty;
}
.combo-dia-precio{
  font-variation-settings:'wght' 620,'wdth' 92;
  font-variant-numeric:tabular-nums;
  font-size:var(--t-lead);
  color:var(--oro);
}
/* La letra chica de la promoción. Chica de verdad —es la excepción, no el
   argumento— pero no escondida: una condición que no se puede leer no es una
   condición, es una trampa.

   El `gap` de `.combo-dia-int` la separaría igual que a todo lo demás; el
   margen negativo la sube contra el precio, porque la condición pertenece al
   número y no es un párrafo más de la sección. */
.combo-dia-condiciones{
  margin-top:calc(var(--e3) * -1 + var(--e2));
  max-width:56ch;
  font-size:var(--t-micro);
  line-height:1.5;
  color:var(--tx-3);
  text-wrap:pretty;
}

/* La foto va sin recuadro: ni filete, ni fondo, ni caja. Llegó a tenerlos y el
   local los rechazó el 31/08/2026 —«es feo el rectángulo que contiene la
   foto»— y tenía razón por una razón que la medición no alcanzaba a ver: el
   filete existía para que un borde oscuro no se fundiera con la página, y eso
   era cierto cuando el fondo era negro. Con fondo dorado la foto ya se recorta
   sola contra el amarillo, así que el filete no separaba nada — sólo dibujaba
   un marco alrededor de una foto que no lo necesitaba. Se va también el fondo
   de carga: era el relleno de esa misma caja.

   `object-fit:cover` porque el panel no recorta: entra lo que el teléfono
   sacó. Cuadrada en todos los anchos, y eso costó una corrección. Hasta el
   31/08/2026 en el teléfono pasaba a banda de 16/7 a todo el ancho, con el
   argumento de que una foto cuadrada a todo el ancho volvía a ser el bloque
   alto que había que achicar. El argumento era cierto y la solución estaba
   mal, porque las dos mitades fallaban a la vez: `cover` sobre una foto casi
   cuadrada —la de hoy es 1230×1278— recortada a 16/7 tira el 58% del alto, o
   sea que de la hamburguesa quedaba una faja sin pan arriba ni plato abajo; y
   la banda seguía cruzando la pantalla, así que la caja ocupaba el 50% del
   teléfono. Se veía cortada y seguía siendo grande. Lo dijo el local mirándolo
   y la medición le dio la razón en los dos cargos.

   La foto no era el problema: era ponerla en su propio renglón. Al costado del
   texto no cuesta un solo píxel de alto —el bloque de texto siempre es más
   alto que 7rem— y la caja baja del 50% al 39% de la pantalla sin recortar
   nada: conserva el 96% del alto de la foto, igual que en escritorio. Lo que
   se paga es una columna de texto más angosta, y es un precio barato para una
   descripción de tres renglones.

   Por eso acá abajo no hay ninguna regla de foto para el teléfono: el
   `clamp(7rem,13vw,11rem)` ya devuelve 7rem exactos por debajo de los 700px,
   que es justo la medida que se quería. Lo único que hace falta es que la fila
   no se parta, y eso se arregla en el texto, no en la foto. */
.combo-dia-foto{
  flex:0 1 auto;
  width:clamp(7rem,13vw,11rem);
  margin:0 0 0 auto;
}
.combo-dia-foto img{
  display:block;
  width:100%; height:auto;
  aspect-ratio:1; object-fit:cover;
}
/* En el teléfono la caja deja de ser una fila y pasa a rejilla, y la razón es
   una medición: con la foto al costado de *todo*, la columna de texto quedaba
   en 180px y la descripción del combo se estiraba a seis renglones — 142px, el
   43% del alto de la caja. La foto ahorraba 112px de renglón propio y la
   descripción se los devolvía casi enteros.

   La rejilla parte la diferencia. La foto acompaña sólo al rótulo y al título,
   que son cortos y ocupan justo su alto; la descripción, el precio y las
   condiciones cruzan las dos columnas y recuperan el ancho entero, donde la
   misma descripción baja de seis renglones a tres. La caja pasa de 331px a
   264px sin recortar la foto ni esconder una palabra.

   `display:contents` disuelve el div envoltorio para que sus párrafos sean
   celdas de esta rejilla. Es un div sin semántica —no un `<ul>` ni una tabla—,
   así que no se pierde nada en el árbol de accesibilidad; el mismo recurso ya
   se usa en el índice de la carta.

   Las columnas van `1fr auto` y no `1fr 5.5rem` a propósito: la foto es
   opcional y el ancho lo declara ella. Sin foto la segunda columna mide cero y
   lo único que queda es el `column-gap`, que sobre un fondo liso no se ve.
   Con `1fr 5.5rem` quedaría un hueco dorado de 88px esperando una imagen que
   no existe, que es justo lo que la regla de las miniaturas prohíbe. */
@media (max-width:700px){
  .combo-dia-caja{
    display:grid;
    grid-template-columns:1fr auto;
    column-gap:var(--e4);
    row-gap:var(--e2);
    padding:var(--e4);
    align-items:start;
  }
  .combo-dia-int{ display:contents }
  .combo-dia-caja .rotulo{ grid-column:1; grid-row:1 }
  .combo-dia-nombre{
    grid-column:1; grid-row:2;
    margin-top:0;
    font-size:1.0625rem; line-height:1.1;
  }
  .combo-dia-foto{ grid-column:2; grid-row:1 / span 2; width:5.5rem; margin:0 }
  .combo-dia-desc{ grid-column:1 / -1; line-height:1.45 }
  .combo-dia-precio{ grid-column:1 / -1; font-size:1.125rem }
  /* El margen negativo lo puso el `gap` de --e3 del bloque flexible, para
     pegar la condición al precio. Acá el `row-gap` ya es --e2 y todo está a
     8px: restar de nuevo dejaría la letra chica montada sobre el número. */
  .combo-dia-condiciones{ grid-column:1 / -1; margin-top:0; line-height:1.4 }
}


/* ═══ 14. VISITA Y PIE ════════════════════════════════════════════════════ */

.visita-titular{
  font-size:var(--t-colosal);
  font-variation-settings:'wght' 840,'wdth' 64;
  text-transform:uppercase; line-height:.8; letter-spacing:-.035em;
  margin-block:clamp(2.5rem,5vw,5rem) clamp(3rem,6vw,6rem);
}
.visita-cols{
  display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);
  gap:clamp(2.5rem,6vw,7rem); align-items:start;
}
.visita-datos{ border-top:1px solid var(--linea) }
.visita-datos > div{
  display:grid; grid-template-columns:7rem minmax(0,1fr); gap:var(--e4);
  padding-block:var(--e5); border-bottom:1px solid var(--linea-sutil);
}
.visita-datos dt{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:var(--t-micro); letter-spacing:.2em; text-transform:uppercase;
  color:var(--tx-2); padding-top:.3rem;
}
.visita-datos dd{
  font-variation-settings:'wght' 560,'wdth' 88;
  font-size:1.0625rem; line-height:1.45;
}
.visita-datos dd a{
  display:inline-block; padding-block:.3rem;
  border-bottom:1px solid transparent;
  transition:border-color .35s var(--curva), color .35s var(--curva);
}
.visita-datos dd a:hover{ border-bottom-color:var(--oro); color:var(--oro) }
.visita-datos .pendiente{ color:var(--tx-2); font-variation-settings:'wght' 460,'wdth' 92; font-size:var(--t-chico) }

/* Fachada del mapa: el iframe de Google sólo se inyecta si se pide. Cargarlo
   de entrada son ~700 KB y tres dominios de terceros por una imagen que la
   mayoría no mira. */
.mapa{
  position:relative; min-height:24rem; height:100%;
  border:1px solid var(--linea); overflow:hidden; background:var(--carbon);
}

/* La aérea de la fachada, debajo del botón y debajo del iframe. `cover` y no
   `contain`: la caja crece con la columna de datos de al lado, así que su
   proporción no es fija y cualquier ajuste al alto dejaría franjas. El
   recorte de origen ya dejó la foto en 1,85 —cerca de la proporción de la
   caja— para que a `cover` le quede poco que sacar. */
.mapa-foto{
  position:absolute; inset:0; z-index:1;
  width:100%; height:100%; object-fit:cover; object-position:center;
}

/* El velo va en el botón, no en la foto: es tratamiento del control —lo que
   hace legible su propio texto— y no un retoque de la fotografía del cliente,
   que sigue publicándose tal como la entregó. La distinción no es de
   abogados: el archivo de `assets/` no está virado ni oscurecido, y si mañana
   este botón desaparece la foto queda intacta.

   Y va **arriba**, no abajo, que es lo contrario de lo que pedía el instinto.
   El texto estaba al pie de la caja, así que el velo empezaba por abajo — y
   ahí se comía el cartel de SISTONS. No fue una impresión: midiendo los
   píxeles amarillos del recorte, el cartel cae entre el 33% y el 37,5%
   contando desde abajo, y el bloque de texto termina en el 38%. Ocupan la
   misma franja; no hay ajuste del degradado que los haga convivir, porque el
   problema no era el degradado sino de qué lado estaba.

   Dado vuelta se resuelve solo, y encima mejor: el cielo es la zona más clara
   del cuadro (167 de luminancia) y la más vacía — la única que se puede
   oscurecer sin tapar nada—. O sea que lo que había que apagar para que se
   leyera el texto es exactamente lo que sobraba. El cartel arranca al 62,5%
   desde arriba y el velo muere al 52%: diez puntos de aire.

   Va con `--noche` y no con negro puro para que el degradado muera contra el
   color real del fondo de la página y no contra otro negro. */
.mapa-fachada{
  position:absolute; inset:0; z-index:2;
  display:flex; flex-direction:column; align-items:flex-start; justify-content:flex-start;
  gap:var(--e3); padding:var(--e6);
  width:100%; text-align:left; border:0; cursor:pointer;
  background-color:transparent;
  background-image:linear-gradient(to bottom,
    rgba(11,9,8,.95) 0%, rgba(11,9,8,.92) 20%, rgba(11,9,8,.84) 34%,
    rgba(11,9,8,.66) 44%, rgba(11,9,8,.24) 50%, transparent 55%);
  transition:background-color .45s var(--curva);
}
.mapa-fachada:hover{ background-color:rgba(232,180,92,.10) }
.mapa-fachada .dir{
  font-variation-settings:'wght' 700,'wdth' 74;
  text-transform:uppercase; font-size:clamp(1.25rem,2.2vw,1.75rem);
  line-height:1.04; letter-spacing:-.015em;
}
.mapa iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; z-index:3 }

.pie{
  margin-top:clamp(4rem,8vw,8rem); padding-top:var(--e5);
  border-top:1px solid var(--linea);
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:var(--e5);
}
.pie img{ height:1.375rem; width:auto; opacity:.8 }
.pie p{
  font-variation-settings:'wght' 500,'wdth' 90;
  font-size:var(--t-micro); letter-spacing:.16em; text-transform:uppercase; color:var(--tx-2);
}
.pie a:hover{ color:var(--oro) }

/* Dos renglones apoyados contra el borde derecho, frente al logotipo. Cuando
   el pie envuelve en pantalla angosta el bloque pasa a la izquierda: alineado
   a la derecha y solo, se leería como un descuido. */
.pie-texto{ display:grid; gap:.45rem; justify-items:end }
@media (max-width:600px){ .pie-texto{ justify-items:start } }

/* La firma un escalón por debajo del copyright: mismo micro-rótulo, menos
   contraste. El subrayado es fino y separado del texto —no es una llamada a la
   acción, es una firma— y sólo enciende en dorado al pasar por encima, como
   cualquier otro enlace del sitio. */
.pie-firma{ color:var(--tx-3) }
.pie-firma a{
  color:var(--tx-2);
  text-decoration:underline;
  text-decoration-color:var(--linea-oro);
  text-underline-offset:.35em;
  text-decoration-thickness:1px;
  transition:color .3s var(--curva);
}
.pie-firma a:hover{ color:var(--oro) }
.menu-pie .pie-firma{ margin-top:var(--e3) }


/* ═══ 13b. VISOR DE FOTO (zoom.js) ════════════════════════════════════════ */

/* Las fotos ampliables se anuncian con el cursor, que es la única señal que
   no ocupa lugar: en la carta hay noventa miniaturas y un iconito de lupa en
   cada una sería más ruido que las fotos. El puntero grueso no ve nada de
   esto, pero ahí tocar una foto es el gesto natural igual. */
.menu-item__foto[role="button"],
.burgers-plato img[role="button"]{ cursor:zoom-in }

.menu-item__foto[role="button"]:focus-visible,
.burgers-plato img[role="button"]:focus-visible{
  outline:2px solid var(--oro); outline-offset:3px;
}

/* El <dialog> viene con borde, fondo y padding propios del navegador, y con
   `max-width`/`max-height` que hay que soltar para ocupar la pantalla. */
.zoom{
  border:0; padding:0; margin:auto;
  width:100%; height:100%; max-width:100%; max-height:100%;
  background:transparent; overflow:hidden;
}
.zoom::backdrop{ background:rgba(6,5,5,.94) }

.zoom__figura{
  margin:0; height:100%;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:var(--e4); padding:var(--e5);
}

/* `--zoom-tope` lo escribe zoom.js con el ancho real del archivo por 1,6: una
   foto de 400 px no se estira a pantalla completa y una de 1080 sí aprovecha.
   El límite que gane primero es el que manda.

   Va `width` y no `max-width`: una <img> con `width:auto` se planta en su
   tamaño real y no crece nunca, así que el tope no llegaba a aplicarse jamás
   —la miniatura de 400 px se abría a 400 px y la constante sobraba—. Pidiendo
   un ancho, la foto sube hasta donde la dejen los tres límites y ahí para.
   `object-fit:contain` es el seguro: si `max-height` recorta la caja, la foto
   se acomoda dentro en lugar de estirarse. */
.zoom__img{
  width:min(92vw, var(--zoom-tope, 40rem));
  max-height:78vh;
  height:auto;
  object-fit:contain;
}

.zoom__pie{
  max-width:min(92vw, 34rem); text-align:center;
  font-size:var(--t-micro); letter-spacing:.04em;
  color:var(--tx-3); text-wrap:balance;
}

.zoom__cerrar{
  position:absolute; top:var(--e4); right:var(--e4); z-index:1;
  width:2.75rem; height:2.75rem;      /* 44px: el mínimo que se acierta con el pulgar */
  display:grid; place-items:center;
  border:1px solid var(--linea); border-radius:50%;
  background:rgba(11,9,8,.7); color:var(--tx-2);
  cursor:pointer; transition:color .2s, border-color .2s;
}
.zoom__cerrar svg{ width:1.15rem; height:1.15rem }
.zoom__cerrar:hover{ color:var(--tx-1); border-color:var(--oro) }
.zoom__cerrar:focus-visible{ outline:2px solid var(--oro); outline-offset:2px }

/* La página de atrás no se mueve mientras el visor está abierto. En la portada
   además se frena Lenis (ver main.js §2): sin las dos cosas, la rueda sigue
   corriendo el fondo debajo de la foto. */
html.zoom-abierto{ overflow:hidden }

.zoom[open]{ animation:zoom-entra .22s ease-out }
.zoom[open]::backdrop{ animation:zoom-fondo .22s ease-out }
@keyframes zoom-entra{ from{ opacity:0; transform:scale(.97) } to{ opacity:1; transform:none } }
@keyframes zoom-fondo{ from{ opacity:0 } to{ opacity:1 } }

/* Con movimiento reducido el visor aparece y ya. La clase la pone zoom.js;
   la media query cubre el caso de que la preferencia cambie con él abierto. */
.zoom--quieto[open],
.zoom--quieto[open]::backdrop{ animation:none }
@media (prefers-reduced-motion: reduce){
  .zoom[open], .zoom[open]::backdrop{ animation:none }
}


/* ═══ 14. CURSOR ══════════════════════════════════════════════════════════ */

/* Sólo con puntero fino. Un punto que sigue al cursor y se abre en anillo
   sobre lo interactivo — sin texto, sin retardo teatral. */
.cursor{
  position:fixed; top:0; left:0; z-index:500;
  width:8px; height:8px; border-radius:50%;
  background:var(--oro);
  pointer-events:none; opacity:0;
  transform:translate3d(-50%,-50%,0);
  transition:width .35s var(--curva), height .35s var(--curva),
             background-color .35s var(--curva), opacity .3s linear,
             box-shadow .35s var(--curva);
  will-change:transform;
}
.cursor.visible{ opacity:1 }
.cursor.activo{
  width:44px; height:44px;
  background:transparent;
  box-shadow:inset 0 0 0 1px var(--linea-oro);
}


/* ═══ 15. MOVIMIENTO ══════════════════════════════════════════════════════ */

/* Estados iniciales de lo que anima GSAP. Sólo se aplican si el JS realmente
   va a correr (la clase `js` la pone un script en <head> antes del primer
   pintado); si el script falla, no queda medio sitio invisible. */
.js .anim-sube{ opacity:0; transform:translateY(32px) }
.js .anim-aparece{ opacity:0 }
.js .anim-linea{ display:block }
.js .hero-cierre{ opacity:0 }

/* Máscara de revelado por líneas. Necesita aire arriba: con interlínea menor
   a 1 la caja de línea es más baja que los glifos y `overflow:hidden` recorta
   los diacríticos (AÑOS se leería ANOS). El padding da lugar al acento y el
   margen negativo devuelve la maquetación a su sitio. */
.linea{ display:block; overflow:hidden; padding-top:.18em; margin-top:-.18em }
.linea > span{ display:block }


/* ═══ 16. RESPONSIVE ══════════════════════════════════════════════════════ */

@media (max-width:1180px){
  .umbral-cols,.visita-cols{ grid-template-columns:1fr }
  .datos{ border-left:0; padding-left:0; border-top:1px solid var(--linea); padding-top:var(--e5) }
  .carta-cols{ grid-template-columns:1fr }
  .carta-cols h2{ max-width:20ch }

  /* Acá `.visita-cols` deja de ser dos columnas, y la fachada del mapa pierde
     la altura que le prestaba la columna de datos: se quedaba con sus 24rem de
     mínimo y unos 348px de ancho, o sea una caja **vertical** para una foto
     apaisada. `cover` hacía lo único que podía —recortar los costados— y se
     comía la fachada entera: quedaba un trozo de pared sin cartel y sin
     simetría, que es justo lo que hace buena a esta toma.

     Así que en angosto se apila en vez de superponerse: la foto arriba con su
     proporción real y el texto debajo, sobre el fondo sólido de la caja. Sale
     ganando dos veces — la foto se ve entera y el texto deja de necesitar
     velo, porque ya no hay nada detrás—. Es el mismo movimiento que hace toda
     la página en este ancho; la fachada no tenía por qué ser la excepción. */
  .mapa{ min-height:0 }
  .mapa-foto{
    position:relative; inset:auto; z-index:1;
    height:auto; aspect-ratio:1400/756;
  }
  .mapa-fachada{
    position:relative; inset:auto;
    padding:var(--e5) var(--e4);
    background-image:none;
  }
}

@media (max-width:960px){

  /* La nocturna pasa debajo del texto y sangra por los dos lados. Con los dos
     bordes verticales fuera de pantalla, la máscara horizontal deja de hacer
     falta: recortaría el letrero sin ganar nada. */
  .experiencia-int{
    grid-template-columns:1fr;
    gap:clamp(2rem,6vw,3rem);
    padding-left:var(--marco); padding-right:var(--marco);
  }
  .experiencia-foto{
    margin-inline:calc(-1 * max(var(--marco), var(--marco) + (100vw - var(--ancho)) / 2));
  }
  .experiencia-foto picture{
    -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 9%,#000 89%,transparent 100%);
    -webkit-mask-composite:source-over;
    mask-image:linear-gradient(180deg,transparent 0,#000 9%,#000 89%,transparent 100%);
    mask-composite:add;
  }
}

@media (max-width:860px){
  :root{ --cabecera:4rem }

  /* En vertical la escena se mantiene —una hamburguesa por vez sigue siendo
     lo que hace distinta a la sección— pero se reordena: el índice pasa a una
     tira horizontal arriba, la foto queda arriba del texto y ocupa casi todo
     el ancho. Nada de recorrido lateral ni de arrastrar con el dedo. */
  /* 58.75svh por ítem (470/8), mismo cálculo que el desktop en CSS §8. */
  .burgers{ height:calc(var(--burgers-n, 8) * 58.75svh) }
  /* En vertical el plano se corre arriba y se achica: acá el texto ocupa la
     mitad inferior de la pantalla y cualquier línea por detrás lo ensucia.
     Baja también de tono —a este tamaño las líneas se juntan y el conjunto
     pesa más que en escritorio. */
  .burgers-plano{
    top:14%; right:-62%;
    width:min(58vh, 21rem);
    color:rgba(232,180,92,.03);
  }
  .burgers-escena::before{
    background:radial-gradient(64% 32% at 50% 34%, rgba(232,180,92,.055), transparent 72%);
  }
  .burgers-marco{
    grid-template-columns:1fr;
    gap:clamp(1.25rem,4vw,2rem);
    align-content:center;
  }
  .burgers-indice{ padding-left:0; padding-top:var(--e3) }
  .burgers-indice::before{ left:0; right:0; top:0; bottom:auto; width:auto; height:1px }
  .burgers-progreso{ left:0; right:0; top:0; bottom:auto; width:auto; height:1px }
  .burgers-progreso i{ transform:scaleX(0); transform-origin:left }
  .burgers-indice ol{ display:flex; flex-wrap:wrap; gap:.25rem 1rem }
  .burgers-indice li + li{ margin-top:0 }
  .burgers-salto .t{ display:none }
  .burgers-item{
    grid-template-columns:1fr;
    gap:clamp(1rem,3vw,1.5rem);
  }
  .burgers-ficha{ order:2 }
  .burgers-plato{ order:1; width:min(74vw,22rem); justify-self:center }
  .burgers-nombre{ font-size:clamp(2rem,9vw,3rem) }
  .burgers-ing{ max-width:none }

  .nav{
    position:fixed; inset:0 0 auto 0;
    flex-direction:column; align-items:stretch; gap:0;
    padding:calc(var(--cabecera) + 1.5rem) var(--marco) var(--e6);
    background:rgba(11,9,8,.98);
    backdrop-filter:blur(20px); -webkit-backdrop-filter:blur(20px);
    border-bottom:1px solid var(--linea);
    transform:translateY(-101%);
    transition:transform .6s var(--curva);
  }
  body.menu-abierto .nav{ transform:none }
  .nav a{
    padding-block:var(--e4);
    font-size:1.375rem;
    font-variation-settings:'wght' 680,'wdth' 74;
    letter-spacing:-.01em; color:var(--tx);
    border-bottom:1px solid var(--linea-sutil);
  }
  .nav a::after{ display:none }
  .hamburguesa{ display:flex }

  /* En vertical la secuencia va arriba y el rail debajo: es el orden natural
     del DOM, sin `order` ni `column-reverse` peleándose entre sí. */
  .hero{ height:460svh }
  .hero-fijo{
    grid-template-columns:1fr;
    grid-template-rows:minmax(0,1fr) auto;
    align-content:center;
    padding-top:var(--cabecera);
  }
  /* En vertical el lienzo sangra hasta los bordes del viewport: el corte
     lateral coincide con el borde de la pantalla, que no se lee como el
     límite de una imagen sino como que el plato sigue fuera de cuadro. Por
     eso acá no va máscara horizontal — recortaría el pan, que llega hasta el
     borde.

     El pie lleva la misma curva que en escritorio pero más larga: en una
     pantalla angosta el recuadro se delata mucho más fácil, y la tabla tiene
     que perderse del todo antes de llegar al canto. */
  .hero-lienzo{
    grid-column:1; grid-row:1;
    width:100%;
    -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 6%,#000 74%,
      rgba(0,0,0,.95) 82%, rgba(0,0,0,.82) 87%, rgba(0,0,0,.6) 91%,
      rgba(0,0,0,.38) 94.5%, rgba(0,0,0,.19) 97%, rgba(0,0,0,.06) 99%,
      transparent 100%);
    -webkit-mask-composite:source-over;
    mask-image:linear-gradient(180deg,transparent 0,#000 6%,#000 74%,
      rgba(0,0,0,.95) 82%, rgba(0,0,0,.82) 87%, rgba(0,0,0,.6) 91%,
      rgba(0,0,0,.38) 94.5%, rgba(0,0,0,.19) 97%, rgba(0,0,0,.06) 99%,
      transparent 100%);
    mask-composite:add;
  }
  /* En vertical la luz de ambiente se centra y se abre: es lo que llena de
     atmósfera el negro que queda arriba y abajo del cuadro, en vez de dejarlo
     plano. */
  .hero-halo{
    opacity:.34;
    filter:blur(56px) saturate(1.1);
    -webkit-mask-image:radial-gradient(160% 115% at 50% 44%, #000 0%, #000 18%, transparent 98%);
    mask-image:radial-gradient(160% 115% at 50% 44%, #000 0%, #000 18%, transparent 98%);
  }

  .hero-rail{
    grid-column:1; grid-row:2;
    padding-inline:var(--marco);
    padding-bottom:clamp(2rem,7vh,4rem);
    gap:var(--e5);
  }
  .hero-nombres{ min-height:3.25rem }
  .hero-pista{ display:none }
  .hero-cierre{ padding-bottom:clamp(1.5rem,5vh,3rem) }

  .burger{ grid-template-columns:2.5rem minmax(0,1fr); row-gap:var(--e3) }
  .burger .precios{ grid-column:2; gap:var(--e4) }

  .visita-datos > div{ grid-template-columns:1fr; gap:var(--e2) }
  .pie{ flex-direction:column; align-items:flex-start }

  /* En vertical la bandeja pasa a sangre completa y el brindis se monta
     encima, con su borde izquierdo también fuera de pantalla. Así la pieza
     chica no deja ningún canto contra el negro: los que tiene caen sobre la
     otra fotografía o fuera del viewport. */
  .barra-int{
    grid-template-columns:1fr;
    gap:clamp(2.5rem,7vw,3.5rem);
    padding-left:var(--marco); padding-right:var(--marco);
  }
  .barra-composicion{
    margin-inline:calc(-1 * max(var(--marco), var(--marco) + (100vw - var(--ancho)) / 2));
  }
  /* La bandeja va a sangre por los dos lados —sus cantos verticales caen
     fuera de la pantalla— y el brindis se monta encima, entrando desde el
     borde izquierdo. Con eso la pieza chica no deja ni un canto contra el
     negro: el derecho apoya sobre la bandeja, el izquierdo se va de pantalla
     y el pie se funde solo. */
  .barra-foto--principal{ grid-area:1 / 1 / 2 / 13 }
  .barra-foto--contrapunto{
    grid-area:1 / 1 / 2 / 11;
    margin-bottom:clamp(-3rem,-7vw,-1.5rem);
  }



}

/* La tira arrastrable con el dedo era, hasta el 31/08/2026, lo que pasaba en
   todo lo que midiera menos de 861px. Ya no: ahí el recorrido es el mismo que
   en escritorio (ver `.galeria` en el bloque de más abajo y el comentario de
   `recorridoHorizontal` en main.js). Queda sólo para movimiento reducido, que
   es el único caso en el que no se puede mover nada solo y aun así hay que
   poder llegar a las cinco fotos. En ese caso la sección vuelve a alto
   automático: sin recorrido animado, una sección de 245svh sería scroll vacío.

   `padding-top:0`: acá el interior deja de estar fijado y la cabecera ya no se
   le monta encima, así que el hueco que la esquivaba sobra. */
@media (prefers-reduced-motion:reduce){
  .galeria{ height:auto; padding-block:var(--aire) }
  .galeria-int{ position:static; height:auto; overflow:visible; padding-top:0 }
  .galeria-pista{
    overflow-x:auto;
    scroll-snap-type:x proximity;
    padding-right:var(--marco); padding-bottom:var(--e4);
    scrollbar-width:none;
  }
  .galeria-pista::-webkit-scrollbar{ display:none }
  .galeria-pieza{ scroll-snap-align:center }
}

/* El alto de la sección es el combustible del recorrido, y en vertical hace
   falta más que los 175svh de escritorio: la pantalla es mucho más angosta, de
   modo que la misma tira tiene más camino que hacer para terminar de pasar.

   245svh no es a ojo. El scroll disponible es el alto de la sección menos la
   pantalla fijada, o sea 145svh, y lo que hay que igualar es el recorrido de
   la tira. Medido con `scripts/galeria-scroll.mjs` a lo ancho de la banda —la
   columna que importa es la última, scroll dividido recorrido: 1,0 es la tira
   avanzando píxel a píxel con el dedo—:

       360 × 780    tira 1453   recorrido 1125   scroll 1131   1,005
       390 × 844    tira 1566   recorrido 1208   scroll 1224   1,013
       430 × 932    tira 1721   recorrido 1323   scroll 1351   1,021
       768 × 1024   tira 2258   recorrido 1522   scroll 1485   0,976
       834 × 1112   tira 2289   recorrido 1487   scroll 1612   1,084

   Ninguno se va más de un 8% de 1,0, y el peor es el más ancho, donde la tira
   queda apenas lenta. De referencia, escritorio a 1440×900 da 1,018: la banda
   entera se comporta como la sensación que había que copiar.

   Sale tan parejo porque el ancho de cada foto se fija en `vh` y no en `vw`:
   al cambiar el alto de la pantalla, tira y scroll crecen juntos. Lo que sí lo
   mueve es el ancho, y por eso están medidos los dos extremos. */
@media (max-width:860px) and (prefers-reduced-motion:no-preference){
  .galeria{ height:245svh }
}

@media (max-width:860px){
  /* En vertical no hay recorrido horizontal: el bloque se apila y el vídeo
     sangra un poco más ancho que la pantalla para tener presencia sin quedar
     en una tira fina —el plano es muy apaisado y a 100vw daría 200 px de
     alto—. Lo que se recorta a los lados son las latas de los extremos, que
     el encuadre original ya cortaba. */
  .minga{ height:auto; padding-block:var(--aire) }
  .minga-int{ position:static; height:auto; display:block; overflow:hidden }
  .minga-pista{
    display:block;
    padding-inline:var(--marco);
    will-change:auto;
  }
  .minga-texto{ width:auto }
  .minga-video{
    width:128vw;
    margin-inline:calc(50% - 64vw);
    margin-top:clamp(2rem,7vw,3rem);
  }
  /* En vertical los cantos laterales del vídeo caen fuera de la pantalla, así
     que el fundido horizontal no tiene nada que resolver y sólo comería
     imagen. Queda el del pie. */
  .minga-video video{
    -webkit-mask-image:linear-gradient(180deg,#000 0,#000 88%,transparent 100%);
    -webkit-mask-composite:source-over;
    mask-image:linear-gradient(180deg,#000 0,#000 88%,transparent 100%);
    mask-composite:add;
  }
}

@media (max-width:600px){
  /* En el teléfono la pieza alta llega a unos 330 px de ancho sobre 390 de
     pantalla: casi toda, con el canto de la siguiente asomando, que es lo que
     hace entender que la tira se arrastra con el dedo. */
  .galeria-foto{ height:54vh; max-width:86vw }
  .galeria-pieza:nth-child(even) .galeria-foto{ height:43vh }
}

/* Movimiento reducido: se anula todo y se fuerzan los estados finales.
   Nadie pierde contenido por pedir menos movimiento. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important; animation-iteration-count:1 !important;
    transition-duration:.01ms !important; scroll-behavior:auto !important;
  }
  .js .anim-sube,.js .anim-aparece,.js .hero-cierre{ opacity:1 !important; transform:none !important }
  .hero-pista{ display:none }
  .cursor{ display:none }
}
