/* ═══════════════════════════════════════════════════════════════════
   Cabañas Los Reales de los Siete Lagos · Licán Ray
   Demo de presentación — tanda T1 (alojamiento)

   IDENTIDAD — de dónde sale y de qué se aparta
   ──────────────────────────────────────────────────────────────────
   Papel, no pantalla. Blanco cálido y crema con la tinta casi negra,
   y el negro pleno guardado para dos sitios: la barra de arriba y el
   cierre de la propuesta. Ese salto —papel en casi todo, negro en los
   extremos— es lo que le da el aire de impreso, y es también lo que
   deja que el color lo pongan las fotos y no la interfaz.

   La versión anterior era al revés: azules profundos de lago con
   dorado, fondo oscuro. Se veía bien en escritorio y pesada en el
   teléfono, que es donde se va a abrir este enlace.

   · El acento sobre papel es un BRONCE oscuro, no un dorado claro: a
     4,5:1 sobre crema, un dorado claro no llega ni de cerca. El dorado
     claro existe igual, pero sólo vive sobre la barra negra.
   · Los siete lagos siguen siendo siete azules, y sobre papel funcionan
     mejor que antes: son bandas de color contra el crema, no tonos
     apenas distinguibles entre sí sobre un fondo oscuro. Vuelven en el
     horizonte de la portada y en el friso del entorno.
   · El morado del logo del negocio entra como color de marca en el
     pavo real y en el logo del pie. No es de la paleta: es suyo.

   El verde de la página NO es un color declarado: es el del bosque de
   sus propias fotos, que asoma porque el velo del fondo está abierto.
   La diferencia importa para no pisarse con Prado Verde.

   Se aparta a propósito de sus demos hermanas:
   Prado Verde es verde-hueso de prado con acento naranjo brasa, y su
   pieza central es el plano del terreno. Las dos son claras ahora, pero
   ninguna comparte color: acá el papel es neutro cálido, el acento es
   bronce y el peso lo lleva el negro. Los Copihues llevará rojo copihue
   sobre bosque húmedo: tampoco hay rojo acá.

   TIPOGRAFÍA — por qué este par
   ──────────────────────────────────────────────────────────────────
   · Newsreader (display) es una serif editorial de tamaño óptico
     variable, hecha para leerse en pantalla. Le da al sitio aire de
     documento impreso —que es justo lo que pide una pieza que se
     llama "La cuenta clara"— sin caer en la serif de hotel de lujo.
   · Public Sans (texto) es una grotesca neutra de aperturas abiertas,
     diseñada para formularios y datos. No compite con la serif: la
     deja hablar y aguanta párrafos largos en gris claro.
   · DM Mono (dato) para cifras, kilómetros y las boletas. Monoespaciada
     de trazo fino: alinea columnas de pesos sin verse de terminal.
   Ninguna de las tres se repite en los proyectos anteriores de Yordy
   ni en las otras demos.
   ═══════════════════════════════════════════════════════════════════ */

:root{
  /* superficie — papel, no pantalla
     La página es clara: blanco cálido y crema, con la tinta casi negra.
     El negro se guarda para dos sitios donde manda de verdad: la barra
     de arriba y el cierre de la propuesta. Ese salto —papel casi todo,
     negro en los extremos— es lo que le da el aire de impreso. */
  --papel:  #FCFAF6;       /* el fondo del sitio */
  --crema:  #F4EFE6;       /* secciones alternas */
  --nata:   #FFFFFF;       /* tarjetas */
  --nata-2: #FAF4E8;       /* tarjeta destacada y realce al pasar el cursor */
  --linea:  #E4DCCC;
  --noche:  #16150F;       /* la barra de arriba y el cierre */

  /* tinta */
  --tinta:  #23211C;       /* texto */
  --humo:   #5C574D;       /* texto secundario */

  /* acentos
     Dos dorados y no uno: sobre papel, un dorado claro no llega a 4,5:1
     ni de cerca —lo dice el propio encargo—, así que el que va sobre
     claro es un bronce oscuro. El claro se guarda para la barra negra,
     donde sí funciona. Medidos los dos. */
  --bronce: #7A5C1C;       /* acento sobre papel: 5,9:1 */
  --dorado-claro: #D8B463; /* acento sobre la barra negra: 9,3:1 */
  --marca:  #4E4B67;       /* el morado del logo del negocio */
  --merma:  #A63D22;       /* ladrillo: sólo donde hay una pérdida */

  /* los siete lagos, del más cercano al más lejano */
  --lago-1: #2E6E86;   /* Calafquén */
  --lago-2: #2A6178;   /* Pullinque */
  --lago-3: #26556A;   /* Pellaifa */
  --lago-4: #22495C;   /* Panguipulli */
  --lago-5: #1E3D4E;   /* Neltume */
  --lago-6: #1A3140;   /* Riñihue */
  --lago-7: #162632;   /* Pirihueico */

  /* tipografía */
  --display: "Newsreader", Georgia, "Times New Roman", serif;
  --cuerpo:  "Public Sans", "Segoe UI", system-ui, sans-serif;
  --dato:    "DM Mono", ui-monospace, "Consolas", monospace;

  /* medidas */
  --ancho: 1120px;
  --radio: 10px;
  --borde: 1px solid var(--linea);

  /* fondo de la sección actual: lo usa la etiqueta "ejemplo" para
     recortar el borde punteado sin que se le note el parche */
  --fondo-local: var(--papel);
}

/* ── base ────────────────────────────────────────────────────────── */
*,*::before,*::after{ box-sizing:border-box; }
[hidden]{ display:none !important; }

html{
  /* Sin esta línea el navegador dibuja los controles nativos en claro:
     la barra de scroll sale blanca y el selector de fecha del
     formulario queda con fondo blanco y letra clara, ilegible. */
  color-scheme:light;
  scroll-behavior:smooth;
  -webkit-text-size-adjust:100%;
}

body{
  margin:0;
  background:var(--papel);
  color:var(--tinta);
  font-family:var(--cuerpo);
  font-size:clamp(1rem, .96rem + .2vw, 1.075rem);
  line-height:1.62;
  -webkit-font-smoothing:antialiased;
  /* el <meta viewport> lleva viewport-fit=cover: sin esto el contenido
     se mete bajo la muesca y bajo la barra de gestos del iPhone */
  padding-inline:env(safe-area-inset-left) env(safe-area-inset-right);
  padding-bottom:env(safe-area-inset-bottom);
  overflow-x:hidden;
}

h1,h2,h3{
  font-family:var(--display);
  font-weight:500;
  line-height:1.1;
  letter-spacing:-.012em;
  margin:0;
  text-wrap:balance;
}

p{ margin:0 0 1em; text-wrap:pretty; }
p:last-child{ margin-bottom:0; }

a{ color:inherit; }
a,button,input,select,textarea,label,summary{ touch-action:manipulation; }

img,svg{ max-width:100%; }

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

.saltar{
  position:absolute; left:-9999px; top:0; z-index:200;
  background:var(--noche); color:var(--papel);
  padding:.8rem 1.2rem; font-weight:700; text-decoration:none;
  border-radius:6px;
}
.saltar:focus{ left:1rem; top:1rem; }

.caja{ width:min(100% - 2.5rem, var(--ancho)); margin-inline:auto; }

.ojo{
  font-family:var(--dato);
  font-size:.72rem;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--humo);
  margin:0 0 1rem;
}
.ojo--dorado{ color:var(--bronce); }

/* ── marcador de dato de ejemplo ─────────────────────────────────
   Todo lo que lleva .ej es relleno. Se ve a simple vista para poder
   decir en la reunión "esto se completa con sus datos reales", y se
   borra junto con la clase cuando el dato llega.                    */
.ej{
  position:relative;
  outline:1px dashed color-mix(in srgb, var(--merma) 55%, transparent);
  outline-offset:10px;
  border-radius:2px;
}
.ej::after{
  content:"ejemplo";
  position:absolute; top:-10px; right:-10px;
  transform:translateY(-100%);
  font-family:var(--dato); font-size:.62rem; letter-spacing:.12em;
  text-transform:uppercase;
  color:var(--merma);
  background:var(--fondo-local);
  padding:0 .4rem;
  pointer-events:none;
}
.ej--inline{
  display:inline; outline-offset:3px; color:var(--merma);
  font-weight:600;
}
.ej--inline::after{ content:none; }

/* ── banda de propuesta ──────────────────────────────────────────── */
.propuesta{ background:#0C0C08; color:var(--papel); }
.propuesta__cinta{
  width:min(100% - 2.5rem, var(--ancho));
  margin-inline:auto;
  display:flex; flex-wrap:wrap; align-items:center; gap:.5rem 1.1rem;
  padding:.7rem 0;
  font-size:.86rem;
}
.propuesta__marca{
  font-family:var(--dato); font-size:.68rem;
  letter-spacing:.14em; text-transform:uppercase;
  color:var(--noche); background:var(--dorado-claro);
  padding:.28rem .6rem; border-radius:3px;
  white-space:nowrap;
}
.propuesta__txt{ margin:0; flex:1 1 22rem; color:color-mix(in srgb,var(--papel) 82%, transparent); }
.propuesta__txt strong{ color:var(--papel); }
.propuesta__txt code{ font-family:var(--dato); font-size:.9em; color:var(--dorado-claro); }
.propuesta__link{
  font-weight:600; color:var(--dorado-claro);
  text-underline-offset:4px; white-space:nowrap;
  /* medido: sin esto quedaba en 22 px de alto y es lo primero que se
     toca en el teléfono */
  display:inline-flex; align-items:center; min-height:44px;
}

/* ── barra de arriba ─────────────────────────────────────────────
   Negra y de borde a borde. La versión anterior era una isla flotante
   con esquinas redondeadas y sombra; en el teléfono se partía en dos
   filas, ocupaba 116 px y se veía como un cajón puesto encima de la
   página. Ahora es una franja sólida, sin bordes ni sombra, que corta
   el papel de un lado a otro: sobre una paleta clara ese contraste es
   todo el efecto que hace falta.

   Sigue en position:sticky y no fixed: sticky conserva su hueco en el
   flujo, así la banda de propuesta no le queda debajo ni hay que
   compensar con padding en el body.                                 */
.cabecera{
  position:sticky; top:0; z-index:100;
  background:var(--noche);
  color:var(--papel);
  transition:box-shadow .35s ease;
}
/* al despegar del tope se le nota el peso, nada más */
.cabecera--pegada{ box-shadow:0 10px 30px -18px rgba(0,0,0,.55); }
.cabecera__caja{
  position:relative;
  width:min(100% - 2.5rem, var(--ancho));
  margin-inline:auto;
  display:flex; align-items:center; justify-content:space-between;
  gap:1rem; padding:.7rem 0;
  transition:padding .3s ease;
}
.cabecera--pegada .cabecera__caja{ padding-block:.5rem; }

/* avance de lectura: cero JavaScript, se engancha al scroll de la raíz */
.cabecera__avance{
  position:absolute; left:0; right:0; bottom:-1px; height:2px;
  transform-origin:0 50%; transform:scaleX(0);
  background:var(--dorado-claro);
  opacity:0; transition:opacity .3s ease;
}
.cabecera--pegada .cabecera__avance{ opacity:1; }
@supports (animation-timeline:scroll()){
  .cabecera__avance{
    animation:avanzar linear both;
    animation-timeline:scroll(root block);
  }
}
@keyframes avanzar{ from{ transform:scaleX(0); } to{ transform:scaleX(1); } }
.marca{
  display:flex; align-items:center; gap:.65rem; text-decoration:none;
  color:var(--papel); min-height:44px;
}
/* El pavo real es la marca de verdad del negocio: sale de su logo, con el
   fondo morado quitado y recortado al contenido. Va la versión clara,
   porque la barra es negra; en el pie va la oscura sobre papel. Su rosa
   original no se usa en ninguna de las dos: no se lee sobre ninguno de
   los dos fondos. */
.marca__pavo{
  width:auto; height:32px; flex:none;
  transition:transform .45s cubic-bezier(.22,.8,.3,1);
}
.marca:hover .marca__pavo{ transform:scale(1.09) rotate(-3deg); }
.marca__txt{
  font-family:var(--display); font-weight:600; font-size:1.12rem;
  line-height:1.05; color:var(--papel);
  display:flex; flex-direction:column;
}
.marca__txt small{
  font-family:var(--dato); font-weight:400; font-size:.6rem;
  letter-spacing:.13em; text-transform:uppercase;
  color:color-mix(in srgb, var(--papel) 62%, transparent);
  margin-top:.22rem;
}
.nav{ position:relative; display:flex; align-items:center; gap:.15rem; flex-wrap:wrap; }
.nav a{
  position:relative; z-index:1;
  text-decoration:none; font-size:.88rem; font-weight:500;
  padding:.5rem .7rem; border-radius:999px;
  color:color-mix(in srgb, var(--papel) 72%, transparent);
  transition:color .25s ease;
}
.nav a:hover{ color:var(--papel); }
.nav a[aria-current="true"]{ color:var(--dorado-claro); }

/* La pastilla se desliza de un enlace a otro en vez de que cada uno
   encienda su propio fondo. main.js le pasa posición y ancho; sin
   script se queda en opacidad 0 y no estorba. */
.nav__pastilla{
  position:absolute; left:0; top:50%; z-index:0;
  height:2.05rem; width:0; margin-top:-1.02rem;
  border-radius:999px;
  background:color-mix(in srgb, var(--dorado-claro) 16%, transparent);
  border:1px solid color-mix(in srgb, var(--dorado-claro) 30%, transparent);
  opacity:0; pointer-events:none;
  transition:transform .42s cubic-bezier(.22,.8,.3,1),
             width .42s cubic-bezier(.22,.8,.3,1),
             opacity .25s ease;
}
/* En la barra negra el botón va claro: es el único elemento de papel
   sobre el negro, y por eso se ve antes que cualquier otra cosa. */
.nav__cta{
  background:var(--papel); color:var(--noche) !important;
  font-weight:700; border-radius:999px; padding:.5rem 1.05rem;
  transition:background-color .25s ease, transform .25s ease;
}
.nav__cta:hover{
  background:var(--dorado-claro); color:var(--noche) !important;
  transform:translateY(-1px);
}

/* ── botones ─────────────────────────────────────────────────────── */
.boton{
  display:inline-block;
  font-family:var(--cuerpo); font-weight:600; font-size:.95rem;
  padding:.82rem 1.4rem; border:1px solid transparent; border-radius:7px;
  text-decoration:none; cursor:pointer; text-align:center;
  transition:transform .16s ease, background-color .16s ease, color .16s ease, border-color .16s ease;
}
.boton:hover{ transform:translateY(-2px); }
/* el botón principal es negro sobre papel: sobre una paleta clara no
   hay acento que pese más que el negro */
.boton--dorado{ background:var(--noche); color:var(--papel); border-color:var(--noche); }
.boton--dorado:hover{ background:var(--tinta); border-color:var(--tinta); }
.boton--linea{ border-color:var(--tinta); color:var(--tinta); background:transparent; }
.boton--linea:hover{ background:var(--tinta); color:var(--papel); }

/* ── fotografías ─────────────────────────────────────────────────
   Las fotos son del negocio. Van dentro de un marco con esquinas
   redondeadas y overflow oculto, y la imagen las llena con object-fit
   para que la proporción del marco mande sobre la del archivo: así una
   foto vertical y una horizontal pueden convivir en la misma fila sin
   que ninguna se deforme.
   Todas llevan width/height en el HTML —aunque el CSS después las
   estire— porque es lo que le permite al navegador reservar el hueco
   antes de bajarlas y no dar el salto de maquetado al cargar.        */
.foto{
  position:relative; margin:0;
  border-radius:var(--radio); overflow:hidden;
  background:var(--nata); border:var(--borde);
}
.foto img{
  display:block; width:100%; height:100%;
  aspect-ratio:4/3; object-fit:cover;
  transition:transform .7s cubic-bezier(.22,.8,.3,1);
}
.foto--alta img{ aspect-ratio:3/4; }
.foto:hover img{ transform:scale(1.045); }
/* El velo del pie de foto llega casi opaco hasta el 55 % de su alto, que
   es donde cae el renglón de texto, y recién ahí se disuelve. Con un
   degradado que se aclarara antes, una foto de cielo quemado detrás —hay
   dos— dejaría el texto por debajo de 4,5:1 y no habría forma de saberlo
   midiendo el CSS: el fondo sería la fotografía. */
.foto figcaption{
  position:absolute; left:0; right:0; bottom:0;
  padding:2rem .9rem .75rem;
  font-family:var(--dato); font-size:.72rem; letter-spacing:.06em;
  color:var(--papel);
  background:linear-gradient(to top,
    rgba(6,15,21,.95) 0%, rgba(6,15,21,.95) 55%,
    rgba(6,15,21,.55) 78%, transparent 100%);
}

/* ── portada a sangre ────────────────────────────────────────────
   La aérea ocupa la primera plana entera y va SIN desenfocar: es la
   foto que explica de una sola vez qué es este lugar, y encerrada en
   una tarjeta no lo hacía.

   El velo no es parejo. Se cierra donde vive el texto y se abre donde
   la foto tiene que verse limpia — vertical en el teléfono (foto
   arriba, texto abajo) y horizontal en escritorio (texto a la
   izquierda, foto a la derecha).

   Los porcentajes están medidos, no elegidos a ojo. Sobre una foto
   NÍTIDA el peor punto posible es negro puro, así que en la franja
   donde cae el texto el velo no puede bajar del 92 %: ahí el bronce
   —el color más flojo sobre papel— da 4,9:1 y el texto
   secundario 5,5:1. Ojo: con la paleta clara el peor punto ya no es el
   pixel más CLARO de la foto sino el más OSCURO, que es el que arrastra
   el fondo hacia abajo. Del 60 % en adelante ya no hay texto y el velo
   se suelta hasta casi nada.                                        */
.portada{
  position:relative; isolation:isolate; overflow:hidden;
  min-height:min(100svh, 780px);
  display:flex; flex-direction:column; justify-content:flex-end;
  /* En el teléfono el texto ocupa casi todo el alto, así que el aire de
     arriba es lo único que deja ver la foto: 40svh de padding son ~325 px
     de fotografía limpia antes del título. */
  padding-top:40svh;
}
.portada__foto{
  position:absolute; inset:0; z-index:-2;
  width:100%; height:100%;
  object-fit:cover; object-position:center 45%;
}
.portada__velo{
  position:absolute; inset:0; z-index:-1; pointer-events:none;
  /* Móvil: la foto respira arriba y el texto se apoya abajo. El corte del
     88 % está en el 76 % medido desde abajo porque ahí es donde empieza
     de verdad el bloque de texto —con el padding-top de 40svh—, no donde
     quedaría bonito. Con el corte en el 52 %, que fue el primer intento,
     el título y la bajada quedaban sobre foto sin velo suficiente: el
     texto llega hasta el 73 % del alto de la portada. */
  background:linear-gradient(to top,
    var(--papel) 0%,
    var(--papel) 58%,
    color-mix(in srgb, var(--papel) 92%, transparent) 80%,
    color-mix(in srgb, var(--papel) 40%, transparent) 91%,
    color-mix(in srgb, var(--papel) 10%, transparent) 100%);
}
.portada__caja{
  position:relative;
  width:min(100% - 2.5rem, var(--ancho));
  margin-inline:auto;
  padding-bottom:clamp(3rem,7vw,5rem);
}
.portada__texto{ max-width:34rem; }
.portada__titulo{
  font-size:clamp(2.2rem, 1.1rem + 3.6vw, 3.6rem);
  margin-bottom:1.4rem;
  max-width:16ch;
}
.portada__bajada{
  font-size:clamp(1.05rem,1rem + .35vw,1.22rem);
  color:var(--humo); max-width:56ch; margin-bottom:2.2rem;
}
.portada__acciones{ display:flex; flex-wrap:wrap; gap:.75rem; margin-bottom:3.2rem; }

.credenciales{
  display:flex; flex-wrap:wrap; gap:1.2rem 2rem;
  margin:0; padding-top:1.6rem; border-top:var(--borde);
}
.credenciales__item{ min-width:0; }
.credenciales dt{
  font-family:var(--dato); font-size:.66rem; letter-spacing:.14em;
  text-transform:uppercase; color:var(--humo); margin-bottom:.4rem;
}
.credenciales dd{ margin:0; display:flex; align-items:baseline; gap:.55rem; }
.credenciales dd strong{
  font-family:var(--display); font-weight:600; font-size:1.7rem;
  color:var(--bronce); line-height:1;
}
.credenciales dd span{ font-size:.85rem; color:var(--humo); }

/* Horizonte de los siete lagos. Dibujado, no fotografiado: este negocio
   no tiene material visual público, así que la portada se sostiene sola. */
.horizonte{ line-height:0; }
.horizonte svg{ display:block; width:100%; height:clamp(140px,20vw,240px); }
.horizonte__cielo{ fill:var(--papel); }
.horizonte__cordon{ fill:var(--lago-6); }
.horizonte__volcan{ fill:var(--lago-7); }
.horizonte__nieve{ fill:var(--papel); }
.horizonte__agua--7{ fill:var(--lago-7); }
.horizonte__agua--6{ fill:var(--lago-6); }
.horizonte__agua--5{ fill:var(--lago-5); }
.horizonte__agua--4{ fill:var(--lago-4); }
.horizonte__agua--3{ fill:var(--lago-3); }
.horizonte__agua--2{ fill:var(--lago-2); }
.horizonte__agua--1{ fill:var(--lago-1); }

/* ── secciones ───────────────────────────────────────────────────── */
.seccion{
  position:relative; isolation:isolate; overflow:hidden;
  padding:clamp(3.5rem,8vw,6rem) 0;
  /* la isla flota encima: sin este margen el título de la sección
     aterriza tapado al tocar un enlace del menú */
  scroll-margin-top:6.5rem;
  --amb:none;
}
.cuenta,.tarifas,.lagos,.reservar{ background:var(--crema); --fondo-local:var(--crema); }
.cabanas,.incluye,.llegar{ background:var(--papel); --fondo-local:var(--papel); }

/* ── ambiente: las mismas fotos, difuminadas, detrás de todo ──────
   Cada sección lleva de fondo una foto del propio negocio, desenfocada
   hasta que no queda nada legible: sólo manchas de color —el turquesa
   del agua, el verde del bosque, la madera— que le sacan a la página el
   aire de documento.

   Son las MISMAS URL que ya usa el contenido más abajo, así que el
   navegador las tiene en caché y el ambiente no cuesta un solo KB extra.

   El contraste no queda al azar, y se resuelve en dos capas.

   Primero, los archivos `amb-*.jpg` se generan con un TECHO DE
   LUMINANCIA de 0,32 y la saturación (×1,8) ya aplicada al pixel. No es
   adorno: la foto de la cabaña tiene el cielo quemado y dejaba una
   mancha de (252,253,252) —blanco— detrás de la sección. Medido, ahí la
   etiqueta "ejemplo", que es el color más flojo de la paleta, caía a
   3,6:1. El techo escala los canales del pixel que se pasa, así que
   apaga lo quemado sin lavarle el color al resto.

   Segundo, encima va un velo del color de la sección entre 72 % y 68 %.
   Empezó en 88-85 %, que era seguro pero mataba el color: no se veía el
   verde del bosque, que es lo que le da temperatura a la página. Bajarlo
   hasta acá se pudo recién después de aclarar --humo y --merma (ver el
   comentario de la paleta).
   Con las dos capas, el peor punto de la página da 4,9:1 para la
   etiqueta y 5,8:1 para el texto secundario.

   La saturación va en el archivo y no en `filter: saturate()` a
   propósito: así lo que se puede medir en el archivo es exactamente lo
   que se ve en pantalla.

   El ::before va con z-index:-1 dentro del stacking context que abre
   `isolation`, así queda sobre el color de fondo de la sección y bajo
   el contenido, sin tocar el texto.                                  */
.seccion::before,
.seccion::after{
  content:""; position:absolute; inset:0; z-index:-1;
  pointer-events:none;
}
.seccion::before{
  background-image:var(--amb);
  background-size:cover;
  background-position:center;
  /* se estira un poco más allá del borde: el desenfoque, si no, deja
     una orilla lavada en los cuatro cantos */
  inset:-6%;
  filter:blur(64px);
}
.seccion::after{
  background:linear-gradient(to bottom,
    color-mix(in srgb, var(--fondo-local) 78%, transparent),
    color-mix(in srgb, var(--fondo-local) 75%, transparent));
}
.aguas   { --amb:url("../imagenes/amb-piscina-techada.jpg"); }
.cuenta  { --amb:url("../imagenes/amb-piscina-atardecer.jpg"); }
.cabanas { --amb:url("../imagenes/amb-cabana.jpg"); }
.tarifas { --amb:url("../imagenes/amb-cabana.jpg"); }
.incluye { --amb:url("../imagenes/amb-sendero.jpg"); }
.lagos   { --amb:url("../imagenes/amb-sendero.jpg"); }
.llegar  { --amb:url("../imagenes/amb-piscina-atardecer.jpg"); }
.reservar{ --amb:url("../imagenes/amb-piscina-techada.jpg"); }

.titular{ max-width:64ch; margin:0 auto clamp(2.5rem,5vw,3.5rem); text-align:center; }
.titular--izq{ margin-inline:0; text-align:left; }
.titular h2{ font-size:clamp(1.75rem,1.2rem + 2.1vw,2.75rem); margin-bottom:1rem; }
.titular__bajada{ color:var(--humo); margin:0; }

.caja--doble{ display:grid; gap:clamp(2rem,4vw,3.5rem); }
.caja--doble > *{ min-width:0; }

/* ═══ LA CUENTA CLARA · pieza firma ═══════════════════════════════
   Dos boletas dibujadas en SVG, una por canal de venta. Cada una es
   su propio <svg> en vez de las dos dentro de uno solo: así en el
   teléfono se apilan y el texto conserva su tamaño, en lugar de
   encogerse a la mitad para que quepan lado a lado.                */
.boletas{
  display:grid; gap:clamp(1.5rem,3vw,2.5rem);
  margin-bottom:clamp(2.5rem,5vw,3.5rem);
}
.boletas > *{ min-width:0; }
.boleta{ margin:0; }
.boleta svg{ display:block; width:100%; height:auto; }

.bol__papel{ fill:var(--nata); stroke:var(--linea); stroke-width:1; }
.bol__papel--directo{ fill:var(--nata-2); stroke:var(--bronce); stroke-width:1.5; }

.bol__linea{ stroke:var(--linea); stroke-width:1; fill:none; }
.bol__corte{ stroke:var(--humo); stroke-width:1.2; stroke-dasharray:5 6; fill:none; opacity:.6; }

.bol__canal{
  font-family:var(--dato); font-size:14px; letter-spacing:.18em;
  fill:var(--bronce);
}
.bol__canal--merma{ fill:var(--merma); }
.bol__tit{ font-family:var(--display); font-weight:600; font-size:27px; fill:var(--tinta); }
.bol__sub{ font-family:var(--dato); font-size:14px; fill:var(--humo); }
.bol__ficha{
  font-family:var(--dato); font-size:13.5px; letter-spacing:.06em;
  fill:var(--humo);
}

.bol__lab{ font-family:var(--cuerpo); font-size:17px; fill:var(--tinta); }
.bol__lab--nulo{ fill:var(--humo); }
.bol__val{
  font-family:var(--dato); font-size:17.5px; fill:var(--tinta);
  text-anchor:end;
}
.bol__val--nulo{ fill:var(--humo); }
.bol__val--merma{ fill:var(--merma); }
.bol__val--dorado{ fill:var(--bronce); }

.bol__totlab{ font-family:var(--cuerpo); font-weight:600; font-size:16px; fill:var(--tinta); }
.bol__totval{
  font-family:var(--dato); font-weight:500; font-size:20px;
  fill:var(--tinta); text-anchor:end;
}
.bol__totval--dorado{ fill:var(--bronce); }

.bol__cierre-lab{
  font-family:var(--dato); font-size:13.5px; letter-spacing:.16em;
  fill:var(--humo);
}
.bol__cierre-val{
  font-family:var(--display); font-weight:600; font-size:42px;
  fill:var(--bronce);
}
.bol__cierre-val--merma{ fill:var(--merma); }

.bol__nota{ font-family:var(--cuerpo); font-size:15px; fill:var(--humo); }
.bol__barras{ stroke:var(--humo); stroke-width:2.2; opacity:.28; }

/* la diferencia, en números grandes */
.diferencia{
  background:var(--nata); border:var(--borde); border-radius:var(--radio);
  padding:clamp(1.5rem,3vw,2.2rem);
  margin-bottom:clamp(2rem,4vw,3rem);
}
.diferencia__ojo{
  font-family:var(--dato); font-size:.68rem; letter-spacing:.16em;
  text-transform:uppercase; color:var(--humo); margin:0 0 1.4rem;
}
.diferencia__lista{
  list-style:none; margin:0; padding:0;
  display:grid; gap:1.4rem 1.5rem;
  grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
}
.diferencia__lista li{ display:flex; flex-direction:column; gap:.2rem; min-width:0; }
.diferencia__lista strong{
  font-family:var(--dato); font-weight:500; font-size:clamp(1.2rem,1rem + 1vw,1.6rem);
  color:var(--tinta); line-height:1.1;
}
.diferencia__lista span{ font-size:.83rem; color:var(--humo); }
.diferencia__suma{
  padding-left:1.5rem; border-left:2px solid var(--bronce);
}
.diferencia__suma strong{ color:var(--bronce); }

.remate{
  max-width:60ch; margin-inline:auto; text-align:center;
  font-family:var(--display); font-size:clamp(1.1rem,1rem + .6vw,1.4rem);
  line-height:1.45; color:var(--humo);
}
.remate strong{ color:var(--tinta); font-weight:600; }

/* ── las cabañas ─────────────────────────────────────────────────── */
.rejilla-cabanas{
  display:grid; gap:clamp(1.5rem,3vw,2rem);
  grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
}
.rejilla-cabanas > *{ min-width:0; }
.cabana{
  background:var(--nata); border:var(--borde); border-radius:var(--radio);
  overflow:hidden;
  display:flex; flex-direction:column;
}
.cabana--destacada{ background:var(--nata-2); border-color:color-mix(in srgb,var(--bronce) 45%,transparent); }
/* la foto va al ras del borde de la tarjeta, sin marco propio */
.cabana__foto{ border:0; border-radius:0; }
.cabana__foto img{ aspect-ratio:16/11; }
.cabana__cuerpo{ padding:1.4rem 1.4rem 1.6rem; display:flex; flex-direction:column; flex:1; }
.cabana__nombre{ font-size:1.35rem; margin-bottom:.3rem; }
.cabana__cupo{
  font-family:var(--dato); font-size:.75rem; letter-spacing:.1em;
  text-transform:uppercase; color:var(--bronce); margin-bottom:1rem;
}
.cabana__lista{
  list-style:none; margin:0 0 1rem; padding:0;
  display:grid; gap:.45rem; font-size:.92rem; color:var(--humo);
}
.cabana__lista li{ padding-left:1.1rem; position:relative; }
.cabana__lista li::before{
  content:""; position:absolute; left:0; top:.62em;
  width:.45rem; height:1px; background:var(--bronce);
}
.cabana__nota{
  margin-top:auto; padding-top:.9rem; border-top:var(--borde);
  font-size:.82rem; color:var(--bronce); font-style:italic;
}

/* ── aguas calientes y spa ───────────────────────────────────────
   La sección que el negocio tiene y no muestra en ninguna parte: su
   propio logo dice "aguas calientes & spa" y no había una sola línea
   escrita sobre eso. Por eso va arriba, antes que las cabañas.      */
.aguas__principal{
  display:grid; gap:clamp(1.5rem,3vw,2.5rem);
  align-items:center;
  margin-bottom:clamp(2rem,4vw,3rem);
}
.aguas__principal > *{ min-width:0; }
.aguas__texto h3{ font-size:clamp(1.4rem,1.1rem + 1vw,1.9rem); margin-bottom:.7rem; }
.aguas__texto p{ color:var(--humo); }
.aguas__mosaico{
  display:grid; gap:clamp(1rem,2vw,1.4rem);
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
}
.aguas__mosaico > *{ min-width:0; }

.lista-marca{
  list-style:none; margin:1.2rem 0 0; padding:0;
  display:grid; gap:.55rem; font-size:.94rem; color:var(--humo);
}
.lista-marca li{ padding-left:1.5rem; position:relative; }
.lista-marca li::before{
  content:""; position:absolute; left:0; top:.5em;
  width:.6rem; height:.6rem; border-radius:50%;
  border:1.5px solid var(--bronce);
}

/* ── subtítulo dentro de una sección ─────────────────────────────── */
.subtitulo{
  font-family:var(--dato); font-weight:400;
  font-size:.72rem; letter-spacing:.16em; text-transform:uppercase;
  color:var(--humo);
  margin:clamp(2.5rem,5vw,3.5rem) 0 1.4rem;
  padding-bottom:.7rem; border-bottom:1px solid var(--linea);
}
.rejilla-interior{
  display:grid; gap:clamp(1rem,2vw,1.4rem);
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
}
.rejilla-interior > *{ min-width:0; }

/* ── entorno: la lista de lagos junto a la foto del recinto ──────── */
.lagos__doble{ display:grid; gap:clamp(1.5rem,3vw,2.5rem); }
.lagos__doble > *{ min-width:0; }

/* ── hueco de foto ───────────────────────────────────────────────
   No hay fotos de este negocio. El hueco explica cuál falta y para
   qué sirve: en la reunión eso es una tarea concreta para el dueño,
   no una caja gris.                                                */
.hueco-foto{ display:flex; }
.hueco-foto__marco{
  flex:1; border:1.5px dashed var(--linea); border-radius:var(--radio);
  padding:1.8rem 1.5rem; text-align:center;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:.6rem; background:color-mix(in srgb,var(--nata) 55%,transparent);
  min-height:220px;
}
.hueco-foto__marco svg{ width:44px; height:44px; color:var(--humo); margin-bottom:.2rem; }
.hueco-foto__marco p{ margin:0; }
.hueco-foto__marco b{ font-family:var(--display); font-size:1.1rem; font-weight:600; }
.hueco-foto__pie{ font-size:.86rem; color:var(--humo); max-width:38ch; }

/* ── tarifas ─────────────────────────────────────────────────────── */
.tabla-marco{
  background:var(--nata); border:var(--borde); border-radius:var(--radio);
  overflow:hidden; margin-bottom:clamp(2rem,4vw,2.8rem);
}
.tabla{ width:100%; border-collapse:collapse; text-align:left; }
.tabla caption{ caption-side:bottom; }
.tabla__pie{
  padding:1rem 1.3rem 1.2rem; font-size:.82rem; color:var(--humo);
  text-align:left; border-top:var(--borde);
}
.tabla th,.tabla td{ padding:1rem 1.3rem; border-bottom:1px solid var(--linea); }
.tabla thead th{
  font-family:var(--dato); font-weight:400; font-size:.66rem;
  letter-spacing:.14em; text-transform:uppercase; color:var(--humo);
  background:var(--crema);
}
.tabla tbody th{
  font-family:var(--display); font-weight:600; font-size:1.15rem; color:var(--tinta);
}
.tabla tbody td{ font-family:var(--dato); font-size:.95rem; color:var(--humo); }
.tabla tbody td b{ color:var(--bronce); font-weight:500; }
.tabla tbody tr:last-child th,.tabla tbody tr:last-child td{ border-bottom:0; }

.letra-chica{
  display:grid; gap:.7rem;
  max-width:70ch; font-size:.9rem; color:var(--humo);
}
.letra-chica p{ margin:0; padding-left:1.2rem; position:relative; }
.letra-chica p::before{
  content:""; position:absolute; left:0; top:.62em;
  width:.5rem; height:1px; background:var(--bronce);
}
.letra-chica b{ color:var(--tinta); font-weight:600; }

/* ── qué incluye ─────────────────────────────────────────────────── */
.rejilla-iconos{
  list-style:none; margin:0; padding:0;
  display:grid; gap:clamp(1.5rem,3vw,2.2rem);
  grid-template-columns:repeat(auto-fit,minmax(250px,1fr));
}
.rejilla-iconos > *{ min-width:0; }
.ficha{
  background:var(--nata); border:var(--borde); border-radius:var(--radio);
  padding:1.4rem 1.3rem 1.5rem;
}
.ficha__icono{ width:40px; height:40px; color:var(--bronce); margin-bottom:.7rem; }
.ficha h3{ font-size:1.18rem; margin-bottom:.4rem; }
.ficha p{ font-size:.92rem; color:var(--humo); margin:0; }
/* el ícono respira cuando el cursor entra a la ficha */
.ficha__icono{ transition:transform .45s cubic-bezier(.22,.8,.3,1), color .3s ease; }
.ficha:hover .ficha__icono{ transform:scale(1.12) rotate(-4deg); color:#E8C77F; }

/* ── los siete lagos ─────────────────────────────────────────────── */
.friso{ line-height:0; margin-bottom:clamp(2rem,4vw,3rem); border-radius:var(--radio); overflow:hidden; }
.friso svg{ display:block; width:100%; height:clamp(70px,9vw,110px); }
.friso__banda--7{ fill:var(--lago-7); }
.friso__banda--6{ fill:var(--lago-6); }
.friso__banda--5{ fill:var(--lago-5); }
.friso__banda--4{ fill:var(--lago-4); }
.friso__banda--3{ fill:var(--lago-3); }
.friso__banda--2{ fill:var(--lago-2); }
.friso__banda--1{ fill:var(--lago-1); }

.siete{ list-style:none; margin:0; padding:0; display:grid; gap:0; }
.siete__item{
  display:grid; align-items:baseline;
  grid-template-columns:auto 1fr auto;
  gap:.2rem 1rem;
  padding:1.1rem 0; border-bottom:1px solid var(--linea);
  min-width:0;
}
.siete__item:last-child{ border-bottom:0; }
.siete__num{
  font-family:var(--dato); font-size:.75rem; color:var(--bronce);
  grid-row:span 2;
}
.siete__nom{ font-family:var(--display); font-weight:600; font-size:1.25rem; }
.siete__dist{
  font-family:var(--dato); font-size:.85rem; color:var(--humo);
  white-space:nowrap; grid-row:span 2;
}
.siete__item p{
  grid-column:2; margin:0; font-size:.92rem; color:var(--humo);
}

/* ── cómo llegar ─────────────────────────────────────────────────── */
.ruta{ list-style:none; margin:0 0 1.5rem; padding:0; display:grid; gap:0; }
.ruta li{
  display:grid; grid-template-columns:5.2rem 1fr; gap:1rem;
  padding:1rem 0; border-bottom:1px solid var(--linea);
  min-width:0;
}
.ruta li:last-child{ border-bottom:0; }
.ruta__km{
  font-family:var(--dato); font-size:.85rem; color:var(--bronce);
  padding-top:.15rem;
}
.ruta p{ margin:0; font-size:.94rem; color:var(--humo); }
.ruta b{ color:var(--tinta); font-weight:600; }
.llegar__nota{ font-size:.9rem; color:var(--humo); max-width:56ch; }

/* ── formulario ──────────────────────────────────────────────────── */
.form{
  display:grid; gap:1.1rem 1.2rem;
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  background:var(--nata); border:var(--borde); border-radius:var(--radio);
  padding:clamp(1.4rem,3vw,2.2rem);
  margin-bottom:1.6rem;
}
.campo{ display:flex; flex-direction:column; gap:.4rem; min-width:0; }
.campo--ancho{ grid-column:1 / -1; }
.campo label{ font-size:.82rem; font-weight:600; color:var(--humo); }
.campo__opc{ font-weight:400; color:var(--humo); opacity:.8; }
.campo input,.campo select,.campo textarea{
  font-family:var(--cuerpo); font-size:1rem;
  background:var(--papel); color:var(--tinta);
  border:1px solid var(--linea); border-radius:6px;
  padding:.7rem .8rem; min-height:46px;
  width:100%;
}
.campo textarea{ resize:vertical; min-height:88px; }
.campo input::placeholder,.campo textarea::placeholder{ color:color-mix(in srgb,var(--humo) 70%,transparent); }
.campo input:hover,.campo select:hover,.campo textarea:hover{ border-color:var(--humo); }

.form__pie{
  grid-column:1 / -1;
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:1rem; padding-top:.6rem; border-top:var(--borde);
}
.form__resumen{
  margin:0; font-family:var(--dato); font-size:.85rem; color:var(--bronce);
  flex:1 1 16rem; min-width:0;
}
.form__pie .boton{ min-height:46px; }

.contacto{
  display:grid; gap:1px; background:var(--linea);
  border:var(--borde); border-radius:var(--radio); overflow:hidden;
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
}
.contacto__item{
  background:var(--nata); padding:1.1rem 1.2rem;
  display:flex; flex-direction:column; gap:.25rem;
  text-decoration:none; min-width:0; min-height:44px;
}
.contacto__item span{
  font-family:var(--dato); font-size:.64rem; letter-spacing:.14em;
  text-transform:uppercase; color:var(--humo);
}
.contacto__item strong{ font-weight:600; font-size:.98rem; }
a.contacto__item:hover{ background:var(--nata-2); }
a.contacto__item:hover strong{ color:var(--bronce); }
/* la etiqueta "ejemplo" de la dirección cae dentro de una celda del
   contacto, así que su fondo es el de la tarjeta, no el de la sección */
.contacto__item.ej{ --fondo-local:var(--nata); outline-offset:-8px; }
.contacto__item.ej::after{ top:auto; bottom:6px; right:8px; transform:none; }

/* ── la propuesta ────────────────────────────────────────────────── */
.hablemos{
  background:var(--noche); --fondo-local:var(--noche);
  border-top:0;
  --amb:url("../imagenes/amb-piscina-noche.jpg");
}
/* Su base (--lago-7) es más clara que la del resto, así que con el velo
   general del 68 % el "borde punteado" en línea quedaba en 4,47:1 — tres
   centésimas por debajo del mínimo. Acá el velo va un punto más cerrado. */
.hablemos::after{
  background:linear-gradient(to bottom,
    color-mix(in srgb, var(--fondo-local) 90%, transparent),
    color-mix(in srgb, var(--fondo-local) 87%, transparent));
}
/* Todo lo que entra a la sección negra necesita su versión clara. La
   página es de papel, así que los colores por defecto —tinta, bronce,
   merma, el botón de línea— son todos oscuros y acá desaparecen. Medido:
   sin estas cuatro reglas el titular quedaba en 1,28:1. */
.hablemos__titulo{
  font-size:clamp(1.8rem,1.2rem + 2.4vw,3rem);
  margin-bottom:clamp(2rem,4vw,3rem);
  color:var(--papel);
}
.hablemos .ojo--dorado{ color:var(--dorado-claro); }
.hablemos .ej--inline{
  color:#F0A98F;
  outline-color:color-mix(in srgb, #F0A98F 55%, transparent);
}
.hablemos .boton--linea{ border-color:color-mix(in srgb,var(--papel) 45%,transparent); color:var(--papel); }
.hablemos .boton--linea:hover{ background:var(--papel); color:var(--noche); border-color:var(--papel); }
.hablemos .boton--dorado{ background:var(--papel); color:var(--noche); border-color:var(--papel); }
.hablemos .boton--dorado:hover{ background:var(--dorado-claro); border-color:var(--dorado-claro); color:var(--noche); }
.hablemos__rejilla{
  display:grid; gap:clamp(1.6rem,3vw,2.4rem);
  grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  margin-bottom:clamp(2.2rem,4vw,3rem);
}
.hablemos__rejilla > *{ min-width:0; }
.hablemos__rejilla > div{
  background:color-mix(in srgb,var(--papel) 7%,transparent);
  border:1px solid color-mix(in srgb,var(--papel) 14%,transparent);
  border-radius:var(--radio);
  padding:1.5rem 1.4rem;
}
.hablemos__rejilla h3{
  font-size:1.2rem; color:var(--dorado-claro); margin-bottom:.6rem;
}
.hablemos__rejilla p{ font-size:.94rem; color:color-mix(in srgb,var(--papel) 76%,transparent); margin:0; }
.hablemos__rejilla strong,.hablemos__rejilla b{ color:var(--papel); font-weight:600; }
.hablemos__rejilla code{ font-family:var(--dato); font-size:.9em; color:var(--papel); }
.hablemos__rejilla a{ color:var(--dorado-claro); text-underline-offset:3px; }
.hablemos__acciones{ display:flex; flex-wrap:wrap; gap:.75rem; }

/* ── pie ─────────────────────────────────────────────────────────── */
.pie{ background:var(--papel); padding:2.5rem 0; border-top:var(--borde); }
.caja--pie{ display:grid; gap:.5rem; justify-items:start; }
/* El logo del negocio, recoloreado al morado de su propia marca. El rosa
   pálido del archivo original está hecho para ir sobre su fondo morado y
   sobre papel desaparece: se conserva el canal alfa —la forma exacta— y
   se reemplaza el color. */
.pie__logo{ width:auto; height:clamp(64px,10vw,86px); margin-bottom:.9rem; }
.pie__marca{ font-family:var(--display); font-weight:600; margin:0; }
.pie__nota{ margin:0; font-size:.85rem; color:var(--humo); max-width:66ch; }
.pie__nota a{ color:var(--bronce); font-weight:600; }

/* ── vida en los recuadros ───────────────────────────────────────
   Tres cosas que pasan cuando el cursor entra a una tarjeta:

   1. La tarjeta se despega unos pixeles. Se usa la propiedad
      `translate` y NO `transform` a propósito: los reveals de scroll
      ya ocupan `transform`, y como `translate` se compone aparte, los
      dos efectos conviven sin pelearse por la especificidad.
   2. El borde se enciende justo donde está el cursor. Es un
      ::before de un pixel recortado con máscara, así que ilumina el
      contorno y nunca se pone encima del texto — que es lo que
      arruinaría el contraste. main.js le pasa la posición en --mx/--my;
      sin script queda centrado, que también se ve bien.
   3. El fondo sube un tono y la sombra crece.

   Se usa ::before y no ::after porque ::after ya está tomado por la
   etiqueta "ejemplo" en varias de estas mismas tarjetas.            */
.cabana,
.ficha,
.diferencia,
.tabla-marco,
.form,
.hueco-foto__marco,
.hablemos__rejilla > div,
.contacto__item{
  position:relative;
  transition:translate .4s cubic-bezier(.22,.8,.3,1),
             background-color .35s ease,
             border-color .35s ease,
             box-shadow .4s ease;
}

.cabana:hover,
.ficha:hover,
.diferencia:hover,
.tabla-marco:hover,
.form:hover,
.hueco-foto__marco:hover,
/* Esta sección es la única de fondo negro, así que su realce va al revés
   que el del resto: la tarjeta se aclara un punto en vez de oscurecerse.
   Con el hover común —que pinta de crema— el texto claro de adentro
   quedaba ilegible al pasar el cursor. */
.hablemos__rejilla > div:hover{
  translate:0 -5px;
  background-color:color-mix(in srgb,var(--papel) 13%,transparent);
  border-color:color-mix(in srgb,var(--dorado-claro) 45%,transparent);
  box-shadow:0 20px 38px -22px rgba(0,0,0,.6);
}
.hablemos__rejilla > div::before{
  background:radial-gradient(220px circle at var(--mx,50%) var(--my,50%),
             var(--dorado-claro), transparent 62%) !important;
}
.hueco-foto__marco:hover{ border-style:dashed; }

/* El contacto es un mosaico de celdas separadas por una línea de un
   pixel, dentro de un marco con overflow:hidden. Si una celda se
   elevara, se recortaría contra el marco y rompería la retícula: acá
   el realce es sólo de fondo y de borde encendido. */
a.contacto__item:hover{ background-color:var(--nata-2); }

@supports ((-webkit-mask-composite:xor) or (mask-composite:exclude)){
  .cabana::before,
  .ficha::before,
  .diferencia::before,
  .tabla-marco::before,
  .form::before,
  .hueco-foto__marco::before,
  .hablemos__rejilla > div::before,
  .contacto__item::before{
    content:""; position:absolute; inset:0; border-radius:inherit;
    padding:1px;
    background:radial-gradient(220px circle at var(--mx,50%) var(--my,50%),
               var(--bronce), transparent 62%);
    -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite:xor;
            mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            mask-composite:exclude;
    opacity:0; transition:opacity .4s ease; pointer-events:none;
  }
  .cabana:hover::before,
  .ficha:hover::before,
  .diferencia:hover::before,
  .tabla-marco:hover::before,
  .form:hover::before,
  .hueco-foto__marco:hover::before,
  .hablemos__rejilla > div:hover::before,
  a.contacto__item:hover::before{ opacity:1; }
}

/* Las boletas no llevan borde recortado: su papel es un zigzag, así que
   un contorno rectangular se les vería encima. Se elevan y proyectan. */
.boleta{ transition:translate .45s cubic-bezier(.22,.8,.3,1), filter .45s ease; }
.boleta:hover{ translate:0 -6px; }
.boleta--directo:hover{
  filter:drop-shadow(0 16px 26px color-mix(in srgb,var(--bronce) 26%,transparent));
}
.boleta:not(.boleta--directo):hover{
  filter:drop-shadow(0 16px 26px rgba(0,0,0,.55));
}

/* Las filas de los siete lagos no son tarjetas: se realzan corriéndose
   un poco y encendiendo el número. */
.siete__item{
  transition:background-color .3s ease, padding-left .3s ease;
  border-radius:8px;
}
.siete__item:hover{
  background:color-mix(in srgb,var(--nata) 70%,transparent);
  padding-left:.8rem;
}
.siete__num,.siete__nom{ transition:color .3s ease; }
.siete__item:hover .siete__nom{ color:var(--bronce); }

/* Un brillo que barre el botón al pasar por encima. */
.boton{ position:relative; overflow:hidden; isolation:isolate; }
.boton::before{
  content:""; position:absolute; inset:0; z-index:-1;
  background:linear-gradient(105deg, transparent 35%,
             color-mix(in srgb,var(--tinta) 30%,transparent) 50%, transparent 65%);
  translate:-120% 0;
  transition:translate .6s cubic-bezier(.22,.8,.3,1);
}
.boton:hover::before{ translate:120% 0; }
.boton--linea:hover{ background:color-mix(in srgb,var(--bronce) 8%,transparent); }

/* ── movimiento ──────────────────────────────────────────────────
   Dos mecanismos distintos, y la diferencia importa:

   · La PORTADA entra con @keyframes al cargar. No pasa por el
     IntersectionObserver a propósito. Un observer que no dispare —
     por la razón que sea — dejaría el primer pantallazo en blanco,
     y ese es el único error que un sitio comercial no puede cometer.
   · De la portada hacia abajo sí manda el observer, porque ahí el
     disparo depende del scroll de verdad.

   Los estados ocultos cuelgan de .js: si el script del <head> no
   corre, la página se ve entera, sólo que quieta.                  */

@keyframes entrar{
  from{ opacity:0; transform:translateY(20px); }
  to  { opacity:1; transform:none; }
}

/* Sin clase intermedia y sin JavaScript: la animación arranca sola en
   cuanto el navegador aplica esta hoja. Si esperara a que main.js
   pusiera una clase dentro de requestAnimationFrame, se colgaría
   entera al abrir el enlace en una pestaña de fondo — Chrome no corre
   rAF en pestañas ocultas — y el dueño vería la portada en blanco. */
.js .portada__titulo,
.js .portada__bajada,
.js .portada__acciones,
.js .credenciales{
  animation:entrar .75s cubic-bezier(.22,.8,.3,1) both;
}
.js .portada__titulo   { animation-delay:.04s; }
.js .portada__bajada   { animation-delay:.16s; }
.js .portada__acciones { animation-delay:.26s; }
.js .credenciales      { animation-delay:.36s; }

/* La foto de fondo entra sólo con opacidad y un acercamiento mínimo. No
   comparte la animación de arriba a propósito: `entrar` desplaza en Y, y
   una imagen que cubre toda la sección con object-fit dejaría asomando
   la franja de la que se corre. */
@keyframes asomar{
  from{ opacity:0; transform:scale(1.06); }
  to  { opacity:1; transform:none; }
}
.js .portada__foto{ animation:asomar 1.1s cubic-bezier(.22,.8,.3,1) both; }

/* La entrada al hacer scroll no es sólo un desplazamiento: la pieza
   llega desde abajo, un punto más chica y desenfocada, y se asienta.
   El desenfoque dura poco a propósito — media página con filter:blur
   activo se le nota al ventilador de un notebook viejo. */
.js .revelar{
  opacity:0;
  transform:translateY(26px) scale(.985);
  filter:blur(6px);
}
.js .revelar.visible{
  opacity:1; transform:none; filter:blur(0);
  transition:opacity .65s ease,
             transform .8s cubic-bezier(.22,.9,.28,1),
             filter .5s ease;
}
.js .revelar.visible.retardo-1{ transition-delay:.07s; }
.js .revelar.visible.retardo-2{ transition-delay:.14s; }
.js .revelar.visible.retardo-3{ transition-delay:.21s; }
.js .revelar.visible.retardo-4{ transition-delay:.28s; }
.js .revelar.visible.retardo-5{ transition-delay:.35s; }
.js .revelar.visible.retardo-6{ transition-delay:.42s; }

/* Las bandas de agua respiran: cada lago con su propio compás, de dos
   pixeles de amplitud. Es lo único del sitio que se mueve solo, así
   que es lo primero que se apaga más abajo. */
@keyframes respirar{
  from{ transform:translateY(0); }
  to  { transform:translateY(-2.5px); }
}
/* Sin will-change: una animación infinita de transform ya la promociona
   el navegador solo, y declararlo en catorce elementos a la vez sólo
   reserva memoria de GPU para nada. */
.friso__banda,
.horizonte__agua{
  animation:respirar 7s ease-in-out infinite alternate;
}
.friso__banda--2,.horizonte__agua--2{ animation-duration:8s;   animation-delay:-.6s; }
.friso__banda--3,.horizonte__agua--3{ animation-duration:6.4s; animation-delay:-1.2s; }
.friso__banda--4,.horizonte__agua--4{ animation-duration:9s;   animation-delay:-1.8s; }
.friso__banda--5,.horizonte__agua--5{ animation-duration:7.6s; animation-delay:-2.4s; }
.friso__banda--6,.horizonte__agua--6{ animation-duration:8.6s; animation-delay:-3s; }
.friso__banda--7,.horizonte__agua--7{ animation-duration:6.8s; animation-delay:-3.6s; }

@media (prefers-reduced-motion: reduce){
  /* Se apaga lo que se mueve solo: el agua que respira y el barrido de
     los botones. Los fundidos, la elevación de las tarjetas y el borde
     que se enciende se dejan — apagarlos deja el sitio con cara de
     muerto, y en Windows esta preferencia viene activada de fábrica en
     muchas máquinas. */
  html{ scroll-behavior:auto; }
  .friso__banda,.horizonte__agua{ animation:none; }
  .boton::before{ display:none; }
  .cabecera__avance{ animation:none; }
  .js .revelar{ transform:none; filter:none; }
  .js .revelar.visible{ transition-duration:.3s; }
  .js .portada__titulo,
  .js .portada__bajada,
  .js .portada__acciones,
  .js .credenciales,
  .js .portada__foto{ animation-duration:.3s; animation-delay:0s; }
  .boton:hover{ transform:none; }
  .marca:hover .marca__pavo{ transform:none; }
  .foto:hover img{ transform:none; }
}

/* ── de 900 px para arriba ───────────────────────────────────────── */
@media (min-width:900px){
  .boletas{ grid-template-columns:1fr 1fr; }
  .caja--doble{ grid-template-columns:1.15fr .85fr; align-items:start; }
  /* En escritorio el velo se da vuelta: pasa a ser horizontal. El texto
     vive en la mitad izquierda, donde nunca baja del 88 %, y la foto
     queda limpia a la derecha. El corte al 52 % está calculado contra el
     ancho real de la columna de texto (34 rem partiendo del margen), no
     puesto a ojo. El ancho del texto se ata además al viewport: sin el
     46vw, en una ventana de 930 px el párrafo llegaba al 61 % y se
     salía de la franja protegida del velo. */
  .portada{ padding-top:clamp(6rem,13vh,8rem); }
  .portada__texto{ max-width:min(38rem, 52vw); }
  .portada__velo{
    background:
      linear-gradient(to right,
        var(--papel) 0%,
        color-mix(in srgb, var(--papel) 94%, transparent) 46%,
        color-mix(in srgb, var(--papel) 92%, transparent) 58%,
        color-mix(in srgb, var(--papel) 40%, transparent) 78%,
        color-mix(in srgb, var(--papel) 8%, transparent) 100%),
      linear-gradient(to top,
        color-mix(in srgb, var(--papel) 60%, transparent) 0%,
        transparent 38%);
  }
  .aguas__principal{ grid-template-columns:.85fr 1.15fr; }
  .aguas__principal .foto--alta{ order:-1; }
  .lagos__doble{ grid-template-columns:1.35fr .65fr; align-items:start; }
  /* Cuatro bloques en tres columnas dejaban el último colgando solo.
     A esta altura se leen mejor en dos por dos. */
  .hablemos__rejilla{ grid-template-columns:1fr 1fr; }
  /* Tres cabañas caben en la fila; el hueco de foto no puede quedar
     como una cuarta tarjeta huérfana a un tercio de ancho. */
  .rejilla-cabanas .hueco-foto{ grid-column:1 / -1; }
  .rejilla-cabanas .hueco-foto__marco{ min-height:180px; }
  .siete{ grid-template-columns:1fr 1fr; column-gap:3rem; }
  .siete__item:nth-last-child(2){ border-bottom:0; }
}

/* ── tabla en pantalla chica ─────────────────────────────────────
   Debajo de 700 px la tabla se convierte en tarjetas apiladas. Se
   mantiene como <table> en el HTML —es una tabla de verdad y el
   lector de pantalla debe leerla así—; sólo cambia cómo se ve.     */
@media (max-width:700px){
  .tabla thead{
    position:absolute; width:1px; height:1px; overflow:hidden;
    clip-path:inset(50%); white-space:nowrap;
  }
  .tabla,.tabla tbody,.tabla tr,.tabla th,.tabla td{ display:block; width:100%; }
  .tabla tbody tr{ padding:1.1rem 1.2rem; border-bottom:1px solid var(--linea); }
  .tabla tbody tr:last-child{ border-bottom:0; }
  .tabla tbody th{ padding:0 0 .6rem; border-bottom:0; }
  .tabla tbody td{
    padding:.3rem 0; border-bottom:0;
    display:flex; justify-content:space-between; gap:1rem;
  }
  .tabla tbody td::before{
    content:attr(data-col);
    font-family:var(--dato); font-size:.66rem; letter-spacing:.12em;
    text-transform:uppercase; color:var(--humo);
    align-self:center;
  }
}

/* ── móvil ───────────────────────────────────────────────────────── */
@media (max-width:640px){
  /* La barra pasa a dos filas y el menú se desliza de lado. Nunca se
     esconde el menú dejando sólo el CTA: en un teléfono —que es donde
     se va a abrir este enlace— eso deja a la gente sin manera de
     llegar a Tarifas.

     El menú sangra hasta el borde de la pantalla y no hasta el margen
     del contenedor: así el primer y el último enlace no quedan cortados
     a medias cuando la fila está desplazada. */
  .cabecera__caja{
    flex-wrap:wrap; gap:.15rem;
    padding:.45rem 0 .3rem;
  }
  .marca{ flex:1 1 auto; }
  .marca__pavo{ height:28px; }
  .marca__txt{ font-size:1rem; }
  .nav{
    flex:1 0 100%;
    flex-wrap:nowrap;
    overflow-x:auto;
    -webkit-overflow-scrolling:touch;
    scrollbar-width:none;
    margin-inline:-1.25rem;
    padding:.1rem 1.25rem .25rem;
  }
  .nav::-webkit-scrollbar{ display:none; }
  /* 44 px es el mínimo que un dedo acierta sin pelear. Con el padding
     de escritorio estos enlaces quedaban en 38. */
  .nav a{ flex:none; white-space:nowrap; padding:.72rem .75rem; }
  /* la pastilla se calcula con offsetLeft dentro de un contenedor que
     además se desplaza: en el teléfono no aporta y puede desfasarse */
  .nav__pastilla{ display:none; }

  .seccion{ scroll-margin-top:8rem; }

  /* La portada medía 1328 px en una pantalla de 812: había que bajar dos
     veces para pasarla. Se recortó por donde sobraba —el aire de arriba,
     los márgenes entre bloques y las tres credenciales apiladas una bajo
     otra, que solas se llevaban 223 px—. La foto de arriba sigue siendo
     lo primero que se ve, que es de lo que se trataba. */
  .portada{ padding-top:30svh; }
  .portada__titulo{ margin-bottom:1rem; }
  .portada__bajada{ font-size:1rem; margin-bottom:1.5rem; }
  .portada__acciones{ gap:.6rem; margin-bottom:2rem; }
  .portada__acciones .boton{ flex:1 1 100%; }
  .credenciales{
    display:grid; grid-template-columns:1fr 1fr; gap:1rem 1.2rem;
    padding-top:1.2rem;
  }
  .credenciales__item:first-child{ grid-column:1 / -1; }
  .credenciales dd strong{ font-size:1.4rem; }
  .credenciales dd{ flex-wrap:wrap; gap:.2rem .5rem; }
  .form__pie .boton{ flex:1 1 100%; }
  .ej{ outline-offset:6px; }
  .ej::after{ top:-6px; right:-6px; }
  .diferencia__suma{ padding-left:0; padding-top:1rem; border-left:0; border-top:2px solid var(--bronce); }
}
