/* ==========================================================================
   KineON — kineon.cl
   Sistema de diseño construido sobre el turquesa del logo (#02BFB8).
   Orden: tokens · base · utilidades · componentes · secciones · responsive
   ========================================================================== */

/* --------------------------------------------------------------- 1. TOKENS */
:root {
  /* Marca */
  --brand: #02bfb8;
  --brand-600: #05a49e;
  --brand-700: #077e7a;
  --brand-soft: #e6f9f7;
  --brand-glow: rgba(2, 191, 184, 0.28);

  /* Neutros */
  --ink: #072a2d;
  --ink-2: #0f3d41;
  --text: #172f32;
  --muted: #5b7679;
  --surface: #ffffff;
  --surface-soft: #f3faf9;
  --surface-alt: #e9f6f4;
  --border: #dcecea;

  /* Apoyo */
  --whatsapp: #25d366;
  --whatsapp-dark: #1da851;
  --star: #f5b301;

  /* Formas */
  --r-sm: 0.5rem;
  --r-md: 0.875rem;
  --r-lg: 1.25rem;
  --r-xl: 1.75rem;
  --r-pill: 9999px;

  /* Sombras: suaves y teñidas, no grises planas */
  --sh-xs: 0 1px 2px rgba(7, 42, 45, 0.06);
  --sh-sm: 0 2px 8px rgba(7, 42, 45, 0.07);
  --sh-md: 0 8px 24px rgba(7, 42, 45, 0.09);
  --sh-lg: 0 20px 48px rgba(7, 42, 45, 0.13);

  /* Ritmo */
  --section-y: clamp(3.5rem, 7vw, 6.5rem);
  --gap: clamp(1.25rem, 2.5vw, 2rem);
  --header-h: 84px;

  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* ----------------------------------------------------------------- 2. BASE */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 1rem);
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  font-family: "Lexend", system-ui, -apple-system, "Segoe UI", sans-serif;
  font-size: clamp(1rem, 0.97rem + 0.15vw, 1.0625rem);
  line-height: 1.65;
  color: var(--text);
  background-color: var(--surface);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
  transition: background-color 0.3s var(--ease), color 0.3s var(--ease);
}

h1, h2, h3, h4 {
  margin: 0;
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--ink);
  font-weight: 700;
}

h1 { font-size: clamp(2rem, 1.3rem + 3.1vw, 3.5rem); font-weight: 800; }
h2 { font-size: clamp(1.65rem, 1.25rem + 1.7vw, 2.5rem); }
h3 { font-size: clamp(1.15rem, 1.05rem + 0.45vw, 1.35rem); }

p { margin: 0 0 1rem; }
p:last-child { margin-bottom: 0; }

a { color: var(--brand-700); }

img {
  max-width: 100%;
  height: auto;
  display: block;
}

ul { margin: 0; padding: 0; list-style: none; }

button { font: inherit; }

:focus-visible {
  outline: 3px solid var(--brand);
  outline-offset: 3px;
  border-radius: 4px;
}

/* ------------------------------------------------------------ 3. UTILIDADES */
.container {
  width: 100%;
  max-width: 1200px;
  margin-inline: auto;
  padding-inline: clamp(1rem, 4vw, 2rem);
}

.container--narrow { max-width: 820px; }

.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  left: -9999px;
  z-index: 300;
  background: var(--surface);
  color: var(--brand-700);
  padding: 0.75rem 1.25rem;
  border-radius: var(--r-sm);
  box-shadow: var(--sh-md);
  font-weight: 600;
  text-decoration: none;
}
.skip-link:focus { left: 1rem; top: 1rem; }

/* Aparición al hacer scroll.
   El contenido es VISIBLE por defecto y sólo se oculta cuando el JavaScript
   confirma que puede animarlo (clase .js-anim en <html>). Así, si el script
   falla, si el observador no dispara o si un rastreador no ejecuta JS, la
   página se ve completa igual. Ocultar por defecto sería arriesgar la
   página entera a cambio de una animación. */
.reveal { opacity: 1; }

html.js-anim .reveal {
  transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
}

html.js-anim .reveal:not(.is-visible) {
  opacity: 0;
  transform: translateY(18px);
}

/* ------------------------------------------------------- 4. TIPOS DE SECCIÓN */
.section { padding-block: var(--section-y); }

/* Las secciones que están fuera de la pantalla no se maquetan ni se pintan
   hasta que el usuario se acerca a ellas. En una página larga como esta, con
   nueve secciones y muchas fotos, es lo que más se nota al desplazarse: el
   navegador deja de rehacer el trabajo de toda la página en cada cuadro.
   `contain-intrinsic-size` es la altura que se le supone mientras está
   guardada; sin ese dato la barra de desplazamiento saltaría al entrar cada
   sección. No se aplica a las dos primeras secciones ni al hero, que se ven
   de entrada. */
#equipo,
#instalaciones,
#como-llegar,
#preguntas {
  content-visibility: auto;
  contain-intrinsic-size: auto 900px;
}
.section--soft { background: var(--surface-soft); }
.section--alt { background: var(--surface-alt); }

.section-head {
  max-width: 720px;
  margin: 0 auto clamp(2.25rem, 4vw, 3.5rem);
  text-align: center;
}

.eyebrow {
  display: inline-block;
  margin-bottom: 0.85rem;
  padding: 0.35rem 0.9rem;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-pill);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

/* Los subtítulos de sección quedan centrados, no justificados. Son de una o
   dos líneas bajo un título centrado: al justificarlos, la primera línea se
   estira de borde a borde y la segunda queda corta y suelta, peleando con el
   eje centrado. Centrado el bloque se lee como una unidad. */
.section-head p {
  margin-top: 1rem;
  color: var(--muted);
  font-size: 1.075rem;
  text-wrap: pretty;
}

/* Texto justificado, pero sólo donde la columna da el ancho para hacerlo bien.
   Justificar reparte el sobrante entre las palabras de la línea: mientras más
   angosta la columna y más largas las palabras, más se abren esos huecos. En
   estos dos bloques la línea pasa de las 60 letras y el texto queda parejo y
   con el borde derecho limpio.
   En las tarjetas de servicio, los pasos y los testimonios NO se justifica: son
   columnas de ~40 letras y con palabras como "musculoesquelética" se abrían
   ríos de espacio en blanco entre palabras, peor que el borde irregular que
   venían a arreglar. La partición con guiones ayuda, pero Chrome descarga los
   diccionarios aparte y no se puede contar con ella.
   El <html lang="es-CL"> es lo que le permite al navegador partir en español. */
.about__text p,
.faq__answer {
  text-align: justify;
  -webkit-hyphens: auto;
  hyphens: auto;
}

/* ------------------------------------------------------------- 5. BOTONES */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.55rem;
  padding: 0.9rem 1.6rem;
  border: 2px solid transparent;
  border-radius: var(--r-pill);
  font-weight: 700;
  font-size: 1rem;
  line-height: 1.2;
  text-decoration: none;
  cursor: pointer;
  transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease),
              background-color 0.25s var(--ease), color 0.25s var(--ease);
}

.btn i { font-size: 1.1em; }

.btn:hover { transform: translateY(-2px); }
.btn:active { transform: translateY(0); }

.btn--primary {
  background: var(--brand);
  color: #04282a;
  box-shadow: 0 6px 18px var(--brand-glow);
}
.btn--primary:hover {
  background: var(--brand-600);
  box-shadow: 0 12px 28px var(--brand-glow);
}

.btn--whatsapp {
  background: var(--whatsapp);
  color: #08301a;
  box-shadow: 0 6px 18px rgba(37, 211, 102, 0.3);
}
.btn--whatsapp:hover { background: var(--whatsapp-dark); color: #fff; }

.btn--ghost {
  background: transparent;
  color: var(--brand-700);
  border-color: var(--brand);
}
.btn--ghost:hover { background: var(--brand); color: #04282a; }

.btn--on-dark {
  background: rgba(255, 255, 255, 0.12);
  color: #fff;
  border-color: rgba(255, 255, 255, 0.45);
  backdrop-filter: blur(6px);
}
.btn--on-dark:hover { background: rgba(255, 255, 255, 0.22); }

.btn--sm { padding: 0.6rem 1.1rem; font-size: 0.9rem; }
.btn--block { width: 100%; }

/* Latido del botón de agendar: es la acción que queremos que se note, así que
   no se detiene nunca, tampoco al pasar el cursor.
   La onda de color va en box-shadow y no en un pseudo-elemento escalado: el
   botón es una píldora ancha, y un scale la engordaría mucho más a lo ancho
   que a lo alto. El box-shadow crece siguiendo el borde redondeado, parejo
   por los cuatro lados, y además no ocupa espacio en el layout. */
.btn--pulse {
  animation: latido 1.4s var(--ease) infinite;
}

@keyframes latido {
  0% {
    transform: scale(1);
    box-shadow: 0 6px 18px var(--brand-glow), 0 0 0 0 rgba(2, 191, 184, 0.6);
  }
  45% {
    transform: scale(1.06);
    box-shadow: 0 10px 26px var(--brand-glow), 0 0 0 11px rgba(2, 191, 184, 0);
  }
  100% {
    transform: scale(1);
    box-shadow: 0 6px 18px var(--brand-glow), 0 0 0 0 rgba(2, 191, 184, 0);
  }
}

.btn-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.85rem;
}

.link-arrow {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  font-weight: 700;
  color: var(--brand-700);
  text-decoration: none;
}
.link-arrow i { transition: transform 0.25s var(--ease); }
.link-arrow:hover i { transform: translateX(4px); }

/* ------------------------------------------------------------ 6. BARRA SUP. */
.topbar {
  background: var(--ink);
  color: #cfe9e7;
  font-size: 0.83rem;
}

.topbar__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  min-height: 40px;
  padding-block: 0.4rem;
}

.topbar__list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.5rem;
}

.topbar__item {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
}

.topbar__item i { color: var(--brand); }

/* Separador entre los dos teléfonos. Va como <span> y no como texto suelto para
   poder atenuarlo, y con aria-hidden para que el lector de pantalla no diga
   "barra vertical" entre un número y otro. */
.topbar__sep {
  opacity: 0.4;
  margin-inline: 0.1rem;
}

.topbar a { color: inherit; text-decoration: none; }
.topbar a:hover { color: #fff; text-decoration: underline; }

/* ------------------------------------------------------------ 7. CABECERA */
/* Sin backdrop-filter a propósito. La cabecera va fija y cubre todo el ancho:
   con desenfoque de fondo, el navegador tiene que volver a desenfocar la franja
   completa en cada cuadro del scroll, y ahí se van los fotogramas. Encima el
   fondo estaba al 92% de opacidad, así que el desenfoque casi no se veía.
   Fondo sólido: se ve prácticamente igual y el scroll queda limpio. */
.header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  transition: box-shadow 0.3s var(--ease);
}

.header.is-stuck { box-shadow: var(--sh-sm); }

.header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  min-height: var(--header-h);
  /* Sin esto, un hijo ancho empuja la cabecera más allá del viewport y
     arrastra todo el documento hacia la derecha. */
  min-width: 0;
  flex-wrap: nowrap;
}

.header__logo { display: inline-flex; flex-shrink: 0; }
.header__logo img { height: 60px; width: auto; }

.nav {
  display: flex;
  align-items: center;
  gap: clamp(1rem, 2vw, 1.9rem);
}

.nav__link {
  position: relative;
  padding-block: 0.35rem;
  color: var(--text);
  font-size: 0.95rem;
  font-weight: 500;
  text-decoration: none;
  white-space: nowrap;
  transition: color 0.2s var(--ease);
}

.nav__link::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 0; height: 2px;
  background: var(--brand);
  border-radius: 2px;
  transition: width 0.3s var(--ease);
}

.nav__link:hover { color: var(--brand-700); }
.nav__link:hover::after { width: 100%; }

.header__actions {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px; height: 42px;
  background: var(--surface-soft);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  font-size: 1.15rem;
  cursor: pointer;
  text-decoration: none;
  transition: background-color 0.2s var(--ease), color 0.2s var(--ease),
              border-color 0.2s var(--ease);
}

.icon-btn:hover {
  background: var(--brand-soft);
  color: var(--brand-700);
  border-color: var(--brand);
}

.burger { display: none; }

/* Menú móvil */
.nav-mobile {
  display: none;
  position: absolute;
  left: 0; right: 0;
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  box-shadow: var(--sh-lg);
  max-height: calc(100vh - var(--header-h));
  overflow-y: auto;
}

.nav-mobile.is-open { display: block; }

.nav-mobile__inner {
  display: flex;
  flex-direction: column;
  padding: 1rem 0 1.75rem;
}

.nav-mobile__link {
  padding: 0.95rem 0.25rem;
  border-bottom: 1px solid var(--border);
  color: var(--text);
  font-size: 1.05rem;
  font-weight: 600;
  text-decoration: none;
}

.nav-mobile__link:hover { color: var(--brand-700); }

.nav-mobile__foot {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin-top: 1.5rem;
}

/* --------------------------------------------------------------- 8. HERO */
.hero {
  position: relative;
  display: grid;
  place-items: center;
  min-height: clamp(560px, 84vh, 780px);
  padding-block: clamp(3.5rem, 8vw, 6rem);
  background: var(--ink);
  overflow: hidden;
  isolation: isolate;
}

.hero__slides {
  position: absolute;
  inset: 0;
  z-index: -2;
}

.hero__slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 1.1s var(--ease);
}

.hero__slide.is-active { opacity: 1; }

/* Sin JS sólo se ve la primera diapositiva, que es la que importa. */
.no-js .hero__slide:first-child { opacity: 1; }

.hero__slide img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 55%;
}

.hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(180deg, rgba(4, 22, 24, 0.55) 0%, rgba(4, 22, 24, 0.72) 55%, rgba(4, 22, 24, 0.9) 100%),
    radial-gradient(70% 60% at 15% 40%, rgba(2, 191, 184, 0.22), transparent 70%);
}

.hero__content {
  position: relative;
  max-width: 780px;
  text-align: center;
  color: #fff;
}

.hero__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 1.35rem;
  padding: 0.45rem 1.1rem;
  background: rgba(2, 191, 184, 0.16);
  border: 1px solid rgba(2, 191, 184, 0.5);
  border-radius: var(--r-pill);
  color: #7ff1eb;
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.hero__eyebrow i { font-size: 1rem; }

.hero h1 {
  color: #fff;
  text-shadow: 0 2px 24px rgba(0, 0, 0, 0.35);
}

.hero h1 em {
  font-style: normal;
  color: var(--brand);
  /* El "1:1" no debe partirse entre dos líneas. */
  white-space: nowrap;
}

/* Bajada del título: más grande que el párrafo pero sin competir con el H1. */
.hero__tagline {
  margin: 1.1rem 0 0;
  font-size: clamp(1.2rem, 1.05rem + 0.7vw, 1.6rem);
  font-weight: 600;
  color: #fff;
  text-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
}

.hero__lead {
  max-width: 620px;
  margin: 0.9rem auto 2rem;
  font-size: clamp(1rem, 0.96rem + 0.3vw, 1.125rem);
  color: #d5e9e7;
}

.hero .btn-actions { justify-content: center; }

.hero__note {
  margin-top: 1.75rem;
  font-size: 0.92rem;
  color: #a9cbc8;
}

.hero__note i { color: var(--brand); }

/* Controles del carrusel */
/* Los puntos van por encima del borde superior de la barra de confianza,
   que sube sobre el hero con un margen negativo. */
.hero__dots {
  position: absolute;
  left: 50%;
  bottom: clamp(4.5rem, 7vw, 5.5rem);
  transform: translateX(-50%);
  display: flex;
  gap: 0.6rem;
  z-index: 3;
}

.hero__dot {
  width: 36px;
  height: 4px;
  padding: 0;
  background: rgba(255, 255, 255, 0.35);
  border: none;
  border-radius: var(--r-pill);
  cursor: pointer;
  transition: background-color 0.3s var(--ease);
}

.hero__dot.is-active { background: var(--brand); }
.hero__dot:hover { background: rgba(255, 255, 255, 0.65); }

.hero__arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 3;
  display: grid;
  place-items: center;
  width: 46px; height: 46px;
  background: rgba(255, 255, 255, 0.12);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, 0.3);
  border-radius: var(--r-pill);
  font-size: 1.3rem;
  cursor: pointer;
  backdrop-filter: blur(6px);
  transition: background-color 0.25s var(--ease);
}

.hero__arrow:hover { background: rgba(255, 255, 255, 0.26); }
.hero__arrow--prev { left: clamp(0.5rem, 2vw, 1.75rem); }
.hero__arrow--next { right: clamp(0.5rem, 2vw, 1.75rem); }

/* ---------------------------------------------------------- 9. BARRA CONFIANZA */
.trust {
  position: relative;
  z-index: 5;
  margin-top: calc(-1 * clamp(2rem, 5vw, 3.5rem));
}

.trust__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--border);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  overflow: hidden;
  box-shadow: var(--sh-md);
}

.trust__item {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
  padding: 1.35rem 1.1rem;
  background: var(--surface);
}

.trust__item i {
  display: grid;
  place-items: center;
  flex-shrink: 0;
  width: 40px; height: 40px;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-md);
  font-size: 1.2rem;
}

.trust__item strong {
  display: block;
  margin-bottom: 0.1rem;
  font-size: 0.94rem;
  line-height: 1.35;
  color: var(--ink);
  /* Evita que "Metro Príncipe de Gales" se parta en tres líneas. */
  text-wrap: balance;
}

.trust__item span {
  display: block;
  font-size: 0.82rem;
  line-height: 1.45;
  color: var(--muted);
}

/* ------------------------------------------------------- 10. QUIÉNES SOMOS */
.about__grid {
  display: grid;
  grid-template-columns: 1.15fr 0.85fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: center;
}

.about__text p { color: var(--muted); font-size: 1.075rem; }
.about__text .section-head { margin: 0 0 1.5rem; text-align: left; }

.about__quote {
  margin: 1.75rem 0;
  padding: 1.1rem 0 1.1rem 1.35rem;
  border-left: 4px solid var(--brand);
  font-size: 1.15rem;
  font-weight: 600;
  color: var(--ink) !important;
}

.about__list { display: grid; gap: 0.9rem; }

.about__list li {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
  padding: 1rem 1.15rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  box-shadow: var(--sh-xs);
}

.about__list i {
  flex-shrink: 0;
  margin-top: 0.15rem;
  color: var(--brand);
  font-size: 1.25rem;
}

.about__list strong { display: block; color: var(--ink); }
.about__list span { font-size: 0.92rem; color: var(--muted); }

/* --------------------------------------------------------- 11. SERVICIOS */
.services {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--gap);
}

/* La tarjeta ya no pinta nada: es sólo el escenario 3D y el marco de
   posicionamiento. Lo que se ve son las dos caras. */
.service {
  position: relative;
  perspective: 1400px;
  /* Alto mínimo parejo: el reverso está posicionado en absoluto, así que no
     empuja la altura de la fila. Sin esto, en una tarjeta de título corto el
     reverso no cabría. */
  min-height: 340px;
}

.service__inner {
  position: relative;
  height: 100%;
  transform-style: preserve-3d;
  transition: transform 0.7s var(--ease);
}

.service.is-flipped .service__inner { transform: rotateY(180deg); }

.service__face {
  position: relative;
  display: flex;
  flex-direction: column;
  height: 100%;
  /* El relleno inferior extra reserva el rincón donde vive el icono de
     voltear, para que ningún texto se le meta debajo. */
  padding: 1.85rem 1.85rem 3.9rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs);
  overflow: hidden;
  /* Sin esto se vería el reverso espejado a través del frente. */
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  transition: box-shadow 0.3s var(--ease), border-color 0.3s var(--ease);
}

.service__face--back {
  position: absolute;
  inset: 0;
  transform: rotateY(180deg);
  background: linear-gradient(160deg, var(--brand-soft) 0%, var(--surface) 60%);
  /* Válvula de escape: si en una pantalla muy angosta el texto no cupiera,
     se desplaza en vez de desbordarse fuera de la tarjeta. */
  overflow-y: auto;
}

.service__face::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 3px;
  background: linear-gradient(90deg, var(--brand), var(--brand-600));
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.35s var(--ease);
}

.service:hover .service__face {
  box-shadow: var(--sh-md);
  border-color: color-mix(in srgb, var(--brand) 45%, var(--border));
}

.service:hover .service__face::before { transform: scaleX(1); }

.service__icon {
  display: grid;
  place-items: center;
  width: 54px; height: 54px;
  margin-bottom: 1.25rem;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-md);
  font-size: 1.5rem;
  transition: background-color 0.3s var(--ease), color 0.3s var(--ease);
}

.service:hover .service__icon {
  background: var(--brand);
  color: #04282a;
}

.service h3 { margin-bottom: 0.6rem; text-wrap: balance; }

.service p {
  color: var(--muted);
  font-size: 0.98rem;
  line-height: 1.7;
}

/* ---- Reverso ---- */
.service__face--back h4 {
  margin-bottom: 0.3rem;
  color: var(--brand-700);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.service__face--back h4 + p { margin-bottom: 1.15rem; }

.service__face--back p {
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--text);
}

.service__face--back ul {
  display: grid;
  gap: 0.45rem;
  margin-top: 0.55rem;
}

.service__face--back li {
  position: relative;
  padding-left: 1.4rem;
  color: var(--muted);
  font-size: 0.93rem;
  line-height: 1.45;
}

.service__face--back li::before {
  content: "\F26E";
  font-family: "bootstrap-icons";
  position: absolute;
  left: 0;
  top: 0.05em;
  color: var(--brand);
  font-size: 0.9rem;
}

/* ---- Botón que voltea ---- */
/* Cubre la tarjeta completa para que sirva presionarla en cualquier punto, y
   al ser un <button> de verdad funciona con teclado y lo anuncia el lector de
   pantalla. Va por encima de las dos caras. */
.service__flip {
  position: absolute;
  inset: 0;
  z-index: 2;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: var(--r-lg);
  cursor: pointer;
}

/* La pista lleva texto y no sólo un icono: si la tarjeta entera es un botón,
   hay que decir que se puede presionar. Un icono suelto no lo dice. */
.service__flip-hint {
  position: absolute;
  right: 1.15rem;
  bottom: 1.15rem;
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.42rem 0.85rem;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-pill);
  font-size: 0.82rem;
  font-weight: 700;
  line-height: 1;
  transition: background-color 0.3s var(--ease), color 0.3s var(--ease);
}

.service__flip-hint i {
  font-size: 1rem;
  transition: transform 0.5s var(--ease);
}

.service:hover .service__flip-hint,
.service__flip:focus-visible .service__flip-hint {
  background: var(--brand);
  color: #04282a;
}

.service:hover .service__flip-hint i { transform: rotate(180deg); }

/* Dada vuelta, la pista dice cómo volver. Los dos textos están en el HTML y
   se alterna cuál se muestra: es más simple que reescribirlo desde el CSS o
   desde el JavaScript, y la pastilla se ajusta sola al ancho de cada palabra. */
.service__flip-text--volver { display: none; }
.service.is-flipped .service__flip-text { display: none; }
.service.is-flipped .service__flip-text--volver { display: inline; }

/* Sin JavaScript la tarjeta no se voltea, así que el botón sobra: el frente
   ya trae la descripción y no se pierde información. */
.no-js .service__flip { display: none; }

/* ------------------------------------------------- 11 bis. ISAPRES (CINTA) */
.isapres {
  background: linear-gradient(180deg, var(--surface) 0%, var(--surface-alt) 100%);
}

/* La cinta desborda el contenedor a propósito: los logos entran y salen por
   los bordes de la pantalla, no por los del container. */
.marquee {
  position: relative;
  overflow: hidden;
  /* Holgura arriba y abajo: el contenedor recorta, y sin esto se comería la
     sombra y el salto de la tarjeta al pasar el cursor. */
  padding-block: 1.25rem;
  /* Difumina los extremos para que los logos no aparezcan cortados de golpe. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}

.marquee__track {
  display: flex;
  width: max-content;
  animation: cinta 24s linear infinite;
  /* Avisa al navegador que esto se mueve, para que lo suba a su propia capa
     y no tenga que repintar la sección entera en cada cuadro. */
  will-change: transform;
}

.marquee__row {
  display: flex;
  align-items: center;
  flex-shrink: 0;
  gap: clamp(1rem, 2.5vw, 1.75rem);
  padding-inline: clamp(0.5rem, 1.25vw, 0.875rem);
}

/* Cada logo va sobre una tarjeta blanca. No es sólo decoración: algunos
   archivos vienen en JPG/AVIF, sin transparencia, y sobre el fondo teñido de
   la sección se les notaría el recuadro blanco. Así todos se ven igual. */
.isapre {
  display: grid;
  place-items: center;
  flex-shrink: 0;
  width: clamp(140px, 17vw, 195px);
  height: 96px;
  padding: 0.9rem 1.15rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  box-shadow: var(--sh-xs);
  transition: border-color 0.35s var(--ease), box-shadow 0.35s var(--ease),
              transform 0.35s var(--ease);
}

.isapre:hover {
  transform: translateY(-4px);
  border-color: color-mix(in srgb, var(--brand) 45%, var(--border));
  box-shadow: var(--sh-md);
}

/* Cada logo llena la casilla y `contain` se encarga de la proporción: así da
   lo mismo que un archivo venga cuadrado y otro alargado, todos ocupan lo
   máximo que pueden sin deformarse ni salirse. */
.isapre img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  /* A color, como pidieron los dueños. Sin escala de grises. */
  transition: transform 0.35s var(--ease);
}

.isapre:hover img {
  transform: scale(1.06);
}

.isapres__note {
  max-width: 720px;
  margin: clamp(1.75rem, 3vw, 2.5rem) auto 0;
  color: var(--muted);
  font-size: 0.95rem;
  text-align: center;
}

.isapres__note i { color: var(--brand); margin-right: 0.35rem; }
.isapres__note a { font-weight: 600; }

/* La copia del listado es idéntica, así que a mitad de recorrido la cinta
   vuelve al inicio sin que se note el salto. */
@keyframes cinta {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

/* -------------------------------------------------------------- 12. EQUIPO */
.team {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--gap);
  max-width: 880px;
  margin-inline: auto;
}

.pro {
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  overflow: hidden;
  box-shadow: var(--sh-sm);
  transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
}

.pro:hover { transform: translateY(-6px); box-shadow: var(--sh-lg); }

.pro__photo {
  aspect-ratio: 4 / 5;
  background: var(--surface-alt);
  overflow: hidden;
}

.pro__photo img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center 22%;
  transition: transform 0.5s var(--ease);
}

.pro:hover .pro__photo img { transform: scale(1.04); }

.pro__body {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  padding: 1.5rem;
  text-align: center;
}

.pro__role {
  margin: 0;
  color: var(--brand-700);
  font-weight: 600;
  font-size: 0.95rem;
}

.pro__tags {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.45rem;
}

.pro__tags li {
  padding: 0.32rem 0.75rem;
  background: var(--surface-soft);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  font-size: 0.8rem;
  color: var(--muted);
}

/* --------------------------------------------------------- 14. TESTIMONIOS */
/* Carrusel de desplazamiento nativo con anclaje. Se eligió esto en vez de mover
   un carril con `transform` porque funciona sin JavaScript: se arrastra con el
   dedo, con la rueda y con el teclado, y la accesibilidad la resuelve el
   navegador. El script solo agrega las flechas. */
.reviews {
  position: relative;
}

.reviews__track {
  display: flex;
  gap: var(--gap);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  /* Sin esto el navegador "ancla" la vista al contenido y corrige el
     desplazamiento cuando el script reordena las tarjetas, dejando el carrusel
     abierto en la última en vez de la primera. */
  overflow-anchor: none;
  /* Aire arriba y abajo para que la sombra de las tarjetas no se recorte. A los
     lados va sin relleno a propósito: el relleno horizontal cuenta como ancho
     desplazable, y con tres tarjetas que caben justas hacía creer al script que
     había desbordamiento, sacando flechas que no servían para nada. */
  padding: 0.5rem 0 1.25rem;
  /* La barra de desplazamiento sobra: para eso están las flechas y el gesto. */
  scrollbar-width: none;
}

.reviews__track::-webkit-scrollbar { display: none; }

.reviews__track > li {
  flex: 0 0 calc((100% - 2 * var(--gap)) / 3);
  scroll-snap-align: start;
  display: flex;
}

/* Igual que en las flechas: el `display: flex` de arriba le gana al
   `display: none` que el navegador aplica con el atributo `hidden`, así que las
   tarjetas que el sorteo semanal deja fuera seguirían viéndose. */
.reviews__track > li[hidden] { display: none; }

/* Resumen de la valoración, bajo el título de la sección. Lleva doble clase
   para ganarle al `.section-head p`, que fija otro tamaño y color. */
.section-head .reviews__resumen {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  margin-top: 1rem;
  color: var(--muted);
  font-size: 1rem;
}

.reviews__resumen strong { color: var(--ink); font-size: 1.15rem; }
.reviews__stars { color: var(--star); letter-spacing: 2px; font-size: 1.1rem; }

.reviews__arrow {
  position: absolute;
  top: calc(50% - 0.4rem);
  transform: translateY(-50%);
  z-index: 2;
  display: grid;
  place-items: center;
  width: 44px; height: 44px;
  background: var(--surface);
  color: var(--brand-700);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  font-size: 1.2rem;
  cursor: pointer;
  box-shadow: var(--sh-md);
  transition: background-color 0.2s var(--ease), color 0.2s var(--ease),
              opacity 0.2s var(--ease);
}

/* El atributo `hidden` del HTML se apoya en un `display: none` del navegador,
   que pierde contra el `display: grid` de arriba por especificidad. Sin esta
   línea, ocultar la flecha desde el script no tiene ningún efecto visible. */
.reviews__arrow[hidden] { display: none; }

.reviews__arrow:hover { background: var(--brand); color: #04282a; }

/* Al llegar a un extremo la flecha se apaga en vez de desaparecer: si se
   quitara, la otra flecha saltaría de posición. */
.reviews__arrow[disabled] {
  opacity: 0.3;
  cursor: default;
  box-shadow: var(--sh-xs);
}

.reviews__arrow[disabled]:hover { background: var(--surface); color: var(--brand-700); }

.reviews__arrow--prev { left: -1.4rem; }
.reviews__arrow--next { right: -1.4rem; }

.review {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  /* Llena la casilla del carril para que todas las tarjetas midan igual, sea
     cual sea el largo de cada reseña. */
  width: 100%;
  margin: 0;
  padding: 1.85rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs);
}

/* Las estrellas también son un <p>, y eso trae dos problemas: heredan el
   `flex-grow` del texto de la reseña (y quedan separadas de él) y el `color`
   del `.review p` de más abajo les gana en especificidad, dejándolas grises.
   Por eso el selector lleva la etiqueta: `p.review__stars` pesa más. */
.review p.review__stars {
  flex-grow: 0;
  color: var(--star);
  letter-spacing: 2px;
  font-size: 1.05rem;
}

.review p {
  flex-grow: 1;
  font-size: 1rem;
  line-height: 1.75;
  color: var(--text);
}

.review footer {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding-top: 1rem;
  border-top: 1px solid var(--border);
}

.review__avatar {
  display: grid;
  place-items: center;
  width: 40px; height: 40px;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-pill);
  font-weight: 800;
}

.review__who strong { display: block; font-size: 0.95rem; color: var(--ink); }
.review__who span { font-size: 0.85rem; color: var(--muted); }

/* -------------------------------------------------------------- 15. GALERÍA */
.gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--gap);
}

.gallery__item {
  position: relative;
  display: block;
  aspect-ratio: 4 / 5;
  border-radius: var(--r-lg);
  overflow: hidden;
  box-shadow: var(--sh-sm);
}

.gallery__item img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease);
}

.gallery__item::after {
  content: "\F1C3";
  font-family: "bootstrap-icons";
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  background: rgba(2, 191, 184, 0.45);
  color: #fff;
  font-size: 2rem;
  opacity: 0;
  transition: opacity 0.3s var(--ease);
}

.gallery__item:hover img { transform: scale(1.06); }
.gallery__item:hover::after { opacity: 1; }

/* ------------------------------------------------------------ 16. UBICACIÓN */
.place__grid {
  display: grid;
  grid-template-columns: 0.95fr 1.05fr;
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}

.place__facts { display: grid; gap: 1.25rem; }

.fact {
  display: flex;
  gap: 1rem;
  padding: 1.25rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
}

.fact i {
  display: grid;
  place-items: center;
  flex-shrink: 0;
  width: 46px; height: 46px;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-pill);
  font-size: 1.25rem;
}

/* Sólo el título del bloque va en su propia línea. Con un selector de
   descendencia, el <strong> que va dentro del párrafo también se volvía
   bloque y partía la frase en tres. */
.fact > div > strong { display: block; margin-bottom: 0.2rem; color: var(--ink); }
.fact p { margin: 0; color: var(--muted); font-size: 0.97rem; }
.fact a { font-weight: 600; text-decoration: none; }
.fact a:hover { text-decoration: underline; }

.place__media { display: grid; gap: 1rem; }

.place__map {
  aspect-ratio: 16 / 11;
  border-radius: var(--r-lg);
  overflow: hidden;
  box-shadow: var(--sh-sm);
  border: 1px solid var(--border);
}

.place__map iframe { width: 100%; height: 100%; border: 0; display: block; }

.place__photo {
  position: relative;
  border-radius: var(--r-lg);
  overflow: hidden;
  box-shadow: var(--sh-sm);
}

.place__photo img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }

.place__photo figcaption {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  padding: 1.5rem 1.1rem 0.9rem;
  background: linear-gradient(transparent, rgba(4, 22, 24, 0.85));
  color: #fff;
  font-size: 0.9rem;
  font-weight: 600;
}

/* ----------------------------------------------------------------- 17. FAQ */
.faq { display: grid; gap: 0.85rem; max-width: 820px; margin-inline: auto; }

.faq__item {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  overflow: hidden;
}

.faq__item summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.15rem 1.35rem;
  font-weight: 600;
  color: var(--ink);
  cursor: pointer;
  list-style: none;
}

.faq__item summary::-webkit-details-marker { display: none; }

.faq__item summary::after {
  content: "\F282";
  font-family: "bootstrap-icons";
  flex-shrink: 0;
  color: var(--brand);
  font-size: 1.1rem;
  transition: transform 0.3s var(--ease);
}

.faq__item[open] summary::after { transform: rotate(180deg); }

.faq__answer {
  padding: 0 1.35rem 1.35rem;
  color: var(--muted);
}

/* ------------------------------------------------ 17 bis. DOCUMENTO LEGAL */
/* Estilos de reglamento.html. Es un texto largo que se lee de corrido, así que
   manda la legibilidad: columna angosta, jerarquía clara y nada que distraiga. */
.doc__head { margin-bottom: 2.5rem; }

.doc h1 {
  margin-bottom: 1.25rem;
  font-size: clamp(1.8rem, 1.35rem + 1.9vw, 2.6rem);
  text-wrap: balance;
}

.doc__intro {
  color: var(--muted);
  font-size: 1.075rem;
  text-align: justify;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.doc__meta {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  margin-top: 1.25rem;
  color: var(--muted);
  font-size: 0.88rem;
}

.doc__meta i { color: var(--brand); }

.doc__acciones { margin-top: 1.5rem; }

.doc__indice {
  padding: 1.5rem 1.75rem;
  margin-bottom: 3rem;
  background: var(--surface-soft);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
}

.doc__indice-titulo {
  margin: 0 0 0.85rem;
  color: var(--ink);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.doc__indice ol {
  display: grid;
  gap: 0.5rem;
  margin: 0;
  padding-left: 1.25rem;
  list-style: decimal;
  color: var(--muted);
}

.doc__indice a {
  color: var(--text);
  text-decoration: none;
  font-size: 0.97rem;
}

.doc__indice a:hover { color: var(--brand-700); text-decoration: underline; }

.doc__seccion { margin-bottom: 3rem; }

.doc__seccion h2 {
  padding-bottom: 0.75rem;
  margin-bottom: 1.5rem;
  border-bottom: 2px solid var(--brand);
  font-size: clamp(1.3rem, 1.1rem + 0.85vw, 1.7rem);
}

.doc__seccion h3 {
  margin-bottom: 0.4rem;
  color: var(--brand-700);
  font-size: 1.02rem;
}

.doc__seccion h3 + p { margin-bottom: 1.5rem; }

.doc__seccion p,
.doc__lista li {
  color: var(--muted);
  text-align: justify;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.doc__lista {
  display: grid;
  gap: 0.85rem;
  margin-top: 0.85rem;
}

.doc__lista li {
  position: relative;
  padding-left: 1.5rem;
}

.doc__lista li::before {
  content: "";
  position: absolute;
  left: 0; top: 0.65em;
  width: 7px; height: 7px;
  background: var(--brand);
  border-radius: var(--r-pill);
}

/* La tabla de cancelaciones no se puede reflotar en tres líneas sin perder el
   sentido: son tres columnas que hay que leer juntas. En pantalla angosta se
   desplaza en su propia caja en vez de romper el ancho de la página. */
.doc__tabla-scroll {
  margin: 1.75rem 0;
  overflow-x: auto;
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
}

.doc__tabla {
  width: 100%;
  min-width: 560px;
  border-collapse: collapse;
  font-size: 0.93rem;
}

.doc__tabla th,
.doc__tabla td {
  padding: 0.9rem 1rem;
  text-align: left;
  vertical-align: top;
  border-bottom: 1px solid var(--border);
}

.doc__tabla thead th {
  background: var(--brand-soft);
  color: var(--brand-700);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  white-space: nowrap;
}

.doc__tabla tbody th {
  color: var(--ink);
  font-weight: 700;
}

.doc__tabla td { color: var(--muted); }

.doc__tabla tbody tr:last-child th,
.doc__tabla tbody tr:last-child td { border-bottom: 0; }

.doc__cierre {
  padding: 1.75rem;
  background: var(--surface-soft);
  border-left: 4px solid var(--brand);
  border-radius: var(--r-md);
}

.doc__cierre p { color: var(--muted); }

.doc__firma {
  margin-top: 0.75rem;
  color: var(--ink) !important;
  font-weight: 700;
}

.doc__acciones--pie { margin-top: 2.5rem; }

/* ------------------------------------------------------------- 18. CTA FINAL */
.cta {
  position: relative;
  padding-block: clamp(3rem, 6vw, 4.5rem);
  background: linear-gradient(135deg, var(--ink) 0%, var(--ink-2) 100%);
  color: #fff;
  overflow: hidden;
}

.cta::before {
  content: "";
  position: absolute;
  top: -40%; right: -10%;
  width: 620px; height: 620px;
  background: radial-gradient(circle, rgba(2, 191, 184, 0.22), transparent 65%);
  pointer-events: none;
}

.cta__inner {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
  flex-wrap: wrap;
}

.cta h2 { color: #fff; max-width: 24ch; }
.cta p { margin-top: 0.75rem; color: #b9d9d6; max-width: 46ch; }

/* Fila propia dentro del flex de .cta__inner, que ya viene con wrap.
   Va con doble clase para ganarle en especificidad al `.cta p` de arriba, que
   limita el ancho a 46ch: esa medida es la correcta para el párrafo de venta,
   pero aquí estrangulaba la línea a un tercio del ancho disponible. */
.cta .cta__legal {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  width: 100%;
  max-width: none;
  margin-top: 0.5rem;
  padding-top: 1.4rem;
  border-top: 1px solid rgba(255, 255, 255, 0.14);
  font-size: 0.87rem;
  color: #9cc4c1;
}

.cta__legal i { flex-shrink: 0; color: var(--brand); }
.cta__legal a { color: #fff; text-underline-offset: 3px; }
.cta__legal a:hover { color: var(--brand); }

/* -------------------------------------------------------------- 19. FOOTER */
.footer {
  background: var(--ink);
  color: #b9d9d6;
  padding-block: clamp(2.5rem, 5vw, 4rem) 0;
}

.footer__grid {
  display: grid;
  grid-template-columns: 1.2fr 1fr 1fr;
  gap: clamp(2rem, 4vw, 3.5rem);
  padding-bottom: 2.5rem;
}

.footer__logo {
  display: inline-block;
  margin-bottom: 1.1rem;
  padding: 0.75rem 1rem;
  background: #fff;
  border-radius: var(--r-md);
}

.footer__logo img { width: 150px; }

.footer h3 {
  margin-bottom: 1.1rem;
  color: #fff;
  font-size: 1rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.footer p { font-size: 0.94rem; }

.footer__links { display: grid; gap: 0.65rem; }

.footer__links a {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  color: #b9d9d6;
  font-size: 0.94rem;
  text-decoration: none;
}

.footer__links a:hover { color: var(--brand); }
.footer__links i { color: var(--brand); font-size: 1.05rem; }

.footer__bottom {
  padding-block: 1.4rem;
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  font-size: 0.85rem;
  text-align: center;
}

.footer__bottom p { margin: 0; }

/* --------------------------------------------------- 20. ACCIONES FLOTANTES */
.float-wa {
  position: fixed;
  right: 1.75rem;
  bottom: 1.75rem;
  z-index: 90;
  display: grid;
  place-items: center;
  width: 60px; height: 60px;
  padding: 0;
  background: var(--whatsapp);
  color: #fff;
  border: 0;
  border-radius: var(--r-pill);
  font-size: 1.9rem;
  line-height: 1;
  cursor: pointer;
  box-shadow: 0 8px 24px rgba(37, 211, 102, 0.4);
  transition: transform 0.25s var(--ease);
}

/* El botón se agranda al pasar el cursor, pero no se detiene: la onda y el
   vaivén siguen corriendo. El escalado vive en el elemento y las animaciones
   en el pseudo-elemento y en el icono, así que no se pisan. */
.float-wa:hover { transform: scale(1.08); }

/* Onda que sale del botón. Va detrás del fondo (z-index negativo dentro del
   propio contexto de apilamiento) para que no tape el icono. */
.float-wa::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background: var(--whatsapp);
  animation: onda-wa 2.6s var(--ease) infinite;
}

/* El vaivén va en el icono, no en el botón: así el :hover del botón sigue
   pudiendo escalarlo sin que la animación le gane la mano al transform. */
.float-wa i {
  display: block;
  animation: vaiven-wa 2.6s ease-in-out infinite;
}

@keyframes onda-wa {
  0%   { transform: scale(1);    opacity: 0.55; }
  70%  { transform: scale(1.75); opacity: 0; }
  100% { transform: scale(1.75); opacity: 0; }
}

@keyframes vaiven-wa {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  30%      { transform: translateY(-5px) rotate(-8deg); }
  60%      { transform: translateY(0) rotate(6deg); }
}

/* Con el selector abierto el botón deja de llamar la atención: ya cumplió su
   trabajo y ahora lo importante es el panel. */
.float-wa[aria-expanded="true"]::before,
.float-wa[aria-expanded="true"] i { animation: none; }

/* ---------------------------------------------- Selector de kinesiólogo */
/* Vive fuera del botón flotante y no dentro, porque en móvil ese botón no
   existe y quien lo abre es el de la barra fija. Un solo panel, dos botones
   que lo abren. */
.wa-picker {
  position: fixed;
  right: 1.75rem;
  bottom: calc(1.75rem + 60px + 0.85rem); /* sobre el botón flotante */
  z-index: 96;
  width: min(330px, calc(100vw - 2rem));
  padding: 1rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-lg);
  animation: wa-picker-entra 0.22s var(--ease);
}

.wa-picker[hidden] { display: none; }

@keyframes wa-picker-entra {
  from { opacity: 0; transform: translateY(10px) scale(0.97); }
  to   { opacity: 1; transform: none; }
}

.wa-picker__title {
  margin: 0 0 0.75rem;
  padding-inline: 0.35rem;
  color: var(--ink);
  font-size: 0.92rem;
  font-weight: 700;
}

.wa-picker__item {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.7rem 0.75rem;
  border-radius: var(--r-md);
  color: var(--text);
  text-decoration: none;
  transition: background-color 0.2s var(--ease);
}

.wa-picker__item + .wa-picker__item { margin-top: 0.25rem; }

.wa-picker__item:hover { background: var(--surface-soft); }

.wa-picker__avatar {
  display: grid;
  place-items: center;
  flex-shrink: 0;
  width: 40px; height: 40px;
  background: var(--brand-soft);
  color: var(--brand-700);
  border-radius: var(--r-pill);
  font-weight: 800;
}

.wa-picker__who { flex-grow: 1; min-width: 0; }

.wa-picker__who strong {
  display: block;
  color: var(--ink);
  font-size: 0.95rem;
  line-height: 1.3;
}

.wa-picker__who span {
  font-size: 0.82rem;
  color: var(--muted);
}

.wa-picker__item > i {
  flex-shrink: 0;
  color: var(--whatsapp);
  font-size: 1.35rem;
}

/* Sin JavaScript el panel no se puede abrir, así que los dos botones que lo
   abren sobran. No se pierde ninguna vía de contacto: el hero, el bloque de
   cierre, «Cómo llegar» y el pie llevan enlaces directos a ambos WhatsApp. */
.no-js .float-wa,
.no-js .action-bar .btn--whatsapp { display: none; }

/* Distintivo de vista previa. Aparece sólo en el navegador donde alguien dejó
   un borrador sin publicar en /admin. Va deliberadamente llamativo: lo peor que
   podría pasar es que alguien crea que sus cambios ya están publicados. */
.vista-previa {
  position: fixed;
  left: 1rem;
  bottom: 1rem;
  z-index: 120;
  display: flex;
  align-items: center;
  gap: 0.9rem;
  max-width: min(360px, calc(100vw - 2rem));
  padding: 0.7rem 0.9rem;
  background: #4a340a;
  color: #ffe9b0;
  border-left: 4px solid #f0b429;
  border-radius: var(--r-md);
  box-shadow: var(--sh-lg);
  font-size: 0.8rem;
  line-height: 1.4;
}

.vista-previa strong { color: #ffd166; }

.vista-previa a {
  flex-shrink: 0;
  padding: 0.35rem 0.7rem;
  background: #f0b429;
  color: #3a2806;
  border-radius: var(--r-pill);
  font-weight: 700;
  text-decoration: none;
  white-space: nowrap;
}

.vista-previa a:hover { background: #ffd166; }

@media (max-width: 640px) {
  /* Sobre la barra fija de acciones, para no taparla. */
  .vista-previa { bottom: calc(72px + env(safe-area-inset-bottom) + 0.5rem); }
}

@media print { .vista-previa { display: none; } }

/* Barra fija de acciones: sólo en móvil, es donde más convierte. */
.action-bar {
  display: none;
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 95;
  gap: 0.6rem;
  padding: 0.6rem 0.75rem calc(0.6rem + env(safe-area-inset-bottom));
  /* Misma razón que en la cabecera: es una barra fija, y el desenfoque de
     fondo la obligaba a repintarse en cada cuadro del scroll. */
  background: var(--surface);
  border-top: 1px solid var(--border);
}

.action-bar .btn { flex: 1; padding-inline: 0.5rem; font-size: 0.95rem; }

/* En móvil el flotante no existe, así que el vaivén se lo lleva el icono de
   la barra fija: es el mismo gesto, en el botón que sí está a la vista. */
.action-bar .btn--whatsapp i { animation: vaiven-wa 2.6s ease-in-out infinite; }

/* ------------------------------------------------------------ 21. RESPONSIVE */
@media (max-width: 1024px) {
  .nav { display: none; }
  .burger { display: inline-flex; }
  .trust__grid { grid-template-columns: repeat(2, 1fr); }
  .services { grid-template-columns: repeat(2, 1fr); }
  .about__grid { grid-template-columns: 1fr; }
  .place__grid { grid-template-columns: 1fr; }

  /* Dos testimonios a la vista en tablet. */
  .reviews__track > li { flex-basis: calc((100% - var(--gap)) / 2); }
}

@media (min-width: 1025px) {
  .nav-mobile, .nav-mobile.is-open { display: none; }
}

@media (max-width: 860px) {
  .topbar__inner { justify-content: center; }
  .topbar__list { justify-content: center; }
  .topbar__item--hide-sm { display: none; }
  .gallery { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 640px) {
  :root { --header-h: 70px; }

  /* Aquí ya entra la barra fija inferior, que lleva el mismo botón de agendar
     (y con el mismo latido), así que el CTA de la cabecera sobra. El de
     Instagram sí se queda: no está repetido en ninguna otra parte visible y en
     el móvil es donde más se usa. Con logo, Instagram y menú la cabecera sigue
     entrando de sobra, incluso en pantallas de 320 px. */
  .header__cta { display: none; }

  .header__logo img { height: 42px; }
  .topbar { display: none; }

  .hero { min-height: auto; padding-block: 3.5rem 5rem; }
  .hero__arrow { display: none; }
  .hero .btn-actions { flex-direction: column; }
  .hero .btn { width: 100%; }

  .trust { margin-top: 0; }
  .trust__grid { grid-template-columns: 1fr; }

  .services { grid-template-columns: 1fr; }
  .gallery { grid-template-columns: 1fr; }
  .team { grid-template-columns: 1fr; }

  /* Uno a la vez, y las flechas se van: aquí se desliza con el dedo. */
  .reviews__track > li { flex-basis: 100%; }
  .reviews__arrow { display: none; }
  .footer__grid { grid-template-columns: 1fr; text-align: center; }
  .footer__links a { justify-content: center; }
  .cta__inner { flex-direction: column; text-align: center; }
  .cta .btn-actions { justify-content: center; }

  /* En columna, el icono como ítem flex se quedaba pegado al borde izquierdo
     mientras el texto se centraba. Como bloque, fluye dentro de la frase. */
  .cta .cta__legal { display: block; text-align: center; }
  .cta__legal i { margin-right: 0.4rem; }

  .float-wa { display: none; }
  .action-bar { display: flex; }

  /* Hueco para que la barra fija no tape el final del contenido. Las páginas
     que no la llevan (el reglamento) se lo sacan con .page-doc. */
  body { padding-bottom: 72px; }
  body.page-doc { padding-bottom: 0; }

  /* Aquí el panel ya no cuelga del botón flotante (que no existe), sino que
     se apoya sobre la barra fija y ocupa el ancho de la pantalla. */
  .wa-picker {
    right: 0.75rem;
    left: 0.75rem;
    bottom: calc(72px + env(safe-area-inset-bottom) + 0.5rem);
    width: auto;
  }
}

/* Quien pide menos movimiento, recibe menos movimiento. */
@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;
  }
  .reveal { opacity: 1; transform: none; }
}

@media print {
  .header, .topbar, .float-wa, .action-bar, .hero__dots, .hero__arrow,
  .wa-picker, .doc__acciones, .doc__volver { display: none; }

  /* El reglamento se imprime (o se guarda como PDF) desde el propio navegador,
     así que aquí se le da forma de documento: sin fondos de color, a todo el
     ancho de la hoja y sin cortar una sección por la mitad. */
  @page { margin: 18mm 16mm; }

  body { font-size: 11pt; line-height: 1.5; }

  .doc { padding-block: 0; }
  .doc .container { max-width: none; padding-inline: 0; }
  .doc__seccion p, .doc__lista li, .doc__intro { color: #000; }

  .doc__indice, .doc__cierre, .doc__tabla thead th {
    background: transparent !important;
    border-color: #999;
  }

  .doc__seccion, .doc__tabla-scroll, .doc__cierre { break-inside: avoid; }
  .doc__seccion h2, .doc__seccion h3 { break-after: avoid; }
  .doc__tabla-scroll { overflow: visible; }
  .doc__tabla { min-width: 0; }

  /* En papel el enlace no se puede pinchar: se escribe el destino al lado. */
  .doc a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 9pt; }
}
