/* ====================================================================
   site-tweaks.css — Overrides de diseño sobre el export de Webflow.
   Se carga DESPUÉS de espacios-pucv-2553f5.webflow.css para ganar por orden.
   No tocamos el CSS del export para mantenerlo replazable si re-exportan.
   ==================================================================== */

/* ====================================================================
   /sobre-nosotros/ — cards de párrafos largos (.qe_grid.pourquoi.v2)
   Misma estructura .p_unit con .pu_image + .pu_text + .p_text.sn pero
   son cards informativas (no pasos), con párrafos extensos. El export deja:
   - .p_text { color: --azul-pucv (#2a578b); font-size: 15px } → bajo contraste
   - .p_text.sn { line-height: 1.6em; margin-right: 30px } → ok pero text muy chico
   - .textcontainer { width: 100% } → texto pegado al borde
   Mejoras: contraste alto, font-size más legible, padding interno cómodo,
   gap entre cards. Sólo afecta sobre-nosotros (selector específico .v2). */
/* Gap interno entre cards (dentro de un .pourquoicontainer) */
.qe_grid.pourquoi.v2 .pourquoicontainer {
  display: flex;
  flex-direction: column;
  gap: 1.75rem;
}
/* Gap ENTRE los dos .pourquoicontainer del HTML (sin esto las cards 2 y 3 quedan
   pegadas porque pertenecen a contenedores diferentes y el gap interno no aplica) */
.qe_grid.pourquoi.v2 {
  display: flex !important;
  flex-direction: column !important;
  gap: 1.75rem;
}
.qe_grid.pourquoi.v2 .p_unit .pu_text {
  padding: 36px 32px;
  box-sizing: border-box;
}
.qe_grid.pourquoi.v2 .p_unit .textcontainer {
  max-width: 56ch; /* limit reading width para legibilidad */
}
.qe_grid.pourquoi.v2 .p_text.sn {
  font-size: 1rem !important;        /* 15px → 16px (más legible) */
  line-height: 1.7 !important;        /* 1.6em → 1.7 más respirable */
  font-weight: 400;
  color: #1a202c !important;          /* contraste alto (era azul-pucv #2a578b) */
  margin: 0 !important;               /* override margin-right: 30px que descuadraba */
}
/* En cards .dark (fondo azul) el texto va blanco para mantener contraste */
.qe_grid.pourquoi.v2 .p_unit.dark .p_text.sn {
  color: #fff !important;
  opacity: 0.95;
}
.qe_grid.pourquoi.v2 .p_unit.medium .p_text.sn {
  color: #fff !important;
  opacity: 0.95;
}
/* Strong (palabras como "PUCV Santiago") con peso visual: en cards claras
   azul-pucv, en cards oscuras color crema/destaque */
.qe_grid.pourquoi.v2 .p_text.sn strong {
  color: #2a578b;
  font-weight: 600;
}
.qe_grid.pourquoi.v2 .p_unit.dark .p_text.sn strong,
.qe_grid.pourquoi.v2 .p_unit.medium .p_text.sn strong {
  color: #fff;
  opacity: 1;
}

/* ---- Mobile (≤767px): stack image-arriba + texto-abajo ---- */
@media (max-width: 767px) {
  .qe_grid.pourquoi.v2 .p_unit {
    flex-flow: column !important;
    height: auto !important;
    min-height: auto;
    border-radius: 1.25rem !important;
    overflow: hidden;
  }
  .qe_grid.pourquoi.v2 .p_unit .pu_image {
    width: 100% !important;
    height: 240px !important;
    order: 1;
    border-radius: 0 !important;
  }
  /* Normalizamos el .pu_text en mobile: alineación CENTRADA y simétrica.
     IMPORTANTE: el .whitesymbol está vacío en sobre-nosotros pero el export
     le aplica width:50px + margin-left:20px + margin-right:20px → ocupa 90px
     a la izquierda dentro del flex-row de .pu_text, descentrando el texto.
     Lo ocultamos en mobile para que .textcontainer pueda centrarse de verdad. */
  .qe_grid.pourquoi.v2 .p_unit .whitesymbol:empty {
    display: none !important;
  }
  .qe_grid.pourquoi.v2 .p_unit .pu_text {
    width: 100% !important;
    order: 2;
    /* Override del export: a <767px aplica margin-top: 50px + margin-bottom: 50px
       a .pu_text, lo que creaba el "vacío" entre imagen y texto en mobile. */
    margin: 0 !important;
    padding: 28px 24px !important;     /* simétrico — top y bottom iguales */
    flex-direction: column !important; /* en lugar de row, evita interferencia del whitesymbol */
    justify-content: flex-start !important;
    align-items: center !important;
    flex: 0 0 auto !important;
    height: auto !important;
  }
  /* El .p_unit en mobile también es flex column. Forzamos height a content
     (sin estirar) para que el espacio top/bottom alrededor del texto sea
     simétrico determinado solo por padding (28px cada lado). */
  .qe_grid.pourquoi.v2 .p_unit {
    align-items: stretch !important;
  }
  .qe_grid.pourquoi.v2 .p_unit .textcontainer {
    max-width: 100%;
    width: 100%;
    margin: 0;
    text-align: center;
  }
  /* El propio párrafo: texto centrado para que líneas wrappeen simétricas */
  .qe_grid.pourquoi.v2 .p_text.sn {
    text-align: center !important;
    margin: 0 auto !important;          /* sin margin lateral asimétrico del export */
    max-width: 32ch;                    /* limita ancho para mejor wrap simétrico en mobile */
  }
  /* Aumentamos el gap entre cards en mobile para mejor respiración */
  .qe_grid.pourquoi.v2,
  .qe_grid.pourquoi.v2 .pourquoicontainer {
    gap: 1.5rem;
  }
  /* Duplicado mobile-only: mostrar .mobile, ocultar el desktop equivalente */
  .qe_grid.pourquoi.v2 .p_unit.dark.mobile { display: flex !important; }
  .qe_grid.pourquoi.v2 .p_unit.dark:not(.mobile) { display: none !important; }
  .qe_grid.pourquoi.v2 .stickytitle.nos {
    font-size: 1.85rem;
    line-height: 1.25;
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }
}

/* ====================================================================
   C6 · text-transform: capitalize en inputs de email/tel/number
   El export pone .contact__input con text-transform: capitalize. Está bien
   para Nombre pero rompe formato de email (juan@gmail.com → Juan@Gmail.Com)
   y teléfono cuando hay separadores (+56 2 2344 5800 → +56 2 2344 5800 ok
   pero cualquier letra se capitaliza). En autofill o paste, también
   rompe — el browser pega valor lower-case y CSS lo capitaliza visualmente,
   confundiendo al usuario. Override para email/tel/number/url. */
.contact__input[type="email"],
.contact__input[type="tel"],
.contact__input[type="number"],
.contact__input[type="url"],
.contact__input[name="message"], /* mensaje libre — no capitalizar cada palabra */
.form-field[type="email"],
.form-field[type="tel"],
.form-field[type="number"],
.form-field[type="url"],
.form-field[name="message"],
input[type="email"],
input[type="tel"],
input[type="number"],
input[type="url"],
textarea,
.text-area {
  text-transform: none !important;
}

/* ====================================================================
   Fallback grid-placement para textarea de mensaje en .form-2
   El export usa `#message.w-node-...` para asignar `grid-area: span 1 / span 2`
   al textarea (que debe ocupar 2 columnas en el grid). Como renombramos los
   `id="message"` para evitar IDs duplicados (C4), agregamos esta regla que
   selecciona por `name="message"` (estable) y reasegura el span sobre 2 cols.
   También aplica al heading "Reserva tu espacio" (primer w-node) y al
   checkbox + submit que también necesitan span. */
.form-2 textarea[name="message"],
.form-2 .w-checkbox.checkbox-field,
.form-2 .w-checkbox.checkbox-field-2,
.form-2 input[type="submit"] {
  grid-column: span 2;
}

/* ---------- Submit del form de cotización (Form 1) — fix texto blanco
   sobre fondo blanco + duplicación del label ----------
   El export envuelve el `<input type="submit" class="submit-btn">` en un
   `.button-3.mod--form` que tiene fondo BLANCO, e incluye un
   `<div class="text-block-8">Reservar Espacio</div>` DUPLICADO como
   label visible. El submit está absolute encima con z:99 y texto blanco
   (invisible originalmente). Esto causaba dos bugs encadenados:
   1) "Reservar Espacio" invisible (blanco sobre blanco del submit input)
   2) Si solo dabamos color al submit, su texto se superponía con el del
      text-block-8 abajo (efecto de texto doble desfasado)
   Fix: hide el `.text-block-8` redundante (display:none) y dejar SOLO el
   submit con texto azul-pucv. El wrapper tiene height: 40px fijo, así
   que ocultar el div interior no rompe layout. Bonus: el `data-wait="Enviando..."`
   funciona nativamente — durante el submit Webflow swap el value del input
   y nuestro color azul se mantiene en ambos textos. */
.contact-form .submit-btn,
.contact-form input[type="submit"].submit-btn,
.button-3.mod--form input[type="submit"] {
  color: var(--azul-pucv) !important;
  font-weight: 600;
}
.contact-form .submit-btn:hover,
.button-3.mod--form input[type="submit"]:hover {
  color: var(--steel-blue) !important;
}
.button-3.mod--form .text-block-8 {
  display: none !important;
}

/* ====================================================================
   AUDITORÍA DE FONT-SIZES — MOBILE ONLY (≤767px)
   El export deja varios elementos con tamaños sub-óptimos en mobile:
   - .form-field sin font-size explícito → hereda 14px → iOS hace zoom al focus
   - .text-area: 14px → mismo problema iOS zoom
   - h5 .p_label: 12.48px → demasiado chico para legibilidad mobile
   - body text inconsistente entre 13-20px
   - H1/H2 a veces a 50px+ en mobile
   Este bloque corrige sólo en mobile (NO toca desktop). */
@media (max-width: 767px) {
  /* === INPUTS / FORMS — bump a 16px para prevenir el auto-zoom de iOS al
     hacer focus en cualquier input con font-size <16px (regla iOS Safari). */
  .form-field,
  .text-area,
  .contact__input,
  input[type="text"],
  input[type="email"],
  input[type="tel"],
  input[type="number"],
  input[type="search"],
  textarea,
  select {
    font-size: 16px !important;
  }
  /* Placeholder: heredar font-size del input (algunos browsers lo hacen smaller) */
  .form-field::placeholder,
  .text-area::placeholder,
  .contact__input::placeholder {
    font-size: 16px;
  }

  /* === H5 LABELS pequeños (.p_label "paso uno/dos/tres", body-text-14) —
     bump a 13px mínimo para legibilidad sin perder jerarquía visual. */
  h5,
  .body-text-14 {
    font-size: 0.82rem !important; /* ~13.1px, antes 12.48px */
  }

  /* === BODY TEXT — normaliza párrafos extra-chicos (≤14px) a 15px mínimo
     para legibilidad. Excluye los ya bien dimensionados. */
  .paragraph-small,
  .short-paragraph {
    font-size: 0.95rem !important; /* ~15.2px */
    line-height: 1.55;
  }

  /* === H1 con bandera bajada en mobile (max 2.25rem para que no rompa layout) */
  h1.heading-27 { /* "Otras formas de contacto" en /contacto/ */
    font-size: 1.7rem !important;
    line-height: 1.2;
  }

  /* === BUTTON font-size mínimo (legibilidad + tappability) */
  .button.w-button {
    font-size: 0.95rem;
  }
}

/* ====================================================================
   Form del footer (cotización "Tu espacio ideal está disponible..."):
   El export deja .contact_form-block con margin-left: 13.9rem (222px) en
   desktop, lo que carga el form a la izquierda dejando un hueco asimétrico
   a la derecha. Lo centramos con margin-left/right: auto.
   El .contact__heading-wrap (título "Tu espacio ideal está disponible...")
   también queda con su propio offset — lo dejamos quieto porque el título
   tiene un layout intencional con 2 líneas (".contact__title.mod--right"
   está alineado a la derecha) que da identidad visual a la sección.
   En mobile el export ya hace margin-left:0 + max-width:none, así que
   este fix sólo cambia el comportamiento desktop/tablet. */
.contact_form-block {
  margin-left: auto !important;
  margin-right: auto !important;
}

/* ====================================================================
   /sala-alumni/ — sección .section-8 con .frame.first/second/third
   El export deja 3 frames decorativos (sin texto) cada uno con height: 100vh
   y background-attachment: fixed (parallax). Total: 300vh de scroll sólo
   para 3 fotos. Rompe ritmo de navegación y desentona con el resto del sitio.
   Los compactamos a galería horizontal de 3 fotos lado a lado, con altura
   razonable y sin parallax. Mantenemos los overlays azul PUCV (--steel-blue,
   --40-azul-pucv) que ya están en paleta. */
.section-8 {
  padding: 4rem 1.5rem;
}
.section-8 .frame-parent {
  display: grid !important;
  grid-template-columns: repeat(3, 1fr) !important;
  gap: 1rem;
  max-width: 1280px;
  margin: 0 auto;
  height: auto !important;
}
.section-8 .frame {
  width: auto !important;
  height: 360px !important;
  padding: 0 !important;
  border-radius: 14px !important;
  background-attachment: scroll, scroll, scroll !important; /* remove parallax fixed */
  background-size: auto, cover, cover !important; /* normalizamos size — descartamos el "contain" raro de .frame.first */
  transition: transform .4s ease, box-shadow .4s ease;
  cursor: default;
}
.section-8 .frame:hover {
  transform: translateY(-4px);
  box-shadow: 0 18px 32px rgba(42, 87, 139, 0.18);
}

@media (max-width: 991px) {
  .section-8 { padding: 3rem 1.25rem; }
  .section-8 .frame { height: 280px !important; }
}
@media (max-width: 767px) {
  .section-8 { padding: 2.5rem 1rem; }
  .section-8 .frame-parent {
    grid-template-columns: 1fr !important;
    gap: 12px;
  }
  .section-8 .frame {
    height: 220px !important;
    border-radius: 12px !important;
  }
}

/* ====================================================================
   /salas/ — cards numeradas (.card-2.is-one/is-two/is-three) "Salas de
   Capacitación / Salas Ejecutivas / Salas de Reunión".
   Problemas del export:
   - .card_number-circle (2rem, fondo BLANCO) + .card_number (color #000)
     → en .card-2.is-one (fondo blanco) el número es INVISIBLE
   - En mobile el layout sigue siendo row 43%/57% → todo apretado, título cortado
   - position: sticky en mobile causa overlap raro al scrollear
   Mejoras: número en círculo azul PUCV con texto blanco (alto contraste),
   más grande y prominente; en mobile stack vertical image + content. */

/* Número en círculo: azul PUCV en lugar de blanco, texto blanco bold */
.card_number-circle {
  background-color: #2a578b !important;
  width: 2.5rem !important;
  height: 2.5rem !important;
  box-shadow: 0 4px 10px rgba(42, 87, 139, 0.25);
  flex: 0 0 auto;
}
.card_number {
  color: #fff !important;
  font-size: 1.1rem !important;
  font-weight: 700 !important;
  line-height: 1;
}
/* Heading consistencia */
.card-2 .heading-31 {
  line-height: 1.2;
  margin: 0;
}
/* Reemplazamos los colores verde (#2ba07d) y morado (#511de0) del template
   Webflow por la paleta PUCV. Card .is-one queda fondo blanco-suave (neutro),
   .is-two azul PUCV medio (--steel-blue #096ad0), .is-three azul PUCV oscuro
   (--midnight-blue #002D55). Variedad visual manteniendo identidad de marca. */
.card-2.is-one {
  background-color: #f1f4f9 !important; /* gris-azulado muy suave, neutral */
}
.card-2.is-two {
  background-color: #096ad0 !important; /* steel-blue */
}
.card-2.is-three {
  background-color: #002D55 !important; /* midnight-blue */
}
.card-2 .card_content {
  background-color: transparent !important;
}
.card-2.is-one .heading-31 {
  color: #2a578b;
}
.card-2.is-two .heading-31,
.card-2.is-three .heading-31 {
  color: #fff;
}

/* ---- Mobile (≤767px): stack vertical, image arriba + content abajo ---- */
@media (max-width: 767px) {
  .cards_wrapper {
    margin-bottom: 4rem !important;
    gap: 1.5rem;
  }
  .card-2 {
    flex-direction: column !important;
    min-height: auto !important;
    height: auto !important;
    position: static !important;  /* desactiva el sticky raro en mobile */
    border-radius: 1rem;
    overflow: hidden;
  }
  .card-2 .card_image {
    width: 100% !important;
    height: 220px !important;
    object-fit: cover;
    order: 1;
  }
  .card-2 .card_content {
    width: 100% !important;
    order: 2;
    padding: 1.5rem 1.5rem 1.75rem !important;
    flex-direction: row !important;
    align-items: center !important;
    justify-content: flex-start !important;
    gap: 14px !important;
  }
  /* Número aún más grande en mobile para mejor presencia */
  .card_number-circle {
    width: 2.75rem !important;
    height: 2.75rem !important;
  }
  .card_number {
    font-size: 1.2rem !important;
  }
  .card-2 .heading-31 {
    font-size: 1.2rem !important;
    flex: 1 1 auto;
    min-width: 0;
  }
}

/* ---------- M7 · Hover lift en cards de /salas/
   Las 3 cards (.cards_wrapper > .card-2.is-one|is-two|is-three) son grandes
   y prominentes pero el export las dejaba como divs estáticos sin feedback
   al pasar el mouse → no comunicaban "esto es interactivo".
   - Lift de 6px + sombra azul-pucv suave en hover.
   - Zoom 1.04 sobre la imagen interna (.card_image) para movement adicional
     que refuerza la sensación de profundidad.
   - cursor: pointer + role="link" + click handler agregados desde JS
     (form-handler.js → initSalasCards) para navegar a /todas-las-salas/?tab=N.
   Mapping del cliente confirmado en /todas-las-salas/:
     Card 1 "Salas de Capacitación" → ?tab=2
     Card 2 "Salas Ejecutivas"      → ?tab=3
     Card 3 "Salas de Reunión"      → ?tab=1 */
.cards_wrapper .card-2 {
  transition: transform .3s cubic-bezier(0.22, 1, 0.36, 1),
              box-shadow .3s cubic-bezier(0.22, 1, 0.36, 1);
  cursor: pointer;
}
.cards_wrapper .card-2:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-lg); /* M12: token unificado (era 0 12px 32px rgba(42,87,139,0.18)) */
}
.cards_wrapper .card-2 .card_image {
  transition: transform .5s cubic-bezier(0.22, 1, 0.36, 1);
}
.cards_wrapper .card-2:hover .card_image {
  transform: scale(1.04);
}
/* Foco con teclado: mismo lift + halo azul (a11y, ya que ahora son
   "links" via JS con tabindex+role aplicado). */
.cards_wrapper .card-2:focus-visible {
  transform: translateY(-6px);
  box-shadow: var(--shadow-lg),
              0 0 0 3px rgba(9, 106, 208, 0.35); /* M12 token + halo de foco */
  outline: none;
}
@media (prefers-reduced-motion: reduce) {
  .cards_wrapper .card-2,
  .cards_wrapper .card-2 .card_image {
    transition: none;
  }
  .cards_wrapper .card-2:hover {
    transform: none;
  }
  .cards_wrapper .card-2:hover .card_image {
    transform: none;
  }
}

/* ====================================================================
   /auditorio-fernando-rosas/ — sección "Equipamiento y Servicios"
   Las cards (.cards_cms_item) tienen el .card_heading h3 con line-height
   por default del browser (cerca de 2x el font-size, ej. 34px sobre 16.8px),
   lo que separa demasiado las líneas en títulos de 2+ líneas como
   "Micrófonos inalámbricos y cableados" o "Posibilidad de servicio de
   catering según tu necesidad". Ajustamos a 1.3 para mejor cohesión visual. */
.cards_cms_item .card_heading {
  line-height: 1.3 !important;
  margin-bottom: 0 !important;
}

/* ====================================================================
   Sección "Ubicación" con Google Maps embed — insertada antes del form
   del footer en home + páginas de sala (index, salas, sala-alumni,
   terraza-techada, auditorio-fernando-rosas). Diseño limpio, mapa con
   border-radius y sombra para integrarse al look del sitio.
   ==================================================================== */
.fh-ubicacion-section {
  padding: 64px 24px 72px;
  background: #fff;
}
.fh-ubicacion-wrapper {
  max-width: 1100px;
  margin: 0 auto;
  text-align: center;
}
.fh-ubicacion-title {
  font-family: Montserrat, Arial, sans-serif;
  font-size: 2.25rem;
  font-weight: 500;
  color: #2a578b;
  margin: 0 0 12px;
  letter-spacing: -0.015em;
}
.fh-ubicacion-address {
  font-family: Montserrat, Arial, sans-serif;
  font-size: 1.05rem;
  color: #4a5568;
  margin: 0 0 32px;
  line-height: 1.5;
}
.fh-ubicacion-map {
  position: relative;
  width: 100%;
  border-radius: 16px;
  overflow: hidden;
  box-shadow: 0 18px 40px rgba(42, 87, 139, 0.14);
  background: #e8eef5; /* placeholder mientras carga el iframe */
}
.fh-ubicacion-map iframe {
  display: block;
  width: 100%;
  height: 450px;
  border: 0;
}

@media (max-width: 991px) {
  .fh-ubicacion-section { padding: 56px 20px 64px; }
  .fh-ubicacion-title { font-size: 2rem; }
  .fh-ubicacion-map iframe { height: 400px; }
}

@media (max-width: 767px) {
  .fh-ubicacion-section { padding: 48px 16px 56px; }
  .fh-ubicacion-title { font-size: 1.7rem; }
  .fh-ubicacion-address { font-size: 0.98rem; margin-bottom: 24px; }
  .fh-ubicacion-map { border-radius: 12px; }
  .fh-ubicacion-map iframe { height: 340px; }
}

/* ====================================================================
   Hero banner CTAs — la sección .section-6.mod--hero tiene overflow:hidden
   (necesario para clip del video/image background) lo que recortaba el
   drop-shadow inferior de los botones "Ver Espacios" / "Consultar Disponibilidad".
   Agregamos un margin-bottom al wrapper de botones para que la sombra (4-11px
   abajo) tenga espacio para render dentro del clipping de la sección. */
.section-6.mod--hero .value-proposition-buttons {
  margin-bottom: 18px;
}
/* En el hero también queremos asegurarnos que cualquier .button con shadow no
   quede pegado al borde inferior. Padding-bottom adicional al hero. */
.section-6.mod--hero {
  padding-bottom: 3.5rem;
}

/* ====================================================================
   Navbar mobile (≤991px): mostrar TODOS los items del navbar desktop
   en una lista plana con buena jerarquía y CTA Reservar Espacio al final.
   El export deja los dropdowns Auditorio/Salas colapsados (requiere tap),
   y la CTA "Reservar Espacio" oculta en mobile (.w-hidden-medium).
   ==================================================================== */
@media (max-width: 991px) {
  /* El menu mobile de Webflow es .nav-menu-container — lo convertimos en
     una columna vertical scrolleable con padding cómodo. */
  .nav-menu-container.w-nav-menu {
    background: var(--midnight-blue, #002D55);
    width: 100%;
    min-height: 100vh;
    padding: 8px 0 32px;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }

  /* Forzar expandidos los dropdowns por default — flat list mejor que dropdowns
     anidados que requieren tap extra en mobile (jakob's law). */
  .nav-menu-container .w-dropdown {
    display: block !important;
    width: 100%;
  }
  .nav-menu-container .w-dropdown-list {
    position: static !important;
    display: block !important;
    background: transparent !important;
    box-shadow: none !important;
    width: 100%;
    max-height: none !important;
    height: auto !important;
    overflow: visible !important;
    transform: none !important;
    opacity: 1 !important;
    margin: 0;
    padding: 0;
  }

  /* El "toggle" del dropdown (Auditorio, Salas) ahora actúa como header de
     sección — uppercase pequeño, no clickable visualmente, separator arriba. */
  .nav-menu-container .w-dropdown-toggle {
    pointer-events: none; /* no se ve como botón, sólo etiqueta de grupo */
    padding: 22px 28px 10px !important;
    font-size: 0.72rem !important;
    font-weight: 600 !important;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: rgba(255, 255, 255, 0.5) !important;
    background: transparent !important;
    border-bottom: none !important;
  }
  .nav-menu-container .w-dropdown-toggle .text-block-2 {
    color: inherit;
    font-size: inherit;
    text-align: left;
    text-transform: uppercase;
  }
  /* Ocultar la flecha del dropdown — ya no toggle */
  .nav-menu-container .w-icon-dropdown-toggle,
  .nav-menu-container .icon-2 {
    display: none !important;
  }

  /* Items dentro de los dropdowns: links de tap target generoso (≥48px alto).
     Estilo similar al de los nav-link-3 (PUCV, Nosotros) para consistencia.
     El export pone .page-preview-link { height: 160px } en <479px y { height: 22px }
     en <991px — ambos rotos. Override con height: auto. */
  .nav-menu-container .page-preview-link.w-inline-block {
    display: flex !important;
    align-items: center;
    width: 100%;
    height: auto !important;
    padding: 16px 28px !important;
    color: #fff;
    text-decoration: none;
    background: transparent;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
    transition: background .15s ease;
  }
  .nav-menu-container .page-preview-link.w-inline-block:hover,
  .nav-menu-container .page-preview-link.w-inline-block:active {
    background: rgba(255, 255, 255, 0.05);
  }
  /* El icono SVG dentro del page-preview-link se mantiene chico a la izquierda */
  .nav-menu-container .nav-link-with-icon-containr {
    display: flex;
    align-items: center;
    gap: 14px;
  }
  .nav-menu-container .nav-link-with-icon-containr .menu-icon {
    width: 22px;
    height: 22px;
    filter: brightness(0) invert(1);
    opacity: 0.85;
  }
  .nav-menu-container .nav-link-with-icon-containr .text-block {
    font-family: Montserrat, Arial, sans-serif;
    font-size: 1rem;
    font-weight: 400;
    color: #fff;
  }

  /* Links sueltos PUCV / Nosotros — mismo padding que los items de dropdown
     para alineación visual consistente. Override del padding 31px del export
     que era demasiado vertical. */
  .nav-menu-container > .nav-link-3.w-nav-link:not(.fh-mobile-cta) {
    padding: 18px 28px !important;
    font-size: 1rem;
    font-weight: 500;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }

  /* CTA "Reservar Espacio" — botón prominente al final del menu mobile.
     La clase .fh-mobile-cta la añadimos al markup.
     IMPORTANTE: el .nav-link-3 del export tiene width: 100% — combinado con
     margin 24px lateral causaba scroll horizontal en mobile (388px viewport
     + 48px margen = overflow). Forzamos width: auto para que respete margen. */
  .nav-menu-container .fh-mobile-cta {
    display: block !important;
    width: auto !important;
    margin: 24px 24px 8px !important;
    padding: 16px 24px !important;
    background: var(--azul-pucv, #2a578b) !important;
    color: #fff !important;
    text-align: center;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.92rem !important;
    font-weight: 600 !important;
    border-radius: 999px;
    border: 0 !important;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25);
  }
  /* Garantía adicional: evitamos scroll horizontal en el menu si algún hijo
     se desborda (defensa en profundidad). */
  .nav-menu-container.w-nav-menu {
    overflow-x: hidden;
  }
  .nav-menu-container .fh-mobile-cta:hover,
  .nav-menu-container .fh-mobile-cta:active {
    background: var(--steel-blue, #096AD0) !important;
  }
}

/* En desktop la CTA mobile está oculta — la real es la del .navbar-links-container */
@media (min-width: 992px) {
  .fh-mobile-cta {
    display: none !important;
  }
}

/* ====================================================================
   "¿Cómo funciona el arriendo de espacios?" — sección #Pourquoi
   Estructura: .qe_grid.pourquoi.ho.home (flex row desktop)
   ├── .leftanchor.home (sticky title 45%)
   └── .pourquoicontainer.home (cards column 65%)
        ├── .p_unit.v2.home (paso uno) — image left + text right
        ├── .p_unit.dark.home (paso dos) — text left + image right
        ├── .p_unit.dark.mobile (paso dos en mobile, display:none desktop)
        └── .p_unit.medium.v3.home (paso tres) — image left + text right
   Mejoras: spacing entre cards, padding interno consistente, labels paso
   más legibles, mobile con stack limpio. SIN modificar copy ni colores.
   ==================================================================== */
.qe_grid.pourquoi.ho.home {
  gap: 2rem; /* espacio entre title sticky y cards column */
}
.qe_grid.pourquoi .pourquoicontainer.home {
  display: flex;
  flex-direction: column;
  gap: 1.5rem; /* aire entre cards (paso 1, 2, 3) */
}
/* Padding interno consistente en cada card para que el contenido respire */
.qe_grid.pourquoi .p_unit .pu_text {
  padding: 28px 24px;
  box-sizing: border-box;
}
/* Label "paso uno/dos/tres" — más prominente: uppercase con tracking */
.qe_grid.pourquoi .p_label {
  font-size: 0.82rem !important; /* 13.12px — más legible en mobile (era 0.78 = 12.48px) */
  font-weight: 600 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.12em !important;
  margin-bottom: 10px !important;
  opacity: 0.7;
}
/* Heading del paso — line-height más respirable */
.qe_grid.pourquoi .p_text {
  font-size: 1.15rem !important;
  line-height: 1.4 !important;
  font-weight: 500 !important;
  margin: 0 !important;
}

/* ---- Tablet (≤991px): el sticky title queda muy ancho, comprimimos ---- */
@media (max-width: 991px) {
  .qe_grid.pourquoi.ho.home {
    flex-flow: column !important;
    gap: 1.5rem;
    padding-left: 1.5rem !important;
    padding-right: 1.5rem !important;
  }
  .qe_grid.pourquoi .leftanchor.home,
  .qe_grid.pourquoi .pourquoicontainer.home {
    width: 100% !important;
    position: static !important;
  }
  .qe_grid.pourquoi .leftanchor.home {
    padding: 0 0 1rem !important;
  }
  .qe_grid.pourquoi .stickytitle {
    font-size: 2.25rem;
    line-height: 1.2; /* aire entre las dos líneas del título responsive */
  }
}

/* ---- Mobile (≤767px): cards stack image-arriba + text-abajo ---- */
@media (max-width: 767px) {
  .qe_grid.pourquoi .p_unit {
    flex-flow: column !important;
    height: auto !important;
    min-height: 400px;
    border-radius: 1.25rem !important;
    overflow: hidden;
  }
  /* Image arriba (más alta para presencia visual), text-abajo. Order asegura
     imagen primero incluso cuando el markup desktop la pone después (paso 2). */
  .qe_grid.pourquoi .p_unit .pu_image {
    width: 100% !important;
    height: 280px !important;
    order: 1;
    /* Reset border-radius del export para que tope con el card border */
    border-radius: 0 !important;
  }
  .qe_grid.pourquoi .p_unit .pu_text {
    width: 100% !important;
    order: 2;
    padding: 22px 20px;
    flex-flow: row !important;
    align-items: flex-start !important;
  }
  .qe_grid.pourquoi .p_unit .whitesymbol {
    width: 36px !important;
    height: 36px !important;
    margin-left: 0 !important;
    margin-right: 14px !important;
    flex: 0 0 auto;
  }
  .qe_grid.pourquoi .p_unit .whitesymbol img {
    width: 100%;
    height: 100%;
    object-fit: contain;
  }
  .qe_grid.pourquoi .p_unit .textcontainer {
    flex: 1 1 auto;
    min-width: 0;
  }
  .qe_grid.pourquoi .stickytitle {
    font-size: 1.85rem;
    line-height: 1.25; /* aire entre "¿Cómo funciona el" y "arriendo de espacios?" */
  }
  /* En mobile el `.p_unit.dark.mobile` se muestra (era el duplicado mobile-only),
     y el `.p_unit.dark.home` se oculta para evitar duplicado. */
  .qe_grid.pourquoi .p_unit.dark.home {
    display: none !important;
  }
  .qe_grid.pourquoi .p_unit.dark.mobile {
    display: flex !important;
  }
  /* Paso Dos en mobile: la foto .pu_image._2 (techo carpa terraza) tiene
     background-position 0 0 (top-left) — en mobile cropea sólo el techo y
     no se ve el espacio. Override a center bottom para mostrar la mitad
     inferior donde se aprecia la terraza. */
  .qe_grid.pourquoi .p_unit .pu_image._2 {
    background-position: center 75% !important;
  }
}


/* ====================================================================
   Type scale + tipografía moderna (lean design)
   ==================================================================== */

/* Font rendering smooth y kerning moderno en todo el sitio */
body {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: 'kern' 1, 'liga' 1;
}

/* Letter-spacing tight en headings grandes (look editorial moderno).
   Reduce el tracking de los headings para que se vean más densos y
   "premium" sin tocar tamaños del cliente. */
h1, h2,
.h1, .heading-1, .heading-2, .heading-3,
.heading-8, .heading-9, .heading-10, .heading-13, .heading-15,
.heading-22, .heading-29 {
  letter-spacing: -0.015em;
}
.hero__title {
  letter-spacing: -0.03em;
}
.contact__title,
.h1.text-style-allcaps {
  letter-spacing: -0.005em;
}

/* Line-height más generoso en prosa larga (estándar moderno: 1.5–1.6
   para body text). El export tenía 1.4–1.5; subimos para legibilidad. */
.paragraph,
.paragraph-2,
.paragraph-3,
.paragraph-4,
.paragraph-7,
.paragraph-8,
.paragraph-small,
.short-paragraph,
.body-text-14 {
  line-height: 1.6;
}

/* Reading width para columnas de prosa larga (60ch ≈ 540px optimal).
   Solo aplica donde el texto es información, no en CTAs o headers. */
.choose__text-wrap p,
.contact__text-wrap p,
.paragraph-3,
.paragraph-4 {
  max-width: 65ch;
}

/* Strong / bold con peso 600 (más legible que el 700 default que se ve
   "blocky" en fuentes modernas). */
strong, b, .bold {
  font-weight: 600;
}

/* Caps labels con tracking generoso (estándar para minúsculas-en-caps:
   +0.05–0.1em hace los caps respirar). */
.text-style-allcaps,
.tag,
.p_label,
.body-text-14.text-weight-medium.sk {
  letter-spacing: 0.06em;
  font-feature-settings: 'kern' 1;
}

/* ---------- Hero banners — vertical center + gap entre columnas ----------
   El export tenía .container-7 { align-items: flex-end } pegando todo al
   bottom del hero. Centramos verticalmente. Además, los heros con dos textos
   lado a lado (index, todas-las-salas) renderizaban sin gap, lo que hacía que
   el título grande chocara con el subtítulo derecho ("Salas|Espacios..." sin
   espacio entre ambas palabras). Agregamos gap horizontal robusto. */
.container-7 {
  align-items: center;
  gap: 3rem;
}
@media (max-width: 991px) {
  .container-7 { gap: 2rem; }
}

/* ---------- m1: subtítulo del hero alineado verticalmente al título ---------- */
.section-6.mod--hero .hero__heading-wrap {
  align-self: center;
}

/* ---------- C2: container-5 con translate3d(30rem) inline congelado ----------
   El IX2 que debía animar transform → 0 nunca se configuró. Override el inline
   style con !important. */
.container-5,
[data-w-id].container-5 {
  transform: none !important;
}

/* ---------- C1 + M1 + M22: elementos con IX2 inicial state pegado ----------
   Webflow puso style="opacity:0" o transforms inline esperando que el IX2
   los animara, pero no se configuraron. JS aplica .fh-revealed para
   animarlos al entrar al viewport (ver form-handler.js).
   M22: removido `[data-w-id]` del selector para cubrir también elementos
   sin data-w-id (ej. `.page-wrapper` con opacity:0 inline). El JS ya
   filtra correctamente cuáles necesitan el reveal — la clase fh-revealed
   solo se añade a elementos efectivamente "stuck". */
.fh-revealed {
  opacity: 1 !important;
  transform: none !important;
  transition: opacity 0.6s ease, transform 0.6s ease !important;
}

/* ---------- Cards "Formación PUCV" — animación premium (M2 v2) ----------
   El export Webflow tiene IX2 corriendo sobre `.d-105-card-wrapper` con
   `translate3d(0, 0, ~135px)` permanente que con perspective: 1000px del
   parent magnifica visualmente la card un 16% — y al hover IX2 cambia el Z
   provocando que la card "salte" de tamaño y la imagen dentro overflow.
   Solución: override total con `transform: none !important` — desactivamos
   IX2 y asumimos control completo del transform. Animación final:
   translateY(-8px) + scale(1.02) + zoom de imagen interna + color shift
   del título + shadow elevation + entrance stagger. */

/* Override IX2 — card sin Z translate, solo nuestro transform */
.d-105-card-wrapper {
  cursor: pointer;
  transform: none !important;
  box-shadow: 0 4px 12px rgba(31, 44, 61, 0.06);
  transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1) !important,
              box-shadow 0.4s cubic-bezier(0.22, 1, 0.36, 1) !important;
}
.d-105-card-wrapper.fh-card-hover {
  transform: translateY(-8px) scale(1.02) !important;
  box-shadow: 0 24px 40px rgba(9, 106, 208, 0.18),
              0 8px 16px rgba(31, 44, 61, 0.10);
}

/* Imagen: zoom suave en hover.
   IX2 inyecta inline `height: 100%; opacity: 0.6` en hover que hace que la
   imagen overflow sobre el área del título (looks broken). Los lockeamos a
   60% / opacity 1 con !important para neutralizar IX2 y dejar SOLO nuestro
   scale 1.08 como efecto de zoom. */
.d-105-image-wrapper {
  height: 60% !important;
  width: 100% !important;
  opacity: 1 !important;
  transition: transform 0.7s cubic-bezier(0.22, 1, 0.36, 1) !important;
  will-change: transform;
}
.d-105-card-wrapper.fh-card-hover .d-105-image-wrapper {
  transform: scale(1.08) !important;
}

/* Título: color shift sutil */
.d-105-card-title {
  transition: color 0.3s ease;
}
.d-105-card-wrapper.fh-card-hover .d-105-card-title {
  color: #096AD0;
}

/* Entrance stagger: cards entran con wave 0/120/240ms al entrar viewport */
.div-block-64 > .d-105-3d-wrapper {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}
.div-block-64.fh-cards-entered > .d-105-3d-wrapper {
  opacity: 1;
  transform: none;
}
.div-block-64.fh-cards-entered > .d-105-3d-wrapper:nth-child(1) { transition-delay: 0ms; }
.div-block-64.fh-cards-entered > .d-105-3d-wrapper:nth-child(2) { transition-delay: 120ms; }
.div-block-64.fh-cards-entered > .d-105-3d-wrapper:nth-child(3) { transition-delay: 240ms; }

@media (prefers-reduced-motion: reduce) {
  .d-105-card-wrapper,
  .d-105-image-wrapper,
  .d-105-card-title,
  .div-block-64 > .d-105-3d-wrapper {
    transition: none !important;
    transform: none !important;
    opacity: 1 !important;
  }
}

/* ---------- M3: anular text-transform: capitalize en headings ----------
   El export aplica capitalize en varios headings, deformando casing español
   ("Capacidad de 100 personas" → "Capacidad De 100 Personas"). Restauramos
   el casing escrito por el cliente. */
h1, h2, h3, h4, h5, h6,
.heading-1, .heading-2, .heading-3, .heading-4, .heading-5, .heading-6,
.heading-7, .heading-8, .heading-9, .heading-10, .heading-11, .heading-12,
.heading-13, .heading-14, .heading-15, .heading-16, .heading-17, .heading-18,
.heading-19, .heading-20, .heading-21, .heading-22, .heading-29 {
  text-transform: none;
}

/* ---------- M4: iconos sociales del footer normalizados ----------
   El export usa <img> de SVGs distintos (instagram en azul, facebook en gris).
   Aplicamos un filtro común para tonalizarlos al azul corporativo PUCV. */
.footer-link .social-media-icon,
a.footer-link img.social-media-icon {
  filter: brightness(0) saturate(100%) invert(28%) sepia(62%) saturate(2200%) hue-rotate(199deg) brightness(95%) contrast(101%);
  opacity: 1;
  transition: opacity .25s ease, transform .25s ease;
}
.footer-link:hover .social-media-icon {
  opacity: 0.75;
  transform: translateY(-2px);
}
/* (C13 fix: el 3er footer-link vacío fue eliminado del HTML directamente
   en lugar de ocultarlo via CSS — antes seguía siendo focuseable con tab y
   anunciado por screen readers como "link" sin nombre. Defensa adicional
   abajo por si el export Webflow vuelve a inyectarlo en futuro re-export.) */
.footer-link.w-inline-block:empty {
  display: none !important;
}

/* ---------- Bug del form de cotización: franja de imagen en mid-form ----------
   El export tenía <img class="contact__bg" src="fotoweb1.webp"> de 1494×838 px
   ocupando todo el alto desde el top de section-4 (incluido el área del form).
   El cliente quiere mantener la imagen como banner ARRIBA del form pero no
   atravesando los inputs. Solución: mask-image con gradient para que la imagen
   se vea sólida en la zona de banner (top de la sección) y fade-out justo
   donde empieza el form, dejando el background azul sólido limpio detrás. */
img.contact__bg {
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 68%, transparent 75%);
          mask-image: linear-gradient(to bottom, #000 0%, #000 68%, transparent 75%);
}

/* ---------- Dropdowns FAQ (.question-container) ----------
   El export tiene <a class="question-container"> con un <img class="question-arrow-icon">
   vacío (sin src) y dependía de IX2 no configurado para el toggle.
   Agregamos: flecha CSS pure rotativa, toggle JS, y estado expand/collapse. */
.question-container {
  cursor: pointer;
  position: relative;
}
.question-container .question-arrow-icon {
  display: none;
}
.question-container .question {
  position: relative;
  padding-right: 36px;
}
.question-container .question::after {
  content: '';
  position: absolute;
  right: 8px;
  top: 50%;
  width: 10px;
  height: 10px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-70%) rotate(45deg);
  transition: transform .25s ease;
  opacity: 0.7;
}
.question-container.is-open .question::after {
  transform: translateY(-30%) rotate(-135deg);
  opacity: 1;
}
/* M3 · Animación de altura en open/close del FAQ.
   El export usaba `display:none → block` lo que provocaba un salto instantáneo.
   Truco grid-template-rows: 0fr → 1fr permite animar la altura intrínseca
   del contenido sin JS y sin medirlo manualmente. El padding también
   transiciona para que la apertura/cierre se sienta cohesivo.
   El hijo directo necesita `min-height: 0` para que el track de grid
   colapse a 0 (sin esto, queda anclado a la altura natural del contenido). */
.question-container .answer {
  display: grid !important;
  grid-template-rows: 0fr;
  overflow: hidden;
  transition: grid-template-rows .35s cubic-bezier(0.22, 1, 0.36, 1),
              padding .35s cubic-bezier(0.22, 1, 0.36, 1);
  padding-top: 0;
  padding-bottom: 0;
}
.question-container .answer > * {
  min-height: 0;
  overflow: hidden;
}
.question-container.is-open .answer {
  grid-template-rows: 1fr;
  padding-top: 8px;
  padding-bottom: 8px;
}
@media (prefers-reduced-motion: reduce) {
  .question-container .answer {
    transition: none;
  }
}

/* ---------- M5 · Focus states visibles en inputs de formularios
   - .contact__input (form de cotización, fondo oscuro, bordes inferiores
     blancos): el export tenía `:focus { border-bottom-color: #f6f6f6 }`
     idéntico al estado idle → el usuario no veía cuál campo estaba activo.
     Subimos a borde blanco puro 2px + box-shadow translúcida abajo.
   - .form-field (form-2 hero/footer, fondo claro): el export no definía
     :focus → ningún feedback visual. Aplicamos border steel-blue + halo
     suave de 3px con steel-blue 15% alpha.
   Mejora a11y (WCAG 2.4.7 Focus Visible) y UX en mobile donde el placeholder
   desaparece al escribir y no había marcador del campo activo. */
.contact__input {
  transition: border-bottom-color .2s ease, box-shadow .2s ease;
}
.contact__input:focus,
.contact__input:focus-visible {
  border-bottom-color: #fff !important;
  border-bottom-width: 2px;
  outline: none;
  box-shadow: 0 2px 0 0 rgba(255, 255, 255, 0.3);
}
.form-field {
  transition: border-color .2s ease, box-shadow .2s ease;
}
.form-field:focus,
.form-field:focus-visible {
  border-color: var(--steel-blue);
  box-shadow: 0 0 0 3px rgba(9, 106, 208, 0.15);
  outline: none;
}

/* ---------- M6 · Hover state en cards del megamenu (.dropdown-container)
   `.page-preview-link` global tiene hover con radial-gradient para los cards
   del hero (fondo midnight-blue oscuro). En el megamenu del navbar las cards
   viven sobre fondo claro y ese hover queda invisible. Scope dedicado para
   `.dropdown-container .page-preview-link`: bg azul-pucv 6% alpha + lift 2px.
   Solo en desktop (≥992px) — en mobile el menú se renderiza con la lista
   .nav-menu-container que ya tiene su propio hover state. Estado .w--current
   (link activo de la página actual) recibe la versión más fuerte (10% alpha)
   para distinguir página actual del simple hover. */
@media (min-width: 992px) {
  .dropdown-container .page-preview-link {
    border-radius: 8px;
    transition: background-color .2s ease, transform .2s ease;
  }
  .dropdown-container .page-preview-link:hover,
  .dropdown-container .page-preview-link:focus-visible {
    background-color: rgba(9, 106, 208, 0.06);
    transform: translateY(-2px);
  }
  .dropdown-container .page-preview-link.w--current {
    background-color: rgba(9, 106, 208, 0.1);
  }
}

/* ---------- M8 · Press feedback (mousedown / tap) en elementos interactivos
   En mobile el usuario quiere ver un "click visual" inmediato al tappear:
   sin esto, los taps rápidos parecen no registrarse, especialmente en
   navegaciones que tardan unos ms en disparar. La escala 0.98 es sutil pero
   perceptible, y la transición de 0.08s la hace inmediata; al soltar el dedo
   el elemento vuelve a 1.0 con la transición idle (0.2-0.5s según componente),
   creando un "rebote" natural press → release.
   Aplica a las 4 superficies clickeables principales del sitio:
   - .card-2 (cards numeradas de /salas/, ya navegables vía M7)
   - .page-preview-link (cards del megamenu del navbar y los hero links)
   - a.button.w-button (botones de "Reservar" / "Volver al Inicio" / etc)
   - a.footer-link (links de contacto y NAP en el footer) */
.card-2:active,
.page-preview-link:active,
a.button.w-button:active,
a.footer-link:active {
  transform: scale(0.98);
  transition: transform .08s ease;
}

/* ---------- M10 · Imágenes de "Cómo funciona el arriendo" sin deformación
   El export tenía `.choose__img.is--1 { object-fit: fill }` y las demás
   variantes (is--2/3/4) sin object-fit explícito → default `fill`, que
   estira la imagen al box completo sin respetar aspect ratio.
   Resultado: caras y muebles estirados horizontal/verticalmente.
   Forzamos `object-fit: cover` en las 4 variantes para mantener el ratio
   y recortar excedente al center. */
.choose__img,
.choose__img.is--1,
.choose__img.is--2,
.choose__img.is--3,
.choose__img.is--4 {
  object-fit: cover !important;
  object-position: center;
}

/* ---------- M11 · Sistema de border-radius consistente
   El export usaba 14+ valores distintos de border-radius (de 1px a 90px,
   en px y rem mezclados) → cards en home con 1rem (16px), .p_unit con
   1.25rem (20px), uui-layout62 con 20px, etc. Inconsistencia visual.
   Definimos 5 tokens (xs/sm/md/lg/pill) y aplicamos `--radius-md` (14px)
   a las cards estándar, `--radius-lg` (20px) a las hero images. Los inputs
   y botones se quedan con sus valores propios — son piezas con su propia
   identidad (inputs lineales, botones pill) y no son "cards". */
:root {
  --radius-xs: 4px;
  --radius-sm: 8px;
  --radius-md: 14px;
  --radius-lg: 20px;
  --radius-pill: 999px;
}
.card-2,
.p_unit,
.qe_grid.pourquoi.v2 .p_unit,
.choose__img-wrap {
  border-radius: var(--radius-md);
}
.uui-layout62_image-wrapper {
  border-radius: var(--radius-lg);
}

/* ---------- M12 · Sistema de box-shadow consistente
   El export usaba 12 valores únicos de shadow mezclando colores
   (#013a751a, #1f2c3d1a, #0000001a, #00000017, #0003, etc) e intensidades.
   Definimos 5 tokens (sm/md/lg + 2 específicos para CTAs):
   - sm: cards livianas, badges
   - md: cards estándar at rest (default)
   - lg: cards en hover, modales
   - cta / cta-hover: botones primarios con tinte azul-pucv
   Todos los shadows usan el mismo color base (rgba 31, 44, 61) para
   coherencia visual; los CTAs usan azul (rgba 1, 58, 117) intencional
   para reforzar el accent. */
:root {
  --shadow-sm: 0 2px 6px rgba(31, 44, 61, 0.08);
  --shadow-md: 0 8px 24px rgba(31, 44, 61, 0.10);
  --shadow-lg: 0 16px 40px rgba(31, 44, 61, 0.14);
  --shadow-cta: 0 4px 11px rgba(1, 58, 117, 0.33);
  --shadow-cta-hover: 0 6px 20px rgba(1, 58, 117, 0.45);
}
.card-2 {
  box-shadow: var(--shadow-md) !important;
}
.card-2:hover {
  box-shadow: var(--shadow-lg) !important;
}
/* `!important` necesario para vencer la regla Webflow `.card-2.is-one
   { box-shadow: 0 2px 5px #0003 }` (uno de los 12 valores inconsistentes
   que este sistema busca eliminar). Sin !important, .is-one quedaba
   con su shadow legacy de 5px alpha 20%, distinto del resto. */

/* ---------- M13 · Overlay de contraste sobre "Beneficio Alumnos" (video bg)
   Verificación: el audit citó `.section.full-screen.background-image-side`
   y `.heading-9.white` en línea 866 — pero esas viven en bloques con
   `display: none` en el export (legacy/WIP del template Webflow). El
   bloque "Beneficio Alumnos" REALMENTE visible es `<section class="section-5">`
   con video background (`videopuv_mp4.mp4`) y `.atmosphere__content` con
   texto blanco. El video tiene frames variables (interior PUCV con luz
   natural) que reducen el contraste del texto blanco intermitentemente.
   Aplicamos un gradiente vertical oscuro (transparente arriba → 45% azul
   midnight abajo) entre el video y el contenido para garantizar legibilidad.
   - Pseudo en `.container-6` (no en section-5) para vivir dentro del mismo
     stacking context que el video y el content.
   - z-index: 1 → arriba del video (z-auto), abajo del content (z:2).
   También se agrega selector defensivo para `.section.full-screen.background-image-side`
   por si el cliente reactiva ese bloque en el futuro. */
section.section-5 .container-6::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(31, 44, 61, 0), rgba(31, 44, 61, 0.45));
  pointer-events: none;
  z-index: 1;
}
.section.full-screen.background-image-side::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(31, 44, 61, 0), rgba(31, 44, 61, 0.45));
  pointer-events: none;
  z-index: 1;
}
.section.full-screen.background-image-side {
  position: relative;
}
.section.full-screen.background-image-side .value-proposition-container {
  position: relative;
  z-index: 2;
}

/* ---------- M16 · Google Maps iframe sin CLS
   El iframe tiene `loading="lazy"` correctamente, pero las dimensiones
   `width="100%" height="450"` (atributos HTML) sin aspect-ratio CSS
   provocan que el browser no reserve espacio antes de cargar el iframe
   → al insertarse en el viewport, el contenido posterior salta hacia abajo
   (Cumulative Layout Shift, métrica Core Web Vitals).
   Solución: aspect-ratio fija + clamps min/max para que el espacio
   esté reservado desde el primer paint, sin importar si el iframe
   ya cargó o no. El bg #f0f0f0 da un placeholder neutro mientras carga.
   Aplica a las 5 páginas con mapa: index, salas, sala-alumni,
   terraza-techada, auditorio-fernando-rosas. */
iframe[src*="google.com/maps/embed"] {
  aspect-ratio: 16 / 9;
  height: auto !important;
  width: 100%;
  max-height: 450px;
  min-height: 320px;
  background: #f0f0f0;
}

/* ---------- M19 · Estado "scrolled" en navbar (shrink + box-shadow)
   El audit pidió "shrinkear el logo + bg blanco translúcido al hacer scroll".
   Reconciliación con la realidad del export: la navbar ya tiene bg blanco
   sólido (#fff) y los links son texto oscuro `rgb(34, 34, 34)`. Si aplicara
   el `rgba(31, 44, 61, 0.96)` dark del CSS del audit literal, los links se
   volverían invisibles. Por eso uso el texto del audit: blanco translúcido
   (matching paleta actual) + box-shadow para crear separación visual al
   scrollear, en lugar del dark bg.
   El estado "scrolled" se activa via JS en form-handler.js cuando window.scrollY > 80px:
   - Navbar pasa de 80px a ~50px de altura (padding 32→8 + logo 200→140).
   - Box-shadow sutil aparece como separador del contenido scrolleado.
   - Backdrop-filter: blur(10px) crea efecto frosted-glass moderno. */
/* === REDISEÑO COMPLETO DEL NAVBAR (M19 v2 + fix de dropdown overlay) ===
   Problema raíz: Webflow trata los megamenús (.dropdown-container._1/_2)
   como bloques en FLUJO INLINE dentro del .navbar.fixed con position:static
   y margin-top:45px. Cuando expanden (hover), su top queda en y=77 mientras
   el bottom del navbar es y=80 → 3px de overlap perpetuo. Ese 3px se ve
   como "barra azul atravesando la navbar" especialmente cuando los items
   internos tienen contraste (links blancos sobre el navy del dropdown).

   Solución: convertir los dropdown-container en overlays absolute-positioned
   debajo del navbar (top: 100%) en lugar de flujo inline. Así:
   - No hay overlap visual con el navbar
   - El navbar mantiene su altura natural (no se "deforma" al hover)
   - El contenido posterior de la página no salta cuando se abre el dropdown
   - Visual cleaner y más moderno (overlay clásico tipo SaaS) */

/* Navbar — base + transitions */
.navbar.fixed.w-nav {
  transition: padding .3s cubic-bezier(0.22, 1, 0.36, 1),
              box-shadow .3s ease;
  /* Subtle base shadow para separar del contenido en cualquier estado */
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}

/* Estado scrolled: shadow más pronunciada, padding más ajustado */
.navbar.fixed.w-nav.fh-nav-scrolled {
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: rgb(255, 255, 255);
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08),
              0 1px 0 rgba(0, 0, 0, 0.04);
}

/* Logo: smooth scale on scroll + hover lift (N5) */
.navbar.fixed.w-nav .logo-navbar {
  transition: max-width .3s cubic-bezier(0.22, 1, 0.36, 1),
              transform .2s ease;
}
.navbar.fixed.w-nav.fh-nav-scrolled .logo-navbar {
  max-width: 150px;
}
.logo:hover .logo-navbar {
  transform: scale(1.04);
}

/* === DROPDOWN-CONTAINER OVERLAY FIX === */
/* Solo desktop (≥992px) — en mobile el menú usa otro mecanismo */
@media (min-width: 992px) {
  .navbar.fixed.w-nav .dropdown-container._1,
  .navbar.fixed.w-nav .dropdown-container._2 {
    position: absolute !important;
    top: 100% !important;        /* justo bajo el navbar, sin overlap */
    left: 0 !important;
    right: 0 !important;
    width: 100%;
    margin-top: 0 !important;     /* anula el margin-top: 45px del export */
    z-index: 5;                   /* por encima del wrapper navbar (z:10 absolute) */
    box-shadow: 0 12px 24px rgba(0, 0, 0, 0.10);
    overflow: hidden;             /* clip durante height transition */
  }

  /* Solo hover/active activa el shadow visible — cuando height=0 no sirve */
  .navbar.fixed.w-nav .dropdown-container._1:not([style*="0px"]),
  .navbar.fixed.w-nav .dropdown-container._2:not([style*="0px"]) {
    box-shadow: 0 12px 24px rgba(0, 0, 0, 0.10);
  }
}

/* ---------- M23 · Reveal de elementos con width/height: 0px stuck
   Webflow IX2 set inline `style="height:0px"` o `style="width:0px"` como
   estado inicial de animación scroll-into-view. JS (initRevealStaleSize)
   detecta los stragglers tras 2s, observa con IO y limpia las inline
   styles al entrar al viewport. La transición permite que el cambio sea
   suave si CSS provee dimensiones explícitas (decorativa en la mayoría
   de los casos donde el natural sizing es lo que aplica). */
.fh-size-revealed {
  transition: width .8s ease, height .8s ease;
}

/* ---------- M24 · Footer mobile — gap consistente + tap targets
   El export deja `.row.footer` con grid-template-rows/columns y col-margins
   asimétricos en mobile → gaps inconsistentes entre las 4 columnas (logo,
   espacios PUCV, espacios, encuéntranos), algunas con margin-bottom y
   otras no. Override mobile-only: forzamos flex single-column con gap 32px
   uniforme. Footer-links-container también pasa a flex column con gap 8px.
   Los `.footer-link` reciben padding 6px arriba/abajo para que el tap
   target alcance ≥36px (recomendación móvil) sin alterar el spacing visual. */
/* ---------- N2 + N8 · Stagger fade-in en grupos de columnas y bento grids
   N2: "Todo lo que tu evento necesita" (.row.grilla-4) y "Por qué elegirnos"
       (.choose__columns) — 4 columnas con fade + translateY.
   N8: bento "Cerro Concepción / Alegre / San Cristóbal" en /sobre-nosotros/
       (.qe_grid.pourquoi.v2 .p_unit) — fade + scale 0.92 → 1.0.
   El init JS las marca con `.fh-stagger-in` (cols) o `.fh-stagger-scale-in`
   (bento) con transition-delay incremental de 80ms. Estado inicial se
   aplica con regla normal; al recibir la clase transitiona suave. */
.row.grilla-4 .col,
.choose__columns .choose__col {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity .6s ease, transform .6s ease;
}
.row.grilla-4 .col.fh-stagger-in,
.choose__columns .choose__col.fh-stagger-in {
  opacity: 1;
  transform: none;
}
.qe_grid .p_unit {
  opacity: 0;
  transform: scale(0.92);
  transition: opacity .6s ease, transform .6s cubic-bezier(0.22, 1, 0.36, 1);
}
.qe_grid .p_unit.fh-stagger-scale-in {
  opacity: 1;
  transform: none;
}
@media (prefers-reduced-motion: reduce) {
  .row.grilla-4 .col,
  .choose__columns .choose__col,
  .qe_grid .p_unit {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ---------- N3 · Parallax suave en hero images
   La inline `transform: translate3d(...)` se actualiza desde JS en cada
   scroll tick con factor 0.15 (15% de la distancia scrolleada).
   Fix franja gris: el JS desplaza la imagen hacia arriba al scrollear, lo
   que exponía la parte inferior del contenedor del hero (fondo gris). Damos
   115% de altura + object-fit: cover para que haya 15% de buffer vertical
   que el parallax pueda usar sin revelar el background. `object-position`
   center para que el cropping siempre muestre el sujeto principal centrado.
   `transform-origin: center top` asegura que cualquier scale futuro
   no cause shift horizontal. */
.hero__bg {
  height: 115% !important;
  object-fit: cover;
  object-position: center;
  transform-origin: center top;
  will-change: transform;
  transition: transform .15s linear;
}

/* (N5 logo hover lift consolidado en el bloque del navbar arriba — M19 v2) */

/* ---------- N15 · Page transition fade entre rutas
   Browsers con cross-document View Transitions API (`<meta name="view-transition"
   content="same-origin">` en <head>) hacen el fade nativamente.
   Para los demás (Safari, Firefox actuales), JS intercepta clicks y agrega
   `.fh-page-leaving` al <body> → este fade de 200ms ocurre, luego navega.
   `!important` para vencer la regla de `.fh-revealed` (que usa transition
   de 0.6s + opacity:1 important sobre .page-wrapper). */
body.fh-page-leaving .page-wrapper {
  opacity: 0 !important;
  transition: opacity 0.2s ease !important;
}
@media (prefers-reduced-motion: reduce) {
  body.fh-page-leaving .page-wrapper {
    transition: none !important;
  }
}

@media (max-width: 767px) {
  /* El export de Webflow solo colapsa el grid del footer a 1 columna en
     <479px (`.row.footer { grid-template-columns: 1fr }` en @media 479px).
     Entre 480-767px (la mayoría de mobile real, ej. 500-767), el footer
     persistía con 4 columnas fijas que se desbordaban del viewport,
     cortando contenido. Forzamos 1 columna en todo el rango mobile. */
  .row.footer {
    display: grid !important;
    grid-template-columns: 1fr !important;
    grid-template-rows: auto !important;
    gap: 32px;
  }
  .row.footer .col {
    margin: 0 !important;
    width: 100%;
  }
  .row.footer .footer-links-container {
    gap: 8px;
    display: flex;
    flex-direction: column;
  }
  .row.footer .footer-link {
    padding: 6px 0;
  }
}

/* ---------- Mensajes de form: Webflow defaults override ----------
   Webflow inyecta .w-form-done (success) y .w-form-fail (error) con
   tipografía y colores genéricos en inglés. Ya tradujimos los textos.
   Acá normalizamos la apariencia para que matche el resto del sitio. */
.w-form-done,
.w-form-fail {
  font-family: Montserrat, Arial, sans-serif !important;
  font-size: 0.95rem;
  line-height: 1.5;
  padding: 14px 18px;
  border-radius: 10px;
  margin-top: 14px;
}
.w-form-done {
  background: #e8f5ed !important;
  color: #1e6f3e !important;
  border: 1px solid #b8e0c5;
}
.w-form-fail {
  background: #fdecea !important;
  color: #b3261e !important;
  border: 1px solid #f5c2c0;
}
.w-form-done div,
.w-form-fail div {
  font-family: inherit;
  font-weight: 600;
}

/* ---------- m4: "Otras formas de contacto" con 1 sola card centrada ----------
   La sección espera múltiples cards pero hay solo 1. Centramos el grid para
   que no se vea solitaria a la izquierda. */
.contacto__cards,
.contacto-cards,
.otras-formas-grid,
[class*="contacto"][class*="grid"] {
  justify-content: center;
}

/* ---------- Anchor scroll target #formulario ----------
   Cuando el usuario hace clic en "Consultar Disponibilidad" desde el home,
   el browser navega a /contacto/#formulario. El id ahora vive en el wrapper
   container-5 (que incluye el título "Tu espacio ideal está disponible..."
   + el form-block), así el scroll aterriza en el título y no más abajo.
   scroll-margin-top compensa el navbar fixed (~80px) para que el título
   quede visible bajo el navbar y no oculto detrás de él. */
#formulario {
  scroll-margin-top: 100px;
}
@media (max-width: 991px) {
  #formulario { scroll-margin-top: 80px; }
}

/* ---------- Página /politicas-de-cancelacion-y-formas-de-pago-catering/ ----------
   Mejor uso del espacio del componente FAQ y legibilidad de "Datos de contacto"
   y de los textos de "Cancelación" / "Modificación". */

/* Hero /contacto/ "Estamos para Ayudarte a Elegir tu Espacio"
   El export deja .hero__title.contacto con font-size 5rem (desktop) y 4.3rem
   en <479px. En mobile el texto a 68.8px wrappea en 5+ líneas que el
   .section-6.mod--hero corta por su overflow:hidden. Escalamos progresivamente. */
.hero__title.contacto {
  word-wrap: break-word;
  overflow-wrap: break-word;
}
@media (max-width: 991px) {
  .hero__title.contacto {
    font-size: 3.5rem !important;
    line-height: 1.1 !important;
  }
}
@media (max-width: 767px) {
  .hero__title.contacto {
    font-size: 2.6rem !important;
    line-height: 1.1 !important;
    letter-spacing: -.05rem;
    /* Override del export: .hero__title tiene overflow:hidden + margin-bottom:15.875rem
       (254px) que en mobile colapsa el render a height 0 dentro del flex column. */
    overflow: visible !important;
    margin-bottom: 1.25rem !important;
    height: auto !important;
  }
  /* Container-7.contacto del export queda en flex-row hasta <479px,
     entre 480-767px el título quedaba en un columna angosta y se rompía
     palabra-por-palabra. Forzamos column antes para layout coherente. */
  .container-7.contacto {
    flex-flow: column !important;
    padding-left: 5% !important;
    padding-right: 5% !important;
    align-items: stretch !important;
  }
  .container-7.contacto .hero__title.contacto {
    width: 100% !important;
  }
  .container-7.contacto .hero__heading-wrap {
    width: 100%;
  }
}
@media (max-width: 479px) {
  .hero__title.contacto {
    font-size: 2.1rem !important;
    line-height: 1.15 !important;
  }
}

/* Banner hero "Términos y Condiciones Catering" — el export deja
   .hero__title.v2.d con font-size 8rem (desktop) y 4.125rem (<479px). En
   mobile el texto chocaba con los bordes del viewport y overflow horizontal.
   Reducimos la escala progresivamente y agregamos word-break protection. */
.hero__title.v2.d {
  word-wrap: break-word;
  overflow-wrap: break-word;
  hyphens: auto;
}
@media (max-width: 991px) {
  .hero__title.v2.d {
    font-size: 4rem;
    letter-spacing: -.15rem;
  }
}
@media (max-width: 767px) {
  .hero__title.v2.d {
    font-size: 2.75rem;
    letter-spacing: -.1rem;
    line-height: 1.05;
    padding: 0 16px;
  }
  .section-5.margin-tio .container-6 {
    height: auto;
    min-height: 18rem;
    padding: 4rem 0;
  }
}
@media (max-width: 479px) {
  .hero__title.v2.d {
    font-size: 2.1rem;
    letter-spacing: -.05rem;
  }
  .section-5.margin-tio .container-6 {
    min-height: 14rem;
    padding: 3rem 0;
  }
}

/* ---------- Tabs "Conoce nuestros espacios" — scroll horizontal en mobile ----------
   El export pone .tab-link con flex: 1 + width: 33.33% (igual reparto entre los 5 tabs)
   y en <479px hace flex-wrap: wrap, lo que tira los tabs a 2 filas o se cortan.
   En mobile preferimos scroll horizontal con fade gradient a la derecha (signal visual
   "hay más afuera de pantalla, swipea →"). Tablets (<991px) también beneficia.
   Selector genérico .tab.w-tabs para capturar ambas instancias del componente
   (.section.v3 desktop y .section-6 .container-8 mobile). */
@media (max-width: 991px) {
  .tab.w-tabs {
    position: relative;
  }
  /* Gradient fade en el lado derecho: arranca transparente y termina blanco para
     sugerir "hay tabs ocultos a la derecha, swipea horizontalmente". Solo cubre
     la zona del menu (top 50px) para no interferir con el contenido del tab. */
  .tab.w-tabs::after {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    height: 56px;
    width: 80px;
    background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.95) 60%, rgba(255, 255, 255, 1) 100%);
    pointer-events: none;
    z-index: 2;
    transition: opacity .3s ease;
  }
  /* Flecha indicadora "swipea →": círculo azul PUCV con chevron blanco, alineado
     a la altura del menu. Animación sutil de bounce horizontal para reforzar la
     affordance de scroll horizontal. pointer-events: none para no bloquear clicks
     en los tabs que pasen por debajo. */
  .tab.w-tabs::before {
    content: '';
    position: absolute;
    top: 9px;
    right: 12px;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background-color: #2a578b;
    /* Chevron > en SVG inline, color blanco */
    background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 14px 14px;
    box-shadow: 0 2px 8px rgba(42, 87, 139, 0.35);
    pointer-events: none;
    z-index: 3;
    animation: fhTabsHint 1.8s cubic-bezier(0.45, 0, 0.55, 1) infinite;
    transition: opacity .3s ease;
  }
  @keyframes fhTabsHint {
    0%, 100% { transform: translateX(0); }
    50% { transform: translateX(5px); }
  }
  /* Cuando el usuario ya scrolleó hasta el final (no hay más tabs ocultos),
     ocultamos arrow y gradient. La clase la setea form-handler.js detectando
     scroll position en .tabs-menu. */
  .tab.w-tabs.fh-tabs-at-end::before,
  .tab.w-tabs.fh-tabs-at-end::after {
    opacity: 0;
  }
  /* Respeta usuarios que prefieren reducir movimiento — desactivamos bounce
     pero dejamos visible el chevron. */
  @media (prefers-reduced-motion: reduce) {
    .tab.w-tabs::before {
      animation: none;
    }
  }
  .tabs-menu {
    flex-wrap: nowrap !important;
    overflow-x: auto;
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none; /* Firefox */
    margin-bottom: 30px !important;
  }
  .tabs-menu::-webkit-scrollbar {
    display: none; /* Chrome / Safari */
  }
  .tab-link {
    flex: 0 0 auto !important;
    width: auto !important;
    min-width: 0;
    white-space: nowrap;
    scroll-snap-align: start;
    padding-left: 18px !important;
    padding-right: 18px !important;
  }
  /* El export tiene un <br> hardcoded en "Salas de<br>Reunión" del primer tab.
     Lo anulamos para que el tab quede en una sola línea consistente con los demás. */
  .tab-link br {
    display: none;
  }
  /* Espacio fantasma al final para que el último tab pueda quedar pegado al
     borde derecho del scroll (no se sienta cortado por el gradient). */
  .tabs-menu::after {
    content: '';
    flex: 0 0 32px;
  }
}

/* "Desde" icon en sección "Cerro Concepción / Tipo de Espacio / Capacidad":
   El export usa .div-block-63 (un círculo azul con bg-image "ahorrar-dinero")
   fijado en 65px para representar el icono de "Desde UF 1,0". Pero los otros
   2 íconos al lado son <img class="icon-64"> que en mobile (<767px) bajan
   de 4rem (64px) a 3rem (48px). El .div-block-63 NO tiene esa media query
   y queda en 65px, viéndose ~35% más grande que los otros 2 íconos en mobile. */
@media (max-width: 767px) {
  .div-block-63 {
    width: 3rem;
    height: 3rem;
    background-size: 75% 75%;
  }
}

/* Datos de contacto en mobile: además del breakpoint a 540px que stack-ea
   las cards a 1 col, asegurar que el role largo (PAMELA: "ADMINISTRADORA
   CAFETERÍA ESPACIO CEA") no overflow horizontalmente con word-break. */
.datos-contacto-card { min-width: 0; }
.datos-contacto-name,
.datos-contacto-role,
.datos-contacto-email,
.datos-contacto-phone {
  word-break: break-word;
  overflow-wrap: break-word;
}


/* Datos de contacto: 2 cards (Litvet + Pamela) en grid responsive.
   Reemplazó al H4 original que mostraba ambos contactos como un wall of text. */
.datos-contacto-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 20px;
  margin: 0 0 56px;
}
.datos-contacto-card {
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  padding: 22px 24px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  transition: box-shadow .25s ease, transform .25s ease;
}
.datos-contacto-card:hover {
  box-shadow: 0 12px 28px rgba(42, 87, 139, 0.10);
  transform: translateY(-2px);
}
.datos-contacto-card p {
  margin: 0;
  font-family: Montserrat, Arial, sans-serif;
  line-height: 1.4;
}
.datos-contacto-name {
  font-size: 1.05rem;
  font-weight: 600;
  color: #2a578b;
  letter-spacing: 0.01em;
}
.datos-contacto-role {
  font-size: 0.78rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: #6b7280;
  margin-bottom: 8px !important;
}
.datos-contacto-email,
.datos-contacto-phone {
  font-size: 0.95rem;
}
.datos-contacto-email a,
.datos-contacto-phone a {
  color: #2a578b;
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color .2s ease, color .2s ease;
}
.datos-contacto-email a:hover,
.datos-contacto-phone a:hover {
  border-bottom-color: #2a578b;
}

/* Listas .fh-policy-list dentro del FAQ: cada bullet es un punto de la
   política (verbatim, no modificamos copy). Mejora escaneabilidad vs
   el párrafo corrido separado por <br>. Aplicado a Solicitud de reserva,
   Cotizaciones y Cancelación. */
.fh-policy-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.fh-policy-list li {
  position: relative;
  padding: 12px 0 12px 28px;
  line-height: 1.65;
  color: #1a202c; /* contraste alto: era azul-pucv (#2a578b) que se veía bajo en blanco */
}
.fh-policy-list li + li {
  border-top: 1px solid #e8eaf0;
}
.fh-policy-list li::before {
  content: '';
  position: absolute;
  left: 6px;
  top: 22px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #2a578b;
}
.fh-policy-list li strong {
  color: #2a578b;
  font-weight: 600;
}
.fh-policy-list li em {
  font-style: italic;
}

/* Bloque "datos bancarios" dentro de la lista de Cotizaciones: presenta los
   campos del banco de forma estructurada (label + value) para que el usuario
   pueda copiar/leer con claridad la transferencia. */
.fh-bank-details {
  margin-top: 12px;
  padding: 16px 20px;
  background: #f7f9fc;
  border: 1px solid #e2e8f0;
  border-radius: 10px;
  display: grid;
  gap: 6px;
  font-style: normal;
}
.fh-bank-details > div {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 12px;
}
.fh-bank-label {
  font-size: 0.78rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: #6b7280;
  min-width: 110px;
}
.fh-bank-value {
  font-family: 'SF Mono', 'Menlo', 'Consolas', monospace;
  font-size: 0.95rem;
  color: #1a202c;
  font-weight: 500;
}

/* Tipografía y CONTRASTE para los párrafos sueltos del FAQ.
   Override del .paragraph/.paragraph-2/.paragraph-3/.paragraph-4 del export
   que usa --azul-pucv (#2a578b) como color de texto, lo que reduce contraste
   en fondo blanco. Cambiamos a casi-negro neutral.
   También anulamos el max-width: 65ch que tienen .paragraph-3 y .paragraph-4
   por la regla genérica de reading-width — dentro del FAQ queremos que el
   texto use TODO el ancho disponible del componente (que ya está limitado
   por el .col.lg-6 a 85% de la row). */
.row.faq .answer .paragraph,
.row.faq .answer .paragraph-2,
.row.faq .answer .paragraph-3,
.row.faq .answer .paragraph-4 {
  line-height: 1.7;
  font-size: 0.98rem;
  color: #1a202c;
  max-width: none;
}

@media (max-width: 540px) {
  .datos-contacto-grid {
    grid-template-columns: 1fr;
    gap: 14px;
    margin-bottom: 40px;
  }
  .datos-contacto-card { padding: 18px 20px; }
  .datos-contacto-name { font-size: 1rem; }
  .datos-contacto-role { font-size: 0.72rem; }

  /* Bank details: en desktop label+value en línea (label ~110px), en mobile
     ese layout horizontal se queda corto y overflow. Stack vertical: label
     arriba pequeño en uppercase, value abajo en monospace ancho completo. */
  .fh-bank-details { padding: 14px 16px; }
  .fh-bank-details > div {
    flex-direction: column;
    gap: 2px;
    align-items: stretch;
  }
  .fh-bank-label {
    min-width: 0;
    font-size: 0.72rem;
  }
  .fh-bank-value {
    font-size: 0.92rem;
    overflow-wrap: anywhere;
  }
}

/* ---------- FAQ section: centrar el bloque "Preguntas Frecuentes" ----------
   El export tiene .row.faq con display: block (no grid), y dentro un col.lg-3
   vacío + col.lg-6 (85% width). Al ser block-level, ambos quedan left-aligned
   por default y la sección entera se ve corrida a la izquierda.
   Solución: ocultar el spacer vacío, centrar el col.lg-6 con margin auto, y
   forzar align-items: stretch para que el H2 ocupe el ancho completo del col
   (así su text-align: center realmente centra el texto). */
.row.faq .col.lg-3:empty {
  display: none;
}
.row.faq .col.lg-6 {
  margin-left: auto;
  margin-right: auto;
  align-items: stretch;
}

/* ---------- Sección "Todo lo que tu evento necesita" — fade-in en TODAS las cols ----------
   El export tiene 4 cols con icon+texto, cada una con su data-w-id. Webflow IX2
   solo configuró la animación para la PRIMERA (Capacidad de 100 personas /
   Amplia variedad), las otras 3 quedan estáticas. Aplicamos opacity:0 inicial
   en las 4 + delegamos a IntersectionObserver (form-handler.js los marca
   con .fh-revealed al entrar al viewport, mismo mecanismo que el resto del
   sitio). La regla [data-w-id].fh-revealed ya está definida arriba. */
.row.grilla-4 > .col > .margin-bottom[data-w-id] {
  opacity: 0;
  transform: translateY(24px);
}

/* ---------- Hero form (.form-2) — gap horizontal + stack en mobile ----------
   El export deja .form-2 con `grid-column-gap: 0` y `grid-template-columns: 1fr 1fr`.
   En desktop esto hacía que los campos del lado izquierdo (Nombre, Celular)
   parezcan FUSIONADOS con los del lado derecho (Correo, Participantes) porque
   no había separación horizontal entre las dos columnas.
   En mobile (<767px) el espacio horizontal se vuelve insuficiente para 2
   columnas y los campos colisionan visualmente. Solución: añadir gap en
   desktop y colapsar a 1 sola columna en mobile. */
.form-2 {
  grid-column-gap: 16px !important;
}
@media (max-width: 767px) {
  .form-2 {
    grid-template-columns: 1fr !important;
    grid-column-gap: 0 !important;
  }
  /* Cuando el grid colapsa a 1 columna, los hijos con `grid-area: span 1 / span 2`
     (heading, mensaje, checkbox, submit) intentarían crear una 2da columna
     implícita rompiendo el layout. Forzamos a span fila completa en cualquier
     número de columnas con `1 / -1`. */
  .form-2 > * {
    grid-column: 1 / -1 !important;
  }
}

/* ---------- M1 · Fallback CSS-only para text-split / letters-fade-in-random / words-rotate-in
   El export de Webflow trae custom attrs `text-split`, `letters-fade-in-random`,
   `words-rotate-in` en hero titles de home, contacto, sobre-nosotros, todas-las-salas,
   terminos y politicas. Esos efectos requieren GSAP + SplitType, pero la
   restricción del proyecto prohíbe agregar dependencias JS. Para que el hero no
   quede estático, aplicamos un fade-in suave CSS-only (entrada única al cargar,
   sin necesidad de scroll trigger). Respeta `prefers-reduced-motion`. */
[letters-fade-in-random][text-split],
[words-rotate-in][text-split] {
  opacity: 0;
  transform: translateY(12px);
  animation: heroFadeIn 0.8s cubic-bezier(0.22, 1, 0.36, 1) 0.2s forwards;
}
@keyframes heroFadeIn {
  to {
    opacity: 1;
    transform: none;
  }
}
@media (prefers-reduced-motion: reduce) {
  [letters-fade-in-random][text-split],
  [words-rotate-in][text-split] {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

/* ---------- M2 · Transición suave en tabs `.uui-layout62_tabs-link`
   Sección "Reserva tu espacio" en /auditorio-fernando-rosas/ y /terraza-techada/.
   El export deja `border-left-color` saltando entre gris (idle) y azul-pucv
   (.w--current) sin transición, lo que se ve abrupto al cambiar de tab.
   Añadimos transición de 0.25s y un estado hover sutil con --alice-blue
   (#096ad033, steel-blue 20% alpha) que ya está definida en el sistema. */
.uui-layout62_tabs-link {
  transition: border-left-color .25s ease, background-color .25s ease;
}
.uui-layout62_tabs-link:hover {
  border-left-color: var(--alice-blue);
  background-color: rgba(9, 106, 208, 0.04);
}
