@charset "UTF-8";
/* =============================================================================
   RBT — Reboot · Kinesiología & Recovery
   Sistema de diseño y hoja de estilos principal.

   Índice
   ------
   01. Tipografía (@font-face)
   02. Tokens
   03. Reset y base
   04. Tipografía de página
   05. Layout: contenedor, secciones, grillas
   06. Motivos de marca (corte, muescas, squiggle)
   07. Header y navegación
   08. Botones y enlaces
   09. Hero
   10. Pilares
   11. Bloques de servicio
   12. Instalaciones
   13. Equipo
   14. Bob
   15. FAQ
   16. CTA y formulario
   17. Ubicación
   18. Footer
   19. Páginas internas (breadcrumbs, page-head, 404)
   20. Animación y scroll reveal
   21. Utilidades y estados de impresión
   ============================================================================= */


/* =============================================================================
   01. TIPOGRAFÍA
   -----------------------------------------------------------------------------
   SOFIA PRO, la tipográfica oficial del manual. Familia retail completa
   (v2.000, Mostardesign Studio), subseteada a latín + Latin-1 + puntuación
   tipográfica: cubre el castellano entero — acentos, ñ, ¿ ¡ — y las comillas
   y rayas que usa el sitio.

   Cinco pesos, sin itálicas, porque son los cinco que el CSS usa realmente:
   68,8 KB en total. Un unicode-range único evita la partición latin/latin-ext
   de Google Fonts, que acá sólo agregaría requests.

   NOTA DE LICENCIA — leer antes de tocar este bloque.
   Los .otf de origen traen la licencia de ESCRITORIO de Mostardesign, que
   permite diseñar con la fuente pero no servirla por @font-face. Para eso hace
   falta la licencia *webfont*, aparte y por pageviews. Está sin tramitar y se
   decidió publicar igual; queda anotado en PENDIENTES_PRODUCCION.md §1, no
   perdido.

   Lo bueno: comprarla después no cambia una línea de acá. Los archivos ya
   están subseteados y servidos desde el propio dominio, que es exactamente lo
   que esa licencia exige. Y antes de comprar conviene mirar Adobe Fonts, donde
   Sofia Pro está en catálogo: un plan de Creative Cloud puede cubrirlo.

   Si algún día hay que sacarla, se borran estos cinco @font-face y los dos
   <link rel="preload"> del <head> de las 7 páginas. El sitio no se rompe: la
   pila de respaldo de --font ya está declarada abajo.
   ============================================================================= */

@font-face {
  font-family: "Sofia Pro"; font-style: normal; font-weight: 300; font-display: swap;
  src: url("../assets/fonts/sofia-pro-light.woff2") format("woff2");
  unicode-range: U+0020-007E, U+00A0-00FF, U+0131, U+0152-0153, U+2010-2015, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20AC, U+2122, U+2190-2193, U+2212, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Sofia Pro"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../assets/fonts/sofia-pro-regular.woff2") format("woff2");
  unicode-range: U+0020-007E, U+00A0-00FF, U+0131, U+0152-0153, U+2010-2015, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20AC, U+2122, U+2190-2193, U+2212, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Sofia Pro"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../assets/fonts/sofia-pro-medium.woff2") format("woff2");
  unicode-range: U+0020-007E, U+00A0-00FF, U+0131, U+0152-0153, U+2010-2015, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20AC, U+2122, U+2190-2193, U+2212, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Sofia Pro"; font-style: normal; font-weight: 600; font-display: swap;
  src: url("../assets/fonts/sofia-pro-semibold.woff2") format("woff2");
  unicode-range: U+0020-007E, U+00A0-00FF, U+0131, U+0152-0153, U+2010-2015, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20AC, U+2122, U+2190-2193, U+2212, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Sofia Pro"; font-style: normal; font-weight: 700; font-display: swap;
  src: url("../assets/fonts/sofia-pro-bold.woff2") format("woff2");
  unicode-range: U+0020-007E, U+00A0-00FF, U+0131, U+0152-0153, U+2010-2015, U+2018-201A, U+201C-201E, U+2020-2022, U+2026, U+2030, U+2039-203A, U+2044, U+20AC, U+2122, U+2190-2193, U+2212, U+FEFF, U+FFFD;
}


/* =============================================================================
   02. TOKENS
   ============================================================================= */

:root {
  /* --- Color de marca (manual) ------------------------------------------- */
  --carbon: #141514;   /* Carbon Core */
  --pulse:  #4D76E9;   /* Pulse Blue  */
  --ash:    #E2E1E1;   /* Soft Ash    */

  /* --- Rampa de superficies (derivada de Carbon Core) --------------------- */
  --surface-0: #141514;
  --surface-1: #191a19;
  --surface-2: #1f201f;
  --surface-3: #272827;
  --surface-inv: var(--ash);

  /* --- Azul: variantes con contraste verificado --------------------------- */
  /* IMPORTANTE — límite del Pulse Blue como FONDO:
     Pulse Blue tiene una luminancia intermedia (L=0.204), así que ni el blanco
     (4.13:1) ni el Carbon Core (4.38:1) alcanzan los 4.5:1 que pide WCAG AA
     para texto normal. Conclusión aplicada en todo el sitio:
       · #4D76E9 exacto  → superficies editoriales con tipografía GRANDE
                           (≥24px, o ≥18.7px en bold → basta 3:1) y elementos
                           gráficos: cuadrados, squiggles, barras, focus.
       · --pulse-deep    → superficies INTERACTIVAS con texto chico (botones,
                           FAB). Blanco sobre #3A5FD1 = 5.58:1 → AA en
                           cualquier tamaño.
     Es la única desviación deliberada respecto del manual y está señalada
     como tal en el informe de entrega. */
  --pulse-bright: #7796EF;  /* texto azul chico sobre carbón — 6.2:1 */
  --pulse-deep:   #3A5FD1;  /* fondo de botones — blanco encima 5.58:1 */
  --pulse-ink:    #2E4CAB;  /* texto azul sobre Soft Ash — 5.9:1 */
  --pulse-tint:   rgba(77, 118, 233, 0.12);
  --pulse-glow:   rgba(77, 118, 233, 0.28);

  /* --- Texto sobre carbón (ratios contra --carbon) ------------------------ */
  /* Los cuatro niveles superan 4.5:1: no hay gris "decorativo" que después
     termine usado en prosa por descuido. */
  --text:       #E2E1E1;                    /* 14.2:1 */
  --text-muted: rgba(226, 225, 225, 0.70);  /*  7.4:1 */
  --text-dim:   rgba(226, 225, 225, 0.62);  /*  5.9:1 */
  --text-faint: rgba(226, 225, 225, 0.52);  /*  4.5:1 — mínimo AA */

  /* --- Líneas ------------------------------------------------------------- */
  --line:        rgba(226, 225, 225, 0.10);
  --line-strong: rgba(226, 225, 225, 0.20);

  /* --- Tipografía --------------------------------------------------------- */
  --font: "Sofia Pro", ui-sans-serif, system-ui, -apple-system,
          "Segoe UI", Roboto, sans-serif;

  --fs-display:  clamp(3.25rem, 13vw, 9.5rem);
  --fs-h1:       clamp(2.5rem, 7.5vw, 5.5rem);
  --fs-h2:       clamp(2rem, 5.2vw, 3.75rem);
  --fs-h3:       clamp(1.375rem, 2.6vw, 2rem);
  --fs-h4:       clamp(1.125rem, 1.7vw, 1.375rem);
  --fs-lead:     clamp(1.0625rem, 1.6vw, 1.3125rem);
  --fs-body:     1rem;
  --fs-small:    0.9375rem;
  --fs-eyebrow:  0.75rem;

  --lh-tight: 0.92;
  --lh-head:  1.06;
  --lh-body:  1.65;

  --tr-display: -0.045em;  /* tracking negativo en display */
  --tr-head:    -0.025em;
  --tr-eyebrow:  0.18em;

  /* --- Espaciado ---------------------------------------------------------- */
  --sp-1: 0.25rem;  --sp-2: 0.5rem;   --sp-3: 0.75rem;  --sp-4: 1rem;
  --sp-5: 1.5rem;   --sp-6: 2rem;     --sp-7: 3rem;     --sp-8: 4rem;
  --sp-9: 6rem;     --sp-10: 8rem;

  --section-y: clamp(4.5rem, 11vw, 9.5rem);
  --gutter:    clamp(1.25rem, 5vw, 4rem);
  --container: 1320px;
  --measure:   62ch;

  /* --- Motivo de marca: el "corte" del logotipo --------------------------- */
  /* El isotipo RBT combina cortes a 45° con un cuarto de círculo sobredimen-
     sionado. Ese cuarto de círculo es el gesto estructural del sitio.        */
  --cut:    clamp(1.75rem, 5vw, 4.5rem);
  --cut-sm: clamp(1rem, 2.5vw, 1.75rem);
  --r-sm:   10px;
  --r-xs:   6px;
  --r-pill: 999px;

  /* --- Elevación ---------------------------------------------------------- */
  --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.4);
  --shadow-2: 0 18px 40px -18px rgba(0, 0, 0, 0.75);
  --shadow-3: 0 40px 90px -30px rgba(0, 0, 0, 0.85);

  /* --- Movimiento --------------------------------------------------------- */
  --ease:     cubic-bezier(0.22, 1, 0.36, 1);
  --ease-in:  cubic-bezier(0.55, 0, 0.65, 1);
  --dur-1: 160ms;
  --dur-2: 320ms;
  --dur-3: 620ms;

  --header-h: 72px;

  /* La misma idea que --header-h pero por abajo: la altura y el margen del CTA
     flotante. Existen porque hay tres reglas que tienen que coincidir —el FAB,
     el panel de Bob que se apoya encima y la franja que el pie reserva para no
     quedar tapado—, y con los números sueltos se separan al primer retoque. */
  --fab-h: 52px;
  --fab-inset: clamp(1rem, 3vw, 2rem);

  color-scheme: dark;
}

@media (min-width: 900px) {
  :root { --header-h: 88px; }
}


/* =============================================================================
   03. RESET Y BASE
   ============================================================================= */

*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 1.5rem);
}

body {
  min-height: 100svh;
  background: var(--carbon);
  color: var(--text);
  font-family: var(--font);
  font-size: var(--fs-body);
  font-weight: 400;
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

img, svg, video, canvas { display: block; max-width: 100%; }
img, video { height: auto; }

input, button, textarea, select { font: inherit; color: inherit; }
button { background: none; border: 0; cursor: pointer; }

ul, ol { list-style: none; padding: 0; }

a { color: inherit; text-decoration: none; }

:where(a, button, input, textarea, select, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--pulse-bright);
  outline-offset: 3px;
  border-radius: var(--r-xs);
}

::selection { background: var(--pulse); color: #fff; }

/* Salto al contenido — visible sólo al tabular. */
.skip-link {
  position: absolute;
  top: 0; left: 50%;
  transform: translate(-50%, -120%);
  z-index: 200;
  padding: 0.75rem 1.25rem;
  background: var(--pulse-deep);  /* es el primer elemento tabulable: AA sí o sí */
  color: #fff;
  font-weight: 600;
  border-radius: 0 0 var(--r-sm) var(--r-sm);
  transition: transform var(--dur-2) var(--ease);
}
.skip-link:focus-visible { transform: translate(-50%, 0); }

/* Sólo para lectores de pantalla. */
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}


/* =============================================================================
   04. TIPOGRAFÍA DE PÁGINA
   ============================================================================= */

h1, h2, h3, h4 {
  font-weight: 700;
  line-height: var(--lh-head);
  letter-spacing: var(--tr-head);
  text-wrap: balance;
}

h1 { font-size: var(--fs-h1); }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); }
h4 { font-size: var(--fs-h4); font-weight: 600; }

/* Escala visual desacoplada del nivel semántico: el orden de encabezados lo
   manda el documento, el tamaño lo manda la composición. */
.h1 { font-size: var(--fs-h1); }
.h2 { font-size: var(--fs-h2); }
.h3 { font-size: var(--fs-h3); }
.h4 { font-size: var(--fs-h4); }

p { text-wrap: pretty; }

.lead {
  font-size: var(--fs-lead);
  line-height: 1.55;
  color: var(--text-muted);
  max-width: var(--measure);
  font-weight: 300;
}

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.6em;
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  color: var(--pulse-bright);
}
.eyebrow::before {
  content: "";
  width: 1.75rem;
  height: 2px;
  background: var(--pulse);
  flex: none;
}
.eyebrow--plain::before { display: none; }

/* Aviso de apertura.
   RBT abre a mediados de octubre de 2026 y ese es hoy el único dato que
   cambia la decisión de quien entra: si el local todavía no atiende, saber
   si igual tiene sentido escribir. Va integrado al hero y a la cabecera de
   las landings, NO como barra superior descartable: esa pieza se lee como
   aviso de cookies y es exactamente el recurso de plantilla que hay que
   evitar acá.

   El sello va contorneado y no relleno porque el botón primario de al lado
   ya es un bloque azul y dos seguidos compiten. Ratios: el borde en --pulse
   sobre carbón da 4.5:1 (es un gráfico, le alcanza con 3:1) y el texto en
   --pulse-bright, 6.2:1. El radio va en píxeles y no con --cut-sm porque a
   esta escala el clamp redondearía el sello hasta deformarlo. */
.opening {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3);
  font-size: var(--fs-small);
  color: var(--text-muted);
}
.opening__tag {
  flex: none;
  /* El padding derecho es menor: el letter-spacing en versalitas deja un
     hueco después de la última letra y sin compensarlo el sello se ve
     descentrado. */
  padding: 0.4em 0.7em 0.4em 0.85em;
  border: 1px solid var(--pulse);
  border-radius: 2px 12px 2px 2px;
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  color: var(--pulse-bright);
}
.opening strong { color: var(--text); font-weight: 600; }

/* Numeración editorial de secciones. */
.index {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: var(--tr-eyebrow);
  color: var(--text-faint);
  font-variant-numeric: tabular-nums;
}

.muted { color: var(--text-muted); }
.dim   { color: var(--text-dim); }
.accent{ color: var(--pulse-bright); }
.small { font-size: var(--fs-small); }

/* Palabra con relleno azul — eco del "RBT Fill" de la marca. */
.fill-word {
  position: relative;
  color: var(--pulse);
}


/* =============================================================================
   05. LAYOUT
   ============================================================================= */

.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.container--narrow { max-width: 900px; }

.section { padding-block: var(--section-y); position: relative; }
.section--tight { padding-block: clamp(3rem, 7vw, 5.5rem); }
.section--flush-top { padding-top: 0; }

.section-head {
  display: grid;
  gap: var(--sp-5);
  margin-bottom: clamp(2.5rem, 6vw, 4.5rem);
}
.section-head__top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
  flex-wrap: wrap;
  padding-bottom: var(--sp-4);
  border-bottom: 1px solid var(--line);
}
.section-head p { max-width: var(--measure); }

@media (min-width: 900px) {
  .section-head--split {
    grid-template-columns: minmax(0, 1fr) minmax(0, 0.85fr);
    align-items: end;
    column-gap: var(--sp-8);
  }
  .section-head--split .section-head__top { grid-column: 1 / -1; }
}

.stack   { display: grid; gap: var(--sp-5); align-content: start; }
.stack-sm{ display: grid; gap: var(--sp-3); align-content: start; }
.cluster { display: flex; flex-wrap: wrap; gap: var(--sp-4); align-items: center; }

/* Banda de superficie alterna. */
.band { background: var(--surface-1); }
.band--deep { background: #101110; }

/* Regla fina de sección. */
.rule { height: 1px; background: var(--line); border: 0; }


/* =============================================================================
   06. MOTIVOS DE MARCA
   -----------------------------------------------------------------------------
   Tomados del sistema de formas del manual (pág. 11): un cuarto de círculo
   sobredimensionado en una sola esquina, muescas cóncavas y el cuadrado azul
   de acento. Es lo que evita que el sitio parezca un template de cards.
   ============================================================================= */

/* El corte: tres esquinas suaves + un cuarto de círculo grande. */
.cut     { border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm); overflow: hidden; }
.cut--tl { border-radius: var(--cut) var(--r-sm) var(--r-sm) var(--r-sm); }
.cut--br { border-radius: var(--r-sm) var(--r-sm) var(--cut) var(--r-sm); }
.cut--bl { border-radius: var(--r-sm) var(--r-sm) var(--r-sm) var(--cut); }
.cut--sm { border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm); }

/* Marco de imagen. */
.media {
  position: relative;
  overflow: hidden;
  background: var(--surface-2);
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
}
.media img { width: 100%; height: 100%; object-fit: cover; }
.media--tall  { aspect-ratio: 3 / 4; }
.media--wide  { aspect-ratio: 16 / 10; }
.media--square{ aspect-ratio: 1 / 1; }

/* Velo para asegurar contraste del texto sobre foto. */
.media__veil {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg,
              rgba(20, 21, 20, 0.15) 0%,
              rgba(20, 21, 20, 0.55) 55%,
              rgba(20, 21, 20, 0.92) 100%);
}

/* Cuadrado azul de acento, alojado en la esquina cortada. */
.accent-square {
  position: absolute;
  width: clamp(1.5rem, 3vw, 2.25rem);
  aspect-ratio: 1;
  background: var(--pulse);
  border-radius: var(--r-xs);
}

/* Squiggle: trazo suelto azul, elemento oficial del manual. */
.squiggle {
  position: absolute;
  color: var(--pulse);
  opacity: 0.9;
  pointer-events: none;
  z-index: 0;
}
.squiggle img, .squiggle svg { width: 100%; height: auto; }

/* Misceláneos del manual — los cinco trazos.
   El manual trae cinco y el sitio venía usando uno solo, inline en el hero y
   oculto por debajo de 1000px: el recurso más reconocible de la marca estaba
   prácticamente sin aparecer.

   Van por mask-image y no por <img>: los archivos traen fill="currentColor",
   que dentro de un <img> no hereda nada y se pintaría negro sobre carbón. Como
   máscara, la forma la pone el SVG y el color lo pone el CSS, así que el mismo
   archivo sirve en azul, en gris o al 10% sin duplicarlo, y se cachea aparte
   en vez de engordar cada HTML.

   Reglas de uso, para que no terminen siendo manchas decorativas:
   · uno por sección como máximo, y no en todas las secciones;
   · siempre anclado a un borde y recortado por el overflow del contenedor —
     así se lee como una marca impresa que se sale de la página, no como una
     calcomanía flotando en el medio;
   · nunca por encima de texto: van detrás y a baja opacidad.

   Cada landing lleva un trazo distinto. Son tres páginas de la misma
   plantilla y esto es parte de lo que evita que se lean como la misma página
   con otro título. */
.motif {
  position: absolute;
  z-index: 0;
  pointer-events: none;
  background: var(--pulse);
  opacity: 0.14;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-position: center;
          mask-position: center;
}
/* El aspect-ratio sale del viewBox de cada archivo: así basta con fijar el
   ancho y la altura sale sola, sin deformar el trazo. */
.motif--1 { aspect-ratio: 399.07 / 460.72; -webkit-mask-image: url("../assets/brand/squiggle-1.svg"); mask-image: url("../assets/brand/squiggle-1.svg"); }
.motif--2 { aspect-ratio: 210.22 / 598.74; -webkit-mask-image: url("../assets/brand/squiggle-2.svg"); mask-image: url("../assets/brand/squiggle-2.svg"); }
.motif--3 { aspect-ratio: 399.07 / 391.93; -webkit-mask-image: url("../assets/brand/squiggle-3.svg"); mask-image: url("../assets/brand/squiggle-3.svg"); }
.motif--4 { aspect-ratio: 542.21 / 425.89; -webkit-mask-image: url("../assets/brand/squiggle-4.svg"); mask-image: url("../assets/brand/squiggle-4.svg"); }
.motif--5 { aspect-ratio: 378.79 / 485.99; -webkit-mask-image: url("../assets/brand/squiggle-5.svg"); mask-image: url("../assets/brand/squiggle-5.svg"); }

/* --- Colocaciones ---------------------------------------------------------
   Cada trazo se posiciona desde la sección que lo contiene, no desde clases
   sueltas de utilidad: son seis usos contados en todo el sitio y nombrarlos
   por su lugar deja claro dónde están. */

/* Cabecera de páginas internas. El resplandor de .page-head::before ya ocupa
   la esquina superior derecha, así que el trazo va abajo: entre los dos arman
   una diagonal en vez de amontonarse en el mismo rincón.
   En móvil el titular usa el ancho completo, así que el trazo se corre casi
   entero fuera de pantalla y baja de opacidad — queda como borde recortado y
   no como fondo detrás de la lectura. Es otro encuadre, no el de escritorio
   encogido. */
.page-head__motif {
  right: -14%;
  top: 50%;
  translate: 0 -50%;
  width: clamp(8rem, 30vw, 15rem);
  /* Los cinco trazos tienen proporciones muy distintas (uno es casi cuadrado
     y otro mide el triple de alto que de ancho). Fijando sólo el ancho, el
     más vertical desbordaría la cabecera de contacto, que es la más baja.
     Con el tope de altura la caja se achica y mask-size:contain reduce el
     dibujo dentro sin deformarlo: entra siempre, en las cinco páginas. */
  max-height: 74%;
  /* Bien tenue: en móvil la bajada usa el ancho completo y el trazo le queda
     detrás. A 0.08 sobre carbón se lee como textura del fondo y no le roba
     contraste al texto; en escritorio, donde el titular no llega hasta ahí,
     puede subir. */
  opacity: 0.08;
}
@media (min-width: 760px) {
  .page-head__motif { right: 2%; width: clamp(11rem, 20vw, 16rem); max-height: 80%; opacity: 0.22; }
}

/* Sección con trazo de fondo (franja de instalaciones en la home). El trazo
   entra por la izquierda a la altura del titular; el contenido sube a z-index
   1 para que nunca quede tapado. */
.section--motif { position: relative; overflow: hidden; }
.section--motif > .container { position: relative; z-index: 1; }
.section--motif > .motif {
  left: -9%;
  top: 5%;
  width: clamp(7rem, 22vw, 15rem);
  opacity: 0.09;
}
@media (min-width: 760px) {
  /* En escritorio el titular no llega al borde izquierdo, así que el trazo
     puede entrar más y verse mejor: cortado al 15% se leía como una mancha
     azul suelta en la esquina, no como una forma. */
  .section--motif > .motif { left: -2.5%; top: 9%; opacity: 0.16; }
}

/* Marcador de zócalo: barra azul fina. */
.tick { width: 2.5rem; height: 3px; background: var(--pulse); border-radius: 2px; }


/* =============================================================================
   07. HEADER Y NAVEGACIÓN
   ============================================================================= */

.site-header {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  height: var(--header-h);
  display: flex;
  align-items: center;
  transition: background var(--dur-2) var(--ease),
              border-color var(--dur-2) var(--ease),
              backdrop-filter var(--dur-2) var(--ease);
  border-bottom: 1px solid transparent;
}
.site-header.is-stuck {
  background: rgba(20, 21, 20, 0.82);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  border-bottom-color: var(--line);
}

.site-header__inner {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
}

/* Logotipo. */
.brand { display: inline-flex; align-items: center; gap: 0.7rem; flex: none; }
/* fill:currentColor es obligatorio: el <symbol id="rbt"> del sprite no declara
   fill propio, así que sin esto hereda el negro por defecto del user agent y
   el logotipo desaparece contra el Carbon Core. */
.brand svg, .brand img {
  width: clamp(74px, 8vw, 96px); height: auto;
  color: var(--ash); fill: currentColor;
}
.brand__tag {
  display: none;
  font-size: 0.5625rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--text-dim);
  padding-left: 0.7rem;
  border-left: 1px solid var(--line-strong);
  line-height: 1.3;
  max-width: 8rem;
}
@media (min-width: 1100px) { .brand__tag { display: block; } }

/* Navegación de escritorio. */
.nav { display: none; }
@media (min-width: 900px) {
  .nav { display: flex; align-items: center; gap: clamp(1.25rem, 2.4vw, 2.25rem); }
}
.nav a {
  position: relative;
  font-size: var(--fs-small);
  font-weight: 500;
  color: var(--text-muted);
  padding-block: 0.4rem;
  transition: color var(--dur-1) var(--ease);
}
.nav a::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 100%; height: 2px;
  background: var(--pulse);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur-2) var(--ease);
}
.nav a:hover { color: var(--text); }
.nav a:hover::after, .nav a[aria-current="page"]::after { transform: scaleX(1); }
.nav a[aria-current="page"] { color: var(--text); }

.header__actions { display: flex; align-items: center; gap: var(--sp-3); }

/* Selector anidado a propósito: `.btn` se declara más abajo con
   display:inline-flex y misma especificidad, así que un `.header__cta` suelto
   perdía el cascade y el botón nunca se ocultaba en móvil. */
.header__actions .header__cta { display: none; }
@media (min-width: 600px) {
  .header__actions .header__cta { display: inline-flex; }
}

/* Botón hamburguesa. */
.nav-toggle {
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 44px; height: 44px;
  padding: 0 10px;
  border-radius: var(--r-sm);
  border: 1px solid var(--line-strong);
}
@media (min-width: 900px) { .nav-toggle { display: none; } }
.nav-toggle span {
  display: block;
  height: 2px;
  background: var(--text);
  border-radius: 2px;
  transition: transform var(--dur-2) var(--ease), opacity var(--dur-1) var(--ease);
}
.nav-toggle span:nth-child(1) { width: 100%; }
.nav-toggle span:nth-child(2) { width: 70%; }
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { width: 100%; transform: translateY(-7px) rotate(-45deg); }

/* Panel móvil. */
.nav-drawer {
  position: fixed;
  inset: var(--header-h) 0 0 0;
  z-index: 99;
  background: var(--carbon);
  padding: var(--sp-6) var(--gutter) var(--sp-8);
  display: grid;
  align-content: start;
  gap: var(--sp-2);
  overflow-y: auto;
  visibility: hidden;
  opacity: 0;
  transform: translateY(-8px);
  transition: opacity var(--dur-2) var(--ease),
              transform var(--dur-2) var(--ease),
              visibility 0s linear var(--dur-2);
}
.nav-drawer.is-open {
  visibility: visible;
  opacity: 1;
  transform: none;
  transition-delay: 0s;
}
@media (min-width: 900px) { .nav-drawer { display: none; } }

.nav-drawer a {
  display: flex;
  align-items: baseline;
  gap: var(--sp-4);
  padding-block: var(--sp-4);
  border-bottom: 1px solid var(--line);
  font-size: 1.5rem;
  font-weight: 600;
  letter-spacing: var(--tr-head);
}
.nav-drawer a span { font-size: 0.75rem; color: var(--text-faint); font-weight: 500; }
.nav-drawer .btn { margin-top: var(--sp-5); justify-content: center; }

/* Bob ocupa el vacío que queda debajo del CTA. Va apagado y difuminado hacia
   abajo: la idea es que aparezca, no que compita con los enlaces. La máscara
   evita el corte a filo contra el borde del panel, que se leería como un
   error de recorte. */
.nav-drawer__bob {
  position: absolute;
  right: calc(var(--gutter) - 0.75rem);
  bottom: 0;
  width: clamp(118px, 40vw, 180px);
  height: auto;
  opacity: 0.4;
  pointer-events: none;
  -webkit-mask-image: linear-gradient(to bottom, #000 52%, transparent 94%);
  mask-image: linear-gradient(to bottom, #000 52%, transparent 94%);
}
/* En pantallas bajas no entra sin pisar el CTA, así que no se muestra. */
@media (max-height: 700px), (min-width: 900px) {
  .nav-drawer__bob { display: none; }
}


/* =============================================================================
   08. BOTONES Y ENLACES
   ============================================================================= */

.btn {
  --btn-bg: transparent;
  --btn-fg: var(--text);
  --btn-bd: var(--line-strong);
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.6em;
  padding: 0.95rem 1.6rem;
  background: var(--btn-bg);
  color: var(--btn-fg);
  border: 1px solid var(--btn-bd);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  font-size: var(--fs-small);
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1.2;
  text-align: center;
  transition: background var(--dur-2) var(--ease),
              border-color var(--dur-2) var(--ease),
              color var(--dur-2) var(--ease),
              transform var(--dur-1) var(--ease);
}
.btn:hover { transform: translateY(-2px); }
.btn:active { transform: translateY(0); }

/* Fondo --pulse-deep, no --pulse: ver la nota de contraste en los tokens.
   El halo sí usa el Pulse Blue puro, así que el botón sigue leyéndose como
   azul de marca. */
.btn--primary {
  --btn-bg: var(--pulse-deep);
  --btn-fg: #fff;
  --btn-bd: var(--pulse-deep);
  box-shadow: 0 10px 30px -12px var(--pulse-glow);
}
.btn--primary:hover { --btn-bg: var(--pulse-ink); --btn-bd: var(--pulse-ink); }

.btn--ghost:hover { --btn-bd: var(--ash); background: rgba(226, 225, 225, 0.06); }

.btn--solid { --btn-bg: var(--ash); --btn-fg: var(--carbon); --btn-bd: var(--ash); }
.btn--solid:hover { --btn-bg: #fff; --btn-bd: #fff; }

.btn--lg { padding: 1.15rem 2rem; font-size: 1rem; }
.btn--block { width: 100%; }

.btn__icon { flex: none; transition: transform var(--dur-2) var(--ease); }
.btn:hover .btn__icon { transform: translateX(3px); }

/* Enlace con flecha, para navegación secundaria. */
.link-arrow {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  font-weight: 600;
  font-size: var(--fs-small);
  color: var(--text);
  padding-bottom: 2px;
  border-bottom: 1px solid var(--line-strong);
  transition: color var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease);
}
.link-arrow svg { transition: transform var(--dur-2) var(--ease); }
.link-arrow:hover { color: var(--pulse-bright); border-color: var(--pulse); }
.link-arrow:hover svg { transform: translateX(4px); }


/* =============================================================================
   09. HERO
   ============================================================================= */

.hero {
  position: relative;
  padding-top: calc(var(--header-h) + clamp(2.5rem, 8vw, 5rem));
  padding-bottom: clamp(2.5rem, 6vw, 4.5rem);
  overflow: hidden;
}

/* Halo azul muy contenido: da profundidad sin caer en gradiente exagerado. */
.hero::before {
  content: "";
  position: absolute;
  top: -30%; right: -10%;
  width: min(70vw, 780px);
  aspect-ratio: 1;
  background: radial-gradient(circle, var(--pulse-glow) 0%, transparent 68%);
  opacity: 0.5;
  pointer-events: none;
}

.hero__grid { position: relative; display: grid; gap: clamp(2.5rem, 6vw, 4rem); }

@media (min-width: 1000px) {
  .hero__grid {
    grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
    align-items: center;
    column-gap: clamp(2.5rem, 5vw, 5rem);
  }
}

.hero__copy { display: grid; gap: clamp(1.5rem, 3vw, 2.25rem); align-content: start; }

.hero__title {
  font-size: var(--fs-h1);
  line-height: var(--lh-tight);
  letter-spacing: var(--tr-display);
  text-transform: uppercase;
  text-wrap: balance;
}
.hero__title .line { display: block; }

/* Relleno azul progresivo sobre la segunda línea: recrea en CSS el
   "RBT Fill" del kit de marca, sin cargar el vídeo. */
.hero__fill {
  background-image: linear-gradient(90deg, var(--pulse) 50%, var(--text) 50%);
  background-size: 200% 100%;
  background-position: 100% 0;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  animation: fill-sweep 1400ms var(--ease) 260ms both;
}
@keyframes fill-sweep { to { background-position: 0 0; } }

.hero__actions { display: flex; flex-wrap: wrap; gap: var(--sp-4); }

/* Datos de apoyo bajo el hero. */
.hero__meta {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--sp-5);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line);
}
.hero__meta dt {
  font-size: var(--fs-eyebrow);
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  color: var(--text-faint);
  font-weight: 600;
  margin-bottom: 0.35rem;
}
.hero__meta dd { font-size: var(--fs-small); color: var(--text-muted); }

/* En móvil los tres datos entran en dos columnas y el tercero cae solo a una
   segunda fila: se lee como un error de maquetado, no como una tabla. Queda
   sólo el primero, en una línea limpia.

   No se pierde nada: "Rosario" ya está en el ojo de arriba y "por WhatsApp"
   es literalmente el botón de al lado. Son datos de apoyo para pantalla
   ancha, donde sobra el espacio horizontal. */
@media (max-width: 599px) {
  .hero__meta { grid-template-columns: 1fr; }
  .hero__meta > div:nth-child(n + 2) { display: none; }
}

/* Imagen principal. */
.hero__media {
  position: relative;
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
  overflow: hidden;
  aspect-ratio: 4 / 5;
  background: var(--surface-2);
}
@media (min-width: 1000px) { .hero__media { aspect-ratio: 5 / 6; } }
.hero__media img { width: 100%; height: 100%; object-fit: cover; object-position: 62% 50%; }

/* Chapa flotante sobre la imagen. */
.hero__badge {
  position: absolute;
  left: 0; bottom: 0;
  display: grid;
  gap: 0.15rem;
  padding: var(--sp-4) var(--sp-5);
  background: rgba(20, 21, 20, 0.72);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-top: 1px solid var(--line);
  border-right: 1px solid var(--line);
  border-radius: 0 var(--cut-sm) 0 0;
}
.hero__badge strong { font-size: var(--fs-small); font-weight: 600; }
.hero__badge span { font-size: 0.8125rem; color: var(--text-dim); }

/* Trazo suelto que descansa sobre la esquina cortada de la foto. Se oculta
   en pantallas angostas, donde no hay aire para que respire. */
.hero__squiggle { display: none; }
@media (min-width: 1000px) {
  .hero__squiggle {
    display: block;
    position: absolute;
    left: calc(50% - 3.5rem);
    top: -1.5rem;
    width: clamp(80px, 7vw, 116px);
    height: auto;
    color: var(--pulse);
    opacity: 0.9;
    z-index: 2;
    pointer-events: none;
  }
}



/* --- Banda "RBT Fill" -------------------------------------------------------
   El clip viene sobre negro puro, así que mix-blend-mode: screen borra el
   fondo solo y deja únicamente la silueta del logotipo: ni alfa ni recorte.
   El recorte a 16/5 saca el aire que el vídeo trae arriba y abajo, para que
   la banda no se coma media pantalla. */
.fill-band {
  position: relative;
  margin-top: clamp(2.5rem, 6vw, 4rem);
  mix-blend-mode: screen;
  opacity: 0.9;
  pointer-events: none;
}
.fill-band__video {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 5;
  object-fit: cover;
}
@media (max-width: 700px) {
  /* En móvil se recorta menos: el logotipo necesita más alto para no quedar
     como una franja delgada e ilegible. */
  .fill-band, .fill-band__video { aspect-ratio: 16 / 7; }
}


/* =============================================================================
   10. PILARES
   ============================================================================= */

.pillars { display: grid; gap: var(--sp-4); }
@media (min-width: 780px) { .pillars { grid-template-columns: repeat(3, 1fr); } }

/* Con dos tarjetas —el salto a los otros dos pilares en las páginas de
   servicio— la grilla de tres dejaría una columna vacía a la derecha, que se
   lee como un hueco y no como una decisión. */
@media (min-width: 780px) {
  .pillars--duo { grid-template-columns: repeat(2, 1fr); }
}

.pillar {
  --pillar-pad: clamp(1.5rem, 3vw, 2.25rem);
  position: relative;
  /* Flex, no grid: hace falta que .pillar__link empuje hacia abajo con
     margin-top:auto para que todas las tarjetas alineen su enlace. */
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--sp-4);
  padding: var(--pillar-pad);
  min-height: clamp(300px, 40vw, 420px);
  background: var(--surface-1);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
  overflow: hidden;
  isolation: isolate;
  transition: border-color var(--dur-2) var(--ease),
              background var(--dur-2) var(--ease),
              transform var(--dur-2) var(--ease);
}
.pillar:hover { border-color: var(--line-strong); background: var(--surface-2); transform: translateY(-4px); }

/* Barrido azul desde el borde inferior al pasar el cursor. */
.pillar::after {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: 3px;
  background: var(--pulse);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur-3) var(--ease);
  z-index: 2;
}
.pillar:hover::after { transform: scaleX(1); }

.pillar__index {
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: var(--tr-eyebrow);
  color: var(--pulse-bright);
  font-variant-numeric: tabular-nums;
}
.pillar__title { font-size: var(--fs-h3); text-transform: uppercase; letter-spacing: var(--tr-head); }
.pillar__body { color: var(--text-muted); font-size: var(--fs-small); max-width: 34ch; }
.pillar__link { margin-top: auto; }

/* Toda la tarjeta es clicable, manteniendo un único enlace accesible. */
.pillar__link::after { content: ""; position: absolute; inset: 0; z-index: 3; }

/* La foto es una franja real al pie de la tarjeta, a sangre, no un fondo
   fantasma detrás del texto: así se lee como composición y no como una imagen
   mal cargada. La máscara la disuelve hacia arriba para que entre en el
   carbón sin borde duro.

   Estaba mal calibrada: 104px de alto para fotos verticales (una es 560×995)
   dejaba a la vista una tira del 20% de la imagen, y encima iba al 75% de
   opacidad, con 40% de gris y con la máscara apagando el 58% de arriba. Entre
   las cuatro cosas no se veía nada — y como las mismas fotos se repiten más
   abajo en la página, el recorte tampoco aportaba variedad, sólo confusión.

   Ahora: franja más alta, la máscara resuelve en el 34% en lugar del 58%, y
   el gris baja a la mitad. Sigue siendo un apoyo apagado —no compite con el
   texto de la tarjeta—, pero se entiende qué muestra. */
.pillar__figure {
  position: relative;
  flex: none;
  width: calc(100% + var(--pillar-pad) * 2);
  height: clamp(168px, 15.5vw, 205px);
  margin: 0 calc(var(--pillar-pad) * -1) calc(var(--pillar-pad) * -1);
  overflow: hidden;
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 34%);
          mask-image: linear-gradient(180deg, transparent 0%, #000 34%);
}
.pillar__figure img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0.88;
  filter: grayscale(0.2) contrast(1.04);
  transition: opacity var(--dur-3) var(--ease),
              filter var(--dur-3) var(--ease),
              scale var(--dur-3) var(--ease);
}
.pillar:hover .pillar__figure img { opacity: 1; filter: none; scale: 1.04; }

/* En móvil la tarjeta ocupa el ancho entero, así que la franja puede ser un
   panel de verdad en vez de una tira. Es donde más se notaba el recorte. */
@media (max-width: 779px) {
  .pillar__figure { height: clamp(190px, 52vw, 260px); }
}


/* --- Dos alternativas a las tres tarjetas ---------------------------------

   El trío de .pillar aparecía cuatro veces: home, kinesiología, recovery y
   entrenamiento. Cuatro páginas con el mismo bloque en el mismo lugar es lo
   que hace que un sitio se lea como una plantilla rellenada.

   Se conserva en las dos donde la numeración significa algo —los tres pilares
   de la home y el recorrido consulta → alta de kinesiología, que sí es una
   secuencia— y las otras dos pasan a composiciones que dicen lo que el
   contenido dice. Ni tokens nuevos ni recursos nuevos: reglas, tipografía y
   los mismos colores. */

/* Listado editorial. Para enumerar alternativas, no pasos: en recovery los
   tres momentos son excluyentes entre sí y numerarlos 01-02-03 sugería un
   orden que no existe. Renglones separados por filetes, sin caja y sin hover:
   se lee como una lista, que es lo que es. */
.listing { display: grid; border-top: 1px solid var(--line); }
.listing__item {
  display: grid;
  gap: var(--sp-2);
  padding-block: clamp(1.35rem, 3.2vw, 2.25rem);
  border-bottom: 1px solid var(--line);
}
@media (min-width: 760px) {
  .listing__item {
    grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.35fr);
    align-items: baseline;
    column-gap: var(--sp-8);
  }
}
.listing__title {
  font-size: var(--fs-h3);
  text-transform: uppercase;
  letter-spacing: var(--tr-head);
  line-height: var(--lh-head);
}
.listing__body { color: var(--text-muted); max-width: 52ch; }

/* Conjunto tipográfico. Para lo simultáneo: el titular de entrenamiento dice
   "tres frentes que van juntos" y las tarjetas los numeraban como etapas. Sin
   caja, sin número y sin levantarse al pasar el mouse — tres columnas colgadas
   de un filete azul, que es el único acento que hace falta. */
.trio { display: grid; gap: var(--sp-6); }
@media (min-width: 760px) {
  .trio { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-7); }
}
.trio__item {
  display: grid;
  gap: var(--sp-3);
  align-content: start;
  padding-top: var(--sp-4);
  border-top: 2px solid var(--pulse);
}
.trio__title {
  font-size: var(--fs-h4);
  text-transform: uppercase;
  letter-spacing: var(--tr-head);
}
.trio__body { color: var(--text-muted); font-size: var(--fs-small); }


/* =============================================================================
   11. BLOQUES DE SERVICIO
   ============================================================================= */

.service { display: grid; gap: clamp(2rem, 5vw, 3.5rem); align-items: center; }

@media (min-width: 900px) {
  .service { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: clamp(2.5rem, 6vw, 5.5rem); }
  .service--reverse .service__media { order: -1; }
}

.service__copy { display: grid; gap: var(--sp-5); align-content: start; }

.service__title { text-transform: uppercase; }

/* Listado de prestaciones.
   Iba numerado 01, 02, 03… y era una promesa falsa: nadie hace magnetoterapia
   "después" de TENS por estar más abajo. Son un menú, no una secuencia, así
   que ahora es <ul> con una marca en lugar de un número. El pulso de líneas
   finas —que es lo que da el aire de la sección— se mantiene igual.

   El padding baja de sp-4 a sp-3 porque kinesiología tiene siete prestaciones
   reales: con el valor anterior el bloque de texto pasaba de largo a la foto
   de al lado y descuadraba la fila entera. */
.service__list { display: grid; gap: 0; list-style: none; }
.service__list li {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--sp-4);
  align-items: baseline;
  padding-block: var(--sp-3);
  border-top: 1px solid var(--line);
  font-size: var(--fs-small);
  color: var(--text-muted);
}
.service__list li:last-child { border-bottom: 1px solid var(--line); }
/* La marca es el cuadrado de acento del sitio a escala mínima, con el mismo
   corte de esquina del logo. No es un bullet de navegador. */
.service__list li::before {
  content: "";
  width: 7px;
  height: 7px;
  background: var(--pulse-bright);
  border-radius: 1px 3px 1px 1px;
  translate: 0 -1px;
}

/* -----------------------------------------------------------------------------
   Índice de prestaciones (landings de servicio)
   -----------------------------------------------------------------------------
   Una carta, no una grilla de tarjetas. Siete tarjetas iguales con un icono
   genérico cada una es el patrón que convierte cualquier sitio en plantilla
   comprada; una lista tipográfica con reglas finas se lee como un menú y deja
   que la palabra "Magnetoterapia" sea lo importante de la línea.

   Las reglas van arriba de cada ítem y abajo del contenedor, no al revés: con
   dos columnas y un número impar de prestaciones, la última fila queda coja, y
   el borde inferior del contenedor cierra el conjunto de punta a punta en vez
   de dejar media línea suelta.
   -------------------------------------------------------------------------- */
.specs {
  display: grid;
  list-style: none;
  border-bottom: 1px solid var(--line);
}
.specs li {
  display: flex;
  align-items: baseline;
  gap: var(--sp-4);
  padding-block: clamp(0.85rem, 2.2vw, 1.25rem);
  border-top: 1px solid var(--line);
  font-size: clamp(1.0625rem, 2.4vw, 1.375rem);
  letter-spacing: var(--tr-head);
  line-height: 1.25;
}
/* La marca es el cuadrado de acento a escala mínima, con el corte del logo.
   flex:none para que no se aplaste cuando el nombre ocupa dos líneas. */
.specs li::before {
  content: "";
  flex: none;
  width: 8px;
  height: 8px;
  background: var(--pulse);
  border-radius: 1px 4px 1px 1px;
  translate: 0 -0.15em;
}

@media (min-width: 760px) {
  .specs { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--sp-8); }
}

.service__media { position: relative; }

/* El cuadrado se aloja EN la esquina cortada, no flotando afuera.
   Para un radio R, un cuadrado de lado s a distancia d del vértice cabe entero
   en la zona vaciada si d + s ≤ R(1 − 1/√2) ≈ 0.293R. Acá se pasa a propósito:
   con 0.30R el cuadrado besa el arco y monta unos píxeles sobre la foto, que
   es como el manual apoya el cuadrado azul. Pegado al vértice exacto quedaría
   un punto suelto en el aire, sobre todo en móvil, donde --cut es chico —
   de ahí el mínimo absoluto. */
.service__media .accent-square {
  top: calc(var(--cut) * 0.10);
  right: calc(var(--cut) * 0.10);
  width: clamp(1.25rem, 2.4vw, 2rem);
}

/* --- Situaciones ------------------------------------------------------------
   "¿Te suena alguna de estas?" en las páginas de servicio. Es el bloque que
   hace que una landing de Ads funcione: la persona se reconoce antes de
   escribir. Son situaciones contadas desde el lado de quien consulta — no
   nombran diagnósticos ni prometen resultados.

   Tarjetas sobrias a propósito: seis cajas idénticas con icono serían el
   "carrusel de cards sin personalidad" que el manual pide evitar. Acá lo único
   que se repite es la muesca del logotipo, en chico.
   -------------------------------------------------------------------------- */
.cases {
  display: grid;
  gap: var(--sp-3);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 16.5rem), 1fr));
  margin: 0;
  padding: 0;
  list-style: none;
}
.cases li {
  display: flex;
  gap: var(--sp-3);
  padding: var(--sp-4);
  background: var(--surface-1);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  color: var(--text-muted);       /* 7.4:1 */
  font-size: var(--fs-small);
  line-height: 1.55;
}
.cases li::before {
  content: "";
  flex: none;
  width: 9px; height: 9px;
  margin-top: 0.5em;
  background: var(--pulse);
  border-radius: 2px 70% 2px 2px;  /* el corte de la marca, en miniatura */
}
.cases__note {
  margin-top: var(--sp-5);
  color: var(--text-muted);
  font-size: var(--fs-small);
  max-width: var(--measure);
}
.cases + .cases__note + .cluster { margin-top: var(--sp-5); }

/* El CTA del encabezado de las páginas de servicio: quien llega desde un
   anuncio no tiene por qué recorrer la página entera para encontrarlo. */
.page-head__inner .cluster { margin-top: clamp(1.5rem, 3vw, 2.25rem); }


/* =============================================================================
   12. INSTALACIONES
   ============================================================================= */

/* Bento de dos columnas ya en móvil. Apilar las cuatro piezas a ancho completo
   convertía la sección en ~1900px de scroll: es el caso exacto de "adaptar el
   desktop" en vez de diseñar para móvil. Las mismas clases de span sirven en
   los dos anchos porque cambia sólo el número de columnas. */
.facilities {
  display: grid;
  gap: var(--sp-4);
  grid-template-columns: repeat(2, 1fr);
  grid-auto-rows: minmax(118px, auto);
}
.facilities__item--lg   { grid-column: span 2; grid-row: span 2; }
.facilities__item--wide { grid-column: span 2; }

@media (min-width: 760px) {
  .facilities {
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: minmax(160px, auto);
  }
}

.facilities__item {
  position: relative;
  overflow: hidden;
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  background: var(--surface-2);
  min-height: 0;
}
.facilities__item img { width: 100%; height: 100%; object-fit: cover; }
.facilities__item figcaption {
  position: absolute;
  inset: auto 0 0 0;
  padding: var(--sp-5) var(--sp-4) var(--sp-4);
  background: linear-gradient(180deg, transparent, rgba(20, 21, 20, 0.9));
  font-size: var(--fs-small);
  font-weight: 500;
}

/* Panel de texto dentro de la grilla. Va en Soft Ash y no en Pulse Blue por
   dos razones: el azul no sostiene texto chico en AA (ver tokens), y un
   rectángulo claro entre fotos oscuras corta el bento mucho mejor que un
   bloque de color más. */
.facilities__panel {
  display: grid;
  align-content: center;
  gap: var(--sp-3);
  padding: clamp(1.5rem, 3vw, 2rem);
  background: var(--ash);
  color: var(--carbon);
}
.facilities__panel .eyebrow { color: var(--pulse-ink); }        /* 5.9:1 */
.facilities__panel p { color: rgba(20, 21, 20, 0.74); }

/* En móvil el panel ocupa una sola columna (~163px): la escala tipográfica
   baja para que "Kinesiología" no reviente la caja. */
.facilities__panel h3 { font-size: var(--fs-h4); overflow-wrap: break-word; }
.facilities__panel p  { font-size: 0.8125rem; }
@media (min-width: 760px) {
  .facilities__panel h3 { font-size: var(--fs-h3); }
  .facilities__panel p  { font-size: var(--fs-small); }
}


/* =============================================================================
   13. EQUIPO
   ============================================================================= */

/* auto-fill desde 160px: en 390px ya entran dos columnas, así los tres huecos
   de "foto pendiente" no ocupan tres pantallas enteras de scroll. */
.team {
  display: grid;
  gap: var(--sp-5);
  grid-template-columns: repeat(auto-fill, minmax(min(160px, 100%), 1fr));
}
@media (min-width: 980px) { .team { grid-template-columns: repeat(3, 1fr); } }

/* El equipo son dos kinesiólogos. Con la grilla de tres quedaría una columna
   vacía a la derecha; con dos columnas a todo ancho, cada retrato 4:5 pasaría
   los 400px y la sección se comería la página. Dos columnas acotadas y
   alineadas a la izquierda es lo que se lee como decisión. */
.team--duo { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (min-width: 700px) {
  .team--duo { grid-template-columns: repeat(2, minmax(0, 15.5rem)); justify-content: start; gap: var(--sp-6); }
}

/* El enlace a equipo.html cuelga de la grilla, que no tiene margen inferior. */
.team + .cluster { margin-top: var(--sp-6); }

.member { display: grid; gap: var(--sp-4); align-content: start; }
.member__photo {
  position: relative;
  aspect-ratio: 4 / 5;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  overflow: hidden;
  display: grid;
  place-items: center;
}
.member__photo img { width: 100%; height: 100%; object-fit: cover; }

/* Sin retrato todavía (RBT: "todavía no" hay fotos). El cartel de "FOTO
   PENDIENTE" servía mientras el sitio era un borrador; en un sitio publicado
   se lee como obra sin terminar y le resta seriedad justo en la sección que
   tiene que dar confianza.

   En su lugar va el monograma de la persona sobre la trama diagonal de marca.
   Se sostiene solo si la foto nunca llega, y el día que llegue se reemplaza el
   <div> entero por un <img>, sin tocar el CSS.

   Pulse sobre surface-2 da 3.96:1 — por debajo de 4.5, pero el monograma pasa
   los 40px y es decorativo: el nombre real está en el <h3> de abajo. */
.member__photo--mono {
  align-content: center;
  justify-items: center;
  background-image: repeating-linear-gradient(
    135deg,
    rgba(77, 118, 233, 0.09) 0 2px,
    transparent 2px 12px
  );
}
.member__photo--mono span {
  font-size: clamp(2.25rem, 8vw, 3.5rem);
  font-weight: 700;
  letter-spacing: var(--tr-head);
  line-height: 1;
  color: var(--pulse);
}
.member__name { font-size: var(--fs-h4); }
.member__role {
  font-size: var(--fs-eyebrow);
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  color: var(--pulse-bright);
  font-weight: 600;
}
.member__note { font-size: var(--fs-small); color: var(--text-dim); }

/* Áreas de trabajo. Todavía no las tenemos, así que en el HTML el bloque va
   comentado con el molde exacto; esto existe para que el día que lleguen se
   descomente y se escriban las palabras, sin tocar una línea de CSS.

   Dos o tres líneas cortas, no una bio. Es el mismo recurso del índice de
   prestaciones —el cuadrado de acento con el corte del logo— a escala de
   ficha: nada nuevo, y así la sección de equipo habla el idioma de las
   landings en vez de inventarse un componente propio. */
.member__areas {
  display: grid;
  gap: 0.45rem;
  list-style: none;
  margin-top: var(--sp-1);
}
.member__areas li {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  font-size: 0.8125rem;
  color: var(--text-muted);
  line-height: 1.35;
}
.member__areas li::before {
  content: "";
  flex: none;
  width: 6px;
  height: 6px;
  background: var(--pulse-bright);
  border-radius: 1px 3px 1px 1px;
  translate: 0 -0.15em;
}


/* =============================================================================
   14. BOB
   -----------------------------------------------------------------------------
   Bob aporta calidez frente a la dureza geométrica del logotipo. Aparece como
   apoyo (primera visita, FAQ, contacto, 404), nunca como protagonista.
   ============================================================================= */

.bob-block {
  display: grid;
  gap: clamp(2rem, 5vw, 3.5rem);
  align-items: center;
  padding: clamp(1.75rem, 4vw, 3.5rem);
  background: var(--surface-1);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
  position: relative;
  overflow: hidden;
}
@media (min-width: 820px) {
  .bob-block { grid-template-columns: minmax(0, 260px) minmax(0, 1fr); }
  .bob-block--wide { grid-template-columns: minmax(0, 320px) minmax(0, 1fr); }
}

/* Bob acompaña, no protagoniza: se le pone techo para que nunca sea el
   elemento más grande de su bloque, sobre todo en móvil. */
.bob-block__figure {
  position: relative;
  justify-self: center;
  width: min(180px, 42vw);
}
.bob-block__figure img { width: 100%; height: auto; }

/* Disco azul detrás de Bob, como en los avatares del manual. */
.bob-block__figure::before {
  content: "";
  position: absolute;
  left: 50%; bottom: 6%;
  translate: -50% 0;
  width: 100%;
  aspect-ratio: 1;
  background: radial-gradient(circle, var(--pulse-tint) 0%, transparent 70%);
  z-index: -1;
}

.bob-block__copy { display: grid; gap: var(--sp-4); align-content: start; }
/* El bloque de Bob es apoyo dentro de una sección, nunca su encabezado: el
   h2 se mantiene por semántica pero baja de escala tipográfica. */
.bob-block__copy > h2 { font-size: var(--fs-h3); }

/* Globo de diálogo. */
.bob-says {
  position: relative;
  padding: var(--sp-4) var(--sp-5);
  background: var(--surface-3);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  font-size: var(--fs-small);
  color: var(--text-muted);
}
.bob-says::before {
  content: "";
  position: absolute;
  left: var(--sp-5); top: -7px;
  width: 12px; height: 12px;
  background: var(--surface-3);
  border-left: 1px solid var(--line);
  border-top: 1px solid var(--line);
  rotate: 45deg;
}


/* =============================================================================
   15. FAQ
   ============================================================================= */

.faq { display: grid; }
.faq__item { border-top: 1px solid var(--line); }
.faq__item:last-child { border-bottom: 1px solid var(--line); }

.faq__q {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  width: 100%;
  padding-block: clamp(1.1rem, 2.4vw, 1.6rem);
  font-size: var(--fs-h4);
  font-weight: 600;
  letter-spacing: var(--tr-head);
  text-align: left;
  cursor: pointer;
  list-style: none;
  transition: color var(--dur-1) var(--ease);
}
.faq__q::-webkit-details-marker { display: none; }
.faq__q:hover { color: var(--pulse-bright); }

.faq__sign {
  position: relative;
  flex: none;
  width: 22px; height: 22px;
}
.faq__sign::before, .faq__sign::after {
  content: "";
  position: absolute;
  inset: 50% 0 auto 0;
  height: 2px;
  background: var(--pulse);
  translate: 0 -50%;
  transition: transform var(--dur-2) var(--ease);
}
.faq__sign::after { rotate: 90deg; }
.faq__item[open] .faq__sign::after { transform: scaleX(0); }

.faq__a {
  padding-bottom: var(--sp-5);
  padding-right: clamp(0rem, 6vw, 3.5rem);
  color: var(--text-muted);
  font-size: var(--fs-small);
  max-width: var(--measure);
}


/* =============================================================================
   16. CTA Y FORMULARIO
   ============================================================================= */

.cta-band {
  position: relative;
  overflow: hidden;
  background: var(--pulse);
  color: #fff;
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
  padding: clamp(2rem, 6vw, 4.5rem);
}
.cta-band__inner { position: relative; display: grid; gap: var(--sp-6); z-index: 1; }
@media (min-width: 900px) {
  .cta-band__inner { grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: var(--sp-8); }
}
.cta-band h2 { text-transform: uppercase; }
/* Sobre Pulse Blue sólo va tipografía grande: 1.5rem (=18pt) entra en el
   umbral de "texto grande" de WCAG, donde con 3:1 alcanza (acá 4.13:1). */
.cta-band p {
  max-width: 40ch;
  font-size: clamp(1.5rem, 2vw, 1.75rem);
  line-height: 1.35;
  letter-spacing: -0.015em;
  color: rgba(255, 255, 255, 0.94);
}
.cta-band .btn--solid { --btn-bg: #fff; --btn-bd: #fff; --btn-fg: var(--pulse-ink); }

/* Marca de agua del isotipo. */
.cta-band__mark {
  position: absolute;
  right: -4%; bottom: -28%;
  width: min(46%, 420px);
  color: #fff;
  opacity: 0.1;
  pointer-events: none;
}

/* --- Bloque de Instagram -------------------------------------------------- */

/* No es un feed y no puede serlo todavía: traer publicaciones reales necesita
   un token de la API y un backend, y maquetar una grilla de fotos que todavía
   no existen sería inventar contenido — posteos falsos, con epígrafes y likes
   falsos, en el sitio de un centro de salud.

   Lo que sí es real y se puede mostrar hoy es la identidad de la cuenta: el
   usuario como pieza tipográfica y la ficha de marca del manual —logotipo
   sobre carbón con el trazo cruzándolo—, que es exactamente lo que va a ver
   quien entre al perfil. Ni un dato fabricado.

   Va después de Ubicación, como cierre. En un centro que abre en octubre,
   "seguinos" es la segunda acción más útil del sitio: quien no está listo para
   pedir turno hoy igual se puede quedar cerca. */
.ig {
  display: grid;
  gap: clamp(1.5rem, 4vw, 2rem);
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
  padding: clamp(1.5rem, 5vw, 3.5rem);
}

.ig__copy { display: grid; gap: var(--sp-4); align-content: center; }

/* La ficha cambia de proporción, no de escala: cuadrada en escritorio —el
   formato del perfil— y apaisada arriba de todo en móvil, donde un cuadrado a
   ancho completo se comería 320px de alto antes de que se lea una palabra.
   Es el mismo objeto en el formato que le sirve a cada pantalla.

   Va con order y no reordenada en el HTML porque en el DOM tiene que ir
   después del texto: es decorativa (aria-hidden) y no puede encabezar la
   lectura de quien usa lector de pantalla. */
.ig__tile {
  order: -1;
  position: relative;
  overflow: hidden;
  display: grid;
  align-items: center;
  /* En la tira apaisada el logotipo va contra la derecha y el trazo entra por
     la izquierda: son los dos únicos elementos que hay y centrar el logotipo
     los superpone. Sobre el logotipo no puede pasar nada — es regla de marca,
     no gusto. En el cuadrado sobra alto y vuelve al centro. */
  justify-items: end;
  padding-inline: clamp(1rem, 4vw, 2rem);
  /* Tope de alto para la tira: en tablet el 16/7 sobre 612px de ancho daba
     268px y el trazo, que se mide por alto, crecía hasta comerse media ficha.
     El width:100% es necesario junto al tope — sin él el navegador resuelve el
     ancho desde la proporción y la tira se encoge a 402px dentro de la
     tarjeta, como si estuviera mal alineada. */
  width: 100%;
  aspect-ratio: 16 / 7;
  max-height: 11rem;
  background: var(--surface-0);
  border: 1px solid var(--line);
  border-radius: var(--r-xs) var(--cut-sm) var(--r-xs) var(--r-xs);
}
@media (min-width: 900px) {
  .ig {
    grid-template-columns: minmax(0, 1fr) clamp(13rem, 26vw, 23rem);
    align-items: center;
    column-gap: var(--sp-8);
  }
  .ig__tile { order: 0; aspect-ratio: 1; max-height: none; justify-items: center; padding-inline: 0; }
}

.ig__mark {
  position: relative;
  z-index: 1;
  width: min(42%, 9rem);
  color: var(--text);
  fill: currentColor;
}
/* En el cuadrado el logotipo sube y el trazo se queda con la mitad de abajo.
   Centrado quedaban uno encima del otro; corrido, la ficha se compone como las
   piezas del manual: marca arriba, trazo cruzando abajo. */
@media (min-width: 900px) {
  .ig__mark { width: 58%; align-self: start; margin-top: 20%; }
}

/* Dentro de la ficha el trazo es dibujo, no marca de agua: por eso va a 0.6 y
   no a la opacidad de fondo del resto del sitio. Se ancla al borde izquierdo y
   lo recorta el overflow de la ficha, igual que en las piezas del manual.
   En la tira apaisada se mide por alto —cruza de arriba a abajo— y en el
   cuadrado por ancho; con una sola medida se deformaría en una de las dos. */
.ig__trace {
  left: -10%;
  bottom: -30%;
  height: 130%;
  width: auto;
  opacity: 0.6;
}
@media (min-width: 900px) {
  .ig__trace { left: -15%; bottom: -20%; height: auto; width: 72%; }
}

/* El usuario es el elemento más grande del bloque, no un enlace al pie de un
   párrafo: es lo único que hay para copiar, buscar o tocar. */
.ig__handle {
  display: inline-flex;
  align-items: center;
  gap: 0.55em;
  width: fit-content;
  max-width: 100%;
  font-size: clamp(1.5rem, 4.5vw, 3.25rem);
  font-weight: 700;
  letter-spacing: var(--tr-head);
  line-height: 1.1;
  /* Es largo y en pantallas de 390px no entra: que corte por el punto antes
     que desbordar la caja. */
  overflow-wrap: anywhere;
  color: var(--text);
  transition: color var(--dur-1) var(--ease);
}
.ig__handle:hover { color: var(--pulse-bright); }

.ig__glyph {
  flex: none;
  width: 1em;
  height: 1em;
  fill: currentColor;
  color: var(--pulse);
  transition: color var(--dur-1) var(--ease);
}
.ig__handle:hover .ig__glyph { color: var(--pulse-bright); }

.ig__note { max-width: 52ch; color: var(--text-muted); font-size: var(--fs-small); }

/* --- Formulario ---------------------------------------------------------- */

.form { display: grid; gap: var(--sp-5); }
.form__row { display: grid; gap: var(--sp-5); }
@media (min-width: 680px) { .form__row--2 { grid-template-columns: 1fr 1fr; } }

.field { display: grid; gap: 0.5rem; }
.field label { font-size: var(--fs-small); font-weight: 500; }
.field label .req { color: var(--pulse-bright); }

.field input, .field select, .field textarea {
  width: 100%;
  padding: 0.9rem 1rem;
  background: var(--surface-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  color: var(--text);
  font-size: var(--fs-small);
  transition: border-color var(--dur-1) var(--ease), background var(--dur-1) var(--ease);
}
.field textarea { resize: vertical; min-height: 130px; }
.field input::placeholder, .field textarea::placeholder { color: var(--text-faint); }
.field input:hover, .field select:hover, .field textarea:hover { border-color: rgba(226, 225, 225, 0.3); }
.field input:focus, .field select:focus, .field textarea:focus {
  outline: none;
  border-color: var(--pulse);
  background: var(--surface-3);
  box-shadow: 0 0 0 3px var(--pulse-tint);
}

/* Select con cheurón propio. */
.field select {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='none' stroke='%23E2E1E1' stroke-width='1.6'%3E%3Cpath d='M1 1.5 6 6.5l5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 1rem center;
  background-size: 12px;
  padding-right: 2.5rem;
}
.field select option { background: var(--surface-2); color: var(--text); }

.field__hint { font-size: 0.8125rem; color: var(--text-dim); }
.field__error {
  font-size: 0.8125rem;
  color: #FF8A8A;
  display: none;
}
.field.is-invalid input,
.field.is-invalid select,
.field.is-invalid textarea { border-color: #FF8A8A; }
.field.is-invalid .field__error { display: block; }

.form__note { font-size: 0.8125rem; color: var(--text-dim); }

/* Confirmación tras enviar. */
.form__done {
  display: none;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-5);
  background: var(--surface-2);
  border: 1px solid var(--pulse);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
}
.form__done.is-visible { display: flex; }
.form__done img { width: 64px; height: auto; flex: none; }


/* =============================================================================
   17. UBICACIÓN
   ============================================================================= */

.location { display: grid; gap: clamp(2rem, 5vw, 3.5rem); }
@media (min-width: 900px) {
  .location { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); align-items: start; }
}

.info-list { display: grid; }
.info-list div {
  display: grid;
  gap: 0.35rem;
  padding-block: var(--sp-4);
  border-top: 1px solid var(--line);
}
.info-list div:last-child { border-bottom: 1px solid var(--line); }
.info-list dt {
  font-size: var(--fs-eyebrow);
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  color: var(--text-faint);
  font-weight: 600;
}
.info-list dd { font-size: var(--fs-small); }

.map {
  position: relative;
  aspect-ratio: 16 / 11;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut) var(--r-sm) var(--r-sm);
  overflow: hidden;
  display: grid;
  place-items: center;
  text-align: center;
  padding: var(--sp-5);
}
/* Con el embed adentro el contenedor deja de ser una tarjeta con un mensaje
   centrado y pasa a ser un marco: el mapa va a sangre, sin relleno. El corte
   de la esquina se mantiene porque lo aplica overflow:hidden del padre. */
.map--embed { padding: 0; }
.map iframe { width: 100%; height: 100%; border: 0; display: block; }

/* Google pinta el mapa en claro y el sitio es oscuro: un rectángulo blanco a
   pleno rompe la página. Un filtro suave lo integra sin volverlo ilegible —
   no se invierte, sólo se baja el brillo y se sube el contraste. Al pasar
   por encima vuelve a su color real, que es cuando alguien lo va a leer. */
.map--embed iframe {
  filter: brightness(0.92) saturate(0.9) contrast(1.05);
  transition: filter var(--dur-3) var(--ease);
}
.map--embed:hover iframe,
.map--embed:focus-within iframe { filter: none; }

.map__placeholder { display: grid; gap: var(--sp-3); justify-items: center; color: var(--text-dim); }
.map__placeholder svg { color: var(--pulse); }


/* =============================================================================
   18. FOOTER
   ============================================================================= */

.site-footer {
  background: #101110;
  border-top: 1px solid var(--line);
  padding-top: clamp(3rem, 7vw, 5rem);
}

.footer__grid { display: grid; gap: var(--sp-7); }
@media (min-width: 760px)  { .footer__grid { grid-template-columns: 1.4fr 1fr 1fr; } }
@media (min-width: 1060px) { .footer__grid { grid-template-columns: 1.6fr 1fr 1fr 1.2fr; } }

.footer__brand { display: grid; gap: var(--sp-4); align-content: start; }
.footer__brand svg { width: 108px; color: var(--ash); fill: currentColor; }
.footer__brand p { font-size: var(--fs-small); color: var(--text-dim); max-width: 34ch; }

.footer__col h2 {
  font-size: var(--fs-eyebrow);
  letter-spacing: var(--tr-eyebrow);
  text-transform: uppercase;
  color: var(--text-faint);
  font-weight: 600;
  margin-bottom: var(--sp-4);
}
.footer__col li + li { margin-top: 0.7rem; }
/* Las entradas que todavía no son enlace (dirección, horarios) igualan la
   escala de las que sí lo son. */
.footer__col li > .dim { font-size: var(--fs-small); }
.footer__col a {
  font-size: var(--fs-small);
  color: var(--text-muted);
  transition: color var(--dur-1) var(--ease);
}
.footer__col a:hover { color: var(--pulse-bright); }

/* El padding de abajo no es aire de diseño: es el hueco del CTA flotante. Sin
   él la cápsula queda apoyada sobre la línea de matrículas —en 1440 la corta
   por la mitad— y ésa es justamente la línea que identifica al profesional
   responsable. Se calcula con los tokens del FAB, no a ojo. */
.footer__bottom {
  margin-top: clamp(2.5rem, 6vw, 4rem);
  padding-block: var(--sp-5) calc(var(--sp-5) + var(--fab-inset) + var(--fab-h));
  border-top: 1px solid var(--line);
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-4);
  align-items: center;
  justify-content: space-between;
  font-size: 0.8125rem;
  color: var(--text-faint);
}

/* El gap va en clamp por una franja de 17px de ancho: entre 760 y 776 el pie
   pasa a tres columnas y la del logo queda en 242-248px, contra los 248,4 que
   piden cinco iconos de 42 más cuatro huecos de 9,6. El quinto —WhatsApp— caía
   solo a una segunda fila, y 768 es el iPad en vertical, o sea justo en el
   medio de la franja. Achicando el hueco en esos anchos entran los cinco.
   De 1010 para arriba 0.95vw ya supera el tope, así que el pie de escritorio
   queda exactamente igual que antes. */
.social { display: flex; flex-wrap: wrap; gap: clamp(0.4rem, 0.95vw, 0.6rem); }

/* Glifos oficiales, de relleno sólido. Los anteriores eran contornos a 1,7px
   que a 18px se empastaban y, sobre todo, no eran los logos reales de cada
   red: se leían como iconos genéricos de librería. Un logo de marca ajena se
   usa como la marca lo publica o no se usa.

   Tamaño óptico, no matemático: Instagram y LinkedIn ocupan su caja entera,
   TikTok y WhatsApp respiran más, así que van un punto más grandes para que
   los cinco pesen igual en la fila. */
.social svg { width: 17px; height: 17px; fill: currentColor; stroke: none; }
/* Seleccionados por el icono y no por posición: si mañana se borra una red
   porque RBT no la usa, el resto no se descoloca. Sin soporte de :has() la
   regla se ignora entera y los cinco quedan a 17px, que es aceptable. */
.social a:has(use[href="#i-tiktok"]) svg,
.social a:has(use[href="#i-whatsapp"]) svg { width: 18px; height: 18px; }

.social a {
  display: grid;
  place-items: center;
  width: 42px; height: 42px;
  background: var(--surface-1);
  border: 1px solid var(--line);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  color: var(--text-dim);
  transition: color var(--dur-1) var(--ease),
              border-color var(--dur-1) var(--ease),
              background var(--dur-1) var(--ease),
              transform var(--dur-1) var(--ease);
}
.social a:hover {
  color: #fff;
  background: var(--pulse);
  border-color: var(--pulse);
  transform: translateY(-2px);
}

/* --- Bob flotante -----------------------------------------------------------
   Reemplaza al botón de WhatsApp suelto: es el mismo enlace, pero con Bob
   apoyado encima y desbordando la cápsula por arriba. La imagen no está
   recortada ni retocada, sólo escalada dentro de su caja.

   Sin JS es un enlace normal a contacto.html; con JS abre el asistente. Por
   eso el nombre accesible sale del <span> visible y no de un aria-label: en
   móvil el texto se oculta a la vista pero sigue en el árbol de accesibilidad.
   -------------------------------------------------------------------------- */
.bob-fab {
  position: fixed;
  right: var(--fab-inset);
  bottom: var(--fab-inset);
  z-index: 90;
  display: inline-flex;
  align-items: center;
  min-height: var(--fab-h);
  padding: 0 1.15rem 0 3.6rem;
  background: var(--pulse-deep);  /* texto chico en blanco → 5.58:1 */
  color: #fff;
  font-size: var(--fs-small);
  font-weight: 600;
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  box-shadow: var(--shadow-2);
  transition: transform var(--dur-2) var(--ease), background var(--dur-2) var(--ease);
}
.bob-fab:hover { background: var(--pulse-ink); transform: translateY(-3px); }

.bob-fab__bob {
  position: absolute;
  left: 0.45rem;
  bottom: 0.3rem;
  width: 46px;
  height: auto;
  filter: drop-shadow(0 6px 12px rgba(0, 0, 0, 0.45));
  transform-origin: 50% 100%;
  transition: transform var(--dur-2) var(--ease);
}
.bob-fab:hover .bob-fab__bob { transform: rotate(-6deg); }
.bob-fab.is-open .bob-fab__bob { transform: rotate(4deg) scale(0.94); }

@media (max-width: 599px) {
  /* El texto sale de la vista pero no del árbol de accesibilidad: sigue
     siendo el nombre del botón. */
  .bob-fab { padding-right: 0.8rem; padding-left: 3.35rem; }
  .bob-fab__label {
    position: absolute; width: 1px; height: 1px;
    padding: 0; margin: -1px; overflow: hidden;
    clip-path: inset(50%); white-space: nowrap;
  }
}


/* --- Asistente de Bob -------------------------------------------------------
   El panel lo construye js/main.js, no los siete HTML: no es contenido, es
   una herramienta, y duplicarlo en cada página sólo daría siete lugares donde
   equivocarse. Todo lo que Bob "dice" vive en el array PASOS del script.
   -------------------------------------------------------------------------- */
/* --teclado lo escribe js/main.js con lo que mide el viewport visual: cuánto
   del alto de la ventana se está comiendo el teclado del teléfono. Sin esto el
   panel queda fijo al viewport de layout, que no se entera de que el teclado
   está abierto, y el campo del nombre termina debajo de las teclas (medido en
   390x844: el input llegaba a 684px y el teclado empieza cerca de 508px).
   Vale 0 en escritorio y mientras no haya nada enfocado. */
.bob-chat {
  position: fixed;
  right: var(--fab-inset);
  bottom: calc(var(--fab-inset) + var(--fab-h) + 0.85rem + var(--teclado, 0px));
  z-index: 95;
  display: flex;
  flex-direction: column;
  width: min(360px, calc(100vw - 2 * var(--fab-inset)));
  max-height: min(560px, calc(100vh - 9rem - var(--teclado, 0px)));
  transition: bottom var(--dur-2) var(--ease);
  background: var(--surface-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-sm) var(--cut-sm) var(--r-sm) var(--r-sm);
  box-shadow: var(--shadow-3);
  overflow: hidden;
  animation: bob-in var(--dur-2) var(--ease) both;
}
.bob-chat[hidden] { display: none; }

@keyframes bob-in {
  from { opacity: 0; transform: translateY(12px) scale(0.98); }
}

.bob-chat__head {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-4);
  background: var(--surface-3);
  border-bottom: 1px solid var(--line);
}
.bob-chat__avatar {
  flex: none;
  width: 38px; height: 38px;
  border-radius: 50%;
  /* Encuadre en la cabeza: la imagen es de cuerpo entero. */
  object-fit: cover;
  object-position: 50% 4%;
  background: var(--pulse-deep);
}
.bob-chat__who { display: grid; line-height: 1.3; }
.bob-chat__who b { font-size: var(--fs-small); font-weight: 600; }
.bob-chat__who small { font-size: 0.75rem; color: var(--text-dim); }

.bob-chat__close {
  margin-left: auto;
  display: grid; place-items: center;
  width: 32px; height: 32px;
  border: 1px solid var(--line-strong);
  border-radius: var(--r-xs);
  background: transparent;
  color: var(--text-muted);
  cursor: pointer;
  transition: color var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease);
}
.bob-chat__close:hover { color: var(--text); border-color: var(--text-muted); }

.bob-chat__log {
  flex: 1 1 auto;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  padding: var(--sp-4);
  font-size: var(--fs-small);
  line-height: 1.55;
}

.bob-msg {
  max-width: 88%;
  padding: 0.55rem 0.8rem;
  border-radius: var(--r-sm);
  animation: bob-in var(--dur-1) var(--ease) both;
}
.bob-msg--bob {                       /* Soft Ash sobre surface-3 → 11:1 */
  align-self: flex-start;
  background: var(--surface-3);
  border-bottom-left-radius: 2px;
}
.bob-msg--yo {                        /* blanco sobre pulse-deep → 5.58:1 */
  align-self: flex-end;
  background: var(--pulse-deep);
  color: #fff;
  border-bottom-right-radius: 2px;
}
.bob-msg--nota {
  /* La previsualización del mensaje: se lee como un borrador, no como Bob. */
  align-self: stretch;
  max-width: none;
  white-space: pre-line;
  background: transparent;
  border: 1px dashed var(--line-strong);
  color: var(--text-muted);
  font-size: 0.8125rem;
}

.bob-chat__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  padding: 0 var(--sp-4) var(--sp-4);
}
.bob-chat__actions:empty { display: none; }

.bob-opt {
  padding: 0.5rem 0.9rem;
  border: 1px solid var(--pulse-bright);
  border-radius: var(--r-pill);
  background: transparent;
  color: var(--pulse-bright);          /* 6.2:1 sobre el carbón */
  font: inherit;
  font-size: var(--fs-small);
  font-weight: 500;
  cursor: pointer;
  transition: background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
}
.bob-opt:hover { background: var(--pulse-bright); color: var(--carbon); }
.bob-opt--go {
  flex: 1 1 auto;
  text-align: center;
  background: var(--pulse-deep);
  border-color: var(--pulse-deep);
  color: #fff;
  font-weight: 600;
}
.bob-opt--go:hover { background: var(--pulse-ink); border-color: var(--pulse-ink); color: #fff; }
.bob-opt--ghost { border-color: var(--line-strong); color: var(--text-dim); }
.bob-opt--ghost:hover { background: transparent; border-color: var(--text-muted); color: var(--text); }

.bob-form { display: flex; gap: var(--sp-2); width: 100%; }
.bob-form input {
  flex: 1 1 auto;
  min-width: 0;
  padding: 0.5rem 0.8rem;
  background: var(--surface-0);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-pill);
  color: var(--text);
  font: inherit;
  font-size: var(--fs-small);
}
.bob-form input::placeholder { color: var(--text-faint); }
.bob-form input:focus-visible { border-color: var(--pulse-bright); outline: none; }

.bob-chat__foot {
  padding: var(--sp-3) var(--sp-4);
  border-top: 1px solid var(--line);
  background: var(--surface-1);
  color: var(--text-dim);              /* 5.9:1 — texto chico, hace falta */
  font-size: 0.75rem;
  line-height: 1.5;
}
/* Sin nowrap el enlace se parte entre "Prefiero" y "escribir yo", que se lee
   como dos cosas distintas. */
.bob-chat__foot a { color: var(--pulse-bright); text-decoration: underline; white-space: nowrap; }

@media (max-width: 480px) {
  /* En pantalla chica el panel ocupa el ancho útil: media columna flotando
     en un teléfono no se lee. */
  .bob-chat {
    left: var(--fab-inset);
    width: auto;
    max-height: calc(100dvh - 10rem - var(--teclado, 0px));
  }
}


/* =============================================================================
   19. PÁGINAS INTERNAS
   ============================================================================= */

.page-head {
  position: relative;
  padding-top: calc(var(--header-h) + clamp(2.5rem, 7vw, 4.5rem));
  padding-bottom: clamp(2.5rem, 6vw, 4rem);
  border-bottom: 1px solid var(--line);
  overflow: hidden;
}
.page-head::before {
  content: "";
  position: absolute;
  top: -40%; right: -5%;
  width: min(60vw, 620px);
  aspect-ratio: 1;
  background: radial-gradient(circle, var(--pulse-glow) 0%, transparent 70%);
  opacity: 0.4;
  pointer-events: none;
}
.page-head__inner { position: relative; display: grid; gap: var(--sp-5); }
.page-head h1 { text-transform: uppercase; letter-spacing: var(--tr-display); }

.breadcrumbs { font-size: 0.8125rem; color: var(--text-faint); }
.breadcrumbs ol { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
.breadcrumbs li { display: flex; align-items: center; gap: 0.5rem; }
.breadcrumbs li + li::before { content: "/"; color: var(--text-faint); }
.breadcrumbs a { color: var(--text-dim); transition: color var(--dur-1) var(--ease); }
.breadcrumbs a:hover { color: var(--pulse-bright); }
.breadcrumbs [aria-current="page"] { color: var(--text-muted); }

/* --- 404 ------------------------------------------------------------------ */

.error-page {
  min-height: calc(100svh - var(--header-h));
  display: grid;
  align-items: center;
  padding-block: clamp(3rem, 10vw, 7rem) var(--sp-9);
  padding-top: calc(var(--header-h) + 3rem);
}
.error-page__grid { display: grid; gap: clamp(2rem, 6vw, 4rem); align-items: center; }
@media (min-width: 820px) {
  .error-page__grid { grid-template-columns: minmax(0, 1fr) minmax(0, 0.7fr); }
}
.error-page__code {
  font-size: var(--fs-display);
  line-height: 0.85;
  letter-spacing: var(--tr-display);
  font-weight: 700;
  color: var(--pulse);
}
/* 46vw y no 70vw: en 390px Bob se comía tres cuartos del ancho y pasaba a ser
   el protagonista de la página en vez del mensaje de error. */
.error-page__figure { justify-self: center; width: min(320px, 46vw); position: relative; }
.error-page__figure::before {
  content: "";
  position: absolute;
  inset: 10% 0 0 0;
  background: radial-gradient(circle, var(--pulse-tint) 0%, transparent 68%);
  z-index: -1;
}


/* =============================================================================
   20. ANIMACIÓN Y SCROLL REVEAL
   ============================================================================= */

[data-reveal] {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity var(--dur-3) var(--ease), transform var(--dur-3) var(--ease);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}
[data-reveal].is-visible { opacity: 1; transform: none; }

/* Sin JS no debe quedar contenido invisible. */
.no-js [data-reveal] { opacity: 1; transform: none; }

/* Respeto estricto por prefers-reduced-motion. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal] { opacity: 1; transform: none; }
  /* Sin el animation:none el barrido sigue corriendo: no se ve, porque ya no
     hay degradado que mover, pero el compositor lo anima igual. */
  .hero__fill {
    background: none; -webkit-background-clip: initial; background-clip: initial;
    color: var(--pulse); animation: none;
  }
  .btn:hover, .pillar:hover, .bob-fab:hover, .social a:hover { transform: none; }
  .bob-fab:hover .bob-fab__bob, .bob-fab.is-open .bob-fab__bob { transform: none; }
  .bob-chat, .bob-msg { animation: none; }
  /* El vídeo se reemplaza por su último fotograma: se ve el logotipo completo
     y la composición no cambia, pero nada se mueve. js/main.js además evita
     que se descargue. */
  .fill-band__video { display: none; }
  .fill-band {
    aspect-ratio: 16 / 5;
    background: url("../assets/video/rbt-fill-poster.webp") center / 100% auto no-repeat;
  }
}


/* =============================================================================
   21. UTILIDADES
   ============================================================================= */

.u-center      { text-align: center; }
.u-mt-auto     { margin-top: auto; }
.u-max-measure { max-width: var(--measure); }
.u-relative    { position: relative; }

@media print {
  .site-header, .nav-drawer, .bob-chat, .bob-fab, .squiggle { display: none !important; }
  body { background: #fff; color: #000; }
}
