/* ==========================================================================
   NOMA Residences, Spa & Yacht Club — landing
   Paleta y ritmo tomados de la propuesta de Área 6, con los ajustes de Marisol.
   ========================================================================== */

:root{
  --tinta:#12212f;          /* azul profundo de las secciones oscuras */
  --tinta-2:#0c1825;
  --papel:#f6f1e5;          /* crema de las secciones claras */
  --papel-2:#efe8d8;
  --oro:#c8a96a;
  --oro-claro:#e0cd9f;
  --oro-hondo:#8c6f2e;      /* el mismo oro pero legible sobre el crema */
  --verde:#1c3a33;          /* banda "espacio, amplitud" */
  --teal:#14403f;           /* pie */
  --texto:#2d3b46;
  /* El cuerpo de los párrafos. Estaba en #5c6873, que sobre el crema da 5,06:1
     —pasa la norma, pero en un celular a la luz del día se lee lavado—. Área 6
     pidió volver a oscurecerlo (05/09/2026) y quedó en 7,44:1 sobre --papel y
     6,87:1 sobre --papel-2.

     No se toca --texto, que es el de los títulos: sigue en 10,15:1. Ahí está la
     jerarquía —el título tiene que seguir pesando más que el cuerpo— y por eso
     el cuerpo se acerca pero no llega. */
  --texto-suave:#434f5a;
  --claro:#f6f1e5;
  --claro-suave:rgba(246,241,229,.68);
  --claro-tenue:rgba(246,241,229,.42);
  --linea:rgba(200,169,106,.34);
  --r:4px;
  --ease:cubic-bezier(.22,.61,.36,1);
  --shell:min(1240px,90vw);
  --nav-h:88px;
}

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

html{scroll-behavior:smooth}
/* Los anclas de la página caen debajo de la barra fija: sin este margen,
   "Conoce NOMA" deja el título de la sección tapado por el menú. */
section[id]{scroll-margin-top:clamp(78px,10vh,108px)}
/* Con la cortina abierta la página de atrás no se mueve. Va en <html> porque es
   el elemento que hace el scroll: en <body> —que ya lleva overflow-x— no
   alcanza en todos los navegadores. */
html.menu-abierto{overflow:hidden}

body{
  margin:0;
  /* Literal antes de la variable: si var() no resuelve —navegador viejo,
     hoja a medio bajar— la página sigue teniendo fondo y color propios en
     vez de quedar en blanco con texto negro. */
  background:#12212f;
  background:var(--tinta);
  color:#2d3b46;
  color:var(--texto);
  font-family:'Jost',-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;
  font-weight:300;font-size:17px;line-height:1.62;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}

img{max-width:100%;display:block}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
a{color:inherit;text-decoration:none}

.wrap{width:min(1240px,90vw);width:var(--shell);margin-inline:auto}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* --- Tipografía compartida ------------------------------------------------ */
.eyebrow{
  font-size:.66rem;letter-spacing:.36em;text-transform:uppercase;
  color:var(--oro);font-weight:400;margin:0 0 1.2rem;
}
.h1{font-size:clamp(2.4rem,6vw,4.4rem);font-weight:400;line-height:1.04;letter-spacing:.01em;margin:0}
.h2{font-size:clamp(1.9rem,3.7vw,3rem);font-weight:300;line-height:1.16;letter-spacing:.005em;margin:0 0 1.2rem}
.h3{font-size:clamp(1.35rem,2.2vw,1.9rem);font-weight:300;line-height:1.24;margin:0 0 .9rem}
.lede{font-size:1.04rem;color:var(--texto-suave);max-width:56ch;margin:0}
.regla{width:64px;height:1px;background:var(--oro);margin:1.6rem 0}

/* --- Secciones ------------------------------------------------------------ */
.sec{position:relative;padding:clamp(5rem,11vw,9.5rem) 0;overflow:hidden}
/* El crema no va plano: lleva una baldosa de granito, pero el crema y la
   textura vienen YA MEZCLADOS en el archivo. Antes se hacía con
   background-color + background-blend-mode:soft-light, y eso resultó frágil:
   a un usuario le llegó la página con el granito gris crudo y el texto encima,
   ilegible, porque la mezcla no se le aplicó. Horneada en la imagen no hay
   nada que se pueda "no aplicar", y de paso la baldosa bajó de 276 KB a 59 KB.

   El background-color literal va antes de la variable a propósito: si por lo
   que sea las variables CSS no resuelven, el fondo sigue siendo crema y no
   transparente. Lo mismo con el color del texto. */
.sec--claro{
  background-color:#f6f1e5;
  background-color:var(--papel);
  color:#2d3b46;
  color:var(--texto);
  background-image:url('../img/granito-papel.jpg');
  background-size:460px;background-repeat:repeat;
}
.sec--oscuro{background:#12212f;background:var(--tinta);color:#f6f1e5;color:var(--claro)}
.sec--verde{background:#1c3a33;background:var(--verde);color:#f6f1e5;color:var(--claro)}
.sec--oscuro .lede,.sec--verde .lede{color:var(--claro-suave)}
.sec--oscuro .h2,.sec--verde .h2{color:var(--oro-claro)}

/* Textura de papel: ruido muy sutil para que el crema no quede plano.
   z-index 0 y el contenido en 1: si no, el pseudo-elemento se pinta encima
   del texto y las fotos y lava toda la sección. */
.sec--claro::before{
  content:'';position:absolute;inset:0;pointer-events:none;opacity:.5;z-index:0;
  background-image:radial-gradient(circle at 20% 30%,rgba(200,169,106,.06),transparent 55%),
                   radial-gradient(circle at 78% 68%,rgba(120,110,90,.05),transparent 50%);
}
.sec > .wrap{position:relative;z-index:1}

/* ==========================================================================
   NAV
   ========================================================================== */
/* La tira de arriba: idioma y sesión. Va por encima de la barra (70 contra 60)
   y no al revés: cuando la barra se fija sube a top:0 y deja 1.45rem de aire
   arriba, que es justo donde queda metida la tira. pointer-events:none en la
   tira y auto en lo que se toca, así el resto del ancho no le roba el clic al
   hero que tiene debajo. line-height:1 para que la tira no crezca de alto: si
   pasa de 26 px, se mete abajo de la barra. */
.tira{
  position:fixed;top:0;left:0;right:0;z-index:70;
  display:flex;align-items:center;justify-content:flex-end;
  gap:clamp(.8rem,2vw,1.4rem);
  padding:.5rem clamp(1rem,4vw,3rem) 0;
  font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;line-height:1;
  color:var(--claro-tenue);pointer-events:none;
}
.tira > *{pointer-events:auto}

.idioma{display:flex;align-items:center;gap:.5rem}
/* 17/09/2026 · Las banderas dejaron de ser <button> y pasaron a ser enlaces a la
   misma página en el otro idioma: un botón sin JS no llevaba a ningún lado, y un
   enlace además lo sigue el buscador, que es lo que hace que exista la versión
   en inglés para Google. Por eso la regla apunta a la clase y no a la etiqueta. */
.idioma__b{padding:.1rem .2rem;transition:color .3s;text-decoration:none;color:inherit}
.idioma__b.is-on{color:var(--claro)}

/* Banderas: la que no está elegida va apagada y en gris, así se ve de un vistazo
   cuál es el idioma activo sin tener que leer las siglas. */
.idioma__b{display:flex;align-items:center;gap:.4rem;line-height:1}
.idioma__bandera{
  display:block;width:22px;height:auto;flex:0 0 auto;border-radius:1.5px;
  box-shadow:0 0 0 1px rgba(255,255,255,.28);
  filter:grayscale(1);opacity:.55;transition:filter .3s,opacity .3s;
}
.idioma__b.is-on .idioma__bandera,
.idioma__b:hover .idioma__bandera,
.idioma__b:focus-visible .idioma__bandera{filter:none;opacity:1}
.idioma__tx{letter-spacing:.2em}
/* Debajo del corte de celular queda sólo la bandera: al lado del logo y del
   botón de menú, las siglas sumaban ruido y nada de información. */
@media(max-width:640px){.idioma__tx{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}}

.nav{
  position:fixed;top:26px;left:0;right:0;z-index:60;
  display:flex;align-items:center;justify-content:space-between;gap:2rem;
  padding:.5rem clamp(1rem,4vw,3rem) 1rem;
  transition:padding .4s var(--ease);
}
/* El fondo desenfocado de la barra fija va en un pseudo-elemento y no en .nav.
   Un elemento con backdrop-filter se vuelve el bloque contenedor de sus hijos
   position:fixed, y la cortina del menú cuelga de acá adentro: con el filtro en
   .nav, el panel se posicionaba contra la barra —76 px de alto— en vez de
   contra la pantalla. Como pseudo-elemento el filtro no arrastra a nadie, y de
   paso el fondo entra fundiéndose en vez de aparecer de golpe. */
.nav::before{
  content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:rgba(12,24,37,.82);
  backdrop-filter:blur(18px) saturate(140%);
  -webkit-backdrop-filter:blur(18px) saturate(140%);
  opacity:0;transition:opacity .5s var(--ease);
}
.nav.is-stuck::before{opacity:1}
/* El aire de arriba es para el selector ES|EN: con la barra fija los dos caen en
   la misma franja y sin ese margen el idioma se le monta al menú. (Antes había
   una regla que lo escondía al fijarse la barra; nunca llegó a aplicar —.idioma
   va antes que .nav y "~" sólo mira hermanos posteriores— y de todos modos el
   cliente quiere el idioma junto al menú, así que se resuelve dándole lugar.) */
.nav.is-stuck{top:0;padding-top:1.45rem;padding-bottom:.85rem}

.marca{color:var(--claro);line-height:0;display:block}
.marca__img{display:block;height:clamp(38px,4vw,60px);width:auto;transition:height .4s var(--ease)}
/* Al fijarse, el logo cede un poco de alto: la barra se vuelve una franja y no
   una segunda portada. */
.nav.is-stuck .marca__img{height:clamp(32px,3vw,46px)}

/* --- Menú de escritorio --------------------------------------------------- */
.menu{display:flex;align-items:center;gap:clamp(1.1rem,2.4vw,2.4rem)}
.menu__lista{
  display:flex;align-items:center;gap:clamp(1.1rem,2.4vw,2.4rem);
  list-style:none;margin:0;padding:0;
}
.menu__it > a{
  font-size:.72rem;letter-spacing:.2em;text-transform:uppercase;color:var(--claro-suave);
  position:relative;padding:.35rem 0;transition:color .3s;white-space:nowrap;
}
.menu__it > a:hover{color:var(--claro)}
.menu__n,.menu__flecha{display:none}

/* El subrayado que barre es el gesto que ya usa el sitio; se queda tal cual. */
.menu__it > a::after{
  content:'';position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--oro);
  transform:scaleX(0);transform-origin:right;transition:transform .45s var(--ease);
}
.menu__it > a:hover::after{transform:scaleX(1);transform-origin:left}

/* El ítem donde estás parado queda encendido: con cinco secciones que viven en
   páginas distintas, sin esto no hay forma de saber en cuál estás. */
.menu__it.is-aqui > a{color:var(--claro)}
.menu__it.is-aqui > a::after{transform:scaleX(1);transform-origin:left;background:var(--oro-claro)}

/* --- "Elige tu residencia": el botón, fuera de la lista ----------------------
   Es el único destino que convierte —ahí se ven precios y se aparta la unidad—,
   y adentro del menú pesaba lo mismo que "Recorrido virtual". Va relleno de oro
   y no con filete: contra cinco rótulos finos en versalitas, un contorno más no
   se distingue. Y vive afuera de la cortina, así que en celular sigue estando a
   la vista con el menú cerrado.
   -------------------------------------------------------------------------- */
.cta-nav{
  display:inline-flex;align-items:center;gap:.6rem;flex:none;
  padding:.7rem 1.35rem;border-radius:999px;
  background:var(--oro);color:var(--tinta);
  font-size:.68rem;letter-spacing:.2em;text-transform:uppercase;white-space:nowrap;
  transition:background .35s var(--ease),transform .35s var(--ease);
}
.cta-nav i{font-style:normal;font-size:1.05em;transition:transform .35s var(--ease)}
.cta-nav:hover{background:var(--oro-claro)}
.cta-nav:hover i{transform:translateX(4px)}
.cta-nav:focus-visible{outline:2px solid var(--claro);outline-offset:3px}
/* El menú empuja: el logo queda a la izquierda, y el menú y el botón se van
   juntos contra el borde derecho, con el botón de remate. */
.menu{margin-left:auto}

/* Los accesos entran escalonados al cargar, con la misma cadencia con la que
   entran las palabras de los títulos. "backwards": si la animación no llega a
   correr, el estado en reposo es el visible. */
@keyframes menuEntra{from{opacity:0;transform:translateY(-10px)}}
.menu__it{animation:menuEntra .8s var(--ease) backwards}
.menu__it:nth-child(2){animation-delay:.06s}
.menu__it:nth-child(3){animation-delay:.12s}
.menu__it:nth-child(4){animation-delay:.18s}
.menu__it:nth-child(5){animation-delay:.24s}

/* --- Sesión, adentro de la tira -------------------------------------------
   Se subió al lado de las banderas (pedido del cliente): antes colgaba del final
   del menú y en celular había que abrir la cortina para encontrarla. Hereda el
   cuerpo de la tira —no se declara— para que no haya dos tamaños compitiendo
   en una tira de 22 px de alto. El filete de la izquierda la separa del idioma:
   pegadas y al mismo cuerpo, las dos cosas se leían como una sola tira.
   El redondel con la inicial del usuario no sobrevivió a la mudanza: medía 34 px
   y la tira entera mide 22. Si alguna vez se quiere de vuelta, la tira tiene
   que crecer y .nav bajar su top:26px en la misma medida.
   -------------------------------------------------------------------------- */
.cuenta,.tira__login{
  border-left:1px solid rgba(200,169,106,.28);
  padding-left:clamp(.8rem,2vw,1.4rem);
}
.cuenta{position:relative;display:flex;align-items:center}
/* El <button> no hereda la tipografía de la tira —los controles de formulario
   arrancan con la del sistema—, así que hay que pasársela a mano: si no, el
   saludo queda en otro cuerpo y en caja baja al lado de ES · EN. */
.cuenta__b{
  display:inline-flex;align-items:center;gap:.45rem;line-height:1;
  font-size:inherit;letter-spacing:inherit;text-transform:inherit;
  color:var(--claro-tenue);white-space:nowrap;transition:color .3s;
}
.cuenta__b:hover,.cuenta__b[aria-expanded="true"]{color:var(--claro)}
/* Un nombre largo empujaría las banderas fuera de pantalla en un celular: el
   saludo se recorta antes de llegar a eso. */
@media(max-width:520px){
  .cuenta__n{display:block;max-width:14ch;overflow:hidden;text-overflow:ellipsis}
}
.tira__login{color:var(--claro-tenue);transition:color .3s;white-space:nowrap}
.tira__login:hover,.tira__login:focus-visible{color:var(--claro)}
.cuenta__v{width:9px;height:6px;fill:none;stroke:var(--oro);stroke-width:1.4;
  transition:transform .35s var(--ease)}
.cuenta__b[aria-expanded="true"] .cuenta__v{transform:rotate(180deg)}
.cuenta__menu{
  position:absolute;top:calc(100% + .7rem);right:0;min-width:190px;
  background:rgba(12,24,37,.95);border:1px solid var(--linea);padding:.35rem 0;
  backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  opacity:0;visibility:hidden;transform:translateY(-8px);
  transition:opacity .3s var(--ease),transform .3s var(--ease),visibility 0s .3s;
}
.cuenta__b[aria-expanded="true"] + .cuenta__menu{
  opacity:1;visibility:visible;transform:none;transition-delay:0s;
}
.cuenta__menu a{
  display:block;padding:.7rem 1.2rem;
  font-size:.64rem;letter-spacing:.18em;text-transform:uppercase;color:var(--claro-suave);
  transition:color .3s,background .3s;
}
.cuenta__menu a:hover{color:var(--claro);background:rgba(200,169,106,.12)}

/* --- La barra, apretada, entre 1331 y 1620 px -------------------------------
   Con seis secciones —y una que se llama "El respaldo detrás de NOMA", que sola
   mide 245 px— la barra ya no entra en una notebook: medido, a 1440 se iba 105
   px afuera y a 1366, 169. Antes que mandar a la cortina a la mayoría de los
   escritorios, en ese tramo la barra se aprieta: menos aire entre accesos y
   menos espaciado entre letras. Arriba de 1620 queda como estaba.
   -------------------------------------------------------------------------- */
@media(min-width:1331px) and (max-width:1620px){
  .menu,.menu__lista{gap:1.05rem}
  .menu__it > a{font-size:.65rem;letter-spacing:.1em}
  .cta-nav{padding-inline:1.15rem;font-size:.62rem;letter-spacing:.14em}
}

/* --- Botón único de celular ----------------------------------------------- */
.hamb{display:none}

/* --- Los accesos se agrupan en una cortina -----------------------------------
   El corte está en 1330 y no en el ancho de un celular: con cinco secciones, el
   Login y el botón de "Elige tu residencia", la barra desborda por la derecha
   hasta cerca de los 1330 px. Medido: a 1200 se iba 73 px afuera de la pantalla.
   Así que tablets y notebooks chicas también van con la cortina; el botón se
   queda afuera de ella y sigue a la vista.
   -------------------------------------------------------------------------- */
@media(max-width:1330px){
  .nav{gap:1rem}
  .nav.is-stuck{padding-top:1.6rem;padding-bottom:.7rem}

  .hamb{
    display:inline-flex;align-items:center;gap:.62rem;flex:none;
    min-height:44px;padding:.5rem 1.05rem;
    border:1px solid var(--linea);border-radius:999px;color:var(--claro);
    background:rgba(12,24,37,.32);
    backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
    transition:border-color .35s var(--ease),background .35s var(--ease);
  }
  .hamb__r{font-size:.6rem;letter-spacing:.24em;text-transform:uppercase}
  .hamb__t{position:relative;display:block;width:18px;height:14px;flex:none}
  .hamb__t i{
    position:absolute;left:0;right:0;height:1px;background:var(--oro-claro);
    /* El origen entra en la transición junto con el transform: el trazo corto
       gira sobre su punta cuando está cerrado y sobre su centro cuando forma la
       cruz, y pasar de un punto al otro de golpe se vería como un tirón. */
    transition:transform .42s var(--ease),transform-origin .42s var(--ease);
  }
  /* El trazo de abajo es más corto: dos rayas desparejas se leen como un signo
     dibujado y no como el icono de siempre. */
  .hamb__t i:first-child{top:0}
  .hamb__t i:last-child{bottom:0;transform:scaleX(.58);transform-origin:right center}
  body.menu-abierto .hamb{border-color:var(--oro);background:rgba(12,24,37,.68)}
  body.menu-abierto .hamb__t i:first-child{transform:translateY(6.5px) rotate(45deg)}
  body.menu-abierto .hamb__t i:last-child{
    transform:translateY(-6.5px) rotate(-45deg);transform-origin:center;
  }

  /* Encima de los flotantes (999 y 1000). La barra y el idioma quedan por
     arriba de la cortina: el logo, el idioma y el botón de cerrar siguen
     estando donde estaban antes de abrir. */
  .menu{
    position:fixed;inset:0;z-index:1100;
    display:flex;flex-direction:column;align-items:stretch;
    padding:clamp(96px,15vh,124px) clamp(1.6rem,7vw,3rem) clamp(3rem,15vh,8rem);
    background:linear-gradient(180deg,rgba(12,24,37,.965),rgba(6,14,22,.985));
    backdrop-filter:blur(22px) saturate(130%);-webkit-backdrop-filter:blur(22px) saturate(130%);
    overflow-y:auto;overscroll-behavior:contain;
    opacity:0;visibility:hidden;
    transition:opacity .42s var(--ease),visibility 0s .42s;
  }
  body.menu-abierto .menu{opacity:1;visibility:visible;transition-delay:0s}
  body.menu-abierto .nav{z-index:1200}
  body.menu-abierto .tira{z-index:1210}
  /* La cortina cuelga dentro del propio <header>, así que el logo y el botón de
     cerrar —sus hermanos— necesitan su propio z-index para no quedar debajo. */
  body.menu-abierto .marca,
  body.menu-abierto .hamb{position:relative;z-index:1120}
  /* Un solo menú abierto por vez: el círculo de contacto se aparta mientras la
     cortina está arriba, así no quedan dos botones de cerrar en pantalla. */
  body.menu-abierto .orbita{opacity:0;pointer-events:none;transform:scale(.86)}

  /* En tablet la cortina es igual de ancha que la pantalla, pero los accesos no:
     estirados a mil píxeles el número queda a un palmo del texto. La columna se
     mantiene en una medida de lectura y se centra. */
  .menu__lista{width:100%;max-width:520px;margin-inline:auto}
  /* Centrado con márgenes automáticos y no con justify-content: cuando el
     contenido es más alto que la pantalla —celular chico en apaisado— el
     centrado por justify-content recorta el arranque y ahí ya no se llega
     con el scroll; los márgenes automáticos se van a cero y no recortan nada. */
  .menu__lista{flex-direction:column;align-items:stretch;gap:0;margin-block:auto}
  .menu__it{
    position:relative;
    opacity:0;transform:translateY(20px);
    transition:opacity .5s var(--ease),transform .62s var(--ease);
  }
  /* Filete que se dibuja de izquierda a derecha bajo cada acceso, como las
     reglas de oro del resto de la página. */
  .menu__it::after{
    content:'';position:absolute;left:0;right:0;bottom:0;height:1px;
    background:linear-gradient(90deg,var(--oro),rgba(200,169,106,.05));
    transform:scaleX(0);transform-origin:left;
    transition:transform .85s var(--ease);
  }
  body.menu-abierto .menu__it{opacity:1;transform:none}
  body.menu-abierto .menu__it::after{transform:scaleX(1)}
  body.menu-abierto .menu__it:nth-child(1),
  body.menu-abierto .menu__it:nth-child(1)::after{transition-delay:.10s}
  body.menu-abierto .menu__it:nth-child(2),
  body.menu-abierto .menu__it:nth-child(2)::after{transition-delay:.17s}
  body.menu-abierto .menu__it:nth-child(3),
  body.menu-abierto .menu__it:nth-child(3)::after{transition-delay:.24s}
  body.menu-abierto .menu__it:nth-child(4),
  body.menu-abierto .menu__it:nth-child(4)::after{transition-delay:.31s}
  body.menu-abierto .menu__it:nth-child(5),
  body.menu-abierto .menu__it:nth-child(5)::after{transition-delay:.38s}

  .menu__it{animation:none}
  .menu__it > a{
    display:flex;align-items:baseline;gap:1rem;
    padding:1.15rem .1rem;min-height:60px;text-transform:none;letter-spacing:0;
  }
  .menu__it > a::after{display:none}
  .menu__n{
    display:block;flex:none;width:2.2em;
    font-style:normal;font-size:.62rem;letter-spacing:.3em;color:var(--oro);
  }
  .menu__tx{font-size:clamp(1.5rem,7vw,2.05rem);font-weight:300;line-height:1.12;color:var(--claro)}
  .menu__it.is-aqui .menu__tx{color:var(--oro-claro)}

  /* El botón se queda en la barra, encogido: en un celular el logo, el botón y
     el signo de menú tienen que entrar en 390 px, así que el signo pierde la
     palabra "Menú" y el logo cede un poco de alto. */
  .cta-nav{padding:.6rem .95rem;font-size:.58rem;letter-spacing:.12em;gap:.4rem;margin-left:auto;order:2}
  .hamb{order:3}
  .hamb{padding:.5rem .7rem;gap:0}
  .hamb__r{display:none}
  .marca__img{height:clamp(30px,8vw,42px)}
  body.menu-abierto .cta-nav{position:relative;z-index:1120}

  /* La sesión ya no está acá: se mudó a la tira de arriba, que en celular
     queda a la vista con la cortina cerrada. La cortina es sólo las secciones. */
}
/* Celular en apaisado: quedan 360 px de alto y el aire de arriba se lleva un
   cuarto de la pantalla. Se recorta todo un punto y la cortina hace su propio
   scroll si aun así no entra. */
@media(max-width:1330px) and (max-height:560px){
  .menu{padding-top:84px;padding-bottom:1.6rem}
  .menu__it > a{padding:.8rem .1rem;min-height:48px}
  .menu__tx{font-size:1.35rem}
}
@media(max-width:520px){
  .nav{top:20px;padding-bottom:.6rem}
  .marca__img{height:32px}
  .nav.is-stuck .marca__img{height:30px}
}


/* ==========================================================================
   HERO
   ========================================================================== */
.hero{position:relative;min-height:100svh;display:flex;align-items:center;overflow:hidden;background:#06121c}
.hero__media,.hero__media video,.hero__media img{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
}
.hero__media img{transition:opacity 1.4s var(--ease)}
.hero.is-playing .hero__media img{opacity:0}
.hero::after{
  content:'';position:absolute;inset:0;pointer-events:none;
  /* El video recorre escenas muy claras (arrecife, playa a pleno sol), así que
     el velo de la izquierda es más denso que antes: si no, el título se pierde. */
  background:linear-gradient(100deg,rgba(6,14,22,.82) 0%,rgba(6,14,22,.62) 34%,rgba(6,14,22,.3) 62%,rgba(6,14,22,.14) 100%),
             linear-gradient(180deg,rgba(6,14,22,.6),transparent 24%,transparent 58%,rgba(6,14,22,.78));
}
/* --- El hero que se funde con la sección de abajo -------------------------
   Cuando abajo del hero viene el fondo de mar, el corte entre las dos fotos se
   ve como una línea. Con esto el hero termina apagándose en el mismo azul con
   el que arranca la sección siguiente, y el agua aparece después: las dos
   imágenes se pasan la posta en vez de encontrarse de golpe.
   -------------------------------------------------------------------------- */
.hero--fundido::after{
  /* El degradado vertical va PRIMERO, o sea encima del velo diagonal: si va
     debajo, el velo le suma su propio azul en el último renglón y la costura
     vuelve a notarse. Arriba el vertical es transparente, así que el velo
     diagonal sigue haciendo su trabajo donde está el título. */
  background:linear-gradient(180deg,
               rgba(6,14,22,.55) 0%,transparent 22%,transparent 42%,
               rgba(10,21,34,.6) 70%,rgba(10,21,34,.94) 89%,rgb(10,21,34) 100%),
             linear-gradient(100deg,rgba(6,14,22,.82) 0%,rgba(6,14,22,.62) 34%,rgba(6,14,22,.3) 62%,rgba(6,14,22,.14) 100%);
}

.hero__in{position:relative;z-index:2;width:min(1240px,90vw);width:var(--shell);margin-inline:auto;padding:88px 0 0;padding:var(--nav-h) 0 0}
.hero__precio{
  display:inline-block;padding:.62rem 1.5rem;margin-bottom:1.5rem;
  background:rgba(146,127,92,.55);backdrop-filter:blur(6px);
  font-size:.78rem;letter-spacing:.3em;text-transform:uppercase;color:var(--claro);font-weight:400;
}
.hero__t{
  font-size:clamp(2rem,3.5vw,2.9rem);font-weight:300;line-height:1.14;color:#fff;
  margin:0 0 1.2rem;max-width:13ch;
}
.hero__sub{
  font-size:clamp(.78rem,1.3vw,.95rem);letter-spacing:.28em;text-transform:uppercase;
  color:var(--claro-suave);margin:0;line-height:1.9;
  display:flex;flex-wrap:wrap;align-items:baseline;gap:.2rem 1rem;
}
.hero__sub i{font-style:normal;color:var(--oro)}
/* Abajo de 640 px las dos partes no comparten renglón y el separador quedaría
   colgando al final de la primera: mejor una debajo de la otra, sin viñeta. */
@media(max-width:640px){
  .hero__sub{display:block}
  .hero__sub span{display:block}
  .hero__sub i{display:none}
}
.hero__registry{
  position:absolute;left:50%;bottom:clamp(2rem,5vw,3.6rem);transform:translateX(-50%);
  z-index:3;display:flex;align-items:center;gap:1.6rem;width:min(760px,86vw);
}
.hero__registry i{flex:1;height:1px;background:rgba(246,241,229,.45)}
.hero__registry div{text-align:center;color:#fff;flex:none}
.hero__registry b{display:block;font-size:.6rem;letter-spacing:.34em;font-weight:300;opacity:.8}
.hero__registry strong{
  display:block;font-family:Georgia,'Times New Roman',serif;font-weight:400;
  font-size:clamp(1.4rem,2.6vw,2rem);letter-spacing:.12em;margin:.15rem 0;
}
.hero__registry small{display:block;font-size:.58rem;letter-spacing:.3em}
@media(max-width:700px){.hero__registry i{display:none}}

.hero__scroll{
  position:absolute;left:clamp(1rem,4vw,3rem);bottom:clamp(2rem,5vw,3.6rem);z-index:3;
  display:flex;flex-direction:column;align-items:flex-start;gap:.6rem;
  font-size:.56rem;letter-spacing:.3em;text-transform:uppercase;color:var(--claro-tenue);
}
.hero__scroll i{display:block;width:1px;height:46px;background:linear-gradient(180deg,var(--oro),transparent);animation:caer 2.6s var(--ease) infinite}
@keyframes caer{0%{transform:scaleY(0);transform-origin:top}45%{transform:scaleY(1);transform-origin:top}55%{transform:scaleY(1);transform-origin:bottom}100%{transform:scaleY(0);transform-origin:bottom}}
@media(max-width:700px){.hero__scroll{display:none}}

/* Botones flotantes — copiados tal cual de css/style.css para que se vean
   igual que en index.php. Acá hacen falta porque index3.php no carga esa hoja. */
.whatsapp-btn{
  position:fixed;top:50%;margin-top:54px;right:9px;
  background-color:#25d366;color:#fff;width:60px;height:60px;border-radius:50%;
  display:flex;justify-content:center;align-items:center;font-size:30px;z-index:999;
  transition:transform .3s ease-in-out,box-shadow .3s ease;text-decoration:none;
}
.whatsapp-btn svg{width:1em;height:1em}
.whatsapp-btn:hover{transform:scale(1.1) rotate(5deg);box-shadow:0 6px 12px rgba(0,0,0,.3)}

.btn-calendly-fixed{
  position:fixed;right:9px;top:50%;margin-top:120px;
  background-color:#0b5cff;color:#fff;height:60px;width:60px;
  display:flex;align-items:center;justify-content:center;padding:0;border-radius:30px;
  text-decoration:none;z-index:1000;
  transition:all .5s cubic-bezier(.4,0,.2,1);overflow:hidden;white-space:nowrap;
}
.btn-calendly-fixed img{width:45px;height:auto;transition:all .3s ease;opacity:1;transform:scale(1)}
.btn-text{opacity:0;font-weight:600;position:absolute;transition:all .4s ease;transform:translateX(10px)}
.btn-calendly-fixed:hover{width:150px}
.btn-calendly-fixed:hover img{opacity:0;transform:scale(.5)}
.btn-calendly-fixed:hover .btn-text{opacity:1;transform:translateX(0)}

/* ==========================================================================
   CONCEPTOS (texto/foto alternados)
   ========================================================================== */
.conceptos{display:flex;flex-direction:column;gap:clamp(3.5rem,7vw,6.5rem);margin-top:clamp(3rem,6vw,5rem)}
.cpt{display:grid;grid-template-columns:1fr 1.15fr;gap:clamp(2rem,5vw,4.5rem);align-items:center}
.cpt:nth-child(even){grid-template-columns:1.15fr 1fr}
.cpt:nth-child(even) .cpt__txt{order:2}
.cpt__n{font-size:.66rem;letter-spacing:.3em;color:var(--oro);margin:0 0 .9rem}
/* margin:0 y no margin-block:0: <figure> trae de fábrica 40px de margen a cada
   lado, y eso le comía 80px de ancho a la foto. Antes quedaba tapado porque los
   márgenes negativos que la estiraban hacia el centro pisaban uno de los dos
   lados; sacados ésos, el margen de fábrica salió a la luz y descolocaba el
   cruce en 80px. */
.cpt__fig{position:relative;overflow:hidden;border-radius:var(--r);margin:0}
.cpt__fig img{width:100%;height:clamp(280px,34vw,440px);object-fit:cover;transform:scale(1.06);transition:transform 1.4s var(--ease)}
.cpt:hover .cpt__fig img{transform:scale(1)}
.cpt p{margin:0 0 1rem;color:var(--texto-suave)}
.cpt em{font-style:italic;color:var(--texto)}

/* El link del concepto 02, hacia el modelo de copropiedad. No es un botón: en
   medio de un párrafo un botón corta la lectura y compite con "Elige tu
   residencia", que es a donde queremos que vayan. Se lee como link y la flecha
   avisa que sigue. */
.cpt__link{
  display:inline-flex;align-items:center;gap:.5rem;
  color:#927f5c;color:var(--oro);
  font-size:.95rem;position:relative;
}
.cpt__link i{font-style:normal;transition:transform .35s var(--ease)}
.cpt__link::after{
  content:'';position:absolute;left:0;right:0;bottom:-4px;height:1px;
  background:currentColor;opacity:.4;
  transform:scaleX(0);transform-origin:right;transition:transform .4s var(--ease);
}
.cpt__link:hover::after,.cpt__link:focus-visible::after{transform:scaleX(1);transform-origin:left}
.cpt__link:hover i{transform:translateX(4px)}

/* Frase de cierre del concepto 03: la sacó el copy final del cliente. La regla
   queda porque el bloque puede volver; hoy no la usa nadie. */
.cpt__cierre{
  margin:1.8rem 0 0!important;padding-top:1.4rem;
  border-top:1px solid var(--oro);
  color:var(--texto)!important;font-size:1.05rem;letter-spacing:.01em;
}

/* El quinto concepto es sólo encabezado (así lo pidió el cliente): el título
   toma el peso que en los otros reparten título y párrafos, y una regla de oro
   le da pie, para que la columna no quede a media altura. */
.cpt--cierre .h3{font-size:clamp(1.6rem,2.9vw,2.4rem);margin-bottom:0}
.cpt--cierre .cpt__txt::after{
  content:'';display:block;width:64px;height:1px;background:var(--oro);margin-top:1.8rem;
}

/* --- Las fotos se muerden por el vértice --------------------------------
   Como en la propuesta de Área 6: cada foto alterna de lado, es más alta que
   su fila y queda centrada, así asoma por arriba y por abajo. Como las filas
   vecinas tienen la foto del lado opuesto, el cruce cae siempre en la esquina.
   El solape es determinista: alto de foto - alto de fila.
   Debajo de 1080px la columna de texto se angosta demasiado y el cruce
   empezaría a comerse los párrafos, así que ahí se apaga.
   ----------------------------------------------------------------------- */
@media(min-width:1080px){
  /* --- El cruce, con un número y no con un pulso --------------------------
     Antes el solape era un residuo: la foto es más alta que su fila, desborda
     por arriba y por abajo, y lo que sobraba después del aire entre filas era
     el cruce. Cada vez que se tocaba una de las tres medidas había que volver
     a medir el resultado, y encima cambiaba con el ancho de pantalla: 100 px
     de cruce abajo de 1750 y 140 arriba.

     Ahora se declara al revés. --cruce dice cuánto se pisan las dos fotos y el
     aire entre filas se calcula solo para que dé exactamente eso, en cualquier
     ancho. Es EL número de esta sección: subirlo las junta, bajarlo las separa.
     ---------------------------------------------------------------------- */
  .conceptos{
    --alto-fila:clamp(520px,33vw,560px);
    --alto-foto:clamp(620px,40vw,700px);

    /* Las dos medidas del cruce, declaradas. La intersección de las dos fotos
       es un rectángulo y cada lado tiene su número:

         --cruce-x   cuánto se pisan A LO ANCHO   ← el que importa
         --cruce-y   cuánto se pisan a lo alto

       A lo ancho sale del ancho de la foto y nada más. Cada foto va pegada a su
       lado —una a la derecha, la otra a la izquierda— así que si las dos miden
       P sobre un ancho útil W, lo que se pisan es 2P − W. Despejando:
       P = (W + cruce) / 2. No hay fr ni márgenes negativos de por medio, y da
       exacto en cualquier ancho de pantalla.

       A lo alto sale del desborde: la foto es más alta que su fila y sobresale
       por arriba y por abajo; el aire entre filas se calcula para que de ese
       desborde queden justo --cruce-y.

       Para calibrar a ojo, --cruce-x en 1440px de pantalla:
         10px  se tocan por el vértice, casi separadas
         60px  ← acá está hoy
        120px  se pisan medio dedo
        200px  se montan de verdad
       Cambiar sólo ese número; el resto se acomoda solo. */
    --cruce-x:60px;
    --cruce-y:40px;
    --ancho-foto:calc((var(--shell) + var(--cruce-x)) / 2);
    gap:calc(var(--alto-foto) - var(--alto-fila) - var(--cruce-y));
  }
  .cpt{
    grid-template-columns:1fr var(--ancho-foto);gap:clamp(3rem,6vw,6rem);
    /* Alto fijo de fila (no min-height): la foto es más alta, queda centrada
       y desborda por igual arriba y abajo. Ese desborde es lo que se cruza. */
    align-items:center;height:var(--alto-fila);
  }
  .cpt:nth-child(even){grid-template-columns:var(--ancho-foto) 1fr}
  /* El orden del solape, escrito y no heredado del azar: la 02 tapa a la 01,
     la 03 a la 02 y la 04 a la 03.

     Va en el ARTÍCULO y no en la foto, y esa es toda la diferencia. Estaba en
     la foto y al scrollear las dos se peleaban por quién quedaba encima: el
     reveal entra con opacity 0 → 1, y un elemento con opacity menor a 1 arma su
     propio stacking context. Mientras el bloque 02 se fundía era un contexto
     con z-index automático (≈0) dentro de la raíz, y la foto de la 01 —que sí
     participa de la raíz con z-index 1— le pasaba por encima. Terminaba el
     fundido, el contexto desaparecía y el orden volvía de golpe: eso era el
     parpadeo. Con el z-index declarado en el artículo el orden es el mismo
     tenga opacidad o no. */
  .cpt{position:relative}
  .cpt:nth-child(1){z-index:1}
  .cpt:nth-child(2){z-index:2}
  .cpt:nth-child(3){z-index:3}
  .cpt:nth-child(4){z-index:4}
  .cpt:nth-child(5){z-index:5}
  .cpt__fig{
    /* Un anillo del color del papel, del ancho de un margen, y nada más. Como
       la foto de abajo en el marcado se pinta encima de la de arriba, ese
       anillo le come el vértice y entre las dos queda una franja limpia de
       papel. Sin él las dos fotos se tocaban sin nada en medio y el cruce se
       leía como un error de armado.

       Va en box-shadow y no en border porque el anillo no ocupa lugar: si
       ocupara, correría la grilla y habría que rehacer todas las medidas.

       3px: el canal es un filete, no un margen. Alcanza con una línea de papel
       que marque cuál está encima; más ancho volvía a leerse como margen.

       La sombra de profundidad se fue (04/09/2026, pedido del cliente). Estaba
       para separar las dos fotos donde se cruzan y de eso ahora se ocupa el
       anillo, así que sobraba. Si alguna vez se quiere de vuelta es una línea:
       0 18px 44px -30px rgba(18,33,47,.22). */
    box-shadow:0 0 0 3px var(--papel);
  }
  .cpt__fig img{height:var(--alto-foto)}
  /* Los márgenes negativos que estiraban la foto hacia el centro se fueron: el
     ancho de la foto ya coloca el cruce donde tiene que estar, y un margen
     encima lo volvía a correr. */

  /* --- La entrada no mueve las fotos ------------------------------------------
     El reveal le daba al bloque entero un translateY(34px) que se iba a cero:
     mientras duraba, cada foto entraba desplazada y el cruce con la de arriba
     se acomodaba a la vista. El solape tiene que estar definido desde el primer
     cuadro, así que acá el bloque sólo se funde y el movimiento se lo queda la
     columna de texto, que puede moverse sin arrastrar a nadie.
     Tres clases para ganarle a .rv.is-in, que tiene dos. */
  .cpt.rv,
  .cpt.rv.is-in{transform:none}
  .cpt.rv .cpt__txt{
    transform:translateY(26px);
    transition:transform 1.2s var(--ease) .08s;
  }
  .cpt.rv.is-in .cpt__txt{transform:none}
}

@media(min-width:861px) and (max-width:1079px){
  .cpt{align-items:start}
  .cpt__txt{padding-top:1.4rem}
}

@media(max-width:860px){
  /* Una sola columna y la foto siempre abajo del texto.

     Acá vivían las escenas a pantalla completa —la foto crecía con un clip-path
     y después subían los textos—. El cliente pidió volver atrás sólo la versión
     de celular (05/09/2026), así que el bloque entero se fue y los conceptos
     vuelven a leerse como una lista: texto, foto, texto, foto. El escritorio no
     se tocó: el cruce de las fotos sigue igual, en el @media de 1080 px.

     Con las escenas se fueron también su bloque de movimiento reducido y la
     función conceptos() del JavaScript, que no hacían falta para nada más. */
  .cpt,.cpt:nth-child(even){grid-template-columns:1fr}
  .cpt:nth-child(even) .cpt__txt{order:0}
}

/* --- El concepto 05, sin foto ---------------------------------------------
   Es el remate de los cuatro anteriores: va solo, centrado y al medio de la
   sección. Va DESPUÉS de los media queries de arriba a propósito: la altura
   fija de fila —la que hace que las fotos desborden y se muerdan entre sí— se
   define ahí, y acá no hay foto que desborde. Si estas reglas subieran, esa
   altura ganaría y el bloque quedaría con medio renglón vacío debajo.
   -------------------------------------------------------------------------- */
.cpt--cierre{
  display:block;height:auto;text-align:center;
  padding-top:clamp(2rem,5vw,3.5rem);
}
/* Arriba de 1080px la foto del 04 se sale de su fila y baja hasta acá —es el
   solape que hace que las fotos se muerdan—. El aire tiene que absorber ese
   solape Y dejar el respiro del remate: con el padding normal, el "05" quedaba
   a 11px del borde de la foto y se leía como caído del bloque anterior. Abajo de
   1080 no hay solape y ese aire de más sería un agujero. */
@media(min-width:1080px){
  .cpt--cierre{padding-top:clamp(7rem,13vw,13rem)}
}
.cpt--cierre .cpt__txt{margin-inline:auto;padding-top:0}
/* El ancho va en el título y no en la caja: 'ch' se mide contra la letra del
   elemento, y la caja hereda los 17px del cuerpo mientras el título mide más del
   doble. Puesto en la caja, 34ch daban una columna angosta y cinco renglones. */
.cpt--cierre .h3{max-width:24ch;margin-inline:auto}
/* La regla de oro que cierra la sección, centrada bajo el texto. */
.cpt--cierre .cpt__txt::after{margin-inline:auto}

/* ==========================================================================
   UBICACIÓN
   ========================================================================== */
.ubi{position:relative;background:var(--tinta-2);color:var(--claro)}
.ubi__fondo{position:absolute;inset:0;overflow:hidden}
/* La foto aérea muestra el edificio, la laguna y el mar: con el velo que tenía
   antes no se veía nada de eso. Se levanta la opacidad y el degradado se
   concentra arriba y abajo, que es donde apoya el texto.

   Y va fija a la ventana en vez de estirada a la sección: la sección mide
   ~1770px de alto y la foto es 16:9, así que para cubrirla se recortaba a una
   franja vertical angosta y del edificio no quedaba nada. Fija se recorta al
   alto de la ventana —mucho menos— y de paso la sección funciona como una
   ventana que corre sobre el paisaje. El clip-path del contenedor es lo que
   hace que "fija" quede acotada a la sección y no a toda la página. */
.ubi__fondo img{width:100%;height:120%;object-fit:cover;opacity:.82}
/* Sólo de tablet para arriba: en celular el recorte es igual de agresivo en las
   dos variantes y fijo dentro de un clip-path se pone pesado en iOS. */
@media(min-width:901px){
  @supports (clip-path: inset(0)){
    .ubi__fondo{clip-path:inset(0)}
    .ubi__fondo img{position:fixed;inset:0;width:100%;height:100%}
  }
}
.ubi::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(8,18,28,.88) 0%,rgba(8,18,28,.62) 34%,rgba(8,18,28,.34) 58%,rgba(8,18,28,.86) 100%)}
.ubi__in{position:relative;z-index:2}
.ubi__km{font-size:1rem;color:var(--claro-suave);margin:0 0 2.6rem}
.tiempos{display:flex;gap:clamp(1rem,3vw,2.6rem);flex-wrap:wrap;margin:2.6rem 0 0}
.tiempo{
  width:clamp(150px,17vw,196px);aspect-ratio:1;border-radius:50%;
  border:1px solid var(--linea);display:grid;place-content:center;text-align:center;padding:1rem;
  transition:border-color .5s var(--ease),background .5s var(--ease);
}
.tiempo:hover{border-color:var(--oro);background:rgba(200,169,106,.08)}
.tiempo b{display:block;font-size:clamp(1.4rem,2.6vw,2rem);font-weight:300;color:var(--claro)}
.tiempo span{display:block;font-size:.78rem;color:var(--claro-tenue);margin-top:.3rem;line-height:1.4}

.cerca{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1.2rem;margin-top:clamp(3rem,6vw,5rem)}
/* Cantidad fija de columnas por tramo —y no auto-fit a secas— porque la última
   fila casi nunca cierra justo: con auto-fit queda un hueco del tamaño de una
   ficha, que se lee como una foto que no cargó. La ficha que queda última en una
   fila incompleta se estira hasta llenarla. */
@media(min-width:1101px){
  .cerca{grid-template-columns:repeat(4,1fr)}
  .cerca figure:has(+ .cerca__par),
  .cerca__medio{grid-column:span 2}
  /* El :not() es para que un par que cae último no se lo coman estas reglas:
     el par siempre ocupa el renglón entero, esté en la posición que esté. */
  .cerca figure:last-child:nth-child(4n+3):not(.cerca__par){grid-column:span 2}
  .cerca figure:last-child:nth-child(4n+2):not(.cerca__par){grid-column:span 3}
  /* Con tres fichas justas van tres columnas parejas: estirar la última al doble
     de ancho sólo para cerrar la fila deja una ficha grande sin motivo. */
  .cerca:has(figure:nth-child(3):last-child){grid-template-columns:repeat(3,1fr)}
  .cerca:has(figure:nth-child(3):last-child) figure:last-child{grid-column:auto}
}
@media(max-width:1100px) and (min-width:561px){
  .cerca{grid-template-columns:repeat(2,1fr)}
  .cerca figure:has(+ .cerca__par),
  .cerca figure:last-child:nth-child(odd){grid-column:span 2}
}
@media(max-width:560px){.cerca{grid-template-columns:1fr}}
.cerca figure{margin:0;position:relative;border-radius:var(--r);overflow:hidden}
.cerca img{width:100%;height:230px;object-fit:cover;transition:transform 1.2s var(--ease)}
.cerca figure:hover img{transform:scale(1.06)}
.cerca figcaption{
  position:absolute;left:0;right:0;bottom:0;padding:2.4rem 1.1rem 1rem;
  background:linear-gradient(180deg,transparent,rgba(6,14,22,.9));
  font-size:.86rem;color:#fff;
}
.cerca b{display:block;font-size:.64rem;letter-spacing:.28em;text-transform:uppercase;color:var(--oro-claro);margin-bottom:.3rem;font-weight:400}

/* Fichas de dos fotos. Son las amenidades que con una sola imagen se entienden
   mal: el borde infinito de la alberca sólo se lee desde el lobby, y el valet no
   se ve dentro del estacionamiento. Toman la fila entera —también porque son las
   dos que más pesan en la decisión— y parten la imagen en dos paños.
   El 2fr/3fr no es capricho: la primera de cada par es vertical y la segunda
   apaisada, así ninguna de las dos queda recortada de más. */
.cerca__par{grid-column:1 / -1;display:grid;grid-template-columns:2fr 3fr;gap:2px}
.cerca__par img{height:300px}
@media(max-width:700px){
  .cerca__par{grid-template-columns:1fr 1fr}
  .cerca__par img{height:190px}
}

/* --- Club de Yates (yachtclub.php) -------------------------------------------
   Tres piezas que trajo el texto del cliente del 05/09/2026.
   -------------------------------------------------------------------------- */

/* La firma del operador, abajo del título del hero (10/09/2026).

   Era "by SeaTrust" en 0,92rem arriba del título: una firma al pie, del tamaño
   que se le da a una marca que acompaña. SeaTrust no acompaña, opera, y el
   cliente pidió que se note.

   El peso lo hace el filete y no el cuerpo de la letra: el nombre queda en
   1,9rem —bien lejos de los 4,4rem del h1, así que no compite— pero arriba
   tiene una línea de oro que lo separa de todo lo demás y lo convierte en un
   bloque. Un renglón suelto se saltea; un bloque con su propia regla, no.

   inline-flex y no block: así el filete mide lo que mide la firma y no el ancho
   entero de la pantalla, que sería otra cosa —una separación de sección— y no
   una firma. */
/* 14/09/2026 · Se fue el filete de oro de arriba. La firma ya se sostiene sola
   con el aire y con el cuerpo del nombre; la línea, sobre una foto, se leía como
   un subrayado del título y no como una separación. Queda el aire, que es lo que
   de verdad la separa. */
.hero__firma{
  display:inline-flex;align-items:baseline;flex-wrap:wrap;
  gap:.35rem clamp(.8rem,1.6vw,1.2rem);
  margin:clamp(2rem,4vw,3rem) 0 0;
}
.hero__firma-k{
  font-size:.62rem;letter-spacing:.24em;text-transform:uppercase;
  color:var(--claro-suave);
}
.hero__firma-m{
  font-size:clamp(1.3rem,2.5vw,1.9rem);font-weight:300;line-height:1;
  letter-spacing:.17em;text-transform:uppercase;color:var(--oro-claro);
}
@media(max-width:600px){
  /* En pantalla angosta los dos pedazos se apilan; el rótulo arriba y el nombre
     abajo se leen como una firma de dos renglones y no como una frase cortada. */
  .hero__firma{display:flex;width:100%;flex-direction:column;align-items:flex-start;gap:.5rem}
}

/* El remate del bloque de actividades. Es la frase que cierra el argumento de
   la sección, así que va más grande que el párrafo pero sin llegar a título:
   entre los dos, y en oro claro para que se despegue del verde. */
.yc__remate{
  margin:clamp(1.6rem,3vw,2.4rem) auto 0;max-width:44ch;
  font-size:clamp(1.15rem,2.1vw,1.5rem);font-weight:300;line-height:1.45;
  color:var(--oro-claro);
}

/* Las cifras de la fracción náutica. Es el mismo tratamiento que .playa__num
   —cifra grande arriba, etiqueta en versalitas abajo— con dos diferencias: son
   cuatro y fijas en grilla, no un flex que reparte lo que sobra, y van en oro
   hondo porque el fondo es el papel y no la tinta. Abajo de 720 px pasan a dos
   columnas: cuatro de 80 px parten "Mantenimiento anual" en tres renglones. */
.cifras{
  display:grid;grid-template-columns:repeat(4,1fr);
  gap:clamp(1.6rem,3vw,2.6rem);
  margin-top:clamp(2.6rem,5vw,3.8rem);
}
.cifras b{
  display:block;font-size:clamp(1.7rem,3.4vw,2.6rem);font-weight:200;
  color:var(--oro-hondo);line-height:1.1;
}
.cifras span{
  display:block;margin-top:.5rem;
  font-size:.68rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--texto-suave);line-height:1.5;
}
@media(max-width:720px){
  .cifras{grid-template-columns:repeat(2,1fr)}
}

/* --- La doble llave, antes de los planos (tipologias.php) --------------------
   Un ancho de lectura y nada más. La lista no lleva viñeta: el cliente pidió
   que la frase en negrita hiciera de entrada y el resto siguiera en el mismo
   renglón, así que se le saca el punto y se le deja sólo el aire de la sangría.
   -------------------------------------------------------------------------- */
.versatil{max-width:68ch;margin-bottom:clamp(3rem,6vw,4.5rem)}
/* El .lede del sitio corta a 56ch y acá quedaba más angosto que el párrafo de
   abajo: dos anchos distintos en el mismo bloque se leen como un error. */
.versatil .lede{max-width:none;margin-bottom:1.4rem}
.versatil p{color:var(--texto-suave);line-height:1.7;margin:0 0 1.2rem}
.versatil em{font-style:italic;color:var(--texto)}
/* El remate del bloque (10/09/2026). El cliente lo pidió con la misma tipografía
   y el mismo tamaño que el título de arriba, así que lleva .h2 —pero es un <p>,
   porque no encabeza nada: es la última frase del bloque. La regla .versatil p
   de acá arriba le gana en especificidad, así que el color, el interlineado y el
   aire de separación hay que reponerlos por nombre. */
.versatil__remate{
  margin:clamp(2.4rem,5vw,3.6rem) 0 0;
  color:var(--texto);line-height:1.16;
}
/* 14/09/2026 · Llevaba el cuerpo entero del .h2 —hasta 3rem— y en celular eran
   cinco renglones de letra de título: pesaba más que el título que abre el
   bloque. Queda a mitad de camino entre el título y el párrafo, que es lo que
   pidió el cliente: se sigue leyendo como remate y ya no le gana a nadie. */
.versatil .versatil__remate{
  font-size:clamp(1.25rem,2.2vw,1.65rem);
  line-height:1.3;color:var(--texto);margin-bottom:0;
}
/* 15/09/2026 · En negritas, como pidió el cliente. 500 y no 700: la Jost que
   carga el sitio llega hasta 500, y en un cuerpo grande alcanza y sobra para
   que se lea como remate. Con 700 el navegador lo engorda él mismo y el trazo
   se ensucia. */
.versatil .versatil__remate--fuerte{font-weight:500}
.casos{list-style:none;margin:0 0 1.4rem;padding:0}
.casos li{
  position:relative;padding-left:1.4rem;margin-bottom:.85rem;
  color:var(--texto-suave);line-height:1.7;
}
/* Un filete de oro en lugar del punto: marca el renglón sin ser una viñeta. */
.casos li::before{
  content:'';position:absolute;left:0;top:.78em;
  width:12px;height:1px;background:var(--oro);
}
.casos b{color:var(--texto);font-weight:500}

/* --- Excelencia gastronómica: un escenario, cinco conceptos -----------------
   Antes eran cinco bloques de foto+texto alternados: casi dos pantallas de alto
   para cinco fichas que el visitante recorre de un vistazo. Ahora comparten un
   solo escenario y se comportan distinto según el ancho, con el mismo marcado.

   ESCRITORIO · las cinco fichas ocupan el mismo lugar, apiladas en absoluto, y
   se ve una por vez. La fila de pestañas de abajo las cambia al pasar el mouse.
   VISIBILITY además de OPACITY: con opacity:0 sola, las cuatro fichas apagadas
   siguen recibiendo el tabulador y el lector de pantalla las lee todas.

   CELULAR · la pila se desarma en fichas de pantalla completa, pegadas arriba:
   cada una se queda quieta y la siguiente sube y la tapa. El apilado es CSS
   puro —position:sticky y el orden del documento—, así que funciona aunque el
   JavaScript no llegue a correr; el JS sólo agrega el asentado de la foto.
   -------------------------------------------------------------------------- */
.mesa{margin-top:clamp(2.6rem,5vw,4rem)}

.mesa__pila{
  position:relative;height:clamp(430px,54vh,620px);
  border-radius:var(--r);overflow:hidden;background:var(--tinta);
}
.mesa__it{
  position:absolute;inset:0;
  opacity:0;visibility:hidden;
  /* 1,4 s y no 0,75: el cambio de foto se leía como un corte (05/09/2026,
     pedido del cliente). El retardo de visibility tiene que valer LO MISMO que
     el fundido, si no la ficha que sale desaparece de golpe a mitad de camino. */
  transition:opacity 1.4s var(--ease),visibility 0s 1.4s;
}
.mesa__it.is-on{opacity:1;visibility:visible;transition-delay:0s}
.mesa__fig{margin:0;position:absolute;inset:0}
.mesa__fig img{width:100%;height:100%;object-fit:cover;display:block}
/* La foto entra un punto más grande y se asienta mientras está a la vista: el
   cambio entre conceptos deja de ser un corte y pasa a ser un movimiento. */
.mesa__it.is-on .mesa__fig img{
  /* 1.035 y no 1.05: durante el cruce las dos fotos se ven a la vez y son la
     misma escena a distinta escala; cuanto más lejos están una de otra, más se
     nota el salto. Con el asentado repartido en 9 s el movimiento sigue estando
     pero ninguna de las dos se despega de la otra mientras se funden. */
  transform:scale(1.035);
  animation:mesaAsienta 9s var(--ease) forwards;
}
@keyframes mesaAsienta{to{transform:scale(1)}}


/* El velo: el texto va sobre la foto y las fotos son claras. Diagonal y no
   plano, para que la esquina de arriba a la derecha quede limpia. */
.mesa__it::after{
  content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(75deg,
    rgba(9,18,28,.88) 0%,rgba(9,18,28,.7) 38%,rgba(9,18,28,.26) 66%,rgba(9,18,28,.1) 100%),
    linear-gradient(180deg,rgba(9,18,28,.3) 0%,transparent 34%);
}
.mesa__txt{
  position:absolute;z-index:1;left:0;bottom:0;
  padding:clamp(1.6rem,3.4vw,3rem);max-width:min(46ch,64%);
  color:var(--claro);
}
.mesa__n{
  margin:0 0 .35rem;font-size:clamp(1.6rem,2.8vw,2.3rem);font-weight:300;
  letter-spacing:.06em;color:var(--claro);
}
/* La bajada de categoría es la que el cliente mandó en inglés y en versalitas;
   se respeta tal cual, sólo se le da el tamaño de un rótulo. Sobre la foto va
   en oro claro y no en --oro-hondo: ese oro es el legible sobre el crema, acá
   el fondo es oscuro y se invierte. */
.mesa__q{
  margin:0 0 .9rem;font-size:.64rem;letter-spacing:.24em;text-transform:uppercase;
  color:var(--oro-claro);
}
.mesa__lema{margin:0 0 .8rem;font-style:italic;font-size:1.04rem;color:var(--oro-claro)}
.mesa__d{margin:0;color:var(--claro-suave);line-height:1.62;font-size:.98rem}

/* --- Escritorio: las cinco columnas ------------------------------------------
   El escenario sale del ancho de lectura y se va a sangre, y encima se le apoyan
   cinco columnas iguales separadas por un filete claro. Cuatro llevan un velo
   que apaga la foto y sólo muestran su nombre al pie; la que tiene el mouse se
   destapa. La foto de abajo es una sola —la del concepto activo— y cruza las
   cinco, así que al cambiar de columna cambia la imagen de todo el ancho.

   Las columnas son las MISMAS pestañas de antes: siguen siendo botones con
   role="tab", así que el teclado y el lector de pantalla funcionan igual que
   cuando eran una fila al pie. Lo único que cambió es dónde se dibujan.
   -------------------------------------------------------------------------- */
.mesa__tabs{display:none}

@media(min-width:901px){
  .mesa__pila{
    /* A sangre. .sec ya trae overflow:hidden, así que los 100vw no abren barra
       horizontal aunque la vertical se lleve unos píxeles. */
    margin-inline:calc(50% - 50vw);
    height:clamp(560px,80vh,880px);
    border-radius:0;
  }
  /* El velo diagonal era para leer un texto pegado abajo a la izquierda. Ahora
     el texto va centrado en su columna y el apagado lo hacen las columnas, así
     que acá sólo queda un asentado arriba y abajo para que ni el filete de las
     columnas ni los nombres al pie floten sobre cielo blanco. */
  .mesa__it::after{
    background:linear-gradient(180deg,
      rgba(9,18,28,.3) 0%,rgba(9,18,28,.05) 26%,rgba(9,18,28,.05) 70%,
      rgba(9,18,28,.14) 100%);
  }

  /* El texto del concepto activo se mete DENTRO de su columna. No hace falta
     duplicarlo en el botón: cada ficha sabe qué lugar ocupa por su posición en
     el marcado y se corre a su quinto. z-index 3 lo pone arriba del velo, y
     pointer-events:none deja que el mouse siga llegando al botón de abajo —si
     no, al pasar sobre el propio texto la columna se apagaba sola. */
  .mesa__txt{
    z-index:3;pointer-events:none;
    left:0;right:auto;top:auto;bottom:clamp(5.5rem,11vh,8.5rem);
    width:20%;max-width:none;
    padding:0 clamp(.9rem,1.6vw,1.9rem);
    text-align:center;
  }
  /* El halo atrás del texto. La columna abierta se destapa casi entera para que
     se vea la foto, y estos renders son de playa: cielo blanco, sombrillas
     blancas, manteles blancos. Un velo parejo lo bastante oscuro para leer
     encima apagaba la foto y mataba el efecto; un óvalo suave que sólo oscurece
     donde están las letras deja la foto abierta alrededor. */
  .mesa__txt::before{
    content:'';position:absolute;z-index:-1;
    /* Ancho: el de la columna entera (left/right a 0 miden contra la caja de
       relleno). Alto: el del texto, más aire arriba y abajo: ese aire es
       el tramo en el que la banda sube de cero a fondo, así que la
       primera letra ya cae sobre el negro y el degradé no se ve.

       Es una banda vertical y no un óvalo. Se probó con un radial y el bloque
       de texto es alto y angosto: las esquinas de arriba —el nombre, que es lo
       más grande— caían fuera de la elipse y quedaban sin fondo, a 1,9:1 sobre
       el render del salón. Una banda a lo ancho de la columna no tiene esquinas
       que se escapen, y a los costados muere contra los filetes, que ya son un
       corte. */
    left:0;right:0;top:-5.4rem;bottom:-3.6rem;
    background:linear-gradient(180deg,
      rgba(9,18,28,0) 0%,rgba(9,18,28,.72) 17%,
      rgba(9,18,28,.76) 80%,rgba(9,18,28,0) 100%);
  }
  .mesa__it:nth-child(2) .mesa__txt{left:20%}
  .mesa__it:nth-child(3) .mesa__txt{left:40%}
  .mesa__it:nth-child(4) .mesa__txt{left:60%}
  /* La última columna se corre a la izquierda. Los botones flotantes de
     WhatsApp y Zoom están clavados al borde derecho de la pantalla y se comen
     los 69 px de ahí: sin este empujón el renglón de categoría de NOMA
     GATHERINGS quedaba tapado por el botón verde. Es la única columna que lo
     necesita, y el corrimiento es de medio centímetro. */
  .mesa__it:nth-child(5) .mesa__txt{
    left:80%;
    padding-right:calc(clamp(.9rem,1.6vw,1.9rem) + 3.4rem);
  }
  /* El texto entra un paso después que la foto: primero se destapa la columna,
     después se lee. Al revés se leía como un parpadeo. */
  .mesa__it .mesa__txt{transform:translateY(16px);transition:transform .8s var(--ease) .12s}
  .mesa__it.is-on .mesa__txt{transform:none}

  .mesa__n{
    font-size:clamp(1.3rem,1.9vw,1.9rem);margin-bottom:.5rem;line-height:1.15;
  }
  /* El filete de oro abajo del nombre, que es el corte que separa el título del
     cuerpo en la página de referencia. */
  .mesa__n::after{
    content:'';display:block;width:44px;height:1px;margin:.9rem auto 0;
    background:var(--oro-claro);opacity:.75;
  }
  .mesa__q{margin-bottom:.75rem}
  .mesa__lema{font-size:.95rem;margin-bottom:.7rem}
  .mesa__d{font-size:.88rem;line-height:1.66}

  /* La que se va sigue moviéndose mientras se apaga. Quieta, el ojo la lee como
     una capa muerta encima de la nueva, y ahí está la mitad de la brusquedad.
     Sólo en escritorio: en celular la escala la maneja el scroll con --p y una
     transición la dejaría arrastrada un segundo atrás del dedo. */
  .mesa__it .mesa__fig img{transition:transform 1.4s var(--ease)}

  .mesa__tabs{
    position:absolute;inset:0;z-index:2;
    display:grid;grid-template-columns:repeat(5,1fr);
  }
  .mesa__tab{
    position:relative;
    /* Columna y no fila: el nombre y la bajada son dos renglones apilados al
       pie, no dos cosas una al lado de la otra. */
    display:flex;flex-direction:column;align-items:center;justify-content:flex-end;
    text-align:center;
    padding:0 clamp(.7rem,1.3vw,1.5rem) clamp(1.7rem,3.4vh,2.8rem);
    /* El filete que separa las imágenes. Claro y no oro: es un corte de luz
       sobre la foto, no un adorno de la paleta. */
    border-left:1px solid rgba(246,241,229,.42);
    /* La sombra sólo abajo, donde están las letras (05/09/2026, pedido del
       cliente). Antes era un velo parejo que apagaba la columna entera y sólo
       se destapaba la del mouse; el cliente prefirió que se vean las cinco
       fotos y que lo único oscuro sea el pie, atrás de los nombres. Así que la
       sombra ya no distingue activa de apagada: eso ahora lo dicen el texto que
       aparece, el filete de oro al pie y la foto que cambia. */
    background:linear-gradient(180deg,
      rgba(9,18,28,0) 0%,rgba(9,18,28,0) 48%,rgba(9,18,28,.26) 66%,
      rgba(9,18,28,.62) 84%,rgba(9,18,28,.8) 100%);
    color:var(--claro);
  }
  .mesa__tab:first-child{border-left:0}
  /* El nombre al pie se va en la columna abierta: ahí el nombre ya está en el
     centro, en grande, y repetirlo abajo era leerlo dos veces. */
  .mesa__tab.is-on .mesa__tn,
  .mesa__tab.is-on .mesa__tq{opacity:0;transform:translateY(8px)}
  /* Y en su lugar queda el filete de oro al pie: la marca de dónde estás
     parado, el mismo gesto que usa el menú. */
  .mesa__tab::before{
    content:'';position:absolute;left:0;right:0;bottom:0;height:2px;
    background:var(--oro-hondo);background:var(--oro-claro);
    transform:scaleX(0);transition:transform .6s var(--ease);
  }
  .mesa__tab.is-on::before{transform:scaleX(1)}
  .mesa__tab:focus-visible{outline:2px solid var(--oro-claro);outline-offset:-4px}
  .mesa__tn,.mesa__tq{
    transition:opacity .5s var(--ease),transform .5s var(--ease);
  }
  .mesa__tn{
    display:block;font-size:.8rem;letter-spacing:.16em;text-transform:uppercase;
    color:var(--claro);
  }
  /* La bajada de categoría es un apoyo, no un rótulo: abajo de 1200 px las
     columnas quedan de 240 px y "Meetings · Corporate events · Private dining ·
     Celebrations" se parte en cuatro renglones. Ahí se va. */
  .mesa__tq{
    display:none;margin-top:.45rem;
    font-size:.58rem;letter-spacing:.14em;text-transform:uppercase;
    color:var(--claro-suave);line-height:1.55;
    /* Dos renglones reservados siempre. Las bajadas de THE MARKET y NOMA
       GATHERINGS ocupan dos y las otras uno: como la columna alinea al pie, los
       nombres quedaban a distinta altura y la fila se leía torcida. */
    min-height:3.1em;
  }
  @media(min-width:1200px){.mesa__tq{display:block}}
}

/* --- Celular: la pila se apila de verdad -------------------------------------
   Cada ficha ocupa la pantalla y se pega arriba; la siguiente sube por encima y
   la tapa. Sale del ancho de lectura con márgenes negativos porque a media
   pantalla el efecto no se lee: tiene que ser a sangre.
   svh y no vh: en celular la barra del navegador aparece y desaparece, y con vh
   la ficha cambia de alto mientras se scrollea y el apilado da un salto.
   -------------------------------------------------------------------------- */
@media(max-width:900px){
  .mesa__pila{
    height:auto;border-radius:0;overflow:visible;background:none;
    margin-inline:calc(50% - 50vw);
  }
  .mesa__it{
    /* inset:auto ANTES del top:0, y no es un detalle: en escritorio la ficha es
       absoluta con inset:0, o sea que trae también bottom:0. Un sticky con top
       Y bottom a la vez queda clavado al alto de la pantalla, y las cinco se
       pinchaban en el mismo lugar: se veía siempre la última. */
    position:sticky;inset:auto;top:0;
    /* Mismo motivo que en amenidades: con svh la ficha quedaba unos 60 px más
       corta que la pantalla real cuando la barra del navegador se esconde, y
       por abajo asomaba una franja de la foto siguiente. */
    height:100svh;
    height:100dvh;
    opacity:1;visibility:visible;transition:none;
    /* La ficha que sube proyecta sombra sobre la que está quieta: sin esto el
       borde de arriba es un corte recto y se lee como un salto, no como que una
       foto se abre sobre la otra. */
    box-shadow:0 -18px 40px -14px rgba(6,14,22,.5);
  }
  /* El velo se da vuelta respecto de escritorio —acá el texto va arriba— pero
     el borde de arriba queda casi limpio a propósito: ahí es por donde la ficha
     asoma mientras tapa a la anterior, y con el velo al tope la aparición era
     una banda negra de 180 px antes de que se viera nada. Empieza flojo, se
     carga detrás del texto y se suelta sobre la foto. */
  .mesa__it::after{
    background:linear-gradient(180deg,
      rgba(9,18,28,.32) 0%,rgba(9,18,28,.84) 20%,rgba(9,18,28,.8) 52%,
      rgba(9,18,28,.22) 72%,rgba(9,18,28,.58) 100%);
  }
  /* --p lo escribe el JS: 0 cuando la ficha viene entrando por abajo, 1 cuando
     ya llegó arriba. Sin JS vale 1 y todo queda asentado y a la vista. */
  .mesa__it .mesa__fig img{
    transform:scale(calc(1.12 - .12 * var(--p,1)));
    animation:none;
  }
  /* El texto sube al tercio de arriba y NO se queda abajo. Pegado al pie, la
     ficha que llega lo tapaba primero y quedaba media frase cortada durante
     todo el recorrido; arriba se lee entero hasta que la foto ya lo relevó. */
  .mesa__txt{
    top:clamp(88px,22svh,200px);bottom:auto;
    max-width:none;padding:0 clamp(1.4rem,6vw,2.4rem);
    opacity:calc(var(--p,1) * 1.7 - .35);
    transform:translateY(calc((1 - var(--p,1)) * 28px));
  }
  /* El reveal de entrada (.rv) envuelve a las cinco fichas y dura 1,1 s. Un
     ancestro con transform le saca el position:sticky a todos sus hijos, así
     que mientras esa animación corre las fichas NO se apilan: quien entra
     scrolleando rápido ve un segundo largo de fichas sueltas y translúcidas.
     Acá el bloque entra sin reveal —cada ficha ya trae su propia entrada con
     --p— y el problema no existe. La especificidad tiene que ganarle a
     .rv.is-in, de ahí las tres clases. */
  .mesa.rv,
  .mesa.rv.is-in{opacity:1;transform:none;transition:none}

  /* Y el otro que rompía el apilado: .sec lleva overflow:hidden —está ahí para
     que el parallax y las fotos desbordadas no ensanchen la página— y eso
     convierte a la sección en el contenedor de scroll de todo lo que tiene
     adentro. Las fichas quedaban con position:sticky en el computed style y no
     se pegaban nunca: se iban para arriba y el título se metía abajo de la
     barra. `clip` recorta exactamente igual pero NO crea contenedor de scroll.
     Si el navegador es viejo y no lo entiende, se queda el hidden de .sec y las
     fichas se leen una abajo de la otra: se pierde el efecto, no el contenido. */
  #gastronomia{overflow:clip}
}

/* Con el movimiento apagado no hay nada que asentar y las fichas no se tapan:
   se leen una abajo de la otra, que es lo que había antes de este bloque. */
@media(prefers-reduced-motion:reduce){
  .mesa__it.is-on .mesa__fig img{animation:none;transform:none}
  /* El texto de la columna abierta entra subiendo 16 px; con el movimiento
     apagado aparece y ya. */
  .mesa__it .mesa__txt{transform:none;transition:none}
}
@media(max-width:900px) and (prefers-reduced-motion:reduce){
  .mesa__it{position:static;height:auto;min-height:64svh}
  .mesa__it .mesa__fig img{transform:none}
  .mesa__txt{opacity:1;transform:none}
}

/* --- Amenidades: la lista como índice ---------------------------------------
   Antes era una grilla de once fichas con foto: dos pantallas de alto que se
   leían como un catálogo, y con las cuatro albercas adelante había que recorrer
   media lista para llegar al spa. Ahora los nombres van a la izquierda, en
   grande, y a la derecha hay una sola foto que cambia al pasar el mouse.

   El apagado de los nombres inactivos es el gesto del sitio de referencia que
   pidió el cliente. Va a .6 de opacidad y no más claro: ahí da 3,4:1 contra el
   papel crema, que es el mínimo que pide la norma para texto grande (arriba de
   24 px, y el más chico de esta lista mide 28,8). Con el activo a 10,2:1 la
   diferencia entre elegido y no elegido sigue siendo evidente —tres veces— sin
   dejar seis palabras ilegibles.
   -------------------------------------------------------------------------- */
.elenco{
  display:grid;grid-template-columns:minmax(230px,36%) 1fr;
  gap:clamp(1.8rem,4vw,4rem);align-items:start;
  margin-top:clamp(2.4rem,4.5vw,3.6rem);
}
.elenco__lista{list-style:none;margin:0;padding:0}
.elenco__b{
  display:block;width:100%;text-align:left;
  font-size:clamp(1.75rem,3.1vw,2.9rem);font-weight:200;line-height:1.16;
  letter-spacing:-.005em;color:rgba(45,59,70,.6);
  padding:.05em 0;transition:color .4s var(--ease);
}
.elenco__b.is-on{color:var(--texto)}
.elenco__b:hover{color:var(--texto)}
.elenco__b:focus-visible{outline:2px solid var(--oro-hondo);outline-offset:4px}

/* La guía y el botón de saltear son de celular: en escritorio la lista de
   nombres de la izquierda ya deja ir a cualquier amenidad de un vistazo. */
.elenco__guia,.elenco__saltar{display:none}

.elenco__pila{
  position:relative;
  /* El alto lo fija la pila y no la foto: si dependiera de cada imagen, la
     columna daría un salto en cada cambio. */
  height:clamp(420px,46vw,600px);
}
.elenco__it{
  position:absolute;inset:0;
  opacity:0;visibility:hidden;
  transition:opacity .6s var(--ease),visibility 0s .6s;
}
.elenco__it.is-on{opacity:1;visibility:visible;transition-delay:0s}
.elenco__caja{position:absolute;inset:0;display:flex;flex-direction:column}
.elenco__fig{
  margin:0;flex:1 1 auto;min-height:0;
  overflow:hidden;border-radius:var(--r);background:var(--papel-2);
}
.elenco__fig img{width:100%;height:100%;object-fit:cover;display:block}
/* El nombre ya está en la lista de al lado: repetirlo sobre la foto sería
   decirlo dos veces. Vuelve en celular, donde la lista no está. */
.elenco__n{display:none}
.elenco__txt{flex:0 0 auto;padding-top:1rem}
.elenco__d{margin:0;color:var(--texto-suave);line-height:1.6;font-size:.98rem}

/* Abajo de 1080 px los nombres a 2,9rem se comen la columna de la foto: la
   lista cede tamaño antes que ancho. */
@media(max-width:1080px){
  .elenco{grid-template-columns:minmax(190px,34%) 1fr;gap:1.6rem}
  .elenco__b{font-size:clamp(1.5rem,2.6vw,2rem)}
}

/* --- Celular: las fichas entran desde la derecha ----------------------------
   Mismo apilado que la sección de gastronomía —cada ficha se pega arriba y la
   siguiente la tapa— pero la que llega no sube: entra de derecha a izquierda,
   como una foto que se corre sobre la otra. La caja de adentro es la que se
   mueve; la ficha se queda quieta y recorta lo que todavía no entró.
   -------------------------------------------------------------------------- */
@media(max-width:900px){
  /* El que se pega es el MARCO, no cada ficha. Con fichas sticky —como en la
     sección de gastronomía— la que llega trae también su desplazamiento
     vertical, y la entrada salía en diagonal en vez de derecha a izquierda.
     Acá el marco queda quieto a pantalla completa mientras el bloque recorre
     sus N pantallas de scroll, y adentro las fichas sólo se corren de costado.
     --fichas lo escribe el PHP con la cantidad real: si mañana se agrega una
     amenidad, el alto se acomoda solo. */
  .elenco{display:block;margin-top:2rem;height:calc(var(--fichas,7) * 100svh)}
  .elenco__lista{display:none}
  .elenco__pila{
    position:sticky;top:0;overflow:hidden;
    margin-inline:calc(50% - 50vw);
    /* dvh y no svh, con svh de respaldo para navegadores viejos. svh es la
       pantalla CON la barra del navegador puesta; en Android la barra se
       esconde apenas bajás y la pantalla real queda unos 60 px más alta, así
       que el marco terminaba antes del borde y abajo asomaba el crema de la
       sección. dvh es la pantalla que hay en este momento, así que el marco
       llega siempre al fondo.

       El alto del BLOQUE (arriba, --fichas * 100svh) se queda en svh a
       propósito: ése es el largo del scroll y si cambiara mientras la barra
       aparece y desaparece, el recorrido se movería abajo del dedo. */
    height:100svh;
    height:100dvh;
  }
  .elenco__it{
    position:absolute;inset:0;height:auto;
    opacity:1;visibility:visible;transition:none;
    /* La ficha ocupa todo el marco aunque su caja esté corrida afuera, así que
       la última del montón se quedaba con todos los clics y con la selección de
       texto de las que sí se ven. Lo que recibe el dedo es la caja, no la ficha. */
    pointer-events:none;
  }
  .elenco__caja{pointer-events:auto}
  .elenco__caja{
    transform:translateX(calc((1 - var(--p,1)) * 100%));
    box-shadow:-24px 0 50px -18px rgba(6,14,22,.55);
  }
  .elenco__fig{border-radius:0}
  /* El texto va sobre la foto: velo cargado abajo, que es donde se apoya. */
  .elenco__fig::after{
    content:'';position:absolute;inset:0;pointer-events:none;
    background:linear-gradient(180deg,
      rgba(9,18,28,.28) 0%,rgba(9,18,28,.12) 34%,rgba(9,18,28,.62) 72%,rgba(9,18,28,.9) 100%);
  }
  .elenco__fig{position:relative}
  .elenco__txt{
    position:absolute;left:0;right:0;bottom:0;z-index:1;
    padding:clamp(1.4rem,6vw,2.2rem);
    padding-bottom:calc(clamp(1.4rem,6vw,2.2rem) + env(safe-area-inset-bottom));
  }
  .elenco__n{
    display:block;margin:0 0 .5rem;
    font-size:clamp(1.7rem,7vw,2.4rem);font-weight:300;letter-spacing:.03em;
    color:var(--claro);
  }
  .elenco__d{color:var(--claro-suave);font-size:1rem}

  /* --- La guía y el botón de saltear ---------------------------------------
     Siete pantallas de scroll son largas si lo que buscabas era otra cosa. La
     guía numera las siete arriba, dice en cuál estás y deja ir directo a
     cualquiera; el botón de abajo se saltea la sección entera.

     Van adentro del marco, que es lo único que queda quieto en pantalla, y por
     encima de las fichas (z-index 2: las cajas viajan en 1).
     -------------------------------------------------------------------------- */
  .elenco__guia{
    position:absolute;z-index:2;
    /* 6,2 rem: la barra fija del sitio termina en 82 px y ésta es la primera
       línea que queda despejada abajo. */
    top:6.2rem;left:0;right:0;
    display:flex;gap:2px;
    padding:0 clamp(1.1rem,4.5vw,2rem);
  }
  /* Un asentado que arranca en el borde de arriba del marco y muere abajo de
     los números. Sin él los números caían sobre lo que hubiera en la foto —el
     Kids Club es techo blanco— y quedaban en 2,4:1. No es un velo sobre la
     imagen entera: son 130 px arriba, donde además ya está la barra oscura. */
  .elenco__guia::before{
    content:'';position:absolute;z-index:-1;pointer-events:none;
    left:0;right:0;top:-6.2rem;bottom:-2.8rem;
    background:linear-gradient(180deg,
      rgba(9,18,28,.88) 0%,rgba(9,18,28,.84) 58%,rgba(9,18,28,0) 100%);
  }
  .elenco__g{
    /* flex:1 reparte el ancho entre las que haya: si mañana se agrega una
       amenidad, no hay ningún número que recalcular. */
    flex:1 1 0;min-width:0;
    /* El número es chico pero el botón no: 44 px de alto es el mínimo que se
       toca sin errarle. El aire de arriba es transparente. */
    min-height:44px;
    display:flex;flex-direction:column;justify-content:flex-start;gap:.5rem;
    padding:0;background:none;
    /* .72 y no --claro-tenue (.42): el número apagado igual tiene que leerse,
       y a 9 px de cuerpo la norma pide 4,5:1. */
    color:rgba(246,241,229,.72);
    transition:color .45s var(--ease);
  }
  .elenco__g i{
    display:block;height:2px;background:rgba(246,241,229,.34);
    transition:background .45s var(--ease);
  }
  .elenco__g span{
    font-size:.58rem;letter-spacing:.16em;font-style:normal;
    text-align:center;color:inherit;
  }
  .elenco__g.is-on{color:var(--oro-claro)}
  .elenco__g.is-on i{background:var(--oro-claro)}
  .elenco__g:focus-visible{outline:2px solid var(--oro-claro);outline-offset:3px}

  .elenco__saltar{
    position:absolute;z-index:2;
    left:50%;transform:translateX(-50%);
    bottom:calc(1.1rem + env(safe-area-inset-bottom));
    display:inline-flex;align-items:center;gap:.5rem;
    min-height:44px;padding:0 1.15rem;
    border:1px solid rgba(246,241,229,.34);border-radius:999px;
    background:rgba(9,18,28,.72);
    -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
    color:var(--claro);
    font-size:.64rem;letter-spacing:.18em;text-transform:uppercase;
  }
  .elenco__saltar:focus-visible{outline:2px solid var(--oro-claro);outline-offset:3px}
  /* El texto de la ficha se corre para arriba lo que ocupa el botón: pegados,
     la bajada de la amenidad quedaba abajo de la píldora. */
  .elenco__txt{
    padding-bottom:calc(clamp(1.4rem,6vw,2.2rem) + 3.4rem + env(safe-area-inset-bottom));
  }

  /* Las dos razones por las que el apilado no funcionaba, iguales a las de la
     sección de gastronomía: .sec lleva overflow:hidden y eso convierte a la
     sección en contenedor de scroll —clip recorta igual y no lo hace—, y el
     reveal de entrada le pone un transform al padre, que le saca el sticky a
     todos sus hijos mientras dura. */
  #servicios{overflow:clip}
  .elenco.rv,
  .elenco.rv.is-in{opacity:1;transform:none;transition:none}
}

/* Sin movimiento no hay ni marco fijo ni entrada: las fichas se leen una abajo
   de la otra, como una lista común. Hay que desarmar las cuatro piezas —el alto
   del bloque, el marco, la ficha y la caja—; si queda una sola, el resto se
   apila encima y se ve una amenidad de siete. */
@media(max-width:900px) and (prefers-reduced-motion:reduce){
  .elenco{height:auto}
  /* Sin marco fijo no hay dónde apoyar la guía ni la píldora: colgadas de una
     pila que ya no es relative, se irían a cualquier lado. Acá tampoco hacen
     falta —las fichas son 62svh y se pasan de largo scrolleando normal—. */
  .elenco__guia,.elenco__saltar{display:none}
  .elenco__pila{position:static;height:auto;overflow:visible}
  .elenco__it{position:static;inset:auto;height:auto;margin-bottom:1.4rem}
  .elenco__caja{position:relative;inset:auto;transform:none;box-shadow:none}
  .elenco__fig{height:62svh;flex:0 0 auto}
}

/* ==========================================================================
   FRENTE DE PLAYA (dentro de la sección de ubicación)
   ========================================================================== */
/* Las cifras arrancan alineadas a la izquierda como el resto de la sección de
   ubicación; recién cuando envuelven pasan a centrarse solas. */
.playa__num{display:flex;gap:clamp(2rem,6vw,5rem);flex-wrap:wrap;margin-top:2.6rem}
/* Apagar una sección entera sin sacarla del marcado. Hoy la usa la galería de
   frases del home (#amenidades), que el cliente pidió esconder el 05/09/2026:
   sacando la clase vuelve tal cual estaba. */
.oculto{display:none!important}
.playa__num div{text-align:left}
.playa__num b{display:block;font-size:clamp(2rem,4.4vw,3.4rem);font-weight:200;color:var(--oro-claro)}
.playa__num span{display:block;font-size:.72rem;letter-spacing:.22em;text-transform:uppercase;color:var(--claro-tenue);margin-top:.4rem}
.playa__fig{margin:clamp(2.6rem,5vw,4rem) 0 clamp(3rem,6vw,4.5rem);position:relative;overflow:hidden;border-radius:var(--r)}
.playa__fig img,
.playa__fig video{width:100%;height:clamp(240px,32vw,440px);object-fit:cover;display:block}
.franja{
  background:var(--verde);color:var(--oro-claro);text-align:center;
  padding:clamp(2rem,4vw,3rem) 0;font-size:clamp(.76rem,1.5vw,1rem);
  letter-spacing:.34em;text-transform:uppercase;
}

/* ==========================================================================
   SLIDES DE AMENIDADES Y CLUB NÁUTICO
   ========================================================================== */
.lujo{position:relative;min-height:clamp(560px,82vh,760px);display:flex;align-items:center;overflow:hidden;background:#06121c}
.lujo__caps{position:absolute;inset:0}
.lujo__caps img{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transform:scale(1.08);
  transition:opacity 1.5s var(--ease),transform 7s linear;
}
.lujo__caps img.is-on{opacity:1;transform:scale(1)}
/* El aéreo del Hobie Wave tiene la embarcación al centro-izquierda y el azul
   profundo a la derecha. En vertical el recorte por defecto se la come; anclado
   a la derecha, el barco queda a la vista y el texto cae sobre el agua honda.
   Sólo en celular: en escritorio la foto entra entera de ancho y el anclaje
   horizontal no cambia nada. */
@media(max-width:900px){
  #flota .lujo__caps img:nth-child(2){object-position:34% 50%}
}
.lujo::after{
  content:'';position:absolute;inset:0;
  background:linear-gradient(90deg,rgba(6,14,22,.86) 0%,rgba(6,14,22,.5) 55%,rgba(6,14,22,.25) 100%);
}
/* En celular el velo horizontal no alcanza: la frase ocupa casi todo el ancho
   —del 10 % al 90 %— y su final cae donde el degradado ya se soltó a .3. Acá se
   inclina y se carga parejo, que es lo que hace falta cuando el texto cruza la
   pantalla entera. */
@media(max-width:900px){
  .lujo::after{
    background:linear-gradient(160deg,
      rgba(6,14,22,.4) 0%,rgba(6,14,22,.58) 40%,rgba(6,14,22,.66) 74%,rgba(6,14,22,.5) 100%);
  }
}
.lujo__in{position:relative;z-index:2;width:min(1240px,90vw);width:var(--shell);margin-inline:auto;color:#f6f1e5;color:var(--claro)}
.lujo__frase{
  font-size:clamp(1.5rem,3.6vw,3rem);font-weight:300;line-height:1.22;
  max-width:20ch;margin:0;min-height:3.6em;color:#fff;
}
.lujo__frase span{
  display:inline-block;opacity:0;transform:translateY(18px);
  animation:subir .8s var(--ease) forwards;
}
@keyframes subir{to{opacity:1;transform:none}}
.lujo__quien{
  margin:1.8rem 0 0;font-size:.72rem;letter-spacing:.3em;text-transform:uppercase;color:var(--oro-claro);
}
.lujo__pts{display:flex;gap:.6rem;margin-top:2.4rem}
.lujo__pts button{
  width:34px;height:2px;background:rgba(246,241,229,.28);position:relative;overflow:hidden;
  transition:background .4s;
}
.lujo__pts button.is-on{background:var(--oro)}

/* ==========================================================================
   AGENTES — grilla de marcas
   El cliente prefirió la grilla fija al marquee: las nueve marcas se ven todas
   juntas, quietas, y ninguna pasa de largo.
   Los PNG vienen en dos versiones con la misma silueta: blanco (reposo) y
   dorado (destacado). El hover cruza uno sobre otro, así que no hace falta
   ningún filtro que degrade el trazo fino de los logos.
   ========================================================================== */
.marcas{
  --alto:clamp(32px,3.6vw,50px);
  margin-top:clamp(2.6rem,5vw,4rem);
  display:grid;grid-template-columns:repeat(3,1fr);
  gap:clamp(1.2rem,2.4vw,2rem) clamp(1.5rem,3vw,3rem);
}
/* Cada celda reserva de antemano el alto del logo más el de la frase. Si la
   frase empujara al aparecer, toda la fila se movería con el mouse encima. */
.marcas__it{
  position:relative;display:flex;flex-direction:column;align-items:center;
  justify-content:flex-start;gap:.8rem;text-align:center;
  padding:1rem .8rem;border-radius:var(--r);
  transition:background .45s var(--ease);
}
/* Fondo propio al pasar el mouse. No es decoración: la frase es texto chico en
   versalitas y abajo hay una foto de agua con brillos, así que sin una base
   pareja el contraste cambia según qué ola quede atrás. */
.marcas__it:hover,.marcas__it:focus-within{background:rgba(18,33,47,.62)}
@supports (backdrop-filter:blur(6px)){
  .marcas__it:hover,.marcas__it:focus-within{background:rgba(18,33,47,.5);backdrop-filter:blur(6px)}
}
.marcas__logo{position:relative;display:block;line-height:0;height:calc(var(--alto) * 1.15);display:grid;place-items:center}
.marcas__logo img{
  grid-area:1/1;
  height:calc(var(--alto) * var(--esc,1));width:auto;max-width:100%;object-fit:contain;
  transition:opacity .45s var(--ease);
}
.marcas__alta{opacity:0}
.marcas__it:hover .marcas__alta,
.marcas__it:focus-within .marcas__alta{opacity:1}
.marcas__it:hover .marcas__base,
.marcas__it:focus-within .marcas__base{opacity:0}

/* La frase entra con el dorado. Va con visibility y no sólo con opacity para que
   el lector de pantalla no la anuncie mientras está escondida. */
.marcas__frase{
  margin:0;font-size:.82rem;letter-spacing:.1em;text-transform:uppercase;
  /* Oro claro y no --oro de marca: es texto chico en versalitas. El --oro sobre
     el fondo del hover da 4,6:1 —justo en el límite— y el oro claro, 10,5:1.
     A 13 px un trazo de 1 px se come buena parte del color con el antialias, así
     que conviene arrancar del lado holgado. */
  color:var(--oro-claro);max-width:22ch;line-height:1.5;
  opacity:0;visibility:hidden;transform:translateY(6px);
  transition:opacity .45s var(--ease),transform .45s var(--ease),visibility 0s linear .45s;
}
.marcas__it:hover .marcas__frase,
.marcas__it:focus-within .marcas__frase{
  opacity:1;visibility:visible;transform:none;transition-delay:0s;
}

/* Sin hover —celular y tablet— la frase no se puede descubrir, así que se muestra
   siempre y el logo queda en su versión blanca, que es la que mejor se lee sobre
   el agua. Va también por ancho y no sólo por (hover:none): hay navegadores que
   no informan bien esa media query, y si falla la frase no se vería nunca. */
@media(hover:none),(max-width:900px){
  .marcas__frase{opacity:1;visibility:visible;transform:none}
}
/* Se queda en dos columnas hasta el final: en una sola, las nueve marcas hacen
   una tira de metro y medio que nadie termina de bajar. A 32 px de alto el logo
   más ancho entra cómodo en media pantalla de celular. */
/* Con siete marcas la última fila queda con una sola y colgada a la izquierda,
   con medio renglón vacío al lado. Cuando sobra exactamente una, ocupa la fila
   entera: el contenido de la celda ya está centrado, así que queda al medio.
   Es una regla que se enciende sola según cuántas marcas haya; si mañana suman
   o sacan una, no hay nada que tocar. */
@media(min-width:901px){
  .marcas__it:last-child:nth-child(3n+1){grid-column:1 / -1}
}
@media(max-width:900px){
  .marcas{grid-template-columns:repeat(2,1fr);gap:1rem .6rem}
  .marcas__it:last-child:nth-child(2n+1){grid-column:1 / -1}
}

/* ==========================================================================
   INTERVAL — carrusel coverflow de destinos
   El abanico entero lo pinta el JS —incluida la perspectiva, que va tarjeta
   por tarjeta—: acá sólo está la caja, la tarjeta y el modo sin animación.
   ========================================================================== */
.coverflow{margin-top:clamp(2.6rem,5vw,4rem)}

.coverflow__escena{
  --cf-ancho:clamp(240px,30vw,430px);
  position:relative;
  /* Aire de sobra sobre el alto 3:2 de la tarjeta: al inclinarse, las esquinas
     de las vecinas suben por encima del borde de la central. */
  height:calc(var(--cf-ancho) / 1.5 + 3rem);
  /* En los extremos el abanico se sale del ancho útil; recortarlo acá evita
     que la página gane scroll horizontal. */
  overflow:hidden;
  /* El navegador se queda con el desplazamiento vertical y nos deja el
     horizontal: así arrastrar de lado no le come el scroll a la página. */
  touch-action:pan-y;
  cursor:grab;
  user-select:none;-webkit-user-select:none;
  outline-offset:6px;
}
.coverflow__escena:focus-visible{outline:1px solid var(--oro)}
.coverflow__escena.is-arrastrando{cursor:grabbing}

.coverflow__pista{list-style:none;margin:0;padding:0;position:absolute;inset:0}

.coverflow__tarjeta{
  position:absolute;top:50%;left:50%;
  width:var(--cf-ancho);height:calc(var(--cf-ancho) / 1.5);
  margin:calc(var(--cf-ancho) / -3) 0 0 calc(var(--cf-ancho) / -2);
  border-radius:var(--r);overflow:hidden;
  box-shadow:0 24px 60px rgba(4,10,16,.55);
  backface-visibility:hidden;
  will-change:transform,opacity;
}
.coverflow__tarjeta img{width:100%;height:100%;object-fit:cover;display:block}
/* Velo que oscurece las tarjetas de los costados; el JS mueve sólo su opacidad. */
.coverflow__tarjeta::after{
  content:"";position:absolute;inset:0;background:var(--tinta-2);
  opacity:var(--velo,0);pointer-events:none;
}
.coverflow__nombre{
  position:absolute;left:0;right:0;bottom:0;z-index:2;padding:2.4rem 1rem .95rem;
  background:linear-gradient(180deg,transparent,rgba(6,14,22,.88));
  font-size:.68rem;letter-spacing:.24em;text-transform:uppercase;color:#fff;text-align:center;
}

.coverflow__mando{display:flex;align-items:center;justify-content:center;gap:clamp(1rem,3vw,1.8rem);margin-top:1.6rem}
.coverflow__flecha{
  width:44px;height:44px;flex:0 0 auto;padding:0;border:1px solid var(--linea);border-radius:50%;
  background:none;color:var(--claro-suave);display:grid;place-items:center;cursor:pointer;
  transition:color .35s,border-color .35s,transform .35s var(--ease);
}
.coverflow__flecha:hover{color:var(--oro);border-color:var(--oro);transform:scale(1.07)}
.coverflow__flecha svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.5}
.coverflow__pts{display:flex;gap:.6rem}
.coverflow__pts button{
  /* La rayita mide 2 px pero el padding le da un blanco de toque decente sin
     engordarla: el fondo se recorta a la caja de contenido. */
  width:26px;height:26px;padding:12px 0;border:0;background:rgba(246,241,229,.28);
  background-clip:content-box;cursor:pointer;transition:background .4s;
}
.coverflow__pts button.is-on{background:var(--oro);background-clip:content-box}

/* En pantallas angostas la fila de controles se estrecha para no quedar
   debajo de los botones flotantes de la esquina. */
@media (max-width:600px){
  .coverflow__mando{gap:.8rem}
  .coverflow__pts{gap:.4rem}
  .coverflow__pts button{width:14px}
}

/* Sin animación: el abanico se cae y queda una tira que se recorre a mano. */
.coverflow--quieta .coverflow__escena{
  height:auto;overflow-x:auto;overflow-y:hidden;
  touch-action:auto;cursor:auto;scroll-snap-type:x mandatory;
}
.coverflow--quieta .coverflow__pista{position:static;display:flex;gap:1rem;padding-bottom:.8rem}
.coverflow--quieta .coverflow__tarjeta{
  position:static;margin:0;flex:0 0 var(--cf-ancho);
  transform:none !important;opacity:1 !important;scroll-snap-align:center;
}
.coverflow--quieta .coverflow__tarjeta::after{opacity:0}
.coverflow--quieta .coverflow__mando{display:none}

/* ==========================================================================
   TIPOLOGÍAS
   Dos columnas espejadas, una por tipología. Cada una se lee sola: render,
   nombre, plano y ficha. Antes era una sola foto con pestañas al costado; el
   cliente pidió partirla para que los dos planos se puedan comparar de un
   vistazo, sin tener que ir cambiando de pestaña.
   ========================================================================== */
.tipos{
  display:grid;grid-template-columns:1fr 1fr;
  gap:clamp(2rem,4vw,3.6rem);align-items:start;
  margin-top:clamp(2.4rem,5vw,3.6rem);
}
.tipo{display:flex;flex-direction:column}
.tipo__render{margin:0 0 1.6rem;overflow:hidden;border-radius:var(--r)}
.tipo__render img{
  display:block;width:100%;height:clamp(220px,26vw,320px);object-fit:cover;
  transform:scale(1.05);transition:transform 1.2s var(--ease);
}
.tipo:hover .tipo__render img{transform:scale(1)}
.tipo__t{
  margin:0 0 1.4rem;font-weight:300;font-size:clamp(1.5rem,2.6vw,2.1rem);
  display:flex;align-items:baseline;justify-content:space-between;gap:1rem;
  padding-bottom:.9rem;border-bottom:1px solid var(--oro);
}
.tipo__t span{
  font-size:.78rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--oro-hondo);white-space:nowrap;
}
/* Cada tipología muestra sus DOS plantas —la de vista al mar y la de laguna—
   porque están espejadas: con una sola, la mitad de los compradores estaría
   mirando el plano equivocado. Van lado a lado y del mismo alto. */
/* 15/09/2026 · Quedó un plano por tipología, así que la grilla se acomoda a los
   que haya en vez de tener dos columnas fijas: con uno solo, dos columnas
   dejaban el dibujo a media caja y un hueco al lado. */
.tipo__planos{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:1rem;margin-bottom:1rem;
}
@media(max-width:520px){.tipo__planos{grid-template-columns:1fr}}

/* La nota de las dos orientaciones, abajo del plano. Va en el cuerpo y no en
   versalitas como el rótulo del plano: es una aclaración que se lee, no una
   etiqueta. */
.tipo__vistas{
  margin:0 0 1.6rem;text-align:center;
  font-size:.86rem;line-height:1.5;color:var(--texto-suave);
}

/* El plano no es una foto: se muestra entero y sobre el papel de la sección,
   porque recortarlo se comería el dibujo, que es lo único que tiene para leer.
   El alto fijo mantiene alineadas las cuatro plantas aunque tengan proporciones
   algo distintas. */
.tipo__plano{margin:0}
.tipo__plano a{display:block;border-bottom:0}
.tipo__plano img{
  display:block;width:100%;height:clamp(230px,26vw,380px);object-fit:contain;
  mix-blend-mode:multiply;   /* el papel del plano es casi el mismo crema: así se funde */
  transition:transform .6s var(--ease);
}
.tipo__plano a:hover img,.tipo__plano a:focus-visible img{transform:scale(1.03)}
.tipo__lupa{
  display:block;margin:.5rem 0 0;text-align:center;
  font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;color:var(--oro-hondo);
}
.tipo__dl{
  margin:0 0 1.8rem;display:grid;grid-template-columns:auto 1fr;
  gap:.55rem 1.4rem;font-size:.86rem;
}
.tipo__dl dt{color:var(--texto-suave)}
.tipo__dl dd{margin:0;color:var(--texto);text-align:right}
/* Empuja el botón al pie: con fichas de 4 y 5 renglones, si no, quedarían a
   distinta altura. */
.tipo__cta{margin:auto 0 0}
.tipos__pie{margin-top:clamp(2.4rem,4vw,3.4rem);text-align:center}
.pend{color:var(--oro);font-size:.76rem;letter-spacing:.06em}
@media(max-width:820px){
  .tipos{grid-template-columns:1fr;gap:clamp(3rem,7vw,4.5rem)}
  .tipo__cta{margin-top:0}
}

/* ==========================================================================
   PROCESO DE PREVENTA · AWARDS
   ========================================================================== */
/* Ocho pasos: en una sola columna serían una tira larguísima, así que van en
   grilla de cuatro y bajan a dos y a una según el ancho. El número lo pone un
   contador para no repetirlo en el texto de cada punto. */
.pasos{
  list-style:none;margin:clamp(2.4rem,5vw,3.6rem) 0 0;padding:0;counter-reset:paso;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:clamp(1.8rem,3.4vw,2.8rem) clamp(1.4rem,3vw,2.4rem);
}
.paso{counter-increment:paso;border-top:1px solid var(--linea);padding-top:1.1rem}
.paso::before{
  content:counter(paso,decimal-leading-zero);
  display:block;line-height:1;margin-bottom:.7rem;
  font-size:1.6rem;font-weight:200;letter-spacing:.06em;
  /* El oro de marca sobre el crema no llega a contraste legible; este sí */
  color:var(--oro-hondo);
}
.paso b{display:block;font-weight:400;color:var(--texto);margin-bottom:.35rem}
.paso p{margin:0;color:var(--texto-suave);font-size:.92rem;line-height:1.55}
.pasos__cta{margin:clamp(2.8rem,5vw,4rem) 0 0}

/* El logo del premio queda solo y centrado. Es el único elemento de la sección,
   así que se le da aire arriba y abajo en lugar de encerrarlo en una caja. */
.awards{display:flex;flex-direction:column;align-items:center;text-align:center;gap:clamp(2rem,4vw,3rem)}
.awards__logo{
  display:block;width:min(100%,clamp(320px,46vw,620px));height:auto;
}
.awards .lede{max-width:56ch;margin:0}

/* ==========================================================================
   FONDO DE MAR (agentes + Interval)
   Foto aérea generada para el proyecto. Va en un envoltorio común a las dos
   secciones, con parallax suave y un velo encima para que el texto respire.
   ========================================================================== */
.mar{position:relative;isolation:isolate;background:var(--tinta)}
/* El agua no empieza de golpe: entra desde transparente, así arriba queda el
   azul liso de la sección y la foto del hero se disuelve en el mar en vez de
   cortarse con una línea.
   La máscara va acá y NO en el <img>: la imagen arranca 9% más arriba que la
   sección —es lo que le da la deriva— así que puesta en ella el degradado
   empezaba fuera de cuadro y al llegar al borde ya venía medio abierto. */
.mar__fondo{
  position:absolute;inset:0;overflow:hidden;z-index:0;
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 clamp(170px,26vh,320px));
          mask-image:linear-gradient(180deg,transparent 0,#000 clamp(170px,26vh,320px));
}
.mar__fondo img{
  position:absolute;left:0;top:-9%;width:100%;height:118%;object-fit:cover;
  /* Deriva muy lenta: el agua nunca queda del todo quieta */
  animation:mareaLenta 46s ease-in-out infinite alternate;
}
@keyframes mareaLenta{
  from{transform:translate3d(0,var(--py,0px),0) scale(1.04)}
  to{transform:translate3d(-1.4%,var(--py,0px),0) scale(1.11)}
}
.mar::after{
  content:'';position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,
    rgba(9,20,33,.9) 0%,rgba(9,20,33,.66) 26%,
    rgba(9,20,33,.62) 62%,rgba(9,20,33,.93) 100%);
}
.mar > .sec{position:relative;z-index:2;background:transparent}
@media (prefers-reduced-motion:reduce){
  .mar__fondo img{animation:none;transform:scale(1.04)}
}

/* ==========================================================================
   CIERRE
   ========================================================================== */
.cierre{position:relative;text-align:center;background:var(--tinta);color:var(--claro);overflow:hidden}
.cierre__fondo{position:absolute;inset:0;opacity:.28}
.cierre__fondo img{width:100%;height:100%;object-fit:cover}
.cierre__in{position:relative;z-index:2}
.cierre h2{
  font-size:clamp(1.5rem,3.4vw,2.6rem);font-weight:300;letter-spacing:.16em;
  text-transform:uppercase;color:var(--oro-claro);margin:0 0 1.6rem;line-height:1.3;
}
.cierre p{max-width:60ch;margin:0 auto;color:var(--claro-suave);font-size:1.06rem}
.cierre__cta{
  display:inline-flex;gap:1rem;flex-wrap:wrap;justify-content:center;margin-top:2.6rem;
}
.btn{
  display:inline-flex;align-items:center;gap:.7rem;padding:.95rem 2rem;
  font-size:.68rem;letter-spacing:.26em;text-transform:uppercase;
  border:1px solid var(--oro);color:var(--oro-claro);
  transition:background .4s var(--ease),color .4s var(--ease),transform .4s var(--ease);
}
.btn:hover{background:var(--oro);color:var(--tinta);transform:translateY(-2px)}
.btn--lleno{background:var(--oro);color:var(--tinta)}
.btn--lleno:hover{background:var(--oro-claro);border-color:var(--oro-claro)}
.btn--oscuro{border-color:rgba(45,59,70,.3);color:var(--texto)}
.btn--oscuro:hover{background:var(--texto);color:var(--papel);border-color:var(--texto)}

/* ==========================================================================
   PIE
   ========================================================================== */
.pie{background:#14403f;background:var(--teal);color:#f6f1e5;color:var(--claro);padding:3.2rem 0}

/* --- La firma del pie -------------------------------------------------------
   NOMA en grande con la foto adentro de las letras, disolviéndose hacia abajo
   contra el verde. El gesto es el de hyempreendimentos.com.br (07/09/2026).

   LA LETRA ES LA DEL LOGO, no la tipografía del sitio. El dibujo sale de
   img/logo.png —el mismo archivo que usa la barra de arriba— vectorizado a
   web/img/logo-noma.svg, y ese SVG se usa de MÁSCARA sobre la foto. Así el pie
   cierra con exactamente el mismo trazo con el que abre la página.

   10/09/2026 · UNA SOLA MÁSCARA. Antes eran dos, anidadas: .pie__firma se
   desvanecía con un degradado y .pie__marca, adentro, recortaba la foto con la
   forma de las letras. En Chrome se veía bien; en el celular del cliente
   aparecía una línea clara cruzando arriba de la palabra, de punta a punta y
   también en los huecos entre letra y letra —o sea, no era la foto, que ahí
   está recortada: era el borde de arriba de la caja enmascarada asomando—.

   Una máscara adentro de otra obliga al navegador a rasterizar dos capas y
   pegarlas, y en esa costura hay motores que dejan escapar una fila de píxeles.
   Como el pie es de un verde plano, el desvanecido no necesita máscara ninguna:
   alcanza con degradar la propia foto HACIA ESE VERDE, adentro de las letras.
   El resultado se ve igual y queda una sola capa, sin costura donde fallar.

   Si el navegador no sabe enmascarar, no se descarga nada y queda la palabra
   escrita en la tipografía del sitio: se lee igual, sin el efecto.
   -------------------------------------------------------------------------- */
.pie__firma{margin-bottom:clamp(1.4rem,3vw,2.6rem)}
.pie__marca{
  margin:0;text-align:center;
}
.pie__marca span{
  font-size:27.5vw;font-weight:200;line-height:.78;letter-spacing:-.005em;
  color:var(--claro);
}

@supports ((-webkit-mask-image:url(#m)) or (mask-image:url(#m))){
  .pie__marca{
    /* 567 × 67 es la caja de las letras en el logo original; el SVG mantiene esa
       proporción, así que con aspect-ratio la máscara entra justa y no queda
       aire arriba y abajo. */
    width:calc(100% - clamp(2rem,7vw,5rem));margin-inline:auto;
    aspect-ratio:567 / 67;
    /* 58%: la banda del banco de arena contra el agua turquesa, la que tiene
       textura y contraste. Más arriba es niebla plana y las letras salen
       grises; más abajo es agua sola y se pierde el dibujo. */
    /* Dos capas de fondo, no una máscara: arriba el degradado al verde del pie
       —que es el que hace la disolución—, abajo la foto. La disolución empieza
       pasada la mitad de la altura de la letra: antes se comía media palabra y
       se leía como un error de carga.
       El verde va escrito con su valor y no con var(--teal) porque adentro de
       un degradado una variable que no resuelva deja el renglón entero afuera,
       y este renglón es el efecto. */
    background:
      linear-gradient(180deg,
        rgba(20,64,63,0) 0%, rgba(20,64,63,0) 58%,
        rgba(20,64,63,.55) 84%, rgba(20,64,63,1) 100%),
      url(../img/pie-marca.jpg) center 58% / cover;
    -webkit-mask:url(../img/logo-noma.svg) center / contain no-repeat;
            mask:url(../img/logo-noma.svg) center / contain no-repeat;
  }
  /* La palabra sigue en el marcado para el lector de pantalla y el buscador,
     pero ya no se dibuja: la dibuja la máscara. */
  .pie__marca span{
    position:absolute;width:1px;height:1px;overflow:hidden;
    clip-path:inset(50%);white-space:nowrap;
  }
  /* Los cortes chicos de la foto. Van con las DOS capas escritas: background-image
     reemplaza la lista entera, así que nombrar sólo el JPG dejaba al degradado
     afuera y con él la disolución. */
  @media(max-width:900px){
    .pie__marca{background-image:
      linear-gradient(180deg,
        rgba(20,64,63,0) 0%, rgba(20,64,63,0) 58%,
        rgba(20,64,63,.55) 84%, rgba(20,64,63,1) 100%),
      url(../img/pie-marca-1280.jpg)}
  }
  @media(max-width:600px){
    .pie__marca{background-image:
      linear-gradient(180deg,
        rgba(20,64,63,0) 0%, rgba(20,64,63,0) 58%,
        rgba(20,64,63,.55) 84%, rgba(20,64,63,1) 100%),
      url(../img/pie-marca-960.jpg)}
  }
}

/* La bajada del nombre, donde antes estaba el logo en PNG. */
.pie__lock{
  margin:0;font-size:.68rem;letter-spacing:.28em;text-transform:uppercase;
  color:var(--claro-suave);
}
/* Tres piezas y no dos desde que el pie lleva los accesos a las secciones: el
   logo arriba, los accesos al medio y el copyright abajo, cada uno en su
   renglón. Con flex en una sola línea los accesos y el copyright se peleaban el
   mismo espacio y el copyright terminaba colgado a la derecha de los links. */
.pie__in{display:grid;justify-items:center;text-align:center;gap:0}
/* El logo del pie va al ancho de su caja pero con tope: el PNG mide 569 px y
   estirarlo más lo ablanda. La bajada se alinea con el borde derecho del logo
   —no con el de la columna— para que las dos líneas cierren juntas. */
/* El ancho de 300px era el del logo en PNG que vivía acá. Ahora son dos líneas
   de texto y ese límite las partía en cuatro renglones. */
.pie__m{max-width:100%}
.pie__m img{display:block;width:100%;height:auto}
/* La firma va centrada abajo del nombre y con cuerpo de rótulo. Estaba en .5rem
   y alineada a la derecha porque colgaba de la esquina del logo; suelta, a ese
   tamaño, no se leía. */
.pie__m small{
  display:block;font-size:.62rem;letter-spacing:.24em;color:var(--claro-tenue);
  margin-top:.6rem;text-align:center;text-indent:.24em;text-transform:uppercase;
}
.pie__c{font-size:.82rem;color:var(--claro-tenue)}

/* ==========================================================================
   MOVIMIENTO
   ========================================================================== */
.rv{opacity:0;transform:translateY(34px);transition:opacity 1.1s var(--ease),transform 1.1s var(--ease)}
.rv.is-in{opacity:1;transform:none}
.rv-d1{transition-delay:.12s}
.rv-d2{transition-delay:.24s}
.rv-d3{transition-delay:.36s}

/* --- Entradas de texto: la palabra y el párrafo salen de foco ---------------
   El título ya entraba palabra por palabra, pero detrás de una máscara: la
   palabra subía y el overflow:hidden del contenedor la iba descubriendo. Ahora
   además entra desenfocada y se resuelve, que es lo que pidió el cliente.

   La máscara se sacó: recortaba el halo del desenfoque y dejaba un borde duro
   justo arriba de cada palabra, como si estuviera cortada con tijera. Sin ella
   el desplazamiento se acorta —de 105% a media línea—, porque sin nada que la
   tape una palabra que sube una línea entera se lee como un salto.
   -------------------------------------------------------------------------- */
.tw{display:inline-block;vertical-align:bottom}
.tw > i{
  display:inline-block;font-style:normal;
  transform:translateY(.46em);opacity:0;filter:blur(14px);
  /* Un segundo y pico, no tres cuartos: a la velocidad anterior el desenfoque
     se resolvía antes de que el ojo llegara a la palabra y el efecto no se
     percibía. Con el escalonado de 80 ms por palabra, un título de seis
     palabras termina de entrar en poco menos de dos segundos. */
  transition:transform 1.45s var(--ease),opacity 1.15s var(--ease),filter 1.2s var(--ease);
}
.is-in .tw > i{transform:none;opacity:1;filter:blur(0)}

/* El párrafo entra entero y no palabra por palabra: un párrafo de treinta
   palabras serían treinta elementos con filtro propio, y eso en un celular se
   siente. Un filtro por bloque cuesta lo mismo que uno por palabra y el efecto
   se lee igual de bien a la velocidad a la que se scrollea.

   .rvb se lo pone el JS a los bloques .rv que NO tienen foto adentro: sobre una
   imagen de 1240 px el desenfoque es caro y encima casi no se nota. */
.rvb{filter:blur(9px);transition:opacity 1.5s var(--ease),transform 1.5s var(--ease),filter 1.4s var(--ease)}
.rvb.is-in{filter:blur(0)}

/* Lo mismo para los textos que no viven adentro de un bloque que ya entre
   —conoce.php, por ejemplo, que no tenía ninguna entrada—. */
.br{
  opacity:0;filter:blur(9px);transform:translateY(16px);
  transition:opacity 1.4s var(--ease),filter 1.4s var(--ease),transform 1.4s var(--ease);
}
.br.is-in{opacity:1;filter:blur(0);transform:none}

/* Terminada la entrada el filtro se apaga del todo. Un filter:blur(0) que queda
   puesto le deja al navegador una capa de composición viva por cada párrafo de
   la página, y son muchos. La clase la pone el JS al terminar la transición. */
.rvb.is-listo,.br.is-listo,.is-listo .tw > i{filter:none}

/* --- La portada entra -------------------------------------------------------
   Los rótulos del hero aparecían de golpe con la página ya cargada. Ahora
   salen de foco y suben, escalonados, con el mismo gesto que el resto del
   sitio. Va con animation y no con .rv: el hero está a la vista desde el
   primer instante, así que no hay nada que observar —arranca solo—.

   El sello de Registry lleva su propio juego de fotogramas porque está
   centrado con translateX(-50%): una animación que toque transform sin
   repetirlo lo tira contra el borde izquierdo.
   -------------------------------------------------------------------------- */
@keyframes heroEntra{from{opacity:0;filter:blur(13px);transform:translateY(24px)}}
@keyframes heroEntraCentro{
  from{opacity:0;filter:blur(13px);transform:translateX(-50%) translateY(24px)}
  to{opacity:1;filter:none;transform:translateX(-50%)}
}
/* backwards y no both: con both el fotograma final se queda pegado para
   siempre —un filter:blur(0) y un transform puestos— y cada rótulo del hero se
   lleva su capa de composición sin necesidad. Con backwards el estado inicial
   se aplica durante la espera y, terminada la entrada, cada uno vuelve a sus
   propios estilos. */
.hero__precio,
.hero__in .eyebrow,
.hero__t,
.hero__sub,
.hero__scroll{animation:heroEntra 1.6s var(--ease) backwards}
.hero__registry{animation:heroEntraCentro 1.6s var(--ease) backwards}

.hero__precio,.hero__in .eyebrow{animation-delay:.2s}
.hero__t{animation-delay:.4s}
.hero__sub{animation-delay:.62s}
.hero__registry{animation-delay:.86s}
.hero__scroll{animation-delay:1.05s}

/* Parallax: el JS escribe --py */
.px{will-change:transform;transform:translate3d(0,var(--py,0px),0)}

/* Barra de progreso de lectura */
.progreso{
  position:fixed;left:0;top:0;height:2px;background:var(--oro);z-index:80;
  width:var(--p,0%);transition:width .12s linear;
}

/* ==========================================================================
   FLOTANTES · MENÚ CIRCULAR (SÓLO CELULAR)
   ========================================================================== */

/* Koppi inyecta su burbuja fuera de nuestro marcado. El botón propio de
   flowise-embed vive en un shadow root —ahí no llega nuestro CSS—, pero el
   script de Koppi lo esconde y dibuja el suyo en el DOM normal: un div
   #ecoflow-lottie-trigger-<timestamp> de 80px con el Lottie adentro. Ese sí lo
   alcanzamos, y el SVG que arma Lottie va al 100% del contenedor, así que
   achicando la caja se achica el dibujo. Lo dejamos en 60 y a 9px del borde,
   la misma medida y la misma columna que WhatsApp y Zoom.
   Lo asumido: el id lo arma su script como 'ecoflow-lottie-trigger-' + Date.now().
   Si algún día cambian ese prefijo, esta regla deja de aplicar y el tamaño hay
   que pedírselo a Koppi (en su config son lottieButtonWidth/lottieButtonHeight,
   hoy en 80px, y ese archivo no lo controlamos nosotros). */
[id^="ecoflow-lottie-trigger-"]{width:60px!important;height:60px!important;right:9px!important}

/* Los tres flotantes apilados tapaban las tarjetas de nivel, los pasos de la
   preventa y la grilla de logos. En celular se repliegan en un botón único y
   salen en abanico al tocarlo. El menú lo arma el JS: si no corre, quedan los
   flotantes de siempre, que siguen funcionando. */
.orbita{position:fixed;right:14px;bottom:14px;width:56px;height:56px;z-index:10002;display:none;
  transition:opacity .3s var(--ease),transform .3s var(--ease)}

@media(max-width:700px){
  .orbita{display:block}
  body.orbita-activa .whatsapp-btn,
  body.orbita-activa .btn-calendly-fixed,
  body.orbita-activa [id^="ecoflow-lottie-tooltip-"]{display:none!important}
  /* La burbuja de Koppi no se saca con display:none: nuestro botón del abanico
     abre el chat disparándole el click a ella, y un nodo sin caja igual recibe
     el evento, pero preferimos no depender de eso. */
  body.orbita-activa [id^="ecoflow-lottie-trigger-"]{
    opacity:0!important;pointer-events:none!important;transform:scale(.4)!important;
  }
}

.orbita__velo{
  position:fixed;inset:0;background:rgba(6,12,18,.28);
  opacity:0;pointer-events:none;transition:opacity .3s var(--ease);
}
.orbita.is-abierta .orbita__velo{opacity:1;pointer-events:auto}

.orbita__nucleo{
  position:absolute;inset:0;width:56px;height:56px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:#12212f;color:#fff;border:1px solid rgba(255,255,255,.22);
  box-shadow:0 6px 18px rgba(0,0,0,.34);cursor:pointer;padding:0;
  transition:transform .3s var(--ease),box-shadow .3s var(--ease);
}
.orbita__nucleo:active{transform:scale(.94)}
.orbita__nucleo svg{position:absolute;width:24px;height:24px;transition:opacity .25s var(--ease),transform .3s var(--ease)}
.orbita__ico--cerrar{opacity:0;transform:rotate(-90deg) scale(.6)}
.orbita.is-abierta .orbita__ico--abrir{opacity:0;transform:rotate(90deg) scale(.6)}
.orbita.is-abierta .orbita__ico--cerrar{opacity:1;transform:none}

.orbita__opciones{position:absolute;inset:0}

/* Cada destino sale del centro del núcleo hacia su punto del arco. El JS
   escribe --x/--y (posición) y --d (el retardo que escalona la salida). */
.orbita__op{
  position:absolute;right:2px;bottom:2px;width:52px;height:52px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  color:#fff;border:0;padding:0;cursor:pointer;text-decoration:none;
  box-shadow:0 5px 14px rgba(0,0,0,.3);
  opacity:0;pointer-events:none;transform:translate3d(0,0,0) scale(.4);
  /* visibility, además de la opacidad: si no, los destinos siguen recibiendo el
     foco con el menú cerrado. Se apaga recién al terminar el fundido. */
  visibility:hidden;
  transition:transform .4s var(--ease),opacity .25s linear,visibility 0s .25s;
}
.orbita.is-abierta .orbita__op{
  opacity:1;pointer-events:auto;visibility:visible;
  transform:translate3d(var(--x,0),var(--y,0),0) scale(1);
  transition-delay:var(--d,0ms);
}
/* Sin fill acá: cada icono trae el suyo (el de WhatsApp se clona del flotante
   original, que pinta con currentColor; los nuestros van con stroke). */
.orbita__op svg{width:26px;height:26px}
.orbita__op img{width:30px;height:auto}
.orbita__op--wa{background:#25d366}
.orbita__op--zoom{background:#0b5cff}
/* El azul de Koppi es casi tan oscuro como el velo: el aro lo despega del fondo */
.orbita__op--koppi{background:#1b2f55;border:1px solid rgba(255,255,255,.24)}

@media (prefers-reduced-motion:reduce){
  *{animation-duration:.01ms !important;transition-duration:.01ms !important}
  html{scroll-behavior:auto}
  /* El abanico sale igual, pero de una y sin escalonar */
  .orbita__op{transition-delay:0ms !important}
  /* La cortina del menú también: aparece entera, sin la entrada escalonada ni
     el filete que se dibuja. */
  .menu__it,.menu__it::after{transition-delay:0ms !important}
  .menu__it::after{transform:none !important}
  .rv{opacity:1;transform:none}
  /* Las tres clases repetidas para ganarle a .rvb.is-in y a .is-in .tw > i, que
     tienen más peso: si no, queda un blur(0) puesto que no desenfoca nada pero
     le deja al navegador una capa de composición por elemento. */
  .rvb,.rvb.is-in,.br,.br.is-in{filter:none;opacity:1;transform:none}
  .hero__precio,.hero__in .eyebrow,.hero__t,.hero__sub,.hero__scroll{animation:none}
  .hero__registry{animation:none;transform:translateX(-50%)}
  .tw > i,.is-in .tw > i{transform:none;opacity:1;filter:none}
  .px{transform:none !important}
  /* La grilla de marcas ya está quieta; sólo se apaga el deslizamiento de la frase,
     que con la regla global de arriba quedaría en un salto de .01ms. */
  .marcas__frase{transform:none;transition:opacity .01ms,visibility 0s}
}

/* El icono de Koppi es un PNG con su propio círculo blanco, así que llena el
   botón entero en vez de ir centrado como los SVG de los otros dos. */
.orbita__op--koppi{background:#fff;padding:0;overflow:hidden}
.orbita__op--koppi img{width:100%;height:100%;object-fit:cover;display:block}

/* ==========================================================================
   El latido de los botones que convierten
   ==========================================================================
   Van con esto "Elige tu residencia" —en la barra y en cada cierre de sección—
   y el botón de Zoom. Son los dos destinos de la estrategia: uno agenda la
   videollamada, el otro muestra precios y toma el apartado de $20,000.

   Late DOS VECES y descansa cinco segundos, en vez de latir sin parar. Un
   parpadeo continuo se vuelve parte del fondo a los veinte segundos —el ojo lo
   aprende y deja de verlo— y encima, en una marca de este precio, lee a oferta.
   Con la pausa larga el movimiento vuelve a llamar la atención cada vez.

   El halo va por box-shadow y no por un ::before: el botón de Zoom tiene
   overflow:hidden para la animación de ancho al pasar el mouse, y un pseudo
   adentro quedaría recortado. La sombra se pinta afuera de la caja y no se
   recorta.

   Y se apaga solo: apenas el usuario toca uno de los dos, el JS marca el
   navegador y no vuelve a latir. Ya entendió dónde hay que hacer click.
   -------------------------------------------------------------------------- */
@keyframes latido{
  0%,68%,100% {transform:scale(1)}
  72%         {transform:scale(1.05)}
  77%         {transform:scale(1)}
  81%         {transform:scale(1.032)}
  86%         {transform:scale(1)}
}
@keyframes latidoAura{
  0%,68% {box-shadow:0 0 0 0 rgba(200,169,106,.5)}
  84%    {box-shadow:0 0 0 16px rgba(200,169,106,0)}
  100%   {box-shadow:0 0 0 0 rgba(200,169,106,0)}
}
.latido{animation:latido 6.5s var(--ease) infinite,latidoAura 6.5s var(--ease) infinite}
/* "Elige tu residencia" late más seguido que el resto (07/09/2026, pedido del
   cliente): 4,4 s en vez de 6,5. Es el único botón que convierte y el que más
   tiene que llamar; el de Zoom se queda en 6,5 para que los dos no latan a la
   vez, que se lee como un parpadeo de la página entera. */
.cta-nav.latido{animation-duration:4.4s}
/* Al pasar el mouse o al enfocar con el teclado se corta: el usuario ya está ahí
   y un botón que se mueve bajo el cursor es incómodo de apuntar. */
.latido:hover,.latido:focus-visible,.latido.is-quieto{animation:none}

/* El de Zoom late en su propio azul; el oro sobre el botón azul se vería sucio. */
@keyframes latidoAuraZoom{
  0%,68% {box-shadow:0 0 0 0 rgba(11,92,255,.55)}
  84%    {box-shadow:0 0 0 16px rgba(11,92,255,0)}
  100%   {box-shadow:0 0 0 0 rgba(11,92,255,0)}
}
.btn-calendly-fixed.latido{animation:latido 6.5s var(--ease) infinite,latidoAuraZoom 6.5s var(--ease) infinite}
/* El botón de Zoom crece de ancho al pasar el mouse; el scale del latido pelea
   con eso, así que ahí también se corta. */
.btn-calendly-fixed.latido:hover{animation:none}

/* Quien pidió menos movimiento en su sistema no ve nada de esto. */
@media(prefers-reduced-motion:reduce){
  .latido,.btn-calendly-fixed.latido{animation:none}
}

/* ==========================================================================
   Pie: los accesos a las cinco secciones
   ========================================================================== */
.pie__nav{
  display:flex;flex-wrap:wrap;justify-content:center;gap:.7rem clamp(1rem,3vw,2.2rem);
  margin:clamp(1.6rem,4vw,2.4rem) 0 clamp(1.6rem,4vw,2.4rem);
}
.pie__nav a{
  font-size:.66rem;letter-spacing:.22em;text-transform:uppercase;color:var(--claro-tenue);
  position:relative;padding-bottom:.25rem;transition:color .3s var(--ease);
}
.pie__nav a::after{
  content:'';position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--oro);
  transform:scaleX(0);transform-origin:right;transition:transform .45s var(--ease);
}
.pie__nav a:hover{color:var(--claro)}
.pie__nav a:hover::after{transform:scaleX(1);transform-origin:left}

/* ==========================================================================
   Hero de sección
   Más bajo que el de la portada: en las páginas de sección abajo hay mucho texto
   y una portada de pantalla completa obliga a un scroll de más antes de que la
   página empiece a explicar algo. Estaba en conoce.css cuando lo usaba una sola
   página; ahora lo usan tres, así que vive acá.
   ========================================================================== */
.hero--sub{min-height:min(74svh,640px)}
/* La bajada de la portada va en una línea con puntos entre medio; en las
   secciones son tres tramos y en pantallas medianas se desarmaba mal. */
.hero--sub .hero__sub{flex-wrap:wrap}
@media(max-width:640px){
  .hero--sub{min-height:min(66svh,520px)}
}
/* El titular que en vez de una frase son tres, una por renglón. Sin el tope de
   13ch del .hero__t: con ese ancho la primera se partía sola en dos. El
   interlineado abre un poco porque son frases independientes y no una oración
   que sigue de un renglón al otro. */
.hero__t--lista{
  max-width:none;line-height:1.3;
  /* El cuerpo baja más que el del .hero__t normal en pantallas chicas, y no por
     capricho: la frase más larga —"Cómo funciona la propiedad"— tiene que entrar
     en UN renglón. Si se parte en dos, las tres frases se leen como cuatro y se
     pierde justo lo que este titular quiere mostrar. Medido: entra en una sola
     línea desde 320 px para arriba. */
  font-size:clamp(1.3rem,5.6vw,2.9rem);
}

/* La letra chica de una sección: descargos, aclaraciones de tarifa. */
.sec .nota{font-size:.79rem;color:var(--texto-suave);max-width:80ch;line-height:1.55}
.sec--oscuro .nota,.sec--verde .nota,.cierre .nota{color:var(--claro-tenue)}
