/* ==========================================================================
   Base — «editorial de piedra».

   La idea rectora: esto no es un portal inmobiliario, es el sitio de alguien
   que alquila dos casas. Así que manda la fotografía y la tipografía, y todo
   lo demás se aparta. Nada de tarjetas con sombra flotando sobre degradados:
   papel, tinta y foto sangrada al borde.

   DOS AMBIENTES. Las dos líneas de negocio comparten tipos, retícula y
   componentes —es la misma persona la que alquila— y se separan solo por
   color y temperatura:

     · A Coruña     → atlántico, urbano, luz fría. Azul marea.
     · A Fonsagrada → montaña, lento, luz cálida. Musgo y tierra.

   Se cambia con [data-ambiente] en el <body>, y todo lo demás obedece sin
   saber en qué página está. Ver «Ambientes» más abajo.
   ========================================================================== */

:root {
  /* ---- La escala de grises ----------------------------------------------
     HORMIGÓN. Las dos casas de Sandra son de hormigón y de piedra: el bloque
     de Corrales en A Coruña y la casa de mampostería de A Fonsagrada. Así que
     el sitio no se pinta de blanco, se pinta de gris, y lo ÚNICO que trae
     color son las fotografías.

     No es solo estética: sobre blanco, una foto de interior con paredes
     blancas se funde con la página y no se ve dónde acaba una y empieza la
     otra. Sobre gris, la foto se recorta sola y se lee como una foto. Por eso
     las tarjetas y los campos van en un gris MÁS CLARO que la página: así se
     levantan sin necesidad de sombra.

     Los grises van numerados de claro a oscuro; el que hay que mirar dos
     veces es --g7, que es el más claro que todavía cumple contraste de texto
     (6,2:1 sobre --g2). Por debajo de ese, solo filetes y adornos. */
  --g0:  #FCFCFB;   /* lo que tiene que levantarse del todo */
  --g1:  #F4F4F2;   /* tarjetas, campos de formulario */
  --g2:  #EBEBE8;   /* el fondo de la página */
  --g3:  #DFDFDB;   /* bandas de sección */
  --g4:  #CBCBC6;
  --g5:  #A6A6A1;
  --g6:  #7B7B76;
  --g7:  #56564F;   /* el gris más claro que vale para TEXTO */
  --g8:  #3A3A36;
  --g9:  #242422;   /* superficies oscuras */
  --g10: #171716;   /* la tinta */

  --paper: var(--g1);
  --ink: var(--g10);
  --muted: var(--g7);
  --line: rgba(23, 23, 22, 0.14);
  --line-fuerte: rgba(23, 23, 22, 0.30);

  /* Superficie oscura para el pie y los bloques a contraluz. */
  --dark: var(--g9);
  --on-dark: var(--g1);
  --on-dark-muted: rgba(244, 244, 242, 0.68);

  /* ---- Ambiente por defecto (la home, que no es de ninguna de las dos) ---
     La home es el punto de partida y no toma partido: gris neutro. */
  --page: var(--g2);
  --banda: var(--g3);       /* el gris de las secciones que se hunden */
  --acento: #4A5D52;        /* verde piedra, para adornos y filetes */
  --acento-texto: #38473E;  /* la variante que SÍ cumple contraste en texto */
  --acento-suave: #DCE2DB;  /* fondos de realce, nunca texto encima sin comprobar */

  /* ---- Tipografía -------------------------------------------------------
     Instrument Serif para titular: serif de contraste altísimo —el trazo fino
     es MUY fino— que da aire de revista. Dos avisos que van aquí porque es
     donde se miran:

       · SOLO TIENE UN PESO (400) y su cursiva. No se le pide `font-weight`
         alto en ningún sitio: el navegador lo falsifica engordando el trazo y
         en una serif de contraste alto eso se ve fatal.
       · NO ES VARIABLE. No tiene los ejes opsz/SOFT/WONK de la Fraunces que
         había antes; cualquier font-variation-settings que quede es letra
         muerta.

     Inter para texto y cifras: neutra, hecha para pantalla, con las cifras
     impecables —esta página va llena de precios, metros y medidas— y los
     acentos y la eñe bien resueltos, que en español no es negociable. */
  --display: 'Instrument Serif', Georgia, 'Times New Roman', serif;
  --texto: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;

  /* Escala. El titular de la home usa cqw (del contenedor) y no vw (de la
     pantalla): el contenedor es la propia sección del hero, así que el tamaño
     se mide contra el hueco real del titular y no contra la ventana.
     Las medidas suben un punto respecto a la Fraunces anterior: Instrument
     Serif pinta más pequeña y más fina al mismo cuerpo, y a tamaño titular
     necesita sitio para que el contraste de trazo se vea. */
  --fs-word: clamp(3.1rem, 9cqw, 8rem);
  --fs-h1: clamp(2.5rem, 1.2rem + 5vw, 5rem);
  --fs-h2: clamp(1.95rem, 1.1rem + 3.1vw, 3.5rem);
  --fs-h3: clamp(1.25rem, 1.05rem + 0.7vw, 1.6rem);
  --fs-lead: clamp(1.09rem, 1.02rem + 0.42vw, 1.32rem);
  --fs-body: 1.0625rem;
  --fs-pequeno: 0.9375rem;
  --fs-etiqueta: 0.78rem;

  /* Espaciado. Una sola serie para todo el sitio: si un hueco no está aquí,
     es que no debería existir. */
  --s1: 4px;  --s2: 8px;  --s3: 12px;  --s4: 16px;
  --s5: 24px; --s6: 32px; --s7: 48px;  --s8: 64px;
  --s9: 96px; --s10: 128px; --s11: 176px;

  --margen: clamp(20px, 5vw, 88px);
  --ancho-max: 1440px;
  --ancho-texto: 62ch;   /* por encima de esto, el ojo pierde el renglón */

  /* Curvas. Una para entrar, otra para salir; la regla es que lo que ENTRA
     frena (ease-out) y lo que SALE acelera (ease-in). Ponerlas al revés es
     lo que hace que una animación se sienta pegajosa. */
  --entra: cubic-bezier(0.16, 0.84, 0.34, 1);
  --sale: cubic-bezier(0.5, 0, 0.9, 0.35);
  --t-micro: 180ms;
  --t-base: 420ms;
  --t-largo: 760ms;

  /* Radio casi nulo a propósito: el redondeo generoso es la firma del carné
     rural genérico. Aquí el borde es recto, como el de una foto impresa. */
  --radio: 2px;
  --radio-foto: 0;
}

/* ==========================================================================
   Ambientes
   ========================================================================== */

/* Con la base en gris, los ambientes ya no son «un color cada uno»: son la
   MISMA escala de grises inclinada a frío o a cálido, más un acento. Es una
   diferencia que se nota sin gritar, que es lo que se pedía. */

/* A Coruña — Atlántico. Gris marea, hormigón mojado, luz fría. Es la línea
   práctica (un estudiante busca precio, zona y cuándo puede entrar), así que
   el color acompaña sin entretener. */
[data-ambiente='coruna'] {
  --page: #E8EBEA;
  --paper: #F3F5F4;
  --banda: #DDE1E0;
  --acento: #2C5F6E;
  --acento-texto: #245361;  /* 7.0:1 sobre --page: vale para texto normal */
  --acento-suave: #DCE7EA;
  --dark: #1E2629;
}

/* A Fonsagrada — montaña. Gris cálido de granito y madera de castaño. Es la
   línea de deseo (aquí se viene a estar a gusto), y el acento sí tiene
   permiso para hacerse notar. */
[data-ambiente='fonsagrada'] {
  --page: #EDEAE4;
  --paper: #F6F4EF;
  --banda: #E3DFD7;
  --acento: #6B7F5E;
  --acento-texto: #47573C;  /* 6.5:1 sobre --page */
  --acento-suave: #E4E7D8;
  --dark: #26291F;
}

/* ==========================================================================
   Reset
   ========================================================================== */

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

* { margin: 0; }

html {
  -webkit-text-size-adjust: 100%;
  /* Sin scroll-behavior:smooth global: pelea con el desplazamiento por
     teclado y marea a quien navega con Inicio/Fin. Se aplica solo donde toca. */
}

body {
  background: var(--page);
  color: var(--ink);
  font-family: var(--texto);
  font-size: var(--fs-body);
  line-height: 1.6;
  /* Inter viene dibujada con bastante aire entre letras para que aguante a
     cuerpo diminuto; a cuerpo de lectura se la cierra un poco, que es lo que
     recomienda su propia documentación. */
  letter-spacing: -0.011em;
  /* Cifras de ancho fijo. Esta página va llena de precios, metros y medidas
     puestos en columna: con cifras proporcionales, el «1» es más estrecho que
     el «8» y los números bailan de una fila a otra. */
  font-variant-numeric: tabular-nums;
  /* Evita el salto lateral cuando una página tiene scroll y otra no. */
  scrollbar-gutter: stable;
  transition: background-color var(--t-largo) var(--entra);
}

/**
 * El atributo `hidden` esconde porque la hoja del NAVEGADOR le pone
 * `display:none`… y cualquier `display` escrito en NUESTRA hoja le gana, porque
 * los estilos de autor mandan sobre los del agente de usuario.
 *
 * O sea: un `.componente { display: flex }` deja visible un
 * `<div class="componente" hidden>`. Ya pasó aquí con la barra de selección del
 * calendario, que salía desde el principio con dos guiones y un botón de
 * «Borrar» sin nada que borrar. Es el mismo fallo que tuvo el <dialog> de
 * Cabbage.
 *
 * Se pone `!important` a propósito: es la única forma de que la regla valga sin
 * tener que acordarse de escribir `.loquesea[hidden]{display:none}` en cada
 * componente nuevo. Y `hidden` significa exactamente eso —esto no está—, así
 * que no hay caso legítimo en el que quisiéramos que perdiera.
 */
[hidden] { display: none !important; }

img, picture, svg, video {
  display: block;
  max-width: 100%;
  height: auto;
}

input, button, textarea, select {
  font: inherit;
  color: inherit;
}

/* Un botón sin estilos de fábrica: cada uno declara el suyo y no arrastra
   el gris del sistema. */
button { background: none; border: none; padding: 0; cursor: pointer; }

a { color: inherit; }

/* ==========================================================================
   Tipografía base
   ========================================================================== */

h1, h2, h3 {
  font-family: var(--display);
  /* 400 Y NO MÁS. Instrument Serif solo tiene este peso: pedirle 600 hace que
     el navegador se invente la negrita engordando el contorno, y en una serif
     de contraste alto eso emborrona justo lo que la hace bonita —los trazos
     finos dejan de ser finos—. Si algún día hace falta un titular con más
     peso, se cambia de familia, no de número. */
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.012em;
  text-wrap: balance;  /* que no quede una palabra sola en la última línea */
}

h1 { font-size: var(--fs-h1); }
h2 { font-size: var(--fs-h2); }

h3 {
  font-size: var(--fs-h3);
  line-height: 1.22;
  letter-spacing: -0.004em;  /* a cuerpo pequeño, el fino ya no necesita ayuda */
}

p { text-wrap: pretty; }  /* evita la línea huérfana al final del párrafo */

.lead {
  font-size: var(--fs-lead);
  line-height: 1.5;
  max-width: 46ch;
}

.apagado { color: var(--muted); }

/* La etiqueta de sección: versalita ancha. Es el único sitio donde se usa
   mayúscula sostenida, y por eso el tracking va abierto —una mayúscula
   sostenida con tracking normal se lee peor, no mejor—. */
.etiqueta {
  font-size: var(--fs-etiqueta);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--acento-texto);
}

/* ==========================================================================
   Utilidades de disposición
   ========================================================================== */

.envoltura {
  max-width: var(--ancho-max);
  margin-inline: auto;
  padding-inline: var(--margen);
}

.medida { max-width: var(--ancho-texto); }

/* --------------------------------------------------------------------------
   Utilidades de hueco y rejilla.

   OJO, ESTO NO ES PREFERENCIA DE ESTILO: la CSP del sitio es `style-src 'self'`
   sin 'unsafe-inline', y esa directiva NO solo bloquea las etiquetas <style>,
   también bloquea los atributos `style=""` del marcado. Un `style="display:grid"`
   escrito en el HTML llega al navegador, se ve en el inspector… y no se aplica:
   el elemento se queda en `display:block` y la maquetación se cae en silencio.

   Es un fallo especialmente traicionero porque el HTML parece correcto y no sale
   ningún error a la vista. Por eso todo hueco vive aquí, en una clase.
   (Se descartó añadir 'unsafe-inline': abrir la CSP entera para ahorrarse unas
   clases es cambiar una defensa real por comodidad.)
   -------------------------------------------------------------------------- */

.sep-4 { margin-top: var(--s4); }
.sep-5 { margin-top: var(--s5); }
.sep-6 { margin-top: var(--s6); }
.sep-7 { margin-top: var(--s7); }
.hueco-5 { margin-bottom: var(--s5); }
.hueco-7 { margin-bottom: var(--s7); }
.hueco-9 { margin-bottom: var(--s9); }

/* El 404 no tiene contenido que llene la pantalla, y sin un alto mínimo el pie
   se le sube hasta media página y parece que falta algo más que la página. */
.alto-medio { min-height: 56vh; }

.bloque { padding-block: clamp(var(--s7), 6vw, var(--s9)); }

/**
 * Banda tonal: la sección se hunde un gris respecto a la página.
 *
 * Es lo que le da ritmo al scroll sin meter ni un filete ni una sombra. Se
 * reserva para las secciones que contienen ALGO —fotos, un formulario, el
 * calendario—: sobre el gris más oscuro, la foto se recorta sola y los campos
 * del formulario (que van en --paper, más claro) se levantan. Las secciones
 * que solo llevan texto se quedan en el color de la página; si se bandea todo,
 * no se hunde nada.
 *
 * Solo pone el fondo, a propósito: el relleno lo pone .bloque o el que traiga
 * la propia sección (.cierre). Así se combinan sin pelearse por el padding.
 *
 * OJO al marcado: la banda tiene que ir a TODO EL ANCHO, así que la clase va
 * en el <section> y la .envoltura pasa a un <div> dentro. Puestas en el mismo
 * elemento, el fondo se cortaría en 1440px y quedaría un panel flotando.
 */
.banda { background: var(--banda); }

/* La pila vertical con hueco constante: los formularios y las columnas de
   texto. Es lo que más se repite en todo el sitio. */
.pila { display: grid; gap: var(--s5); }
.pila--corta { gap: var(--s4); }

/* Dos columnas que se apilan solas cuando no caben. */
.duo {
  display: grid;
  /* min(100%, 300px): sin el min(), en un móvil de 320 px la columna exige
     300 de mínimo y la rejilla desborda por la derecha. */
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: clamp(var(--s6), 4vw, var(--s8));
  align-items: start;
}

/* Dos columnas de verdad, que NO se reparten: entrada y salida de fecha. */
.par { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s4); }

.lista-datos {
  display: grid;
  gap: var(--s3);
  padding-left: var(--s5);
}

.nota { font-size: var(--fs-pequeno); }
.nota-mini { font-size: var(--fs-etiqueta); }

.boton--menudo { padding: var(--s2) var(--s4); }

/* Visible solo para el lector de pantalla. La usan los saltos de navegación
   y las etiquetas de los campos que no llevan rótulo a la vista. */
.solo-lector {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* El salto al contenido: invisible hasta que alguien lo enfoca con el
   tabulador. Es lo primero que agradece quien navega sin ratón. */
.saltar {
  position: absolute;
  top: var(--s3);
  left: var(--s3);
  z-index: 100;
  padding: var(--s3) var(--s5);
  background: var(--ink);
  color: var(--paper);
  text-decoration: none;
  transform: translateY(-200%);
}
.saltar:focus { transform: translateY(0); }

/* ==========================================================================
   Foco
   ========================================================================== */

/* Un solo anillo para todo el sitio, y con `:focus-visible` para que no salte
   al hacer clic con el ratón. El desfase lo separa del borde del elemento:
   pegado al canto se confunde con el propio borde del campo. */
:focus-visible {
  outline: 2px solid var(--acento-texto);
  outline-offset: 3px;
  border-radius: var(--radio);
}

/* ==========================================================================
   Movimiento

   Todo lo que se mueve entra por aquí. La regla: si alguien ha pedido menos
   movimiento en su sistema, se le da el estado FINAL de la animación, no la
   animación acelerada — que sigue mareando igual, solo que más rápido.
   ========================================================================== */

/* El estado de partida de lo que aparece al hacer scroll. Lo pone el JS
   (html.js) para que sin JavaScript no quede nada invisible: sin esta
   condición, un fallo de guion deja la página en blanco. */
html.js [data-revelar] {
  opacity: 0;
  transform: translateY(22px);
}

/* Misma especificidad de partida que la regla que lo esconde (html.js
   [data-revelar]) MÁS la propia clase — si no, «html.js [data-revelar]» sigue
   ganando por especificidad aunque .visible llegue después en el CSS y en el
   DOM, y el bloque se queda en opacity:0 para siempre por mucho que el JS le
   ponga la clase. Así se quedaron invisibles las fichas de habitación y los
   bloques de «La zona»/«Condiciones» en cuanto arrancaba el JavaScript. */
html.js [data-revelar].visible {
  opacity: 1;
  transform: none;
  transition:
    opacity var(--t-largo) var(--entra),
    transform var(--t-largo) var(--entra);
}

@media (prefers-reduced-motion: reduce) {
  html.js [data-revelar] { opacity: 1; transform: none; }

  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
