@charset "utf-8";
::selection {
	background-color: #F4C670;
	color: #1A1A1A;
}

/* ==================================================
   ESCALA GLOBAL DEL SITIO — 75%

   PALANCA UNICA de tamano de todo el sitio: tipografia, espaciados, cajas y
   radios. Cambiar SOLO este numero reescala la web entera (80% para subirla,
   100% para volver al tamano original). No hay ninguna otra palanca.

   PORCENTAJE y NO px a proposito: un font-size absoluto en la raiz descarta la
   preferencia de tipografia del navegador, asi que quien la tiene ampliada por
   baja vision recibiria el tamano fijo (WCAG 1.4.4). El 75% se aplica SOBRE su
   valor, no en lugar de el.

   CONTRATO DE UNIDADES que hace funcionar esto -respetarlo en todo el tema-:

     rem  = medida de diseno.      Escala con esta palanca.
     px   = constante funcional.   Absoluta, NO escala nunca.

   Para convertir una medida de diseno a rem se divide SIEMPRE ENTRE 16, nunca
   entre 12: 30px de la maqueta -> 1.875rem (30/16), que con la raiz al 75%
   computa 22,5px. Dividir entre 16 mantiene el numero en rem legible como "el
   valor de la maqueta" -asi los comentarios de medidas de este tema siguen
   apuntando a algo- y hace la reversion exacta, sin residuo de redondeo.

   Se quedan en px por ser constantes funcionales, no medidas de diseno:
   bordes y hairlines (1px; a 0,75px el antialias baja el contraste efectivo
   del limite de componente, WCAG 1.4.11), el anillo de foco y su halo
   (outline 2px + offset 2px + box-shadow 4px; 2px es el grosor minimo de
   WCAG 2.4.11), los minimos de area tactil (24 y 44px, WCAG 2.5.5/2.5.8) y
   los breakpoints de media query.
   ================================================== */
html {
	font-size: 75%;
	overflow-x: hidden;
	/* Reserva el hueco de la barra de scroll SIEMPRE, incluido cuando
	   .no-scroll la retira. Sin esto, bloquear el scroll ensancha el viewport
	   ~15px y toda la pagina (el #header fixed incluido) da un tiron
	   horizontal. Donde no esta soportado (Safari <=18.1) las barras son
	   overlay y no ocupan ancho, asi que no hay salto que compensar. */
	scrollbar-gutter: stable;
}
/* La aplica y la retira scrollLock (site.js). Va en <html> y no en <body>:
   solo el overflow del elemento raiz se propaga al viewport. */
html.no-scroll {
	overflow: hidden;
}

/* Badge flotante de Google reCAPTCHA v3, inyectado por su script en <body>.
   Se oculta porque su aviso legal se muestra como texto dentro de cada
   formulario protegido (#contact-form y #subscribe-form).
   visibility: hidden y NO display: none a proposito: los terminos de Google
   permiten ocultarlo visualmente solo si el aviso legal esta visible, pero
   exigen que el badge siga presente en el DOM; display: none lo saca del
   layout y da por roto ese requisito. Regla global porque el newsletter del
   footer carga reCAPTCHA en todas las paginas, no solo en /contacto. */
.grecaptcha-badge {
	visibility: hidden;
}

@font-face {
	font-family: 'Hurme Geometric Sans 1';
	src: url('../../fonts/HurmeGeometricSans1-Regular.eot');
	src: url('../../fonts/HurmeGeometricSans1-Regular.eot?#iefix') format('embedded-opentype'),
		url('../../fonts/HurmeGeometricSans1-Regular.woff2') format('woff2'),
		url('../../fonts/HurmeGeometricSans1-Regular.woff') format('woff'),
		url('../../fonts/HurmeGeometricSans1-Regular.ttf') format('truetype'),
		url('../../fonts/HurmeGeometricSans1-Regular.svg#HurmeGeometricSans1-Regular') format('svg');
	font-weight: normal;
	font-style: normal;
	font-display: swap;
}
@font-face {
	font-family: 'Hurme Geometric Sans 1';
	src: url('../../fonts/HurmeGeometricSans1-Bold.eot');
	src: url('../../fonts/HurmeGeometricSans1-Bold.eot?#iefix') format('embedded-opentype'),
		url('../../fonts/HurmeGeometricSans1-Bold.woff2') format('woff2'),
		url('../../fonts/HurmeGeometricSans1-Bold.woff') format('woff'),
		url('../../fonts/HurmeGeometricSans1-Bold.ttf') format('truetype'),
		url('../../fonts/HurmeGeometricSans1-Bold.svg#HurmeGeometricSans1-Bold') format('svg');
	font-weight: 700;
	font-style: normal;
	font-display: swap;
}
@font-face {
	font-family: 'Hurme Geometric Sans 1';
	src: url('../../fonts/HurmeGeometricSans1-SemiBold.eot');
	src: url('../../fonts/HurmeGeometricSans1-SemiBold.eot?#iefix') format('embedded-opentype'),
	url('../../fonts/HurmeGeometricSans1-SemiBold.woff2') format('woff2'),
	url('../../fonts/HurmeGeometricSans1-SemiBold.woff') format('woff'),
	url('../../fonts/HurmeGeometricSans1-SemiBold.ttf') format('truetype'),
	url('../../fonts/HurmeGeometricSans1-SemiBold.svg#HurmeGeometricSans1-SemiBold') format('svg');
	font-weight: 600;
	font-style: normal;
	font-display: swap;
}

body {
	padding: 0;
	margin: 0;
	background-color: #ffffff;
	font-family: 'Hurme Geometric Sans 1';
	font-size: 1rem;
	color: #1A1A1A;
	font-weight: 400;
	line-height: normal;
}

a {
	color: #F4C670;
	text-decoration: none;
}
a:hover {
	color: #1A1A1A;
	text-decoration: none;
}
img {
	max-width: 100%;
	height: auto;
}
.padding-t-0 {
	padding-top: 0 !important;
}
.padding-b-0 {
	padding-bottom: 0 !important;
}
/* Excepcion: la X de cierre del modal del NeoLoyaltyWidget en movil (<=991px,
   auth.mode:'modal' en neo-loyalty.xsl). Verificado en vivo (jul 2026): ese
   boton NO vive dentro de #neo-loyalty-widget -el dialogo se porta directo a
   <body>, cadena real reka-dialog-content-v-0 > BODY-, asi que no se puede
   excluir por el contenedor unico del widget (ver cabecera de neo-loyalty.xsl).
   Se excluye por ".neoloyalty-modal-content", la clase semantica que el propio
   widget expone para ese wrapper (equivalente in situ a la ".neoloyalty-dialog-
   content" de la doc oficial, que quedo desactualizada respecto al bundle
   desplegado). El boton no tiene clase neoloyalty-* propia ni aria-label -solo
   utilidades Tailwind (p-0.5, absolute, top-3...) y un <span class="sr-only">
   con el texto "Close" sin traducir, ambos fuera de nuestro control-, asi que
   el hook mas estable disponible es estructural: es el UNICO <button> hijo
   DIRECTO de .neoloyalty-modal-content (los botones "Unete al club"/"Inicia
   sesion" cuelgan mas adentro, dentro de .neoloyalty-inner-buttons).
   Motivo del bug: este bloque global gana a las utilidades del propio widget
   pese a tener menos especificidad (selector "button", 0-0-1, contra clases
   Tailwind 0-1-0) porque el CSS del widget viaja en un @layer (Tailwind v4) y
   CUALQUIER regla SIN layer -como esta- gana siempre a una CON layer, al
   margen de la especificidad. Con la exclusion, el boton deja de matchear esta
   regla y las utilidades propias del widget (tamano de icono, hover:bg-
   secondary, etc.) se aplican tal cual las diseño Core, sin que nosotros
   reproduzcamos sus valores a mano. NO tocar sin volver a verificar contra el
   bundle real (index.js), ver advertencia en la cabecera de neo-loyalty.xsl.
   OJO: la exclusion va envuelta en :where(). Un :not() suma la especificidad de
   su argumento, asi que "button:not(.neoloyalty-modal-content > button)" subia
   de 0-0-1 a 0-1-2 y este bloque base pasaba a ganar a las reglas propias de
   cada boton (.textArrowBtn y demas), rompiendolos en toda la web. :where()
   tiene especificidad 0 y deja el bloque exactamente como estaba. */
.button,
button:not(:where(.neoloyalty-modal-content > button)),
[type=button]:not(:where(.neoloyalty-modal-content > button)),
[type=reset],
[type=submit] {
	display: inline-block;
	margin: 0;
	padding: 1.5rem 1.5rem;
	outline: 0;
	border: 1px solid #1A1A1A;
	background-color: #1A1A1A;
	border-radius: 0.25rem;
	font-family: 'Hurme Geometric Sans 1';
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 700;
	line-height: 0.8125rem;
	letter-spacing: 0.042188rem;
	text-transform: uppercase;
	text-decoration: none;
	text-align: center;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	/* FASE 08 WCAG (E-31 / antipatron A4). La abreviatura `transition: <dur> <ease>`
	   sin nombre de propiedad equivale a `transition-property: all`, asi que animaba
	   TAMBIEN el outline y el box-shadow del anillo de foco: crecian de 0 a 2/4px en
	   400ms, de modo que tabulando a velocidad normal (~150-250ms por pulsacion) el
	   anillo apenas se insinuaba antes de que el foco ya estuviera en el control
	   siguiente. Era la causa mas extendida del "no se ve donde estoy" de esta fase,
	   y esta regla la mas grave por alcance: matchea TODO <button> del sitio (35
	   focusables en /habitaciones, incluido el boton del NeoLoyaltyWidget).
	   Se listan las propiedades que el :hover de justo debajo cambia de verdad
	   -border-color, background-color y color-, con lo que la animacion de hover
	   queda intacta y el anillo pasa a ser instantaneo. Mismo criterio en las otras
	   15 reglas de focusables del proyecto, marcadas con "FASE 08 (E-31)".
	   opacity va en la lista aunque el :hover no la toque: al ser una regla de TODO
	   <button>, tambien gobierna botones de terceros que si la cambian por estado
	   (el "aplicar" del calendario de litepicker cuando esta :disabled). Es la unica
	   propiedad ajena al hover que se conserva, y es de las baratas (se compone en
	   GPU, no fuerza layout). */
	transition: background-color .4s cubic-bezier(0.645, 0.045, 0.355, 1),
	            border-color .4s cubic-bezier(0.645, 0.045, 0.355, 1),
	            color .4s cubic-bezier(0.645, 0.045, 0.355, 1),
	            opacity .4s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.button:not(.textArrowBtn,.outlined):hover,
button:not(.textArrowBtn,.outlined):hover,
[type=button]:not(.textArrowBtn,.outlined):hover,
[type=reset]:not(.textArrowBtn,.outlined):hover,
[type=submit]:not(.textArrowBtn,.outlined):hover {
	border-color: #F4C670;
	background-color: #F4C670;
	color: #1A1A1A;
	text-decoration: none;
}
/* WCAG 4.1.2 (punto 2.7 del checklist): las flechas y las miniaturas de los
   carruseles Swiper eran <div role="button"> y pasan a ser <button> nativos. El
   ROL no cambia -Swiper lo sigue escribiendo-; cambia el TAG, y con el llega la
   regla corporativa de <button> de aqui arriba, que el <div> no matcheaba. Se
   neutraliza aqui para que el carrusel se vea EXACTAMENTE igual que antes.

   ESPECIFICIDAD, que es lo que tiene trampa: estos controles llevan
   type="button" -obligatorio, porque conviven con la mascara de reservas y un
   <button> sin type envia el <form>-, asi que NO casan solo con el selector de
   tipo `button` (0,0,1) sino tambien con el de ATRIBUTO `[type=button]`, que es
   (0,1,0). Un reset de una sola clase empataria con el y dependeria del orden de
   los ficheros. Por eso la forma es `button.clase` (0,1,1), que gana por
   especificidad; y el :hover replica la forma del :hover global (0,2,1) y se
   declara DESPUES en este mismo fichero, que es lo que desempata. Sin
   !important ([T2]).

   Lo que NO se toca es deliberado: el borde, el fondo y el radio de las flechas
   ya los fija .swiperNav [class*=swiper-button-] (0,2,0) y el display, el
   border-radius y el overflow de las miniaturas sus reglas con ID (1,3,0); las
   dos ganan a este bloque por si solas. En las miniaturas se resetea
   border-WIDTH y no `border`, para no pisar el `border: 2px solid #FFFFFF` de la
   miniatura activa. Los valores son los que computaba el <div>, medidos uno a
   uno sustituyendo cada <button> por un <div> identico en su mismo hueco. */
button.swiper-button-prev,
button.swiper-button-next,
button.swiper-slide {
	padding: 0;
	font: inherit;
	letter-spacing: inherit;
	text-transform: inherit;
	text-align: inherit;
	-webkit-appearance: none;
	appearance: none;
}
/* Solo las flechas. `display: flex` se lo daba .swiper-button-next/-prev de
   swiper-bundle.min.css, que es (0,1,0) y por tanto EMPATA con [type=button] y
   pierde por orden de ficheros; sin esto la flecha pasa a inline-block (block,
   al ser item de un contenedor flex). El `color` se restituye desde la MISMA
   variable de Swiper que perdia ese empate: aqui no se ve -el circulo lo pinta
   el <span> y la punta es un <img> con filter, y el borde va a 0-, pero es
   currentColor y de el cuelgan border-color y outline-color, asi que se deja
   igual que en el <div> en vez de dejarlo a la deriva. Las miniaturas no
   necesitan display: el suyo lo fija una regla con ID. */
button.swiper-button-prev,
button.swiper-button-next {
	display: flex;
	color: var(--swiper-navigation-color, var(--swiper-theme-color));
}
/* Solo las miniaturas: el fondo corporativo si les llega (ninguna otra regla les
   declara background-color) y el borde de 1px de la regla global les anadiria un
   marco negro alrededor de la foto.
   La `transition` importa mas de lo que parece: la regla global las deja
   animando border-color 0,4s, y como la miniatura activa se marca con
   `border: 2px solid #FFFFFF`, el marco blanco entraria haciendo un fundido
   desde el color heredado en vez de aparecer de golpe al cambiar de
   diapositiva. Se devuelve el `transform` de .swiper-slide (duracion 0s), que
   es lo que tenia el <div>. */
button.swiper-slide {
	border-width: 0;
	background-color: transparent;
	color: inherit;
	transition: transform;
}
/* El :hover global pinta fondo dorado + borde dorado a TODO <button>. Aqui
   dejaria un rectangulo dorado detras de la flecha y sobre la miniatura. Se
   anula devolviendo los valores del <div>, sin anadir ningun efecto nuevo: el
   hover real de estos controles ya lo resuelven
   .swiperNav [class*=swiper-button-]:hover span .arrow (la punta se desplaza) y
   las reglas de la miniatura activa. */
/* OJO CON LA ESPECIFICIDAD DE ESTE BLOQUE: el selector lleva [type="button"] a
   proposito y no se puede "simplificar" a button.clase.

   La regla global de botones es
     .button:not(.textArrowBtn, .outlined):hover,
     button:not(.textArrowBtn, .outlined):hover,
     [type=button]:not(.textArrowBtn, .outlined):hover { background-color: #F4C670; ... }
   y esa ultima rama pesa (0,3,0): atributo + la clase de dentro del :not + :hover.
   Un reset escrito como `button.swiper-button-next:hover` pesa solo (0,2,1) -tag +
   clase + :hover-, asi que PIERDE y el dorado se cuela igual.

   Paso exactamente eso al convertir estos controles en <button>: el reset parecia
   correcto, pero al pasar el raton por una flecha aparecia un CUADRADO DORADO detras
   del circulo blanco, y lo mismo en las miniaturas y en los dots. Con el atributo en
   el selector el reset sube a (0,3,1) y gana sin necesidad de !important.

   Es el mismo tropiezo que ya obligo a escribir button.clase para el display: al
   poner type="button" estos elementos empiezan a casar con selectores de ATRIBUTO,
   no solo con los de tag. */
button[type="button"].swiper-button-prev:hover,
button[type="button"].swiper-button-next:hover {
	border-color: currentColor;
	background-color: transparent;
	color: var(--swiper-navigation-color, var(--swiper-theme-color));
}
button[type="button"].swiper-slide:hover {
	border-color: currentColor;
	background-color: transparent;
	color: inherit;
}
/* Los dots de paginacion tienen el mismo problema y no tenian reset: nacieron como
   <span> -que la regla global no alcanza- y pasaron a <button> el 17-sep-2026. El
   dorado de la regla global les pintaba un cuadrado de 24x24 detras del destello, y
   ademas su color no debe cambiar en hover: el blanco y el dorado del activo los
   fijan sus propias reglas en other-rooms.css. */
button[type="button"].swiper-pagination-bullet:hover {
	border-color: currentColor;
	background-color: transparent;
	color: inherit;
}
.button.white {
	border-color: #ffffff;
	background-color: #ffffff;
	color: #1A1A1A;
}
.button.outlined {
	border-color: #1A1A1A;
	background-color: transparent !important;
	color: #1A1A1A;
}
.button.outlined.white {
	border-color: #ffffff;
	color: #ffffff;
}
.textArrowBtn {
	display: flex;
	align-items: center;
	gap: 1rem;
	width: fit-content;
	padding: 0;
	border: none;
	background-color: transparent !important;
	cursor: pointer;
	color: #1A1A1A !important;
}
.textArrowBtn.white {
	color: #ffffff !important;
}
/* TILDES CORTADAS EN MOVIL: la ventana del hover "rodante" (el overflow:hidden de
   .btnText) medía lo mismo que la line-height del boton, 0.8125rem, MENOS que la
   propia fuente (0.9375rem). La tilde de una mayuscula (Á, É, Ó...) sobresale por
   encima de la versal y quedaba fuera de esa ventana: en Chrome/Windows se comia
   ~1px, y en iOS -que toma otras metricas de ascendente de la fuente- se veia
   cortada del todo.
   La ventana se agranda con padding (overflow recorta en el borde del padding)
   y el margen negativo devuelve exactamente lo anadido: el boton mide lo mismo
   y la line-height NO se toca, asi que el texto no se mueve ni una fraccion de
   pixel (cambiar la line-height y compensar desplazaba el texto ~0,5px por el
   redondeo del interlineado).
   El salto del hover (text-shadow + translateY) es --btn-roll y tiene que
   superar la ventana ampliada: si no, en reposo asomaria la copia de abajo y al
   terminar el hover la de arriba. Con 0.3em de margen por lado y 1.5em de salto
   quedan holgura para la tilde, el descendente de la Ç y las metricas de iOS. */
.textBtn .btnText,
.textArrowBtn .btnText {
	--btn-clip: 0.3em;
	--btn-roll: 1.5em;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.9375rem;
	width: 100%;
	padding-block: var(--btn-clip);
	margin-block: calc(var(--btn-clip) * -1);
	overflow: hidden;
}
.textBtn .btnText span,
.textArrowBtn .btnText span {
	width: 100%;
	white-space: nowrap;
	text-shadow: 0px var(--btn-roll) transparent;
	transform: translateY(0);
	transition: text-shadow .5s cubic-bezier(.3, 1, .3, 1);
}
.textBtn:hover .btnText span,
.textArrowBtn:hover .btnText span {
	text-shadow: 0px var(--btn-roll);
	transform: translateY(calc(var(--btn-roll) * -1));
	transition: all .5s cubic-bezier(.3, 1, .3, 1);
}
/* TEXTO Y FLECHA DESCENTRADOS EN iOS: el flex centra la CAJA del texto, que va del
   ascendente al descendente de la fuente, no las mayusculas. Esas metricas cambian
   segun el sistema: Windows lee las 'win' (1.022/0.262 em) y deja las versales
   casi centradas; iOS/macOS leen las 'hhea' (0.765/0.235 em) y las versales quedan
   ~0.08em por encima del centro de la flecha (~1px en movil).
   Recortando la caja a versal + linea base, lo que se centra con la flecha es
   justo la altura de las mayusculas, en cualquier sistema. Solo en textArrowBtn:
   su alto lo fija el circulo de la flecha (2.5rem), asi que el boton no cambia de
   tamano. La ventana del hover (--btn-clip/--btn-roll, arriba) sigue cubriendo
   tilde y descendente con la caja recortada. */
.textArrowBtn .btnText span {
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
.textArrowBtn .arrowClone {
	display: flex;
	min-width: 2.5rem;
	width: 2.5rem;
	height: 2.5rem;
	background: #1A1A1A;
	border-radius: 50%;
	overflow: hidden;
}
.textArrowBtn.white .arrowClone {
	background: #ffffff;
}
.textArrowBtn:hover .arrowClone .arrow {
	transition: transform .27s ease;
}
.textArrowBtn.prev .arrowClone {
	flex-direction: row;
}
.textArrowBtn.prev:hover .arrowClone .arrow {
	transform: translateX(-100%);
}
.textArrowBtn.next .arrowClone {
	flex-direction: row-reverse;
}
.textArrowBtn.next:hover .arrowClone .arrow {
	transform: translateX(100%);
}
.textArrowBtn.up .arrowClone {
	flex-direction: column;
}
.textArrowBtn.up:hover .arrowClone .arrow {
	transform: translateY(-100%);
}
.textArrowBtn.down .arrowClone {
	flex-direction: column-reverse;
}
.textArrowBtn.down:hover .arrowClone .arrow {
	transform: translateY(100%);
}

#wrap {
	float: left;
	width: 100%;
}
:root {
	--container-width: 90.9375rem;
	--container-padding: calc((100vw - var(--container-width)) / 2);
}
.container {
	max-width: 90.9375rem;
	padding: 0;
}
#header.anim {
	animation: fadeInDown 0.5s both;
	animation-delay: 0.5s;
}
#header {
	float: left;
	width: 100%;
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	align-items: center;
	gap: 0.5rem;
	padding: 0.75rem 4.75rem 0.5rem;
	background-color: #1A1A1A;
	position: fixed;
	top: 0;
	z-index: 5;
	transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);
}
#header.navOpen {
	background-color: transparent;
}
#header .topbar {
	display: flex;
	justify-content: flex-end;
	align-items: center;
	gap: 1.5rem;
	width: 100%;
	animation: fadeIn 0.5s both;
	animation-delay: 0.5s;
	z-index: 100;
}
#header.navOpen .topbar {
	animation: fadeOut 0.5s both;
	animation-delay: 0s;
}
#header .topbar .buttons {
	display: flex;
	align-items: center;
	gap: 0.5rem;
}
#header .topbar .buttons .button {
	display: flex;
	align-items: center;
	column-gap: 0.4375rem;
	padding: 0 0.5rem;
	border: none;
	background-color: #F4C670;
	border-radius: 2.5rem;
	font-size: 0.75rem;
	color: #1A1A1A;
	line-height: 1.75rem;
	letter-spacing: 0px;
	text-transform: none;
}
/* Estos botones ya tienen line-height de sobra (1.75rem para 0.75rem de fuente):
   la ventana del hover es su propia linea y no hace falta ampliarla */
#header .topbar .buttons .button .btnText {
	--btn-clip: 0px;
	--btn-roll: 1.75rem;
}
/* WhatsApp: blanco con aro dorado, NO el verde de marca. Se venia copiando el
   boton de vibrahotels (#header .rightNav .button--whatsapp) con su verde exacto,
   pero sobre el header negro ese verde era el elemento mas llamativo de toda la
   cabecera. El blanco lo baja de tono sin esconderlo, y el aro #F4C670 lo ata a la
   paleta dorada del proyecto a la vez que lo distingue de los pills dorados
   macizos que tiene al lado.

   El aro va como `box-shadow: inset`, NO como `border`. La regla padre
   (#header .topbar .buttons .button) declara `border: none` y compone los 28px de
   alto con `line-height: 1.75rem` + `padding: 0 .5rem`; un borde de 1px sumaria
   2px de caja y descuadraria este pill respecto a los demas del topbar -- esa
   alineacion de 28px es justo lo que documenta neoloyalty-overwrite.css. El inset
   pinta el aro sin tocar el box model.

   EL COLOR DEL TEXTO NO SE DECLARA AQUI, a proposito: hereda el #1A1A1A del
   .button, que sobre blanco da 16,1:1 (y sobre el dorado del hover, 9,6:1). El
   icono .svg tambien viene con fill #1A1A1A. Cumple de sobra 1.4.3 para el texto
   y 1.4.11 para el icono, que en telefono es lo UNICO que identifica el boton.
   NO pintar texto ni icono en dorado sobre el blanco: #F4C670 sobre #FFFFFF son
   1,6:1 y rompe ambos criterios en un proyecto con el WCAG pasado. */
#header .topbar .buttons .wpBtn {
	background-color: #ffffff;
	box-shadow: inset 0 0 0 1px #F4C670;
	/* Ancla del ::after de abajo. */
	position: relative;
}
#header .topbar .buttons .wpBtn:hover {
	background-color: #F4C670;
}
/* WCAG 2.5.8 (Tamano del objetivo, minimo 24x24 CSS px).

   El pill mide 76x21px: cumple de sobra a lo ancho y se queda a 3px a lo alto. Los
   21px no son un descuido, son los 28px de la maqueta pasados por la escala global
   del 75% (line-height 1.75rem), y son EXACTAMENTE la altura a la que se alinean
   todos los pills del topbar, el boton de NeoLoyalty incluido (ver la referencia
   medida en neoloyalty-overwrite.css). Subir la altura real descuadraria esa fila y
   obligaria a tocar un widget de CDN que no controlamos.

   2.5.8 mide el AREA ACTIVA, no el dibujo: basta con que la zona que responde al
   puntero llegue a 24px. Este ::after la extiende 1,5px por arriba y por abajo sin
   entrar en el box model -es absolute-, asi que el pill se sigue viendo y alineando
   igual que antes. Al ser hijo del propio enlace, el puntero que cae sobre el lo
   activa sin necesidad de pointer-events ni de JS.

   Los 24px van en px y no en rem a proposito: es un minimo funcional de WCAG, no una
   medida de diseno, asi que NO debe escalar con la palanca global del 75% (ver el
   contrato de unidades al principio de este archivo). Crece solo en vertical, asi que
   no puede solapar con el pill vecino ni con el telefono, que estan a los lados. */
#header .topbar .buttons .wpBtn::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	top: 50%;
	transform: translateY(-50%);
	height: 24px;
}
#header .topbar .phone {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 700;
	line-height: 0.9375rem;
	letter-spacing: -0.010625rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	/* La propiedad va NOMBRADA a proposito. Un `transition: .25s ...` sin propiedad
	   equivale a `transition: all`, e `all` incluye el `outline-width`: el anillo de
	   foco pasaria de 0 a 2px ANIMADO en 250 ms, asi que tabulando a velocidad normal
	   el usuario ya esta en el siguiente control cuando el anillo apenas se insinua.
	   El anillo tiene que aparecer instantaneo (antipatron A4 / E-31 del procedimiento
	   WCAG). Nombrando `color` aqui y `filter` en la <img> el hover anima exactamente
	   igual que antes; lo unico que deja de animarse es el foco. */
	transition: color .25s cubic-bezier(0.645, 0.045, 0.355, 1);

	img {
		transition: filter .25s cubic-bezier(0.645, 0.045, 0.355, 1);
	}
	&:hover {
		color: #F4C670;

		img {
			filter: invert(15%) sepia(13%) saturate(1000%) hue-rotate(0deg) brightness(84%) contrast(125%);
		}
	}
}

#header .logo {
	width: 13.125rem;
	z-index: 3;
	animation: fadeIn 0.5s both;
	animation-delay: 0.5s;
}
#header.navOpen .logo {
	animation: fadeOut 0.5s both;
	animation-delay: 0s;
}
#header .logo img {
	width: 100%;
	height: auto;
}
#header .leftNav {
	display: flex;
	align-items: center;
	gap: 1.5rem;
}
#header .rightNav {
	display: flex;
	align-items: center;
	gap: 1.5rem;
}
/* Copia de telefono del boton de WhatsApp (header.xsl la emite solo con
   mobile/@isPhone='true', porque en <=767px la .topbar esta oculta). Mismo blanco
   con aro dorado que el pill del topbar, pero en circulo y sin texto visible: solo
   el icono. El nombre accesible lo aporta el <span class="sr-only">.

   El aro va como box-shadow por el mismo motivo que arriba: el circulo se
   dimensiona con `padding` alrededor del icono de 15px, asi que un borde real lo
   agrandaria 2px y lo descuadraria respecto al resto del header movil.

   No se reutiliza tal cual #header .topbar .buttons .button porque ese selector
   esta anclado al topbar; aqui se declaran las cuatro propiedades que hacen
   falta en vez de reestructurar la regla de arriba y arriesgar el desktop. */
#header .wpBtnMobile {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0.375rem;
	/* WCAG 2.5.8: el circulo mide justo 24x24 (icono de 15px mas 4,5px de padding a
	   cada lado), pero ese 24 sale de un padding en REM, asi que cualquier retoque de
	   la escala global del 75% lo dejaria por debajo del minimo sin que nada avise. El
	   minimo se fija aqui en px, que es como el contrato de unidades de este archivo
	   manda declarar los minimos de area tactil. Hoy no cambia nada: solo impide que
	   se rompa manana. */
	min-width: 24px;
	min-height: 24px;
	border: none;
	background-color: #ffffff;
	box-shadow: inset 0 0 0 1px #F4C670;
	border-radius: 50%;
}
#header .wpBtnMobile:hover {
	background-color: #F4C670;
}
/* Con el menu hamburguesa abierto el header se vacia (el logo se oculta y la
   .topbar se funde). Sin esto el boton se quedaria flotando sobre el panel del
   menu, que es justo el bug que .bookBtnBox ya tiene documentado en el footer. */
#header.navOpen .wpBtnMobile {
	display: none;
}
#header .menuNav {
	width: auto;
	z-index: 0;
	animation: fadeIn 0.5s both;
	animation-delay: 0.5s;
}
#header.navOpen .menuNav {
	animation: fadeOut 0.5s both;
	animation-delay: 0s;
}
#header .menuNav ul.menu {
	padding: 0;
	margin: 0;
	list-style-type: none;
	display: flex;
	gap: 1.0625rem;
}
#header .menuNav ul.menu > li {
	position: relative;
	font-size: 1.125rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.125rem;
}
#header .menuNav ul.menu > li > a {
	display: flex;
	padding: 0.9375rem 0;
	color: #ffffff;
	text-decoration: none;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	/* FASE 08 (E-31): lo unico que cambia en :hover / li.current es el color. Con la
	   abreviatura sin propiedad (= all) se animaba tambien el anillo de foco. */
	transition: color 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
#header .menuNav ul.menu > li:hover > a,
#header .menuNav ul.menu > li > a:hover {
	color: #F4C670;
}
#header .menuNav ul.menu > li.current > a {
	color: #F4C670;
	font-weight: 700;
}
#header .menuNav ul.menu > li.current > a:after {
	content: "";
	width: 0.25rem;
	height: 0.25rem;
	background-color: #F4C670;
	position: absolute;
	bottom: 0.5rem;
	left: 50%;
	border-radius: 3.125rem;
}
#header .menuNav ul.menu > li:has(.sub-menu) > a {
	padding-right: 1.75rem;
}
#header .menuNav ul.menu > li:has(.sub-menu):after {
	content: "";
	width: 1.5rem;
	height: 1.5rem;
	background: url("../../images/menu-dropdown-icon.svg") no-repeat center center;
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	right: 0;
	filter: brightness(0) invert(1);
	pointer-events: none;
	transition: 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
#header .menuNav ul.menu > li.current:has(.sub-menu):after,
#header .menuNav ul.menu > li:hover:has(.sub-menu):after,
#header .menuNav ul.menu > li:has(.sub-menu):has(>a:hover):after {
	filter: none;
}
#header .menuNav ul.menu > li:hover > ul.sub-menu {
	opacity: 1;
	visibility: visible;
}
#header .menuNav ul.menu > li > ul.sub-menu {
	display: flex;
	flex-direction: column;
	gap: 0.75rem;
	margin: 0;
	padding: 1.25rem 1.25rem;
	list-style-type: none;
	width: 16.125rem;
	background-color: #1A1A1A;
	border-radius: 0.25rem;
	box-shadow: 0 0.5rem 1.25rem -0.625rem rgba(255, 255, 255, 0.16);
	opacity: 0;
	visibility: hidden;
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 1;
	transition: 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
#header .menuNav ul.menu > li > ul.sub-menu > li {
	font-size: 1rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.5rem;
}
#header .menuNav ul.menu > li > ul.sub-menu > li > a {
	display: inline-block;
	color: #ffffff;
	text-decoration: none;
	/* FASE 08 (E-31): el :hover y li.current solo cambian color y peso. */
	transition: color 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96),
	            font-weight 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
#header .menuNav ul.menu > li > ul.sub-menu > li > a:hover {
	color: #F4C670;
}
#header .menuNav ul.menu > li > ul.sub-menu > li.current > a {
	color: #F4C670;
	font-weight: 700;
}
#header .languageMenu {
	position: relative;
	z-index: 0;
}
/* FASE 03 WCAG: codigo LATENTE (con 1 solo idioma este bloque no se renderiza).
   Era <a href="javascript:void(0);"> (no navega, despliega la lista) -> <button
   class="language-trigger">. El bootstrap customizado del framework pinta
   fondo/borde/tipografia corporativos a TODO <button> (regla global
   '.button, button, [type=button]...', linea 88) -> se neutraliza por clase,
   sin !important, mismo patron que #header .hamburger ([T2]). */
#header .languageMenu > .language-trigger {
	display: flex;
	justify-content: flex-end;
	align-items: center;
	gap: 0.5rem;
	width: 5.125rem;
	padding: 0.875rem 0;
	background-color: transparent;
	border: none;
	border-radius: 0px;
	font-family: inherit;
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 700;
	line-height: 1.25rem;
	letter-spacing: 0.042188rem;
	text-transform: none;
	text-align: left;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	-webkit-appearance: none;
	appearance: none;
	cursor: pointer;
	/* FASE 08 (E-31): el :hover neutraliza el fondo y .open cambia el color. */
	transition: background-color .25s cubic-bezier(0.645, 0.045, 0.355, 1),
	            color .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
/* El bootstrap customizado del framework pinta un :hover global a todo <button>
   (fondo corporativo + color). Se anula por clase, sin !important ([T2]). */
#header .languageMenu > .language-trigger:hover {
	background-color: transparent;
}
#header .languageMenu > .language-trigger::after {
	content: "";
	width: 0.75rem;
	height: 0.4375rem;
	background-image: url("../../images/arrow-language.svg");
	background-position: center center;
	background-repeat: no-repeat;
	transition: .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#header .languageMenu > .language-trigger.open::after {
	background-image: url("../../images/arrow-language-open.svg");
}
#header .languageMenu:hover > .language-trigger,
#header .languageMenu > .language-trigger.open {
	color: #ffffff;
}
#header .languageMenu .language-trigger.open + ul {
	opacity: 1;
	visibility: visible;
}
#header .languageMenu ul {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	list-style-type: none;
	margin: 0;
	padding: 1rem 1rem;
	width: 5.9375rem;
	background-color: #1A1A1A;
	border-radius: 0.25rem;
	box-shadow: 0 0.5rem 1.25rem -0.625rem rgba(255, 255, 255, 0.16);
	opacity: 0;
	visibility: hidden;
	position: absolute;
	top: calc(100% + 0px);
	left: 0;
	z-index: 1;
	transition: 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
#header .languageMenu ul li {
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.25rem;
	text-transform: none;
}
#header .languageMenu ul li a {
	display: inline-block;
	color: #ffffff;
	text-decoration: none;
	/* FASE 08 (E-31): el atenuado por :has(a:hover) y li.current cambian color y peso. */
	transition: color 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96),
	            font-weight 0.48s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
#header .languageMenu ul li a:hover {
	color: #F4C670;
}
#header .languageMenu ul:has(a:hover) li:not(.current) a:not(:hover) {
	color: #A7A7A7;
}
#header .languageMenu ul li.current > a {
	font-weight: 700;
	color: #F4C670;
}
/* Es un <button> desde la Fase 03 de accesibilidad (antes era un <div> con un
   <label> suelto, imposible de operar con teclado). Las declaraciones de abajo ya
   neutralizaban el chrome del boton, asi que el aspecto no cambia; solo hacia falta
   anadir font-family (el user-agent impone la suya a los <button>) y appearance. */
#header .hamburger {
	position: relative;
	display: flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0.875rem 0;
	border: none;
	background-color: transparent;
	border-radius: 0px;
	font-family: inherit;
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 700;
	line-height: 1.25rem;
	/* La regla global de <button> impone text-transform:uppercase y
	   letter-spacing:0.675px. El elemento original era un <div>, que no las tenia:
	   sin estas dos lineas el boton se lee "MENU" en vez de "Menu" y, al ser mas
	   ancho, desplaza el menu de navegacion ~4px. Lo detecto el pixel diff [T1]. */
	letter-spacing: normal;
	text-transform: none;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	text-align: left;
	-webkit-appearance: none;
	appearance: none;
	cursor: pointer;
}
/* El bootstrap customizado del framework pinta un :hover global a todo <button>
   (fondo corporativo + color). Se anula por clase, sin !important ([T2]). */
#header .hamburger:hover {
	background-color: transparent;
	color: #ffffff;
}
#header .hamburger .hamburgerInner {
	pointer-events: none;
	display: flex;
	align-items: center;
	column-gap: 0.5rem;
	margin: 0px 0;
}
#header .hamburger .hamburgerInner span {
	position: relative;
	display: block;
	width: 2rem;
	height: 0.0625rem;
	margin-bottom: 0.5625rem;
	background-color: #ffffff;
	border-radius: 0.625rem;
	transition: .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#header .hamburger .hamburgerInner span::before {
	content: "";
	width: 2rem;
	height: 0.0625rem;
	background-color: #ffffff;
	border-radius: 0.625rem;
	position: absolute;
	bottom: -0.5625rem;
	left: 0;
	transition: .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#header .hamburger:hover .hamburgerInner span,
#header .hamburger:hover .hamburgerInner span::before {
	background-color: #ffffff;
}
/* El estado abierto lo marca aria-expanded, que es tambien lo que anuncia el lector
   de pantalla: una sola fuente de verdad en vez de una clase paralela. Se mantiene
   .navOpen porque site.js la usa para el resto de la animacion del header. */
#header .hamburger[aria-expanded="true"] .hamburgerInner span {
	width: 2rem;
	margin-bottom: 0;
	transform: rotate(-45deg);
}
#header .hamburger[aria-expanded="true"] .hamburgerInner span::before {
	width: 2rem;
	top: 0;
	transform: rotate(90deg);
}
/* 100vw y no el inset:0 a secas: 100vw incluye el hueco reservado por
   scrollbar-gutter y 100% no, asi que sin esto el overlay se queda 15px corto y
   deja ver una franja del fondo del body a la derecha. Al ser fixed no genera
   scroll horizontal, y 100vw no cambia se dibuje la barra o no. */
.hamburgerOverlay {
    position: fixed;
    inset: 0;
    width: 100vw;
    /* Cama y desenfoque viven en la MISMA capa a proposito: backdrop-filter difumina
       lo que se pinta DETRAS, asi que si el oscurecimiento fuese una capa aparte por
       encima, el blur estaria difuminando un negro plano y no se veria nada.

       .60 y no .75: con .75 apenas asomaba la web y el desenfoque no se apreciaba.
       Es una decision de IMAGEN, no de contraste: no hay nada legible apoyado sobre la
       zona difuminada. Medido en vivo en los tres tramos, la X del menu y el selector
       de idioma caen SIEMPRE sobre .menuRight, que es opaco -el panel es el 32% / 40%
       derecho y en <=960px el 100%, y el boton vive dentro de ese margen-, aunque
       #header sea z-index 5 y esta capa 4. Asi que el valor se puede subir o bajar por
       gusto sin comprometer 1.4.3.

       El desenfoque entra con el autoAlpha del timeline (site.js) y no animando el
       radio del blur: animar el radio obliga al navegador a recalcular el desenfoque
       de todo el viewport en cada fotograma. */
    background: rgba(0, 0, 0, .60);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    opacity: 0;
    visibility: hidden;
    z-index: 4;
}
nav.hamburgerNav {
	display: none;
	flex-direction: row;
	width: 100vw; /* Cubre el gutter reservado, igual que .hamburgerOverlay */
	height: 100vh;
	position: fixed;
	top: 0;
	left: 0;
	z-index: 4;
	pointer-events: none;
	overflow: hidden;
}
/* Hueco izquierdo, antes carrusel vertical de fotos. SIN background: lo que se ve a
   traves es la cama difuminada de .hamburgerOverlay. Conserva la anchura porque es lo
   que empuja al panel derecho a su sitio.

   El clic en esta zona CIERRA el menu, y el listener va sobre ella (site.js) en vez de
   delegar en el de .hamburgerOverlay: se probo con pointer-events:none para que el clic
   la atravesara y NO funciona, porque quien lo recibe entonces no es la cama sino el
   propio <nav>, que cubre el viewport entero y que la timeline pone en
   pointer-events:auto al abrir. */
nav.hamburgerNav .menuLeft {
	width: 68%;
	height: 100%;
}
nav.hamburgerNav .menuRight {
	position: relative;
	display: flex;
    justify-content: center;
    align-items: center;
	width: 32%;
	height: 100%;
	padding: 6.5rem 1.25rem 2.5rem;
	background: #1A1A1A;
	overflow: hidden;
}
nav.hamburgerNav .menuRight:before {
	content: "";
	width: 100%;
	height: 100%;
	background-image: radial-gradient(40% 57% at 50.03% 46.66%, rgba(128, 0, 51, 0.96) 0%, rgba(128, 0, 51, 0.93) 17.31%, rgba(128, 0, 51, 0.90) 34.62%, rgba(128, 0, 51, 0.84) 52.4%, rgba(128, 0, 51, 0.72) 70.67%, rgba(128, 0, 51, 0.48) 89.42%);
	background-image: radial-gradient(64.13% 40.37% at 50.03% 46.66%, rgba(26, 26, 26, 0.96) 0%, rgba(26, 26, 26, 0.93) 17.31%, rgba(26, 26, 26, 0.90) 34.62%, rgba(26, 26, 26, 0.84) 52.4%, rgba(26, 26, 26, 0.72) 70.67%, rgba(26, 26, 26, 0.48) 89.42%);
	position: absolute;
	inset: 0;
	z-index: -1;
}
nav.hamburgerNav .menuRight .patternBg {
	pointer-events: none;
	width: 100%;
	height: 100%;
	opacity: 40%;
	position: absolute;
	inset: 0;
	z-index: -2;
}
nav.hamburgerNav .menuRight .patternBg .patternDrawline {
	stroke-dasharray: 100;
	stroke-dashoffset: 100;
}
nav.hamburgerNav .menuRight.animate .patternBg .patternDrawline {
	animation: drawStroke 17s ease forwards;
}
nav.hamburgerNav .menuRight ul.menu {
	flex: 1;
	width: 100%;
	max-height: 100%;
	padding: 0 0 0.5rem 0;
	margin: 0;
	list-style-type: none;
	overflow: hidden;
	overflow-y: auto;
}
nav.hamburgerNav .menuRight ul.menu::-webkit-scrollbar {
	width: 0.125rem;
}
nav.hamburgerNav .menuRight ul.menu::-webkit-scrollbar-track {
	background: rgb(255 255 255 / 7%);
	-webkit-border-radius: 0.625rem;
	border-radius: 0.625rem;
}
nav.hamburgerNav .menuRight ul.menu::-webkit-scrollbar-thumb {
	min-height: 2.5rem;
	background: rgb(255 255 255 / 12%);
	-webkit-border-radius: 0.625rem;
	border-radius: 0.625rem;
}
nav.hamburgerNav .menuRight ul.menu > li {
	position: relative;
	margin: 0 0 1.5rem 0;
	font-size: 2rem;
	color: #ffffff;
	font-weight: 400;
	line-height: normal;
	text-transform: none;
	text-align: center;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
nav.hamburgerNav .menuRight ul.menu > li:last-child {
	margin-bottom: 0;
}
nav.hamburgerNav .menuRight ul.menu > li > a {
	display: block;
	color: #FFFFFF;
	text-decoration: none;
	/* FASE 08 (E-31): el hover y li.current solo cambian color y peso. Estos enlaces
	   no los cazo el medidor porque el <nav> cerrado lleva inert, pero al abrir el
	   menu son focusables reales y sufrian el mismo anillo animado (500ms aqui). */
	transition: color .5s cubic-bezier(0.645, 0.045, 0.355, 1),
	            font-weight .5s cubic-bezier(0.645, 0.045, 0.355, 1);
}
nav.hamburgerNav .menuRight ul.menu > li.current > a::before {
	content: "•";
	position: absolute;
	top: -0.8125rem;
	text-indent: -30px;
}
/* El dorado del hover lo pinta el CSS, no una clase .active puesta por JS. El JS la
   ponia en mouseenter y NO la quitaba nunca, porque no marcaba "estas encima" sino
   "esta es la opcion cuya foto estas viendo" en el carrusel vertical. Sin fotos se
   quedaba pegada a la ultima opcion visitada, compitiendo con li.current.
   :focus-visible va emparejado para que el teclado reciba el MISMO dorado y no solo
   el anillo de foco (accessibility.css). */
nav.hamburgerNav .menuRight ul.menu > li > a:hover,
nav.hamburgerNav .menuRight ul.menu > li > a:focus-visible {
	color: #FFD375;
	text-decoration: none;
}
nav.hamburgerNav .menuRight ul.menu > li.current > a {
	color: #FFD375;
	font-weight: 700;
	text-decoration: none;
}

#searchForm {
	width: 100%;
	/* 880 y no los 820 de la maqueta: peticion del cliente (jul 2026). Es un
	   max-width, no un min-width: la mascara sigue encogiendo por debajo de esa
	   anchura (a 768-960 skeleton.css la deja en calc(100% - 40px) y en <=767 pasa a
	   overlay a pantalla completa), asi que un min-width real desbordaria ahi.

	   FASE 15 WCAG (1.4.4): se expresa en rem, no en px. 55rem son exactamente los
	   mismos 880px con la fuente por defecto -cambio nulo en el render normal-, pero
	   si el usuario amplia el texto la tarjeta crece con el en vez de quedarse
	   clavada mientras su contenido no cabe. El width:100% de arriba y el
	   left:0/right:0 siguen acotandola al viewport, asi que no puede desbordar la
	   ventana por mucho que se amplie la fuente. */
	max-width: 55rem;
	margin: 0 auto;
	padding: 0.5rem 0.5rem 0.5rem 0.5rem;
	background: #ffffff;
	border-radius: 0.25rem;
	box-shadow: 0 0.25rem 2rem 0 rgba(0, 0, 0, 0.16);
	position: fixed;
	bottom: 3rem;
	right: 0;
	left: 0;
	z-index: 3;
	transition: bottom 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);
}
/* La maqueta del 31-jul suma la mascara al fundido de entrada de la cabecera:
   nace con .invisible (booking-mask.xsl) y site.js le pone .anim, misma mecanica
   que #header (linea 226) y #slider (linea 958). El retardo de 0.5s la deja
   entrar despues del hero, no a la vez. El keyframe fadeIn lo aporta
   third-party/wow-animate.css, igual que a #slider.anim. */
#searchForm.anim {
	animation: fadeIn 0.5s both;
	animation-delay: 0.5s;
}
#searchForm.sticky {
	bottom: 1.25rem;
}
/* NO se pone flex-wrap aqui, y conviene saber por que antes de intentarlo otra
   vez: los cuatro .field llevan width:25%, o sea 100% de la .fieldBox, y ademas
   hay tres huecos de 49px. La suma SIEMPRE excede el 100%, asi que sin wrap la
   presion de encogido del flex lo absorbe y la fila cuadra, pero con wrap el
   cuarto campo -el boton- rompe linea SIEMPRE, tambien con la fuente por defecto.
   Medido: la mascara pasaba de 134px de alto a 190 y el boton RESERVAR caia a una
   segunda fila. Es decir, wrap no es una mejora latente que solo actua al ampliar
   el texto: rompe la maqueta desde el primer pixel ([T1]). El escalado al 200% se
   resuelve con los suelos en rem de mas abajo, no aqui. */
#searchForm .fieldBox {
	display: flex;
	justify-content: center;
	align-items: center;
	gap: 3.0625rem;
	max-width: 100%;
	margin: 0 auto;
}
/* FASE 03 WCAG: era <a href="javascript:void(0);"> (cierra la mascara, no
   navega) -> <button>. Ya era un reset case-completo (background/border/padding
   propios), solo faltan las declaraciones que el bootstrap customizado del
   framework fija en TODO <button> por su cuenta y que aqui deben quedar como
   estaban en el <a>: font-family (misma familia que el body, sin diferencia
   visual, pero se fija por si cambia), text-align (UA centra el texto de los
   <button>) y appearance/cursor ([T2]). */
#searchForm .searchFormClose {
	display: none;
	align-items: center;
	gap: 0px;
	width: auto;
	margin: 0;
	padding: 0;
	outline: 0;
	border: none;
	border-radius: 0px;
	background-color: transparent;
	font-family: inherit;
	font-size: 0.75rem;
	color: #6D6D6D;
	font-weight: 700;
	line-height: 1.125rem;
	letter-spacing: normal;
	text-transform: uppercase;
	text-align: left;
	-webkit-appearance: none;
	appearance: none;
	cursor: pointer;
	position: fixed;
	top: 1rem;
	right: 1rem;
	z-index: 1;
	text-indent: -9999px;
}
/* El bootstrap customizado del framework pinta un :hover global a todo <button>
   (fondo corporativo + color). El <a> original no tenia :hover propio en el
   elemento raiz (solo en su span/img internos, ver reglas de abajo), asi que se
   neutraliza sin anadir un efecto nuevo ([T2]). */
#searchForm .searchFormClose:hover {
	background-color: transparent;
	color: #6D6D6D;
}
#searchForm .searchFormClose span {
	border: 1px solid #6D6D6D;
	background-color: transparent;
	border-radius: 0.25rem;
	transition: .5s cubic-bezier(0.645, 0.045, 0.355, 1);
	text-indent: 0px;
}
#searchForm .searchFormClose:hover span {
	border-color: #F4C670;
	background-color: #F4C670;
}
#searchForm .searchFormClose span img {
	transition: .5s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#searchForm .searchFormClose:hover span img {
	filter: brightness(0) invert(1);
}
#searchForm .field {
	position: relative;
	float: left;
	width: 25%;
	padding: 0.75rem;
	padding-bottom: 0.5rem;
}
#searchForm .field:after {
	content: "";
	width: 0.0625rem;
	height: calc(100% - 0.875rem);
	background-color: #999999;
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	left: -1.5625rem;
}
#searchForm .field:first-child:after,
#searchForm .field.bookBtn:after {
	display: none;
}
/* REPARTO DE ANCHOS DE LA MASCARA (peticion del cliente, jul 2026).
   Los cuatro campos se reparten 717px: la .fieldBox mide 864 (mascara de 880 menos
   sus 8px de padding a cada lado) y los tres huecos de 49px se comen 147.
   Medido lo que necesita cada contenido para NO cortarse: fechas 234
   (DD/MM/AAAA → DD/MM/AAAA, longitud fija en cualquier idioma), huespedes 146
   ("2 habitaciones"), promo 189 (placeholder "Introduce el codigo") y boton 129.
   Suman 698, asi que entra por 19px de margen: es un reparto de suma cero y quien
   gana ancho se lo quita a otro. Prioridad: que la fecha se vea ENTERA.

   FASE 15 WCAG (1.4.4): los tres suelos pasan de px a rem. Los valores son los
   MISMOS con la fuente por defecto (240px = 15rem, 166px = 10.375rem,
   156px = 9.75rem), asi que el reparto medido arriba se conserva intacto; lo que
   cambia es que ahora el suelo de cada campo escala con el texto. Con los suelos
   en px, ampliar la fuente al 200% dejaba el contenido del doble de tamano dentro
   de una caja del mismo ancho: "Selecciona fechas" se quedaba en "Selecciona fe",
   "1 habitacion" en "1 habit" y el rotulo "ENTRADA / SALIDA" salia cortado. Eso es
   perdida de contenido, no un apreto estetico. */
#searchForm .field.dateinout {
	min-width: 15rem;
}
/* 20% de la .fieldBox = 173px, por encima de los 146 que necesita "2 habitaciones".
   flex-shrink: 0 es IMPRESCINDIBLE: sin el, la presion de encogido del flex se lo
   comia hasta su min-width (medido: 166px = 19,2%) y el 20% no se respetaba.
   El min-width se queda como suelo para la mascara estrecha de tablet, donde el
   20% cae por debajo. */
#searchForm .field.adultschildren {
	width: 20%;
	min-width: 10.375rem;
	flex-shrink: 0;
}
#searchForm .field.procode {
	min-width: 9.75rem;
}
#searchForm .field.bookBtn {
	flex: 1;
	padding: 0;
}
#searchForm .field label {
	display: flex;
	margin-bottom: 0.625rem;
	font-size: 0.75rem;
	color: #1A1A1A;
	font-weight: 600;
	line-height: 0.75rem;
	text-transform: uppercase;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#searchForm .field .form-control {
	display: block;
	height: auto;
	padding: 0;
	border: none;
	background-color: transparent;
	border-radius: 0px;
	box-shadow: none;
	font-size: 1.125rem;
	color: #1A1A1A;
	font-weight: 600;
	line-height: 1.25rem;
}
#searchForm .field .form-control::placeholder {
	color: #666666;
}
#searchForm .field .form-control:-webkit-autofill,
#searchForm .field .form-control:-webkit-autofill:hover,
#searchForm .field .form-control:-webkit-autofill:focus {
	-webkit-text-fill-color: #1A1A1A !important;
	-webkit-box-shadow: 0 0 0px 62.5rem #ffffff inset;
	transition: background-color 5000s ease-in-out 0s !important;
}
#searchForm .field .bookButton {
	display: flex;
	justify-content: center;
	width: 100%;
}

#slider {
	float: left;
	width: 100%;
	overflow: hidden;
	position: relative;
	z-index: 1;
}
#slider.anim {
	animation: fadeIn 0.5s both;
	animation-delay: 0.5s;
}
#slider,
#slider .home-slider-video,
#slider .home-slider {
	width: 100%;
	height: 100dvh;
	user-select: none;
}
#slider .home-slider-video video {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	position: absolute;
	top: 0;
	left: 0;
}
#slider .home-slider .swiper-slide {
	display: flex;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 100%;
	overflow: hidden;
}
#slider .home-slider .swiper-slide picture,
#slider .home-slider .swiper-slide picture img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
#slider .home-slider .swiper-slide video {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	position: absolute;
	top: 0;
	left: 0;
}
/* WCAG 1.4.4 - este bloque y el carrusel de miniaturas (.home-thumb-wrapper)
   son los dos position:absolute, asi que ninguno aparta al otro: al ampliar el
   texto al 200% el caption crecia hasta meterse debajo de las miniaturas y las
   ultimas palabras quedaban tapadas.

   El min() pone el techo que faltaba. El segundo termino reserva la banda
   derecha que ocupan las miniaturas (9.5rem de ancho + 4.75rem de separacion a
   cada lado) y, al estar en rem, esa reserva crece a la vez que ellas. Al 100%
   gana siempre el primer termino -a 1366px son 805px frente a 1062px-, asi que
   el caption mide exactamente lo mismo que antes.

   Y el overflow pasa a auto: con hidden, un texto que creciera mas que el hero
   se RECORTABA, que es perdida de contenido y no solo solape. */
#slider .caption-wrapper {
	width: 100%;
	max-width: min(50.3125rem, calc(100% - 9.5rem - 9.5rem));
	height: fit-content;
	max-height: 100%;
	margin: auto;
	padding: 4rem 4.75rem;
	background-color: #1A1A1A;
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	z-index: 2;
	overflow: auto;
}
#slider .caption-wrapper .home-slider-caption {
	transition: height 0.3s ease;
	will-change: height;
}
#slider .caption-wrapper .home-slider-caption .swiper-slide {
	overflow: hidden;
}
#slider .caption-wrapper .home-slider-caption .title {
	display: block;
	margin: 0 0 2.5rem 0;
	font-size: 3.375rem;
	color: #F4C670;
	font-weight: 400;
	line-height: 3.875rem;
	letter-spacing: -0.09375rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	padding-block: 0.25rem;
}
#slider .caption-wrapper .home-slider-caption .title br {
	display: block;
}
#slider .caption-wrapper .home-slider-caption p {
	display: block;
	margin: 0 0 1.25rem 0;
	padding-bottom: 0.3125rem;
	font-size: 1.375rem;
	color: #FDFBF9;
	font-weight: 400;
	line-height: 1.9375rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#slider .caption-wrapper .home-slider-caption p:last-child {
	margin-bottom: 0;
}
/* WCAG 1.4.4 - TEXTO AMPLIADO: el parrafo del hero dejaba de verse entero.

   UMBRAL: min-width en px Y max-width en em, a proposito. Una media query en em
   NO mide contra el font-size del html (aqui 12px por la palanca del 75%), sino
   contra el tamano de fuente configurado en el NAVEGADOR: 16px por defecto, 32px
   cuando el usuario amplia el texto al 200%. Comprobado en vivo bisecando
   "(max-width: Xem)" con el html forzado a 24px: el punto de corte seguia dando
   1em = 16px. Asi que 60em son 960px al 100% y 1920px al 200%.
   Emparejar ese 60em con min-width:961px hace el bloque IMPOSIBLE al 100%: pide
   a la vez >=961px y <=960px, que no lo cumple ningun ancho. Solo se abre cuando
   la fuente base pasa de 16px, y al 200% cubre de 961px a 1920px, o sea el tramo
   entero de Desktop Pequeno. No es un umbral inventado: 961px es el suelo de
   escritorio que ya usa el proyecto (el tramo 961-1365 de skeleton.css) y 60em
   son esos mismos 960px escritos en unidades de texto. Leido en voz alta: "el
   viewport es ancho de verdad pero estrecho medido en anchos de texto", que es
   exactamente la situacion que hay que corregir.

   LA SEGUNDA CLAUSULA cubre Desktop Grande con el MISMO truco y los limites del
   proyecto: 1921px es el suelo de ese tramo y 120em son los 1920px de su techo
   inferior escritos en unidades de texto, asi que tambien es imposible al 100%
   (>=1921px y <=1920px) y al 200% cubre de 1921px a 3840px. Hacen falta las dos
   porque un unico par "min-width:N + max-width:Mem" solo puede cubrir de N a 2N
   (si fuese mas ancho, M*16 alcanzaria a N y el bloque dejaria de estar vacio al
   100%). Juntas cubren de 961px a 3840px al 200%, sin hueco entre ellas.

   Por debajo de 961px NO entra a proposito: ahi el proyecto ya tiene maqueta
   propia (skeleton.css, tramos 768-960 y <=767) y no hay nada que arreglar;
   abrir el bloque solo anadiria riesgo de regresion.

   QUE ARREGLA: con text-box-trim:trim-both la caja del parrafo se corta en la
   linea base alfabetica, asi que los rasgos descendentes (g, j, p, q, y) de la
   ULTIMA linea se pintan FUERA de la caja. El .caption mide justo esa caja, y de
   ahi sale la altura que el JS (swiper-bundle-controls.js, setHeight) escribe en
   el carrusel de captions; como .swiper-slide es overflow:hidden, esos rasgos se
   recortaban. Medido en vivo a 1366x768 con el texto al 200%: scrollHeight 302
   frente a clientHeight 298 en el slide activo, los cuatro pixeles de los
   descendentes. Es perdida de contenido, no un solape.

   POR QUE SE QUITA EL TRIM Y NO SE TOCA EL overflow DEL SLIDE: Swiper escribe la
   altura INLINE en cada .swiper-slide, asi que desde CSS la caja no puede crecer
   sin !important; y poner overflow:auto ahi sacaria una barra de scroll por
   cuatro pixeles, ademas de asomar durante la transicion entre slides. Quitando
   el recorte tipografico la tinta vuelve a caber DENTRO de la caja, el JS mide
   una altura que ya la contiene y el overflow:hidden deja de recortar nada.
   El recurso no es nuevo en el proyecto: skeleton.css ya apaga el trim del
   .title en los tramos <=960px por este mismo motivo.

   Al 100% no cambia nada: el bloque no llega a existir. */
@media (min-width: 961px) and (max-width: 60em),
       (min-width: 1921px) and (max-width: 120em) {
	#slider .caption-wrapper .home-slider-caption p {
		text-box-trim: none;
		text-box-edge: auto;
	}
}
/* Las dos bandas de padding son el hueco de las flechas: .swiperNav se estira
   con inset:0 y las reparte con space-between, asi que cada flecha cae en una
   banda y las miniaturas ocupan la caja de contenido, entre las dos.

   ESCALA 75%: la flecha del hero se baja a 2.5rem (30px) mas abajo, y la banda
   es ese diametro MAS los 8px de holgura pedida. El problema que arregla: la
   banda escalo con la palanca y bajo a 43,5px, pero el diametro de la flecha se
   quedo en los 48px de Swiper -es un control de terceros y se dejan grandes
   hasta la fase 2-, asi que la flecha se metia 4,5px en la caja de contenido y,
   como .swiperNav computa z-index 0 contra el 1 de .home-slider-thumb, quedaba
   pintada POR DETRAS de las miniaturas. Medido en vivo a 1440x900 antes del
   arreglo: flecha de arriba en y 274-322 contra miniaturas que empezaban en
   y 317, y flecha de abajo en y 578-626 contra miniaturas que acababan en
   y 583; 5px de solape por cada lado.

   Bajar solo el diametro a 30px quitaba el solape pero dejaba 13,5px de hueco
   (43,5 - 30), asi que la banda se declara como diametro + holgura y los 8px
   salen exactos.

   Los 8px van en px y no en rem porque son la holgura PEDIDA a tamano final,
   no una medida de maqueta que deba escalar; el diametro si escala. El alto es
   la caja de contenido -3 miniaturas mas sus 2 huecos, los 354px de la maqueta-
   mas las dos bandas, y se escribe con la misma suma para que se vea de donde
   sale. */
#slider .home-thumb-wrapper {
	width: 9.5rem;
	height: calc(22.125rem + (2.5rem + 8px) * 2);
	margin: 0 auto;
	padding: calc(2.5rem + 8px) 0;
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	right: 4.75rem;
	z-index: 2;
}
/* Con las flechas bloqueadas no hay bandas que reservar y el wrapper se queda
   en la caja de contenido pelada, que es el mismo 22.125rem de arriba. */
#slider .home-thumb-wrapper:has(.swiperNav .swiper-button-lock) {
	height: 22.125rem;
	padding: 0;
}
#slider .home-thumb-wrapper .home-slider-thumb {
	width: 100%;
	height: 100%;
}
#slider .home-thumb-wrapper .home-slider-thumb .swiper-slide {
	position: relative;
	display: flex;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 100%;
	border-radius: 0.125rem;
	overflow: hidden;
	cursor: pointer;
}
#slider .home-thumb-wrapper .home-slider-thumb .swiper-slide.swiper-slide-thumb-active {
	border: 2px solid #FFFFFF;
}
#slider .home-thumb-wrapper .home-slider-thumb .swiper-slide picture,
#slider .home-thumb-wrapper .home-slider-thumb .swiper-slide picture img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
#slider .home-thumb-wrapper .home-slider-thumb .swiper-slide video {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	position: absolute;
	top: 0;
	left: 0;
}
#slider .home-thumb-wrapper .home-slider-thumb .thumb-progress {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 2;
	width: 100%;
	height: 100%;
	overflow: hidden;
	pointer-events: none;
}
#slider .home-thumb-wrapper .home-slider-thumb .thumb-progress span {
	position: absolute;
	top: 0;
	right: 0;
	display: block;
	width: 100%;
	height: 100%;
	background: rgb(26 26 26 / 72%);
}
#slider .home-thumb-wrapper .swiperNav {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	align-items: center;
	margin-top: 0;
	position: absolute;
	inset: 0;
}
/* 2.5rem = 30px con la palanca al 75%. Es el UNICO sitio donde se toca el
   tamano de un control de Swiper antes de la fase 2, y se hace scopeado al
   hero: la regla base de swiper-bundle-controls.css sigue en sus 48px para el
   resto del sitio. Va en rem para que acompane a la palanca -si manana la
   escala sube al 80%, la flecha sube con ella y la banda de padding de arriba
   se recalcula sola, porque esta escrita como este mismo diametro + 8px-.
   min-width ademas del width porque la regla base declara min-width: 48px y si
   no gana ella. */
#slider .home-thumb-wrapper .swiperNav [class*=swiper-button-] span {
	min-width: 2.5rem;
	width: 2.5rem;
	height: 2.5rem;
	background: #ffffff;
}
#slider .home-thumb-wrapper .swiperNav [class*=swiper-button-] span img {
	filter: none;
}

#middle {
	float: left;
	width: 100%;
}

#welcomeSec {
	padding-top: 5rem;
	padding-bottom: 5rem;
	background-color: #4D001F;
	overflow: hidden;
	position: relative;
	z-index: 0;
}
#welcomeSec:before {
	content: "";
	width: 100%;
	height: 100%;
	background-image: radial-gradient(40% 57% at 50.03% 46.66%, rgba(128, 0, 51, 0.96) 0%, rgba(128, 0, 51, 0.93) 17.31%, rgba(128, 0, 51, 0.90) 34.62%, rgba(128, 0, 51, 0.84) 52.4%, rgba(128, 0, 51, 0.72) 70.67%, rgba(128, 0, 51, 0.48) 89.42%);
	position: absolute;
	inset: 0;
	z-index: -1;
}
#welcomeSec .patternBg {
	pointer-events: none;
	width: 100%;
	height: 100%;
	position: absolute;
	inset: 0;
	z-index: -2;
}
#welcomeSec .patternBg .patternDrawline {
	stroke-dasharray: 100;
	stroke-dashoffset: 100;
}
#welcomeSec.animate .patternBg .patternDrawline {
	animation: drawStroke 17s ease forwards;
}
#welcomeSec .welcomeText {
	max-width: 72.5rem;
	margin: 0 auto;
}
#welcomeSec .welcomeText .subtitle {
	display: block;
	margin: 0 0 2rem 0;
	font-size: 1.125rem;
	color: #F4C670;
	font-weight: 600;
	line-height: 1.4375rem;
	text-align: center;
	letter-spacing: 0.09375rem;
	text-transform: uppercase;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#welcomeSec .welcomeText .title {
	margin: 0 0 4rem 0;
	font-size: 2.8125rem;
	color: #FDFBF9;
	font-weight: 400;
	line-height: 3.25rem;
	letter-spacing: -0.09375rem;
	text-align: center;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#welcomeSec .welcomeText .title strong {
	color: #F4C670;
	font-weight: 400;
}
#welcomeSec .welcomeText p {
	max-width: 53.9375rem;
	margin: 0 auto;
	margin-bottom: 2.1875rem;
	font-size: 1.125rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.5rem;
	text-align: center;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#welcomeSec .welcomeText p:last-child {
	margin-bottom: 0;
}
/* Botonera del bloque: mismo patron que #introductionSec .contentBox .buttonBox
   (fila centrada, gap 48px, ancho al contenido) para que los CTA de la Home y los de
   las paginas interiores tengan el mismo ritmo. Los margenes salen del CONTENEDOR y
   no de cada boton: con dos botones, un margin-top por boton los apilaria con 64px
   cada uno. Los .button ya vienen con margin:0 de la regla base. */
#welcomeSec .welcomeText .buttonBox {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: 3rem;
	width: fit-content;
	margin: 0 auto;
	margin-top: 4rem;
}

#footer {
	float: left;
	width: 100%;
	background-color: #1A1A1A;
	overflow: hidden;
}
#footer .footerNewsletter {
	padding-top: 3rem;
	padding-bottom: 3rem;
	border-top: 1px solid #999999;
	border-bottom: 1px solid #999999;
	background-color: #ffffff;
}
#footer .footerNewsletter .newsletter {
	position: relative;
	display: flex;
	justify-content: space-between;
	gap: 1.875rem;
}
#footer .footerNewsletter .content {
	width: 100%;
	max-width: 40.75rem;
}
#footer .footerNewsletter .content .title {
	display: block;
	margin: 0;
	font-size: 2.3125rem;
	color: #1A1A1A;
	font-weight: 400;
	line-height: 2.625rem;
	letter-spacing: -0.09375rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#footer .footerNewsletter .newsform {
	width: 100%;
	max-width: 31.25rem;
}
#footer .footerNewsletter .newsform .form-group {
	position: relative;
	display: flex;
	/* gap en vez de grid-gap (maqueta 31-jul): grid-gap es la propiedad obsoleta,
	   gap es el equivalente estandar y funciona igual en flex */
	gap: 0.5rem;
	/* wrap para que el aviso de error pueda bajar de linea. Sin esto, el <span>
	   que inyecta form-validator.js se queda como un item MAS de la fila: en el
	   grupo del email caia entre el <input> y el <button> -y le robaba ancho al
	   campo, que bajaba de su ancho normal a 169px- y en el del checkbox caia a
	   la derecha del texto del consentimiento. Ver la regla de .field-error de
	   abajo, que es la otra mitad del arreglo. */
	flex-wrap: wrap;
	margin-top: 1.5rem;
	margin-bottom: 0;
}
/* EL AVISO DE ERROR, A LINEA COMPLETA Y DEBAJO DE SU FILA.
   form-validator.js ancla el mensaje al campo que falla: detras del <input> en
   el email, y detras del <label> ENTERO en el checkbox (si fuera detras de su
   <input> partiria la frase del consentimiento por la mitad). Como el
   .form-group es flex en fila, ese <span> entraba en la fila en vez de debajo.

   flex-basis 100% le da la linea entera, y con el wrap del contenedor eso lo
   empuja a una linea nueva. La separacion la da el gap del contenedor, asi que
   se anula el margin-top que trae la regla global de .field-error
   (accessibility.css) para no sumar dos veces.

   order: 1 lo pinta DESPUES del boton de enviar, aunque en el DOM vaya antes.
   Hace que el orden visual difiera del orden del DOM, que normalmente conviene
   evitar, pero aqui es inocuo y a proposito:
     - el <span> no es focusable, asi que no altera el orden de tabulacion
       (WCAG 2.4.3);
     - la asociacion con el campo es por aria-describedby, no por proximidad, asi
       que el lector de pantalla lo anuncia al llegar al input independientemente
       de donde se pinte;
     - y el orden del DOM -mensaje justo tras su campo- es la secuencia de
       lectura correcta para WCAG 1.3.2. Lo unico que se reordena es la pintura.
   La alternativa era mover el anclaje en form-validator.js, pero ese motor lo
   comparte #contact-form y habria que meterle una opcion por formulario. */
#footer .footerNewsletter .newsform .form-group .field-error {
	flex: 0 0 100%;
	order: 1;
	margin-top: 0;
}
#footer .footerNewsletter .newsform .form-group:first-of-type {
	margin-top: 0;
}
/* ETIQUETA VISIBLE DEL CAMPO DE EMAIL (footer.xsl, 17-sep-2026).

   Tipografia COPIADA de las etiquetas de #contact-form
   (contact-page.css: .formBox .form-group .label) para que los dos formularios del
   sitio hablen el mismo idioma visual. No se factoriza en una regla comun porque
   viven en modulos CSS distintos -este se pinta en todas las paginas y
   contact-page.css solo en /contacto- y compartir selector obligaria a subir uno de
   los dos de modulo.

   width:100% + flex:0 0 auto, y NO flex:0 0 100%: la etiqueta tiene que llevarse una
   linea entera para si, con el par campo+boton debajo. En el tramo ancho el grupo es
   flex EN FILA, asi que la base del item es el ancho y el 100% la deja sola en su
   linea (el contenedor ya es flex-wrap). Pero en <=767px el grupo pasa a
   flex-direction:column (skeleton.css) y alli la base seria el ALTO: un 100% se
   resolveria contra una altura indefinida y el resultado depende del navegador. Con
   la base en auto y el ancho declarado aparte, las dos direcciones se comportan igual
   sin necesidad de una media query.

   El margin-bottom se SUMA al gap de 0.5rem del grupo: 6 + 3 = 9px entre la etiqueta
   y el campo, que es la separacion que usa #contact-form. */
#footer .footerNewsletter .newsform .form-group .label {
	flex: 0 0 auto;
	width: 100%;
	margin-bottom: 0.25rem;
	font-size: 1.125rem;
	color: #1A1A1A;
	font-weight: 600;
	line-height: 1.125rem;
	letter-spacing: -0.0625rem;
	text-transform: uppercase;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
/* Instruccion de formato que se revela al enfocar (WCAG 3.3.2). Mismo mecanismo y
   mismos porques que en #contact-form -ver la cabecera larga de contact-page.css-,
   adaptado a este bloque: aqui el fondo es blanco y el grupo es flex EN FILA con la
   etiqueta ocupando la primera linea, asi que el hint se ancla a la derecha de esa
   misma linea. */
/* Etiqueta y hint en la misma fila, el hint pegado a la etiqueta. Mismo criterio
   que en #contact-form: ver el comentario de .label-row en contact-page.css.
   Aqui .label-row hereda el width:100% + flex:0 0 auto que llevaba la etiqueta, y
   que estan explicados en la regla de .label de mas abajo: en <=767px el grupo pasa
   a columna y un flex-basis en porcentaje se resolveria contra una altura
   indefinida. */
#footer .footerNewsletter .newsform .form-group .label-row {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: 0.5rem;
	flex: 0 0 auto;
	width: 100%;
	margin-bottom: 0.25rem;
}
#footer .footerNewsletter .newsform .form-group .label-row .label {
	width: auto;
	margin-bottom: 0;
}
#footer .footerNewsletter .newsform .form-group .field-hint {
	font-size: 0.9375rem;
	color: #1A1A1A;
	font-weight: 400;
	line-height: 1.125rem;
	opacity: 0;
	transform: translateY(0.25rem);
	pointer-events: none;
	transition: opacity .28s cubic-bezier(0.22, 1, 0.36, 1), transform .28s cubic-bezier(0.22, 1, 0.36, 1);
}
#footer .footerNewsletter .newsform .form-group:has(.form-control:focus) .field-hint {
	opacity: 1;
	transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
	#footer .footerNewsletter .newsform .form-group .field-hint {
		transform: none;
		transition: opacity .01s linear;
	}
}
#footer .footerNewsletter .newsform .form-group .form-control {
	width: 100%;
	/* flex-basis 0 para que el campo COMPARTA fila con el boton de enviar.
	   Hace falta desde que el grupo es flex-wrap:wrap (ver arriba): el corte de
	   linea en flex se decide con el tamano BASE de cada item, antes de aplicar
	   el encogido, y con el width:100% de arriba como base el campo se quedaba
	   la fila entera y empujaba el boton a la linea siguiente. Con nowrap no se
	   notaba porque no habia linea siguiente a la que irse y el campo se
	   encogia. min-width:0 para levantar el minimo automatico del item flex, que
	   en un <input> lo fija su ancho intrinseco.
	   En <=767px el grupo pasa a flex-direction:column (skeleton.css) y alli se
	   devuelve a flex:0 0 auto, porque en columna la base es el ALTO y un 0
	   colapsaria el campo. */
	flex: 1 1 0;
	min-width: 0;
	height: 3.625rem;
	padding: 0.5rem 1rem;
	border: 0;
	/* FASE 14 WCAG (1.4.11), autorizado por el usuario el 13-ago-2026: el borde
	   era #999999, que sobre el blanco de .footerNewsletter da 2,85:1 y se queda
	   por debajo del minimo de 3:1 para componentes de interfaz. Se adopta el
	   #1A1A1A que YA usan todos los demas campos del sitio (mascara y formulario
	   de contacto, 10,91:1): no es un color nuevo, es alinear el unico componente
	   que se habia quedado fuera de la convencion del proyecto. */
	border: 1px solid #1A1A1A;
	background-color: transparent;
	border-radius: 0.25rem;
	box-shadow: none;
	font-size: 1.125rem;
	color: #1A1A1A;
	font-weight: 400;
}
/* WCAG 1.4.3: el placeholder es texto y le aplica el minimo de 4,5:1. El #999999 que
   traia la maqueta da 2,85:1 sobre el blanco del bloque -el MISMO 2,85:1 por el que
   ya se corrigieron el borde del campo y el del checkbox en la fase 14-, asi que se
   adopta el #666666 (5,74:1) que YA usan los placeholders de #contact-form. No es un
   color nuevo: es alinear el ultimo campo que se habia quedado fuera de la
   convencion. Con la etiqueta ya visible el placeholder pasa ademas a ser un ejemplo
   de formato, asi que tampoco carga con informacion imprescindible. */
#footer .footerNewsletter .newsform .form-group .form-control::placeholder {
	color: #666666;
}
#footer .footerNewsletter .newsform .form-group label.checkbox {
	position: relative;
	margin: 0;
	padding-left: 1.5625rem;
	font-size: 0.9375rem;
	color: #1A1A1A;
	font-weight: 400;
	line-height: 1.25rem;
	user-select: none;
}
#footer .footerNewsletter .newsform .form-group label input {
	appearance: none;
	width: 16px;
	height: 16px;
	outline: 0;
	/* FASE 14 WCAG (1.4.11): mismo caso y misma correccion que el campo de email
	   de arriba — #999999 daba 2,85:1 sobre el blanco del bloque. */
	border: 1px solid #1A1A1A;
	background-color: transparent;
	border-radius: 2px;
	vertical-align: text-top;
	position: absolute;
	top: 2px;
	left: 0;
	cursor: pointer;
}
#footer .footerNewsletter .newsform .form-group label input:checked:before {
	content: "";
	display: block;
	width: 6px;
	height: 10px;
	border: 2px solid #1A1A1A;
	border-top: 0;
	border-left: 0;
	transform: rotate(45deg);
	position: relative;
	top: 0;
	left: 4px;
}
#footer .footerNewsletter .newsform .form-group label strong {
	font-weight: 700;
}
#footer .footerNewsletter .newsform .form-group label a {
	position: relative;
	color: #1A1A1A;
	font-weight: 700;
	text-decoration: underline;
	/* FASE 08 (E-31): el :hover solo quita el subrayado, y text-decoration-line es de
	   tipo discreto -nunca se ha animado-. Lo unico que la abreviatura (= all) SI
	   animaba era el anillo de foco. Se deja el color, que es la unica propiedad
	   animable de este enlace, para no cambiar la intencion de la regla. */
	transition: color .5s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#footer .footerNewsletter .newsform .form-group label a:hover {
	text-decoration: none;
	/* FASE 08 (E-31): hay que declararla tambien en el estado :hover. Una transicion
	   usa el valor de transition-* del estado DESTINO, asi que si aqui quedara `all`,
	   enfocar un enlace que ya esta bajo el raton volveria a animar el anillo. */
	transition: color .5s cubic-bezier(0.645, 0.045, 0.355, 1);
}
/* Aviso legal de reCAPTCHA del newsletter (footer.xsl). Hereda el mismo color y
   cuerpo que el label del consentimiento que tiene justo debajo (#1A1A1A sobre el
   fondo blanco del bloque) para que se lea como parte del formulario y no como
   letra pequena pegada por encima del diseno */
#footer .footerNewsletter .newsform .form-group.recaptchaNotice {
	display: block;
	margin-top: 1rem;
}
#footer .footerNewsletter .newsform .recaptchaNotice p {
	margin: 0;
	font-size: 0.8125rem;
	color: #1A1A1A;
	font-weight: 400;
	line-height: 1.125rem;
}
#footer .footerNewsletter .newsform .recaptchaNotice a {
	color: #1A1A1A;
	font-weight: 700;
	text-decoration: underline;
	/* FASE 08 (E-31): mismo caso que el enlace del label de arriba. */
	transition: color .5s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#footer .footerNewsletter .newsform .recaptchaNotice a:hover {
	text-decoration: none;
}
#footer .footerNewsletter .newsform .form-group .button {
	padding: 1.25rem 1.5rem;
}
#footer .footerTop {
	display: flex;
	border-bottom: 1px solid #999999;
}
#footer .footerTop .infoBox {
	display: flex;
	flex-direction: column;
	gap: 2.5rem;
	width: 100%;
	max-width: 25%;
	padding: 4rem 4.75rem;
	border-right: 1px solid #999999;
}
#footer .footerTop .infoBox .logo {
	display: flex;
	justify-content: flex-start;
	align-items: center;
}
#footer .footerTop .infoBox .info {
	display: flex;
	flex-direction: column;
	gap: 1.5rem;
}
#footer .footerTop .infoBox .info .item {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	font-size: 1.125rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.5rem;
	word-break: break-word;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#footer .footerTop .infoBox .info .item br {
	display: block;
}
#footer .footerTop .infoBox .info .item .label {
	display: block;
	margin: 0;
	font-size: 0.9375rem;
	color: #F4C670;
	font-weight: 700;
	line-height: 1.25rem;
	text-transform: uppercase;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#footer .footerTop .infoBox .info .item a {
	display: inline-block;
	color: #ffffff;
	text-decoration: none;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	/* FASE 08 (E-31): el :hover solo cambia el color. */
	transition: color .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#footer .footerTop .infoBox .info .item a:hover {
	color: #f4c670;
	text-decoration: none;
}
#footer .footerTop .infoBox .info .social {
	display: inline-block;
	width: 100%;
	margin: 0;
}
#footer .footerTop .infoBox .info .social ul {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0;
	margin: 0;
	list-style-type: none;
}
#footer .footerTop .infoBox .info .social ul li {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.5rem;
	width: auto;
}
#footer .footerTop .infoBox .info .social ul li a {
	display: block;
	& img {
		transition: filter .25s cubic-bezier(0.645, 0.045, 0.355, 1);
	}
}
#footer .footerTop .infoBox .info .social ul li a:hover img {
	filter: brightness(0) saturate(100%) invert(70%) sepia(54%) saturate(296%) hue-rotate(1deg) brightness(96%) contrast(117%);
}
#footer .footerTop .discoverBox {
	display: flex;
	flex-direction: column;
	gap: 1.5rem;
	width: 100%;
	max-width: 25%;
	padding: 4rem 4.75rem;
	border-right: 1px solid #999999;
}
#footer .footerTop .discoverBox .title {
	display: block;
	margin: 0;
	font-size: 0.9375rem;
	color: #F4C670;
	font-weight: 700;
	line-height: 1.25rem;
	text-transform: uppercase;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#footer .footerTop .discoverBox .title br {
	display: block;
}
#footer .footerTop .discoverBox .logo {
	display: flex;
	justify-content: flex-start;
	align-items: center;
	margin-bottom: 1rem;
}
#footer .footerTop .discoverBox ul.discoverMenu {
	display: flex;
	flex-direction: column;
	gap: 0.625rem;
	padding: 0;
	margin: 0;
	list-style-type: none;
}
#footer .footerTop .discoverBox ul.discoverMenu li {
	width: auto;
	display: flex;
}
#footer .footerTop .discoverBox ul.discoverMenu li a {
	position: relative;
	display: flex;
	align-items: center;
	gap: 0.5rem;
	font-size: 1.125rem;
	color: #fff;
	font-weight: 400;
	line-height: 1.5rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
	/* FASE 08 (E-31): el :hover cambia el color del enlace (el filter del icono va en
	   su propia regla, sobre el <img> hijo). */
	transition: color .25s cubic-bezier(0.645, 0.045, 0.355, 1);

	& img {
		transition: .25s cubic-bezier(0.645, 0.045, 0.355, 1);
	}
}

#footer .footerTop .discoverBox ul.discoverMenu li a:hover {
	color: #f4c670;
	text-decoration: none;
}
#footer .footerTop .discoverBox ul.discoverMenu li a:hover img {
	filter: brightness(0) saturate(100%) invert(70%) sepia(54%) saturate(296%) hue-rotate(1deg) brightness(96%) contrast(117%);
}
#footer .footerTop .menuBox {
	display: flex;
	flex-direction: column;
	gap: 1.5rem;
	width: 100%;
	max-width: 25%;
	padding: 4rem 4.75rem;
	border-right: 1px solid #999999;
}
#footer .footerTop .menuBox:last-child {
	border-right: none;
}
#footer .footerTop .menuBox .title {
	display: block;
	margin: 0;
	font-size: 0.9375rem;
	color: #F4C670;
	font-weight: 700;
	line-height: 1.25rem;
	text-transform: uppercase;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#footer .footerTop .menuBox ul.menu {
	display: flex;
	flex-direction: column;
	/* WCAG 2.5.8, por la via de la EXCEPCION DE ESPACIADO. Los enlaces de estas
	   columnas miden 18px de alto, por debajo del minimo de 24x24, asi que solo
	   pueden cumplir por espaciado: un circulo de 24px centrado en cada objetivo
	   no debe tocar el del vecino, o sea 24px entre centros como minimo. Con
	   gap:1rem estaban a 21,7px medidos y se quedaban a 2,3px.

	   NO se resuelve dando padding vertical al enlace hasta los 24px de alto, que
	   habria sido el arreglo invisible y es el que se uso en el topbar y en la
	   firma del pie: aqui el hueco real entre cajas es de solo 3,7px, asi que
	   crecer 3px por arriba y por abajo haria que las areas clicables de dos
	   enlaces contiguos SE SOLAPASEN. Pulsar un enlace y activar el de al lado es
	   peor que el problema que se venia a arreglar.

	   Sube a 1.25rem (15px reales, +3) y la separacion queda en ~24,7px. La
	   columna mas larga crece 24px de alto; es el coste aceptado por el usuario el
	   17-sep-2026 al pedir el cierre del punto aunque cambiara el diseno.

	   En rem y no en px a proposito, a diferencia de los minimos tactiles del
	   topbar: el valor declarado aqui NO es el minimo de WCAG -ese es la
	   separacion RESULTANTE- sino un espaciado de diseno, y debe seguir escalando
	   con la palanca global. Si algun dia se baja la escala por debajo del 75%,
	   hay que volver a medir esta separacion. */
	gap: 1.25rem;
	padding: 0;
	margin: 0;
	list-style-type: none;
}
#footer .footerTop .menuBox ul.menu li {
	display: block;
	font-size: 1.125rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.5rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
#footer .footerTop .menuBox ul.menu li a {
	display: inline-block;
	color: #ffffff;
	text-decoration: none;
	/* FASE 08 (E-31): el :hover solo cambia el color. */
	transition: color .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#footer .footerTop .menuBox ul.menu li a:hover {
	color: #f4c670;
	text-decoration: none;
}
#footer .footerMiddle {
	position: relative;
	display: flex;
	justify-content: center;
	gap: 2rem;
	padding: 2rem 4.75rem;
	border-bottom: 1px solid #999999;
}
#footer .footerMiddle .links {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.25rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
/* FASE 03 WCAG: el enlace de "Configurar cookies" era <a href="#"> (no navega,
   abre el panel de consentimiento) -> <button class="cookies-panel-btn">. El
   bootstrap customizado del framework pinta fondo/borde/tipografia corporativos
   a TODO <button> (regla global '.button, button, [type=button]...',
   linea 88) -> se neutraliza por clase, sin !important, mismo patron que
   #header .hamburger ([T2]), para que se vea IDENTICO al resto de enlaces. */
#footer .footerMiddle .links a,
#footer .footerMiddle .links .cookies-panel-btn {
	display: inline-block;
	margin: 0;
	padding: 0;
	background-color: transparent;
	border: none;
	border-radius: 0px;
	font-family: inherit;
	font-size: inherit;
	font-weight: inherit;
	line-height: inherit;
	letter-spacing: normal;
	text-transform: none;
	text-align: left;
	color: #ffffff;
	-webkit-appearance: none;
	appearance: none;
	cursor: pointer;
	text-decoration: none;
	/* FASE 08 (E-31): el :hover cambia fondo y color. */
	transition: background-color .25s cubic-bezier(0.645, 0.045, 0.355, 1),
	            color .25s cubic-bezier(0.645, 0.045, 0.355, 1);
}
/* El bootstrap customizado del framework pinta un :hover global a todo <button>
   (fondo corporativo + color). Se anula por clase, sin !important ([T2]). */
#footer .footerMiddle .links a:hover,
#footer .footerMiddle .links .cookies-panel-btn:hover {
	background-color: transparent;
	color: #f4c670;
	text-decoration: none;
}
#footer .footerBottom {
	position: relative;
	display: flex;
	justify-content: space-between;
	gap: 2rem;
	padding: 2rem 4.75rem;
}
#footer .footerBottom .leftText {
	flex: 1;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 2rem;
	text-align: left;
}
#footer .footerBottom .rightText {
	flex: 1;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 2rem;
	text-align: right;
}
#footer .footerBottom .text {
	font-size: 0.9375rem;
	color: #ffffff;
	font-weight: 400;
	line-height: 1.25rem;
	text-box-trim: trim-both;
	text-box-edge: cap alphabetic;
}
/* Firma de Neobookings: el logo y el icono de "pestana nueva" centrados con el
   texto que los precede. inline-flex (no flex) para que el enlace siga fluyendo
   dentro del <span class="text">, que es texto corrido.

   OJO con la diferencia entre los dos alineados, que es la que causo un bug:
   - align-items:center  -> centra el logo y el icono ENTRE SI, dentro del enlace.
   - vertical-align      -> alinea el enlace COMPLETO respecto al texto de al lado.

   Sin el vertical-align, el enlace usaba el 'baseline' por defecto: al ser una
   caja inline se apoyaba en la linea base del texto, asi que el logo (16,1px de
   alto) quedaba 2,8px MAS ALTO que el centro de la caja visual del texto
   (10,45px, la que define text-box-trim:trim-both + text-box-edge:cap alphabetic
   en .footerBottom .text). Medido en vivo a 1440 y a 500px.

   NINGUN keyword de vertical-align acierta, porque el logo (16,1px) es mas alto
   que la caja visual del texto (10,45px): medidos 'middle' 1,45px,
   'text-bottom' 1,2px, 'text-top' -1,74px, 'bottom' 2,47px. Se usa un desplazamiento
   calculado, y el calc() deja la formula a la vista para que no sea un magic number:

     con vertical-align:baseline el logo apoya su base en la linea base, asi que su
     centro queda a 16,1/2 = 8,05px sobre ella; el centro de la caja visual del texto
     esta a 10,45/2 = 5,225px. Sobra 2,825px -> hay que BAJAR el enlace eso mismo.
     Un <length> negativo en vertical-align baja el elemento:
       calc((10,45px - 16,1px) / 2) = -2,825px
     El modelo predijo la medicion real (-2,80px), de ahi la confianza en la formula.

   Los dos primeros numeros del calc son constantes conocidas, no ajustes a ojo:
   10,45px es la caja del texto (font-size 15px + text-box-trim:trim-both/cap
   alphabetic) y 21,6px el alto del logo (lo fija el ancho de 125px declarado abajo
   -el <img> lleva el mismo valor como reserva de hueco- y la
   proporcion del SVG). Si se cambia el logo o el tamano del texto, se recalcula con
   esta misma formula.

   EL "- 0.5px" ES DISTINTO: no es geometria, es una CORRECCION OPTICA pedida por el
   usuario (6-ago-2026) tras verlo renderizado. Va sumado aparte y no fundido en la
   formula justamente para que se distingan las dos cosas.
   Por que hace falta: el centro geometrico que calcula la formula usa la caja de
   MAYUSCULAS-a-linea-base (la que declara text-box-trim). Pero la masa visual de un
   texto en minusculas se apoya mas abajo -en la banda de la altura-x-, y el ojo pesa
   eso, asi que un centrado geometricamente exacto se percibe ligeramente alto. La
   medicion decia 0,01px de desviacion y era correcta: lo que cambia es la REFERENCIA,
   no la exactitud. Si alguien vuelve a medir contra la caja de mayusculas le saldra
   ~0,5px de desviacion; es intencional, no la "corrijas" de vuelta.

   NO convertir .footerBottom .text en flex para centrarlo "exacto": se probo y
   da 0,5px, pero cuando el texto envuelve en varias lineas el logo se va al
   centro vertical del parrafo entero en vez de fluir tras la ultima linea
   (medido: -19,5px respecto a esa linea). Rompe el texto corrido. */
#footer .footerBottom .neoSignature {
	display: inline-flex;
	align-items: center;
	/* 1.3503rem = 21,6px, el alto del logo a 125px de ancho (125 x 14/81). Este
	   termino SE RECALCULA cada vez que cambia el ancho del logo: es el que centra
	   la firma con la linea de texto. Antes valia 1.00625rem (16,1px) para los 93px
	   de la maqueta. La formula y el porque del -0.03125rem estan justo arriba. */
	vertical-align: calc((0.653125rem - 1.3503rem) / 2 - 0.03125rem);
	gap: 0.375rem;
	/* Ancla del ::after de abajo. No afecta al flujo ni al vertical-align. */
	position: relative;
}
/* WCAG 2.5.8 (Tamano del objetivo, minimo 24x24 CSS px).

   El enlace mide 108x16px: el ancho sobra y el alto sigue por debajo del minimo,
   porque lo fija la proporcion del logo (125x21,6 en la maqueta, 16,2px de alto ya
   con la escala del 75% aplicada). Antes del reescalado del 17-sep eran 83x12px; el
   logo mas grande acorta la distancia al minimo pero NO la cierra, asi que este
   ::after sigue haciendo falta.

   Hay un argumento para no tocarlo -la excepcion "inline" de 2.5.8 exime a los
   enlaces embebidos en una frase, y este lo esta: va dentro del texto "Diseno Web y
   Motor de reservas"-, pero se corrige igual: la excepcion es discutible cuando el
   enlace es una imagen y no palabras, las herramientas automaticas lo reportan como
   fallo, y el arreglo no cuesta nada.

   Se amplia el AREA ACTIVA, no el logo. Agrandar el dibujo a 24px de alto lo llevaria
   a 138px de ancho y convertiria la firma en el elemento dominante del footerBottom,
   ademas de invalidar el calc del vertical-align de arriba, que tiene el alto del
   logo como termino. El ::after es absolute, asi que no entra en el box model y ese
   calc sigue valiendo tal cual.

   24px en px, no en rem: minimo funcional de WCAG, no medida de diseno (ver el
   contrato de unidades al principio de este archivo). Crece solo en vertical y en su
   fila no hay ningun otro elemento interactivo, ni en escritorio ni en la version en
   columna de <=767px, asi que no puede solapar con nada. */
#footer .footerBottom .neoSignature::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	top: 50%;
	transform: translateY(-50%);
	height: 24px;
}
/* EL ANCHO DEL LOGO SE DECLARA AQUI Y EN REM, no con el atributo width="93" de
   la maqueta -que se queda, como reserva de hueco para el CLS y para dar la
   proporcion-.

   El motivo es que el ALTO de este logo es un termino del vertical-align de
   arriba, y ese calc esta en rem. Con el tamano atado a un atributo HTML, que es
   absoluto, el calc no puede seguirlo: al reducir la escala al 75% el texto bajo
   a 11,25px y el offset a -2,49px -que es el valor correcto para un logo de
   12,07px-, pero el logo se quedo en sus 93x16,06px y la firma quedaba
   descentrada (medido: el centro del logo 1,55px por encima del centro de la
   linea de texto). Con los tres terminos en rem la formula vuelve a cuadrar sola
   en cualquier escala futura.

   7.8125rem = 125/16. height:auto para que el alto salga de la proporcion del SVG
   (81x14) y no haya que declararlo por separado.

   POR QUE 125 Y NO LOS 93 DE LA MAQUETA (peticion del usuario, 17-sep-2026, por
   criterio estetico y no de accesibilidad): a 93 el logotipo tiene MENOS altura-x
   que la frase que lo introduce ("Diseno Web y Motor de reservas"), asi que se leia
   como una nota al pie descolgada en vez de como parte de la linea. A 125 las dos
   alturas-x coinciden, que es el criterio tipografico cuando un logotipo va embebido
   en texto corrido. Se descarto 140, que tambien se probo: ahi el logo pesa mas que
   la frase y la firma del proveedor acaba dominando el pie del cliente. */
#footer .footerBottom .neoSignature picture img {
	width: 7.8125rem;
	height: auto;
}
/* Icono decorativo de enlace externo. Tamano intrinseco del SVG (12x12): se
   declaran width/height para reservar el hueco y no provocar CLS */
#footer .footerBottom .neoSignature .externalIcon {
	flex: 0 0 auto;
	width: 0.75rem;
	height: 0.75rem;
}
#footer .bookBtnBox {
	display: none;
	justify-content: center;
	gap: 0.25rem;
	padding: 0.25rem;
	width: 100%;
	text-align: center;
	position: fixed;
	bottom: 0;
	left: 0;
	z-index: 4;
	background-color: rgb(77 77 77 / 60%);
    -webkit-backdrop-filter: blur(3px);
    backdrop-filter: blur(3px);
	transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);
}
/* Con el menu hamburguesa abierto esta barra se retira.
   Es z-index 4 igual que el menu pero el #footer va DESPUES en el DOM, asi que
   pintaba POR ENCIMA del panel: en <=767px se veia el boton RESERVAR sobre el menu
   -por eso .menuRight reserva 84px de padding inferior ahi- y no hacia nada, porque
   #footer queda inert mientras el menu esta abierto. Un control visible y muerto.

   Se necesita una marca a nivel de documento porque desde aqui no hay selector que
   alcance al footer: #header.navOpen esta anidado dentro de <header> y #footer es
   hermano de <header>, no de #header. Y no vale html.no-scroll, que lo comparten el
   menu y la mascara movil. La clase la pone site.js, igual que no-scroll.

   visibility ademas de opacity: @keyframes fadeOut es opacidad pura y por eso
   .topbar y .logo se quedaban clicables estando invisibles. El transition:all de
   arriba ya funde las dos propiedades. */
html.hamburger-open #footer .bookBtnBox {
	opacity: 0;
	visibility: hidden;
}

#footer .bookBtnBox .bookBtn {
	border: 0;
	background-color: #F4C670;
	color: #1A1A1A;
}
#footer .bookBtnBox .bookBtn:hover {
	background-color: #1A1A1A;
	color: #ffffff;
}
/* FASE 03 WCAG: .bookNowBtn era <a class="button" href="javascript:void(0);">
   (no navega, abre #searchForm en movil) -> <button>. Ya matcheaba la regla
   global '.button, button, [type=button]...' (linea 88) por su clase 'button',
   asi que el aspecto no cambia ni un pixel; lo unico que un <a> tenia y un
   <button> no trae de fabrica es el cursor de mano, que esa regla global
   tampoco fija ([T2]). */
#footer .bookBtnBox .bookNowBtn {
	cursor: pointer;
}

/*----------------- GLightbox Design -----------------*/
/* Los controles del lightbox (galeria de /galeria) se ESTANDARIZAN con el otro
   pop-up del proyecto, el <dialog> de "mas informacion" de las landings
   (.moreInfoDialog, modules/more-info-dialog.css): mismo velo, misma geometria
   de boton (circulo de 40px, sin borde, transparente en reposo y dorado
   #F4C670 al hover) y misma curva de transicion. Antes eran cuadrados de
   border-radius 4px con borde blanco sobre un velo dorado: un lenguaje visual
   propio que no se repetia en ningun otro pop-up del sitio.

   DESVIACION DELIBERADA respecto a la referencia — el COLOR DEL ICONO: en
   .moreInfoDialogClose el icono es negro (filter: brightness(0)) porque ese
   boton vive sobre el panel BLANCO del dialogo. Aqui los tres controles flotan
   sobre el velo OSCURO, asi que un icono negro seria invisible. Se invierte:
   BLANCO en reposo, y #1A1A1A solo en hover, cuando el fondo del boton ya es
   dorado. Es decir, se estandarizan geometria e interaccion, NO el color del
   icono, que depende del fondo sobre el que se pinta.

   La POSICION de cada control la sigue gobernando glightbox.css por breakpoint
   (flechas a los lados desde 769px, abajo por debajo); aqui solo se redefine la
   apariencia, que es identica en las tres resoluciones del proyecto. */
#glightbox-body .goverlay {
	/* Mismo velo que .moreInfoDialog::backdrop. Sustituye al dorado
	   rgba(244,198,112,.8) de la maqueta del 31-jul: aparte de no coincidir con
	   el pop-up de referencia, un velo claro dejaba que el header, el logo y la
	   mascara de reservas siguieran compitiendo con la foto ampliada. */
	background: rgba(26, 26, 26, 0.7);
}
#glightbox-body .gslide-media {
	-webkit-box-shadow: none;
	box-shadow: none;
}
/* max-width en 100% y NO en 100vw (era el valor que trae glightbox.css:156, se
   copio tal cual al escribir este override). El <html> lleva
   'scrollbar-gutter: stable' (linea 14 de este archivo), asi que el area de
   contenido es 15px MAS ESTRECHA que el viewport: con 100vw la imagen se hacia
   1440px dentro de un contenedor de 1425 y sobresalia 15px, lo que en un
   navegador con barra de scroll clasica genera SCROLL HORIZONTAL al abrir el
   lightbox (se nota mas al abrir una foto apaisada, que es la que llega al
   tope de ancho). Con 100% mide exactamente el contenedor: mismo tamano util,
   cero desborde.

   OJO: no confundir con los 100vw de .hamburgerOverlay y nav.hamburgerNav mas
   arriba, que SI son correctos: esos son position:fixed, y un fixed a 100vw
   cubre el gutter sin generar scroll. Esta imagen va en flujo normal, asi que
   ahi 100vw si desborda. */
#glightbox-body .gslide-image img {
	max-width: 100%;
	max-height: 80dvh;
}

/* Geometria e interaccion comunes a cerrar / anterior / siguiente: el circulo
   de 40px de .moreInfoDialogClose. glightbox.css les da 40x50 (flechas),
   35x35 (cerrar) y border-radius 4px, de ahi que haya que redefinir las tres
   medidas y no solo el radio. */
#glightbox-body .gclose,
#glightbox-body .gprev,
#glightbox-body .gnext {
	width: 40px;
	height: 40px;
	padding: 0;
	border: none;
	border-radius: 50%;
	background-color: transparent;
	transition: background-color .3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#glightbox-body .gclose:hover,
#glightbox-body .gprev:hover,
#glightbox-body .gnext:hover {
	background-color: #F4C670;
}
/* glightbox.css atenua el cerrar a opacity .7 a partir de 992px y el pop-up de
   referencia no atenua el suyo. La opacidad de las flechas NO se toca para no
   pisar su estado .disabled (opacity .1) de la libreria. */
#glightbox-body .gclose {
	opacity: 1;
}
/* 20x20 como el icono de .moreInfoDialogClose. Las flechas tienen viewBox
   18x16, asi que dentro de la caja cuadrada se escalan sin deformarse
   (preserveAspectRatio por defecto). */
#glightbox-body .gclose svg,
#glightbox-body .gprev svg,
#glightbox-body .gnext svg {
	width: 20px;
	height: 20px;
}
/* Los <path> traen fill="#88898D" como atributo de presentacion en el SVG que
   inyecta glightbox-controls.js; el CSS gana siempre a ese atributo, asi que
   el color se controla desde aqui sin tocar el JS. */
#glightbox-body .gclose path,
#glightbox-body .gprev path,
#glightbox-body .gnext path {
	fill: #ffffff;
	transition: fill .3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#glightbox-body .gclose:hover path,
#glightbox-body .gprev:hover path,
#glightbox-body .gnext:hover path {
	fill: #1A1A1A;
}

/* El cambio de color no implica movimiento, pero se respeta la preferencia del
   sistema igual que hace el masonry de la misma pagina (gallery-masonry.css). */
@media (prefers-reduced-motion: reduce) {
	#glightbox-body .gclose,
	#glightbox-body .gprev,
	#glightbox-body .gnext,
	#glightbox-body .gclose path,
	#glightbox-body .gprev path,
	#glightbox-body .gnext path {
		transition: none;
	}
}

/*----------------- Inner Pages -----------------*/
