/*
 * Infinity Private · sistema visual compartido
 *
 * Los tokens son los MISMOS que los de la web pública y los del formulario de
 * alta. La zona privada tiene que sentirse como una extensión del club, no como
 * un panel de administración con la marca pegada encima.
 *
 * Este fichero solo trae tokens, reset y las piezas que se repiten (botones,
 * campos, avisos). Cada pantalla añade lo suyo. `hazte-socio.css` se deja como
 * está: funciona y no hay motivo para tocarlo.
 */

/* ============================================================== FUENTES === */
/*
 * Aquí estaba el fallo de fondo del área privada: los tokens de abajo pedían
 * "Playfair Display" y "Outfit" desde el primer día, pero NADIE las cargaba —
 * no había ni un @font-face ni un <link>. El navegador se encogía de hombros y
 * caía en Times y Segoe UI, así que la zona de socios llevaba meses viéndose
 * con las fuentes del sistema mientras el CSS decía lo contrario.
 *
 * Los ficheros son copia de los de la web pública y viven en /socios/marca/,
 * no en /assets/. Es a propósito: así el área privada se ve IGUAL en local que
 * en producción. Apuntando a /assets/ (que sirve nginx desde la web estática)
 * funcionaría en el dominio, pero en local darían 404 y todas las capturas y
 * verificaciones mentirían sobre cómo se ve de verdad.
 *
 * Los unicode-range son los mismos que los de la web: el fichero "latin-ext"
 * solo se descarga si aparece un carácter que lo necesite. Un alias polaco o
 * checo no se queda con un glifo de otra fuente a mitad de palabra.
 */
@font-face{font-family:'Outfit';font-style:normal;font-weight:300 700;font-display:swap;src:url('/socios/marca/fonts/outfit-normal-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Outfit';font-style:normal;font-weight:300 700;font-display:swap;src:url('/socios/marca/fonts/outfit-normal-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:400 700;font-display:swap;src:url('/socios/marca/fonts/playfairdisplay-normal-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:400 700;font-display:swap;src:url('/socios/marca/fonts/playfairdisplay-normal-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:400 700;font-display:swap;src:url('/socios/marca/fonts/playfairdisplay-italic-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:400 700;font-display:swap;src:url('/socios/marca/fonts/playfairdisplay-italic-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}

:root {
  --noir: #050406;
  --noir-2: #0b0709;
  --noir-3: #120b0e;
  --wine-deep: #2a0710;
  --wine: #5c1020;
  --wine-bright: #8e1730;
  --ember: #c4324a;
  --gold: #c8a24c;
  --gold-bright: #e9cd86;
  --gold-pale: #f4e6c0;
  --gold-deep: #9c7a35;
  --white: #fff;
  --cream: #f5efe6;
  --muted: #b9aea2;
  --faint: #8d8376;
  --glass: rgba(245, 239, 230, .035);
  --glass-2: rgba(245, 239, 230, .06);
  --line: rgba(233, 205, 134, .16);
  --line-hi: rgba(233, 205, 134, .42);
  /* Los degradados de la web pública, palabra por palabra. El del oro no es un
     dorado plano: va de oro viejo a champán y vuelve, y ese giro en el centro
     es lo que hace que parezca metal y no un color amarillo. */
  --grad-gold: linear-gradient(105deg, #9c7a35 0%, #e9cd86 44%, #f4e6c0 52%, #c8a24c 100%);
  --grad-wine: linear-gradient(135deg, #2a0710 0%, #5c1020 60%, #8e1730 100%);
  --glow-gold: 0 0 44px rgba(233, 205, 134, .20);
  --glow-wine: 0 0 60px rgba(142, 23, 48, .45);
  /* Los stacks completos de la web pública, no una versión corta: si el woff2
     no llega, la reserva tiene que ser la misma en los dos sitios. */
  --font-display: "Playfair Display", "Bodoni Moda", Didot, "Times New Roman", serif;
  --font-body: "Outfit", "Manrope", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --ease: cubic-bezier(.22, 1, .36, 1);

  /* La tinta sobre oro. Es el marrón de la web pública (`.btn--gold` usa este
     mismo valor). Estaba escrito a mano, y además con OTRO tono, en seis
     sitios distintos: insignias, chips, botones y el envío del chat. */
  --tinta-oro: #1a0c05;

  /* Sin esto los controles del sistema —el desplegable de salas, las casillas
     del panel, el autorrelleno de Chrome— se dibujan en CLARO sobre el negro
     del club. Es una línea y arregla lo único de la interfaz que el CSS no
     puede repintar. */
  color-scheme: dark;

  --radius-s: 6px;
  --radius-m: 10px;
  --radius-l: 16px;
  --shadow-card: 0 20px 60px rgba(0, 0, 0, .45);
  --dur-1: 180ms;
  --dur-2: 320ms;

  /* alto real de la ventana en móvil: la barra del navegador miente con 100vh */
  --vh: 100dvh;
}

*, *::before, *::after { box-sizing: border-box; }
html, body { height: 100%; }

body {
  margin: 0;
  /* El mismo fondo que la web pública: no un gris azulado, sino un vino muy
     apagado que sube desde el centro. Es lo que hace que el negro parezca
     terciopelo y no un panel de administración. */
  background: radial-gradient(120% 90% at 50% 38%, #1a0610 0%, #0a0507 55%, var(--noir) 100%);
  background-attachment: fixed;
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 16px;
  font-weight: 300;
  line-height: 1.6;
  letter-spacing: .005em;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overscroll-behavior-y: none;
}

/* Grano de película, calcado de la web pública.
   `z-index: -1` lo deja por encima del degradado del fondo y por debajo de
   todo el contenido; `pointer-events: none` es obligatorio o se comería los
   clics de la pantalla entera. Sin esta capa el negro se ve plano y digital. */
body::after {
  content: "";
  position: fixed; inset: 0; z-index: -1;
  pointer-events: none; opacity: .5; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.55'/%3E%3C/svg%3E");
}

h1, h2, h3, legend {
  font-family: var(--font-display); color: var(--gold-pale);
  font-weight: 500; line-height: 1.12; letter-spacing: -.01em;
}
a { color: var(--gold-bright); }
::selection { background: var(--wine-bright); color: var(--gold-pale); }

/* La cursiva dorada con la que la web pública remata los titulares. El
   `padding-bottom` negativo compensa que al recortar el degradado contra el
   texto se comen las colas de la g y la p. */
.acento {
  font-style: italic;
  background: var(--grad-gold);
  -webkit-background-clip: text; background-clip: text; color: transparent;
  padding-bottom: .15em; margin-bottom: -.15em;
}


/* El foco tiene que verse SIEMPRE: en una pantalla oscura, el contorno por
   defecto del navegador es prácticamente invisible. */
:focus-visible {
  outline: 2px solid var(--gold-bright);
  outline-offset: 2px;
  border-radius: 3px;
}

/* Enlace para saltar al contenido: primer tabulador de cada pantalla. */
.saltar {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--noir-2); color: var(--gold-pale);
  padding: 12px 18px; border: 1px solid var(--line-hi); border-radius: 0 0 var(--radius-m) 0;
}
.saltar:focus { left: 0; }

/* --------------------------------------------------------------- marca --- */
/*
 * El logotipo REAL del club, el mismo fichero que usa la web pública. Antes
 * aquí había un carácter ∞ del tipo de letra del sistema: en Windows se
 * dibujaba como dos círculos pegados que no se parecen en nada al lazo del
 * logo.
 *
 * Se usa el mapa de bits (.webp/.avif) y NO infinity-horizontal.svg, aunque
 * sea vectorial y pese menos: ese SVG escribe "INFINITY" con un <text> que
 * pide 'Cormorant Garamond'. Quien no la tenga instalada ve el logotipo con
 * otra letra distinta, y no hay forma de saberlo desde aquí.
 */

.logo { display: block; line-height: 0; flex: none; }
.logo img { width: 100%; height: auto; display: block; }

/* Alturas. El logo es 434x156 (2,78:1), así que se fija el ANCHO y la altura
   sale sola; poner las dos a mano lo deformaría en cuanto cambie el recorte. */
.logo--cab  { width: 118px; }
.logo--hero { width: min(212px, 58vw); }

/*
 * El brillo va SOLO en el logotipo grande, igual que en la web pública (su
 * cabecera no lleva filtro ninguno; el que brilla es el de la intro).
 *
 * Se probó ponérselo también al pequeño, porque ningún píxel del logo es opaco
 * —el trazo llega al 61 % de alfa— y sobre negro se apaga. Pero a 118 px de
 * ancho la línea "SW CLUB" mide 4 px de alto, y el desenfoque del brillo la
 * convertía en un borrón: en la captura se leía "SW CLLIB". Nítido y algo más
 * apagado se lee mejor que brillante y emborronado.
 */
.logo--hero img { filter: drop-shadow(0 0 18px rgba(233, 205, 134, .28)); }

/* -------------------------------------------------- insignia del club --- */
/*
 * El distintivo «Oficial». Vive AQUÍ y no en cada pantalla porque estaba
 * duplicado —en la cabecera del área privada y en cada mensaje del chat— y las
 * dos copias ya se habían separado: una llevaba el degradado dorado de la marca
 * y la otra un dorado plano inventado. Es el mismo sello, se define una vez.
 *
 * El lazo va como MÁSCARA sobre `currentColor` y no como imagen: sobre una
 * insignia dorada, un lazo dorado no se vería. Así se dibuja en la tinta
 * oscura del texto.
 */
.insignia {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: .58rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
  color: var(--tinta-oro); background: var(--grad-gold);
  padding: 3px 9px 3px 7px; border-radius: 999px; white-space: nowrap;
  box-shadow: 0 3px 10px rgba(200, 162, 76, .22);
}
.insignia::before {
  content: ""; flex: none; width: 15px; height: 8px;
  background: currentColor;
  -webkit-mask: url('/socios/marca/logo/infinity-mark.svg') center / contain no-repeat;
  mask: url('/socios/marca/logo/infinity-mark.svg') center / contain no-repeat;
}

/* Respiración del logo en las pantallas de espera. Es la misma que la intro de
   la web pública: no gira ni rebota, solo late el brillo. */
@keyframes marcaLatir {
  0%, 100% { filter: drop-shadow(0 0 9px rgba(233, 205, 134, .30)); }
  50%      { filter: drop-shadow(0 0 26px rgba(247, 231, 180, .68)); }
}
/* El brillo lo pone la animación, en el <picture>. Se apaga el estático del
   <img> o se sumarían las dos sombras y el logo saldría de neón. */
.logo--latir { animation: marcaLatir 6.5s ease-in-out infinite; }
.logo--latir img { filter: none; }

/* Filete dorado con el lazo en medio. Es el separador de la web pública y
   aquí hace de firma discreta al pie de las pantallas de una sola columna. */
.filete {
  display: flex; align-items: center; gap: 14px;
  color: var(--gold); opacity: .55;
  font-size: .76rem;             /* referencia del `em` de los filetes */
}
.filete::before, .filete::after {
  content: ""; flex: 1; height: 1px;
  background: linear-gradient(90deg, transparent, var(--line-hi), transparent);
  /* Un pelo por encima del centro de la caja: en un rótulo todo en mayúsculas el
     centro óptico está más alto que el geométrico, porque la línea reserva sitio
     para unas colas que no hay. */
  margin-top: -.08em;
}

.marca__txt {
  font-size: .74rem; letter-spacing: .34em; text-transform: uppercase;
  color: var(--muted);
}

/* --------------------------------------------------------------- botón --- */

/*
 * El botón de la web pública: píldora, versalitas y mucho espaciado entre
 * letras. Antes esto era un botón de 10 px de radio con el texto en caja baja,
 * que es correcto pero es de formulario, no de club. El `min-height: 48px` sí
 * se conserva: la web pública no tiene que preocuparse de dedos, esto sí.
 */
.btn {
  position: relative;
  display: inline-flex; align-items: center; justify-content: center; gap: .6rem;
  min-height: 48px;                     /* objetivo táctil cómodo */
  padding: 12px 26px;
  font-family: var(--font-body); font-size: .78rem; font-weight: 600;
  letter-spacing: .18em; text-transform: uppercase;
  border-radius: 999px; border: 1px solid var(--line-hi);
  background-color: transparent; color: var(--gold-pale);
  cursor: pointer; text-decoration: none; text-align: center;
  /*
   * El barrido de la web pública: el oro sube desde abajo y llena el botón. Va
   * como capa de fondo y no como un ::before superpuesto, que es como está en
   * la web: un pseudoelemento por encima taparía el texto, que aquí no va
   * envuelto en ningún <span> al que subirle el z-index.
   *
   * Se anima el TAMAÑO y no la posición. Con `background-size: 100% 100%` la
   * imagen mide exactamente lo que el área de posicionado, y entonces un
   * porcentaje de posición vale `(caja − imagen) × pct = 0`: daba igual poner
   * 148 % que 0 %, el oro no se movía y el botón salía RELLENO en reposo, con
   * el texto claro sobre oro — invisible. Con la altura a 0 no hay nada que
   * enseñar hasta que se crece.
   */
  background-image: var(--grad-gold);
  background-repeat: no-repeat;
  background-position: 50% 100%;
  background-size: 100% 0%;
  /* El color del texto espera a que el oro haya subido. Sin la espera, el texto
     se oscurecía en 320 ms mientras el relleno tardaba 500: durante la primera
     décima de segundo la mitad de arriba del botón quedaba en marrón oscuro
     sobre negro, ilegible, justo al pasar el ratón. */
  transition: background-size .5s var(--ease), background-color var(--dur-1) var(--ease),
              border-color var(--dur-1) var(--ease), color var(--dur-1) var(--ease) 130ms,
              transform var(--dur-1) var(--ease);
}
.btn:hover:not(:disabled) {
  border-color: var(--gold); color: var(--tinta-oro);
  background-size: 100% 100%;
}
.btn:active:not(:disabled) { transform: translateY(1px); }
.btn:disabled { opacity: .5; cursor: not-allowed; }
.btn--full { width: 100%; }

.btn--oro {
  background-size: 100% 100%;           /* ya viene lleno: no hay nada que barrer */
  color: var(--tinta-oro); border-color: transparent; font-weight: 700;
  /* El brillo interior de arriba es lo que lo hace parecer metal y no un
     rectángulo amarillo. */
  box-shadow: var(--glow-gold), inset 0 1px 0 rgba(255, 255, 255, .45);
}
.btn--oro:hover:not(:disabled) {
  border-color: transparent; color: var(--tinta-oro);
  box-shadow: 0 12px 36px rgba(233, 205, 134, .26), inset 0 1px 0 rgba(255, 255, 255, .6);
}

/* Proveedores externos. Se dejan neutros a propósito: el color corporativo de
   Google o Apple dentro de esta paleta canta muchísimo y rompe la sobriedad.
   `background-color` y NO el atajo `background`: el atajo borra también la capa
   de imagen, así que el botón se quedaba sin el oro del barrido pero el hover
   seguía poniéndole tinta oscura → texto casi negro sobre fondo negro. Hoy no
   se ve porque no hay proveedores configurados; saltaría el día que se activen. */
.btn--proveedor { background-color: var(--glass); font-weight: 400; }
.btn--proveedor svg { width: 18px; height: 18px; flex: none; }

/* --------------------------------------------------------------- campo --- */

.campo { display: block; margin-bottom: 18px; }
.campo__et {
  display: block; margin-bottom: 7px;
  font-size: .82rem; letter-spacing: .06em; text-transform: uppercase; color: var(--muted);
}
/*
 * Los tres controles, con el mismo aspecto.
 *
 * Antes solo se estilaba `input`, así que en cuanto una pantalla usó un
 * `textarea` o un `select` aparecían con la pinta que les da el sistema
 * operativo: fuente distinta, fondo claro, esquinas rectas. En medio de esta
 * paleta cantan muchísimo, y encima el `select` de Windows sale con letra
 * pequeña y difícil de tocar en el móvil.
 */
.campo input,
.campo textarea {
  width: 100%; min-height: 48px; padding: 12px 14px;
  font-family: var(--font-body); font-size: 1rem;
  line-height: 1.55;
  color: var(--cream); background: rgba(0, 0, 0, .35);
  border: 1px solid var(--line); border-radius: var(--radius-m);
  /* solo el textarea se puede estirar, y solo a lo alto: a lo ancho se saldría
     de la tarjeta en el móvil */
  resize: vertical;
  transition: border-color var(--dur-1) var(--ease);
}
/* El select va en su propio bloque, sin agruparlo con los otros dos, porque el
   revisor de CSS del proyecto cuenta un selector repetido aunque una de las dos
   veces sea dentro de una lista — y esa comprobación existe para cazar
   duplicados de verdad. Sale más barato repetir seis propiedades que aflojar la
   herramienta.
   `appearance:none` porque, sin él, el navegador dibuja su propia flecha sobre
   este fondo oscuro y no siempre con contraste suficiente; la nuestra va como
   data-uri, que es lo único que admite la CSP. */
.campo select {
  width: 100%; min-height: 48px; padding: 12px 40px 12px 14px;
  font-family: var(--font-body); font-size: 1rem;
  color: var(--cream);
  border: 1px solid var(--line); border-radius: var(--radius-m);
  transition: border-color var(--dur-1) var(--ease);
  appearance: none;
  background-color: rgba(0, 0, 0, .35);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%23e9cd86' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 12px 8px;
}
.campo input:hover,
.campo textarea:hover,
.campo select:hover { border-color: var(--line-hi); }
.campo input::placeholder,
.campo textarea::placeholder { color: var(--faint); }
.campo input[aria-invalid="true"],
.campo textarea[aria-invalid="true"] { border-color: var(--ember); }

.campo__msg { display: block; margin-top: 6px; font-size: .86rem; color: var(--ember); min-height: 1.2em; }
.campo__pista { display: block; margin-top: 6px; font-size: .84rem; color: var(--faint); }

/* --------------------------------------------------------------- aviso --- */

.aviso {
  padding: 12px 15px; border-radius: var(--radius-m);
  border: 1px solid var(--line); background: var(--glass);
  font-size: .93rem; color: var(--cream);
}
.aviso--mal { border-color: rgba(196, 50, 74, .5); background: rgba(140, 20, 40, .14); }
.aviso--bien { border-color: var(--line-hi); }
.aviso[hidden] { display: none !important; }

/* ------------------------------------------------------------ separador -- */

.o {
  display: flex; align-items: center; gap: 14px;
  margin: 22px 0; color: var(--faint);
  font-size: .78rem; letter-spacing: .18em; text-transform: uppercase;
}
.o::before, .o::after { content: ""; flex: 1; height: 1px; background: var(--line); }

/* ------------------------------------------------------ pantalla de carga - */
/*
 * El telón que tapa la pantalla mientras se resuelve la sesión. Lo usan el área
 * de socios Y el panel, así que vive aquí: estaba solo en `privado.css`, que el
 * panel no carga, y allí el logotipo salía sin estilo pegado a la esquina de
 * arriba a la izquierda mientras respondía /api/me.
 *
 * El fondo es el MISMO degradado del body para que al quitarse el telón no se
 * note un salto de color.
 */
.cargando {
  position: fixed; inset: 0; z-index: 50; display: grid; place-items: center;
  background: radial-gradient(120% 90% at 50% 38%, #1a0610 0%, #0a0507 55%, var(--noir) 100%);
}
.cargando .logo { width: min(200px, 56vw); }

/* Aviso de «no se ha podido conectar», dentro del propio telón. Se pinta desde
   JavaScript solo cuando la API no responde; el logotipo se queda arriba. */
.cargando__aviso {
  display: grid; justify-items: center; gap: 10px;
  margin-top: 26px; padding-inline: 24px; text-align: center; max-width: 34ch;
}
.cargando__aviso p { margin: 0; color: var(--cream); }
.cargando__aviso .cargando__sub { color: var(--muted); font-size: .92rem; }
.cargando__aviso .btn { margin-top: 6px; }

/* -------------------------------------------------------------- sin JS --- */
/*
 * El z-index tiene que ganarle a la pantalla de carga (`.cargando`, z-index 50):
 * esa capa es fija y opaca, y si no se pasa por encima el aviso quedaría debajo
 * y el resultado sería el mismo negro mudo que se quería evitar.
 */
.sin-js {
  position: fixed; inset: 0; z-index: 100;
  display: grid; place-content: center; gap: 8px;
  padding: 32px; text-align: center;
  background: var(--noir); color: var(--cream);
}
.sin-js strong { color: var(--gold-pale); font-family: var(--font-display); font-size: 1.15rem; }
.sin-js p { margin: 0; }

/* ------------------------------------------------------------ utilidades - */

[hidden] { display: none !important; }
.visualmente-oculto {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.pie-legal {
  margin-top: 26px; text-align: center;
  font-size: .76rem; letter-spacing: .2em; text-transform: uppercase; color: var(--faint);
}
/*
 * Con `.filete` alrededor, el pie deja de ser una línea suelta y se convierte en
 * la firma de la pantalla.
 *
 * `margin: 0` y no `margin-top: 0`. La regla de arriba fija el margen superior
 * pero no el inferior, así que el <p> se quedaba con el `1em` que le pone el
 * navegador por defecto: la caja del párrafo medía 24 px para 12 px de texto, y
 * como en flex se centra la caja CON su margen, las letras subían y los filetes
 * cruzaban seis píxeles por debajo. No se veía a ojo por qué; se vio midiendo.
 */
.filete .pie-legal { margin: 0; line-height: 1; }

/* Quien pide menos movimiento no quiere ninguno. Se apaga de verdad, no "casi". */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important; animation-iteration-count: 1 !important;
    transition-duration: .001ms !important; scroll-behavior: auto !important;
  }

  /*
   * Con la regla de arriba, el latido del logotipo dura un microsegundo y el
   * elemento vuelve a su estado sin animar: `filter: none`. Resultado medido —
   * el logo se quedaba SIN brillo justo para quien ha pedido menos movimiento,
   * y como ningún píxel del logotipo es opaco, se veía más apagado que para todo
   * el mundo. Se le da el brillo fijo, que es lo que hace la web pública.
   */
  .logo--latir { filter: drop-shadow(0 0 14px rgba(233, 205, 134, .5)); }
}
