/* =========================================================================
   Alpha Value Consulting — hoja de estilos principal
   Sistema de diseño derivado del archivo Figma (Alpha_consulting.fig)
   ========================================================================= */

/* ---------- Tokens ---------- */
:root {
  /* Marca */
  --gold: #c79e41;
  --gold-dark: #af8c3c;
  --gold-soft: #fee9bf;
  --gold-tint: #fff6e2;

  /* Neutros */
  --ink: #000000;
  --ink-800: #141414;
  --ink-700: #262626;
  --graphite: #414040;
  --surface: #ffffff;
  --surface-alt: #f8f7f5;
  --surface-dark: #0d0d0f;
  --surface-darker: #060607;

  --text: #1a1a1a;
  --text-muted: #6f7176;
  --text-soft: #828489;
  --text-on-dark: #d9dade;
  --border: #e3e1de;
  --border-dark: rgba(255, 255, 255, 0.12);

  /* Tipografía */
  --font-sans: "Afacad Flux", "Segoe UI", system-ui, -apple-system, Roboto, Helvetica, Arial, sans-serif;

  /* Métricas */
  --container: 1180px;
  --radius-sm: 10px;
  --radius: 16px;
  --radius-lg: 26px;
  --shadow-sm: 0 2px 10px rgba(20, 20, 20, 0.06);
  --shadow: 0 18px 48px rgba(20, 20, 20, 0.12);
  --section-y: clamp(64px, 9vw, 120px);
  --header-h: 84px;
}

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

html { scroll-behavior: smooth; overflow-x: hidden; }

body {
  margin: 0;
  font-family: var(--font-sans);
  font-size: 18px;
  line-height: 1.6;
  color: var(--text);
  background: var(--surface);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
/* Nota: overflow-x:hidden va solo en <html>, nunca en <body>: ponerlo aquí
   también convierte a body en su propio contenedor de scroll y rompe
   position:sticky en sus hijos directos (el header). */

h1, h2, h3, h4, p, li, a, span { overflow-wrap: break-word; }

h1, h2, h3, h4 {
  margin: 0 0 .5em;
  line-height: 1.12;
  font-weight: 600;
  color: var(--ink-800);
  letter-spacing: -0.01em;
}

p { margin: 0 0 1rem; }
a { color: inherit; text-decoration: none; }
img { max-width: 100%; display: block; }
ul { margin: 0; padding: 0; list-style: none; }

/* ---------- Utilidades de layout ---------- */
.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: clamp(20px, 5vw, 48px);
}

.section { padding-block: var(--section-y); }
.section--alt { background: var(--surface-alt); }
.section--dark { background: var(--surface-dark); color: var(--text-on-dark); }
.section--tight { padding-block: clamp(48px, 6vw, 80px); }

.eyebrow {
  display: inline-block;
  margin-bottom: 14px;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--gold-dark);
}
.section--dark .eyebrow { color: var(--gold); }

.section-head { max-width: 760px; }
.section-head--center { margin-inline: auto; text-align: center; }

.h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); }
.h2 { font-size: clamp(2rem, 4vw, 3.1rem); }
.h3 { font-size: clamp(1.35rem, 2.4vw, 1.8rem); }
.lead {
  font-size: clamp(1.05rem, 1.6vw, 1.35rem);
  color: var(--text-soft);
  text-align: justify;
}
.section--dark .lead { color: var(--text-on-dark); }

.muted { color: var(--text-soft); }
.text-center { text-align: center; }
.divider {
  width: 96px; height: 4px; border: 0; margin: 22px 0 0;
  background: var(--gold); border-radius: 4px;
}
.section-head--center .divider { margin-inline: auto; }

/* ---------- Botones ---------- */
.btn {
  --btn-bg: var(--gold);
  --btn-fg: var(--graphite);
  display: inline-flex;
  align-items: center;
  gap: .55em;
  padding: 14px 30px;
  border: 2px solid var(--btn-bg);
  border-radius: var(--radius-sm);
  background: var(--btn-bg);
  color: var(--btn-fg);
  font: inherit;
  font-weight: 600;
  font-size: 1rem;
  cursor: pointer;
  transition: transform .15s ease, box-shadow .2s ease, background .2s ease, color .2s ease;
}
.btn:hover { transform: translateY(-2px); box-shadow: 0 12px 26px rgba(199, 158, 65, .34); }
.btn--ghost {
  --btn-bg: transparent;
  --btn-fg: var(--ink-800);
  border-color: var(--ink-800);
}
.section--dark .btn--ghost,
.hero .btn--ghost,
.cta .btn--ghost { --btn-fg: #fff; border-color: rgba(255,255,255,.55); }
.btn--ghost:hover { box-shadow: none; background: rgba(0,0,0,.04); }
.section--dark .btn--ghost:hover,
.hero .btn--ghost:hover,
.cta .btn--ghost:hover { background: rgba(255,255,255,.08); }
.btn--on-dark { --btn-fg: var(--graphite); }

/* ---------- Header / navegación ---------- */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  background: transparent;
  border-bottom: 1px solid transparent;
  transition: background .3s ease, border-color .3s ease, box-shadow .3s ease;
}
/* Flota sobre el hero (vídeo) en vez de empujarlo hacia abajo: por eso .hero
   compensa el alto del header con su propio padding-top más abajo. Arriba
   del todo el header es invisible (se ve el vídeo detrás); al hacer scroll
   (wireHeaderScrollState + wireHeroHeaderMark en site.js) se "solidifica"
   con los mismos colores que ya usaba siempre — sólo cambia CUÁNDO se
   aplican. En páginas sin .hero justo debajo (ver .site-header--on-hero),
   el header nunca necesitó texto claro encima de un fondo oscuro, así que
   mantiene los colores de siempre. */
.site-header.is-scrolled {
  background: rgba(255, 255, 255, .92);
  backdrop-filter: blur(10px);
  border-bottom-color: var(--border);
  box-shadow: var(--shadow-sm);
}
.site-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  min-height: var(--header-h);
}
.brand { display: flex; align-items: center; }
.brand__logo { height: 40px; width: auto; display: block; transition: filter .3s ease; }
/* Sólo mientras flota transparente sobre un hero oscuro: el logo (texto
   negro/gris) se vuelve blanco para que se lea sobre el vídeo. Es el mismo
   archivo de siempre — recupera sus colores reales apenas hay scroll. */
.site-header--on-hero:not(.is-scrolled) .brand__logo { filter: brightness(0) invert(1); }

.nav { display: flex; align-items: center; gap: 6px; }
.nav a {
  padding: 6px 18px;
  border-radius: 8px;
  font-size: .98rem;
  font-weight: 500;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: .04em;
  transition: color .2s ease, background .2s ease;
}
.nav a:hover { color: var(--ink-800); background: var(--surface-alt); }
.nav a[aria-current="page"] { color: var(--ink-800); background: var(--gold); }
/* Mismo motivo que el logo: texto claro sólo mientras el header está
   transparente sobre el vídeo del hero; el estado activo (gold-soft) ya
   tiene su propio fondo y se lee bien en cualquier caso. Sólo aplica a la
   barra de escritorio: el menú móvil desplegable tiene su propio fondo
   blanco opaco siempre (ver @media max-width:760px más abajo), así que ahí
   el texto debe seguir oscuro o quedaría ilegible sobre ese blanco. */
@media (min-width: 761px) {
  .site-header--on-hero:not(.is-scrolled) .nav a:not([aria-current="page"]) {
    color: rgba(255, 255, 255, .92);
  }
  .site-header--on-hero:not(.is-scrolled) .nav a:hover:not([aria-current="page"]) {
    color: #fff;
    background: rgba(255, 255, 255, .14);
  }
}
/* Páginas sin .hero justo debajo del header (p. ej. 404): el header no deja
   de flotar, pero como no hay vídeo detrás, el contenido necesita el mismo
   espacio que antes ocupaba el header en el flujo normal. */
.site-header:not(.site-header--on-hero) + main {
  padding-top: var(--header-h);
}

.nav-toggle {
  display: none;
  width: 44px; height: 44px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #fff;
  cursor: pointer;
}
.nav-toggle span,
.nav-toggle span::before,
.nav-toggle span::after {
  content: "";
  display: block;
  width: 20px; height: 2px;
  margin: 0 auto;
  background: var(--ink-800);
  transition: transform .2s ease;
}
.nav-toggle span::before { transform: translateY(-6px); }
.nav-toggle span::after { transform: translateY(4px); }
/* El botón ya recibe aria-expanded de wireMobileNav en site.js; sólo se
   añade la transición visual de hamburguesa → X, sin tocar el JS. */
.nav-toggle[aria-expanded="true"] span { background: transparent; }
.nav-toggle[aria-expanded="true"] span::before { transform: translateY(0) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span::after { transform: translateY(0) rotate(-45deg); }

/* ---------- Hero ---------- */
.hero {
  position: relative;
  background: var(--surface-dark);
  color: #fff;
  overflow: hidden;
  /* Compensa que el header ya no reserva espacio en el flujo (ahora flota
     encima, fixed): el vídeo/velo (position:absolute, inset:0) igual llenan
     desde el borde real de arriba, sólo el contenido (.hero__inner, en flujo
     normal) se corre hacia abajo para no quedar debajo del logo/nav. */
  padding-top: var(--header-h);
}
/* Vídeo de fondo (inyectado por wireHeroVideo en site.js): cubre el hero
   detrás de todo lo demás; si no llega a cargar, el fondo oscuro de .hero
   ya deja el texto legible por sí solo. */
.hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
  pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  .hero__video { display: none; }
}
/* Variante para YouTube/Drive (buildHeroMedia en site.js): un <iframe> no
   acepta object-fit, así que en vez de inset:0 se sobredimensiona y centra
   (truco clásico de "vídeo de YouTube a pantalla completa") — .hero ya
   tiene overflow:hidden, así que el exceso queda recortado a sus bordes. */
.hero__video--embed {
  top: 50%;
  left: 50%;
  inset: auto;
  width: 100vw;
  height: 56.25vw; /* 100vw · 9/16 */
  min-width: 177.78vh; /* 100vh · 16/9 */
  min-height: 100%;
  transform: translate(-50%, -50%);
  border: 0;
}
.hero::after {
  content: "";
  position: absolute;
  inset: 0;
  /* Vela oscura pareja para que el texto se lea sobre cualquier fotograma del
     vídeo ("cierta transparencia": se ve el vídeo, pero nunca compite con las letras). */
  background:
    linear-gradient(180deg, rgba(6, 6, 7, .6), rgba(6, 6, 7, .72)),
    radial-gradient(60% 60% at 85% 0%, rgba(199, 158, 65, .18), transparent 70%),
    repeating-linear-gradient(135deg, rgba(255,255,255,.03) 0 2px, transparent 2px 22px);
  pointer-events: none;
}
.hero__inner {
  position: relative;
  z-index: 1;
  padding-block: clamp(72px, 12vw, 148px);
}
.hero__title {
  font-size: clamp(2.7rem, 7vw, 5.2rem);
  color: #fff;
  max-width: 16ch;
}
.hero__title--quote { font-style: italic; font-weight: 300; }
.hero__lead { max-width: 100ch; color: var(--text-on-dark); font-size: clamp(1.05rem, 1.7vw, 1.4rem); }
.hero__actions { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 34px; }
.breadcrumb {
  margin-top: 26px;
  font-size: .92rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.breadcrumb a:hover { color: var(--gold); }

/* ---------- Grids y tarjetas ---------- */
.grid { display: grid; gap: 26px; }
.grid--2 { grid-template-columns: repeat(2, 1fr); }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--4 { grid-template-columns: repeat(4, 1fr); }

.card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 34px;
  transition: transform .18s ease, box-shadow .2s ease, border-color .2s ease;
}
.card:hover { transform: translateY(-4px); box-shadow: var(--shadow); border-color: var(--gold); }
.card__icon {
  width: 62px; height: 62px;
  border-radius: 16px;
  display: grid; place-items: center;
  background: var(--gold-soft);
  margin-bottom: 20px;
  border: 1px solid var(--gold);
}
.card__icon img { width: 34px; height: 34px; }
.card h3 { font-size: 1.28rem; }
.card p { margin: 0; color: var(--text-soft); font-size: 1rem; }

.card--dark {
  background: var(--ink-800);
  border-color: var(--border-dark);
  color: var(--text-on-dark);
}
.card--dark:hover { border-color: var(--gold); box-shadow: none; }
.card--dark h3 { color: #fff; }
.card--dark p { color: var(--text-on-dark); }

/* Icono circular dorado (propósito) */
.feature { text-align: center; }
.feature__badge {
  width: 84px; height: 84px;
  margin: 0 auto 18px;
  border-radius: 50%;
  display: grid; place-items: center;
  background: var(--gold-soft);
  border: 1px solid var(--gold);
}
.feature__badge img { width: 40px; height: 40px; }
.feature h3 { font-size: 1.15rem; }
.feature p { color: var(--text-soft); font-size: .98rem; margin: 0; }

/* ---------- Bloque de texto largo ---------- */
.prose { max-width: 72ch; }
.prose p { color: var(--text-soft); font-size: 1.12rem; }
.prose--accent { border-left: 4px solid var(--gold); padding-left: 28px; }

/* ---------- Split (imagen + texto) ---------- */
.split {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: clamp(28px, 5vw, 64px);
  align-items: center;
}
.split__media {
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--surface-alt);
  border: 1px solid var(--border);
}
.split__media img { width: 100%; height: 100%; object-fit: cover; }

/* ---------- Servicios ---------- */
/* Sólo en esta página: portada más chica y menos separación antes de la
   tarjeta — el título es una sola palabra y no necesita todo el aire del
   hero genérico; así se llega antes al índice/contenido sin tanto scroll. */
body[data-page="servicios"] .hero__inner { padding-block: clamp(36px, 5vw, 56px); }
body[data-page="servicios"] .hero__title { font-size: clamp(2.1rem, 4.5vw, 3rem); }
body[data-page="servicios"] .breadcrumb { margin-top: 14px; }
body[data-page="servicios"] .hero + .section { padding-top: clamp(20px, 3vw, 36px); }

/* ---------- Contacto ---------- */
/* Sólo en esta página: el título del hero sube un poco — no toca
   .hero__title en general para no afectar a las demás páginas. */
body[data-page="contacto"] .hero__title { margin-top: -8vw; margin-bottom: 10vw; }

/* ---------- Inicio ---------- */
/* Un margin-top negativo en .hero__title por sí solo no puede subir más de
   ~14px (el margin-bottom del .eyebrow que va justo encima) sin montarse
   encima de ese texto — por eso -10px casi no se notaba. En su lugar, se
   reduce el padding-top de .hero__inner: sube TODO el bloque (eyebrow +
   título + texto + botones) junto, manteniendo su espaciado entre sí. */
body[data-page="inicio"] .hero__inner { padding-top: clamp(6px, 2vw, 45px); padding-bottom: clamp(2px, 8vw, 60px);  }
/* El título queda pegado arriba (padding-top reducido arriba); el subtítulo
   se separa más de él y se acerca a los botones de abajo, sólo en Inicio. */
body[data-page="inicio"] .hero__lead { margin-top: clamp(28px, 6vw, 64px); }

/* Una sola "tarjeta de interfaz": sidebar gris claro + panel de contenido
   blanco, todo dentro del mismo marco redondeado. */
.svc-shell {
  display: grid;
  grid-template-columns: minmax(200px, 250px) 1fr;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}

.svc-sidebar {
  background: #f5f5f5;
  padding: clamp(22px, 3vw, 34px) clamp(16px, 2.4vw, 24px);
  display: flex;
  flex-direction: column;
  gap: 24px;
  border-right: 1px solid var(--border);
  min-width: 0; /* evita que la fila de pestañas (ver abajo) "empuje" la columna del grid */
}
.svc-sidebar__list { display: grid; gap: 4px; list-style: none; margin: 0; padding: 0; text-align: center;}
.svc-tab {
  display: block;
  padding: 13px 20px;
  border-radius: 999px;
  color: #4b4b4b;
  font-weight: 500;
  font-size: .98rem;
  line-height: 1.3;
  transition: background .15s ease, color .15s ease;
}
.svc-tab:hover { background: #e7e7e7; }
.svc-tab.is-active { background: var(--ink); color: #c79e41; }
.svc-tab.is-active:hover { background: var(--ink); }

.svc-sidebar__cta {
  margin-top: auto;
  background: var(--ink);
  border-radius: var(--radius);
  padding: 22px;
}
.svc-sidebar__cta p { color: #fff; font-weight: 600; margin: 0 0 16px; font-size: 1.02rem; }
.svc-sidebar__agenda {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  justify-content: center;
  padding: 13px 16px;
  border-radius: var(--radius-sm);
  background: var(--gold);
  color: var(--graphite);
  font-weight: 700;
  transition: filter .15s ease;
}
.svc-sidebar__agenda:hover { filter: brightness(1.06); }
.svc-sidebar__agenda img { width: 20px; height: 20px; filter: brightness(0); }

/* Panel único: JS oculta todos los .svc-item menos el activo (sin scroll).
   Sin JS, el atributo [hidden] nunca se añade y los 8 quedan apilados en
   el mismo panel, navegables por ancla como enlaces normales. */
.svc-content { padding: clamp(28px, 4vw, 48px); min-width: 0; overflow: hidden; text-align: justify;}
/* El separador entre servicios sólo tiene sentido cuando están apilados
   (fallback sin JS): con JS, sólo hay un .svc-item visible a la vez, pero
   el combinador "+" sigue contando los ocultos como hermano anterior y
   generaba un hueco vacío arriba del panel a partir del 2º servicio. */
html:not(.js) .svc-item + .svc-item {
  margin-top: clamp(36px, 5vw, 56px);
  padding-top: clamp(36px, 5vw, 56px);
  border-top: 1px solid var(--border);
}
.svc-item__grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(24px, 3vw, 40px); align-items: start; }
/* "Productos" va en su propia fila a todo el ancho, debajo del grid de
   texto+imagen — no dentro de la columna angosta de la imagen — así los
   tags aprovechan todo el espacio disponible en vez de apretarse. */
.svc-item__products { margin-top: clamp(20px, 3vw, 32px); }
.svc-item__products h4 { margin-top: 0; }
.svc-item__products .doc-card__tags { gap: 10px; }
.svc-item__num { font-size: .95rem; font-weight: 700; letter-spacing: .2em; color: var(--gold-dark); }
.svc-item h3 { font-size: clamp(1.5rem, 2.6vw, 2rem); margin-top: 6px; }
.svc-item h4 {
  margin: 24px 0 10px;
  font-size: .8rem; letter-spacing: .2em; text-transform: uppercase; color: var(--gold-dark);
}
.svc-item p { color: var(--text-soft); line-height: 1.7; }
/* Fotografías reales (no íconos): un marco fino en vez del "colchón" oscuro
   de antes, para que la foto se note más y ocupe casi todo el recuadro.
   aspect-ratio fija = mismo tamaño visible en las 8, aunque las fuentes
   vengan en tamaños distintos (retrato, paisaje, etc.); object-fit:cover
   recorta cada una para llenar ese marco sin deformarla. */
.svc-item__media {
  aspect-ratio: 3 / 4;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--surface-alt);
  border: 1px solid var(--border);
}
.svc-item__media img { width: 100%; height: 100%; object-fit: cover; }

/* Servicios cargados desde Firestore: estados de espera/placeholder/error. */
.svc-tab--placeholder { color: var(--text-muted); cursor: default; }
.svc-loading { color: var(--text-soft); padding: 12px 4px; }
.svc-error { padding: 12px 4px; }
.svc-error p:first-child { color: var(--ink-800); font-weight: 600; }

/* ---------- Marco de integridad ---------- */
.doc-card { display: flex; flex-direction: column; gap: 18px; }
.doc-card > .btn { align-self: flex-start; }
.doc-card__tags { display: flex; flex-wrap: wrap; gap: 8px; }
.doc-card__tags span {
  font-size: .85rem; font-weight: 600;
  color: var(--gold-dark);
  padding: 5px 12px;
  border: 1px solid var(--gold-soft);
  border-radius: 999px;
}
/* Lista con viñetas circulares doradas — reutilizada en Servicios (Productos)
   y en Marco de Integridad (Código de Ética / Política de Calidad). */
.dot-list li {
  position: relative;
  padding-left: 26px;
  margin-bottom: 10px;
  color: var(--text-soft);
}
.dot-list li::before {
  content: "";
  position: absolute; left: 0; top: .55em;
  width: 10px; height: 10px; border-radius: 50%;
  background: var(--gold);
}

/* Lista corta de servicios como tarjetitas ("chips") en vez de una lista
   con viñetas — se acomodan solas según el ancho disponible (auto-fit),
   sin necesitar breakpoints propios. */
.chip-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px;
  max-width: 920px;
  margin: 0 auto;
  text-align: left;
}
.chip {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 16px 20px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  font-weight: 500;
  color: var(--ink-800);
  transition: transform .15s ease, box-shadow .2s ease, border-color .2s ease;
}
.chip:hover { transform: translateY(-3px); box-shadow: var(--shadow-sm); border-color: var(--gold); }
.chip__dot { flex: none; width: 10px; height: 10px; border-radius: 50%; background: var(--gold); }

/* ---------- Modal (Marco de integridad → "Ver más") ---------- */
html.modal-open, html.modal-open body { overflow: hidden; }
.modal {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: grid;
  place-items: center;
  padding: clamp(16px, 4vw, 40px);
}
.modal[hidden] { display: none; }
.modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(10, 10, 10, .62);
  backdrop-filter: blur(2px);
}
.modal__dialog {
  position: relative;
  background: var(--surface);
  border-radius: var(--radius-lg);
  width: 100%;
  max-width: 1000px;
  min-height: vh;
  max-height: 100vh;
  overflow: auto;
  display: grid;
  grid-template-columns: minmax(220px, 300px) 1fr;
  box-shadow: var(--shadow);
}
.modal__close {
  position: absolute;
  top: 14px; right: 14px;
  width: 36px; height: 36px;
  border: 0; border-radius: 50%;
  background: rgba(0, 0, 0, .06);
  color: var(--ink-800);
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
  display: grid; place-items: center;
}
.modal__close:hover { background: rgba(0, 0, 0, .12); }
.modal__media {
  background: var(--surface-alt);
  overflow: hidden;
}
.modal__media img,
.modal__media video { width: 100%; height: 100%; object-fit: cover; }
.modal__body { padding: clamp(30px, 4vw, 48px); }
.modal__body h3 { font-size: clamp(1.4rem, 2.4vw, 1.9rem); margin-bottom: 18px; }
.modal__content h4 {
  margin: 22px 0 8px;
  font-size: .82rem; letter-spacing: .16em; text-transform: uppercase; color: var(--text-muted);
}
.modal__content h4:first-child { margin-top: 0; }
/* Texto justificado a pedido, sólo dentro de este modal. */
.modal__content p { text-align: justify; color: var(--text-soft); }
.modal__content .dot-list { margin-top: 10px; }

@media (max-width: 700px) {
  .modal__dialog { grid-template-columns: 1fr; max-height: 90vh; }
  .modal__media { aspect-ratio: 16 / 9; }
}

/* ---------- Perfil fundador ---------- */
.founder {
  display: grid;
  grid-template-columns: 320px 1fr;
  border-radius: var(--radius-lg);
  overflow: hidden;
  border: 1px solid var(--border);
  box-shadow: var(--shadow);
}
.founder__photo {
  background: var(--surface);
  min-height: 320px;
  display: grid;
  justify-items: center;
  align-items: start;
  padding-top: clamp(28px, 4vw, 48px);
  padding-left: 24px;
  padding-right: 0px;
}
/* object-fit:cover forzaba la foto a estirarse para llenar todo el panel
   (alto variable según el largo del texto de al lado), y eso la pixeleaba.
   Ahora el <img> se dimensiona a su propio contenido (max-width/height en
   vez de 100%/100%), así queda centrada por el grid del panel y el
   border-radius recorta la foto real, no una caja vacía más grande que ella. */
.founder__photo img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  border-radius: var(--radius-lg);
  display: block;
}
.founder__body { padding: clamp(28px, 4vw, 48px); background: #fff; }
.founder__body h3 { font-size: 1.9rem; margin-bottom: 4px; }
.founder__role { color: var(--gold-dark); font-weight: 600; margin-bottom: 18px; }
.founder__body p { color: var(--text-soft); }

/* ---------- CTA final ---------- */
.cta {
  background: var(--surface-dark);
  color: #fff;
  text-align: center;
}
.cta__logo { width: min(420px, 70vw); margin: 0 auto 30px; filter: brightness(0) invert(1);}
.cta h2 { color: #fff; font-size: clamp(2rem, 2.5vw, 3.4rem); max-width: 24ch; margin-inline: auto; }
.cta p { color: var(--text-soft); max-width: 52ch; margin: 12px auto 30px; font-size: 1.2rem; }

/* ---------- Formulario contacto ---------- */
.form-grid { display: grid; gap: 18px; grid-template-columns: repeat(2, 1fr); }
.field { display: flex; flex-direction: column; gap: 6px; }
.field--full { grid-column: 1 / -1; }
.field--half-centered {
  grid-column: 1 / -1;   /* Permite que el contenedor use todo el espacio del grid... */
  width: 50%;            /* ...pero reduce el elemento real exactamente a la mitad */
  margin: 0 auto;        /* Lo centra horizontalmente de forma perfecta */
  
  /* Nuevas propiedades para centrar el texto y sus elementos hijos */
  text-align: center;    /* Centra el texto puro */
  align-items: center;   /* Centra los elementos internos (como el botón o inputs) */
}


.field label { font-size: .9rem; font-weight: 600; color: var(--text-muted); }
.field input,
.field textarea,
.field select {
  font: inherit;
  padding: 13px 15px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #fff;
  color: var(--text);
}
.field input:focus,
.field textarea:focus,
.field select:focus { outline: 2px solid var(--gold); border-color: var(--gold); }

.info-list li { display: flex; gap: 14px; margin-bottom: 18px; align-items: flex-start; }
.info-list b { display: block; color: var(--ink-800); }
.info-list span { color: var(--text-soft); }

/* ---------- Footer ---------- */
.site-footer {
  background: var(--surface-darker);
  color: var(--text-soft);
  padding-block: clamp(56px, 8vw, 88px) 30px;
}
.site-footer a:hover:not(.footer-cta) { color: var(--gold); }
.footer-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1.1fr;
  gap: 40px;
}
/* Mapa de la oficina (reemplaza el bloque de marca+contacto de esta
   columna) — mismo truco "sin API key" que el resto del sitio usa para
   evitar dependencias de pago: una URL de Google Maps normal con
   output=embed. */
.footer-map {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid var(--border-dark);
}
.footer-map iframe { width: 100%; height: 100%; border: 0; display: block; }
.footer-col h4 {
  color: #fff;
  font-size: .82rem;
  letter-spacing: .22em;
  text-transform: uppercase;
  margin-bottom: 18px;
}
.footer-col li { margin-bottom: 10px; }
.footer-cta {
  display: inline-flex; margin-top: 4px;
  padding: 12px 22px; border-radius: 10px;
  background: var(--gold); color: var(--graphite); font-weight: 700;
}
.footer-cta:hover { color: var(--graphite); filter: brightness(1.05); }
.footer-bottom {
  margin-top: 46px;
  padding-top: 22px;
  border-top: 1px solid var(--border-dark);
  display: flex;
  flex-wrap: wrap;
  gap: 8px 26px;
  justify-content: space-between;
  font-size: .88rem;
}

/* ---------- Animación de entrada ---------- */
/* Sólo se oculta si el JS marca <html class="js">: sin JS el contenido siempre es visible. */
.js .reveal { opacity: 0; transform: translateY(18px); transition: opacity .6s ease, transform .6s ease; }
.js .reveal.is-visible { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .js .reveal { opacity: 1; transform: none; transition: none; }
  html { scroll-behavior: auto; }
}

/* ---------- Responsive ---------- */
@media (max-width: 960px) {
  .grid--3, .grid--4 { grid-template-columns: repeat(2, 1fr); }
  .split, .founder { grid-template-columns: 1fr; }
  .founder__photo { min-height: 220px; }

  /* Servicios: el sidebar pasa a una barra de pestañas horizontal encima
     del panel, en vez de columna izquierda. Además, el orden visual cambia:
     pestañas → contenido → "¿Hablamos de tu proyecto?" al final (en
     escritorio ese bloque queda pegado abajo del sidebar y funciona bien
     así, pero en una sola columna tiene más sentido cerrar con el CTA
     después de leer el servicio, no antes). .svc-sidebar pasa a
     display:contents para que sus dos hijos (la lista y el CTA) se vuelvan
     ítems directos del grid de .svc-shell y así se puedan reordenar con
     "order" junto con .svc-content — si no, "order" no tendría efecto
     porque .svc-sidebar__cta seguiría atrapado dentro de la columna del
     sidebar. El fondo/padding que tenía .svc-sidebar se traslada a
     .svc-sidebar__list, que es quien ahora "hace de" barra superior. */
  .svc-shell { grid-template-columns: 1fr; }
  .svc-sidebar { display: contents; }
  .svc-sidebar__list {
    order: 1;
    display: flex;
    flex-direction: row;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    gap: 8px;
    background: #f5f5f5;
    padding: clamp(22px, 3vw, 34px) clamp(16px, 2.4vw, 24px) 12px;
    border-bottom: 1px solid var(--border);
    min-width: 0;
  }
  .svc-tab { white-space: nowrap; flex: none; }
  .svc-content { order: 2; }
  .svc-sidebar__cta {
    order: 3;
    margin: 0 clamp(16px, 2.4vw, 24px) clamp(22px, 3vw, 34px);
  }
}

@media (max-width: 760px) {
  body { font-size: 17px; }
  .nav {
    position: absolute;
    left: 0; right: 0; top: 100%;
    flex-direction: column;
    align-items: stretch;
    gap: 2px;
    padding: 0 clamp(20px, 5vw, 48px);
    background: #fff;
    border-bottom: 1px solid var(--border);
    box-shadow: var(--shadow);
    display: flex;
    max-height: 0;
    opacity: 0;
    overflow: hidden;
    pointer-events: none;
    transition: max-height .3s ease, opacity .25s ease, padding .3s ease;
  }
  .nav.is-open {
    max-height: 480px;
    opacity: 1;
    padding: 14px clamp(20px, 5vw, 48px) 22px;
    pointer-events: auto;
  }
  .nav-toggle { display: block; }
  .grid--2, .grid--3, .grid--4 { grid-template-columns: 1fr; }
  .form-grid { grid-template-columns: 1fr; }
  .footer-grid { grid-template-columns: 1fr 1fr; }

  /* Servicios: texto e imagen se apilan (imagen debajo) en vez de 2 columnas. */
  .svc-item__grid { grid-template-columns: 1fr; }
  .svc-item__media { aspect-ratio: 4 / 3; max-width: 420px; margin-inline: auto; }
}

@media (max-width: 480px) {
  .footer-grid { grid-template-columns: 1fr; }
  .hero__actions { flex-direction: column; align-items: stretch; }
  .btn { justify-content: center; }

  /* Un poco menos de aire en tarjetas y bloques que en pantallas grandes
     ocupan demasiado espacio relativo al ancho disponible. */
  .card { padding: 24px; }
  .founder__photo { min-height: 180px; }
  .svc-sidebar { padding: 18px 16px; }
  .svc-content { padding: 24px 18px; }
  .svc-sidebar__cta { padding: 18px; }
}
