/* ==========================================================================
   styles.css — MAQISA
   Colores, tipografías y medidas tomados del kit de Elementor original.
   Orden: reset → tokens → base → componentes → páginas → responsive.
   ========================================================================== */

/* 0. Reset
   ========================================================================== */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: 90px;
}

body,
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd,
ul, ol {
  margin: 0;
  padding: 0;
}

ul[class],
ol[class] {
  list-style: none;
}

body {
  min-height: 100vh;
  line-height: 1.6;
  text-rendering: optimizeSpeed;
}

img,
picture,
svg,
video {
  display: block;
  max-width: 100%;
  height: auto;
}

a {
  color: inherit;
  text-decoration: none;
}

input,
button,
textarea,
select {
  font: inherit;
  color: inherit;
}

button {
  background: none;
  border: 0;
  cursor: pointer;
}

table {
  border-collapse: collapse;
  width: 100%;
}

:focus-visible {
  outline: 2px solid var(--color-brand);
  outline-offset: 3px;
}

/* Superficies del navegador: lo que el navegador pinta con sus propios
   colores si no se toca (sytez-standards §6) */
::selection { background-color: var(--color-brand); color: var(--color-white); }
input,
textarea { caret-color: var(--color-brand); }
input[type="checkbox"],
input[type="radio"],
input[type="range"],
progress { accent-color: var(--color-brand); }
a { text-decoration-thickness: 1px; text-underline-offset: .22em; }
/* Solo con mouse: en touch, scrollbar-color le quita al navegador la barra
   flotante y reserva un carril blanco de ~15px junto a todo el contenido */
@media (hover: hover) and (pointer: fine) {
  html { scrollbar-color: var(--color-navy) var(--color-bg-soft); }
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* 1. Tokens
   ========================================================================== */
:root {
  --color-brand: #e71c37;        /* rojo MAQISA */
  --color-brand-dark: #ca152d;   /* hover / activo */
  --color-navy: #242e48;         /* barras de progreso, títulos de tarjetas */
  --color-ink: #394054;          /* títulos y texto */
  --color-muted: #828daa;        /* textos secundarios */
  --color-muted-dark: #646d88;   /* texto secundario sobre fondo claro (4.8:1) */
  --color-bg: #f8f8f8;           /* fondo general y header */
  --color-bg-soft: #eef0f1;      /* bloques grises (CTA, "Por qué elegirnos") */
  --color-gray: #e9e9e9;
  --color-footer: #0f1419;
  --color-white: #fff;

  /* Colores de apoyo (antes escritos a mano en los componentes) */
  --color-black: #000;
  --color-blueprint: #1d3566;    /* fondo de video y lámina de plano */
  --color-navy-light: #343f5e;
  --color-navy-soft: #2f3a5a;
  --color-navy-deep: #1c2439;
  --color-brand-deep: #b8122c;   /* franjas de la cinta de obra */
  --color-line: #c1c6d5;         /* subrayado de campos del formulario */
  --color-line-dark: #2d3343;    /* divisor del footer */
  --color-on-dark-muted: #ccc;   /* contador del lightbox */
  --color-star: #f6b93b;         /* estrellas de testimonios */
  --color-metal-light: #e3e6ec;  /* herrajes del portón */
  --color-metal: #9aa1ae;
  --color-metal-edge: #c9ced8;
  --color-ruler: #9aa1b5;        /* marcas de regla */
  --color-ruler-light: #c8ccd8;

  /* Colores oficiales de redes (hover de los botones del footer) */
  --color-facebook: #1877f2;
  --color-facebook-rgb: 24, 119, 242;
  --color-instagram: linear-gradient(45deg, #feda75, #fa7e1e 25%, #d62976 55%, #962fbf 80%, #4f5bd5);
  --color-instagram-rgb: 214, 41, 118;
  --color-whatsapp: #25d366;
  --color-whatsapp-dark: #128c4b;  /* ícono sobre fondo claro, 3:1 */
  --color-whatsapp-rgb: 37, 211, 102;

  /* Tripletas RGB para transparencias: rgba(var(--color-navy-rgb), .14) */
  --color-white-rgb: 255, 255, 255;
  --color-black-rgb: 0, 0, 0;
  --color-navy-rgb: 36, 46, 72;
  --color-bg-rgb: 248, 248, 248;
  --color-footer-rgb: 15, 20, 25;
  --color-shade-rgb: 10, 14, 22;
  --color-light-warm-rgb: 255, 232, 190;
  --color-light-soft-rgb: 255, 245, 225;

  --font-display: "Poppins", Arial, sans-serif;
  --font-body: "Inter", Arial, sans-serif;

  --container: 1240px;
  --gutter: 20px;
  --section-y: 110px;

  /* Sistema de movimiento y profundidad (plantilla TSB) */
  --color-brand-rgb: 231, 28, 55;
  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --radius: 8px;
  --radius-lg: 18px;
  --shadow-sm: 0 2px 10px rgba(15, 20, 25, .06);
  --shadow-md: 0 14px 40px rgba(15, 20, 25, .12);
  --shadow-lg: 0 24px 70px rgba(15, 20, 25, .18);
  --header-h: 110px;
  --header-h-scrolled: 76px;
}

/* 2. Base
   ========================================================================== */

/* Fuentes auto-alojadas (subconjunto latin, cubre acentos, ñ, ¿ y ¡).
   Poppins no tiene versión variable: un archivo por peso usado. */
@font-face {
  font-family: "Poppins";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("assets/fonts/poppins-500-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Poppins";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("assets/fonts/poppins-600-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Poppins";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("assets/fonts/poppins-700-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url("assets/fonts/inter-latin-variable.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
body {
  background: var(--color-bg);
  color: var(--color-ink);
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.5;
}

h1, h2, h3, h4, h5 {
  font-family: var(--font-display);
  font-weight: 700;
  line-height: 1.15;
  color: var(--color-ink);
}

.container {
  width: 100%;
  max-width: calc(var(--container) + var(--gutter) * 2);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.section { padding-block: var(--section-y); }

.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

.skip-link {
  position: absolute;
  left: 16px; top: -60px;
  z-index: 200;
  padding: 10px 16px;
  background: var(--color-brand);
  color: var(--color-white);
}
.skip-link:focus { top: 16px; }

/* 3. Botones y enlaces
   ========================================================================== */
.btn {
  position: relative;
  overflow: hidden;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 14px 28px;
  border-radius: var(--radius);
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 500;
  transition: background .3s, color .3s, box-shadow .3s var(--ease), transform .3s var(--ease);
}
.btn svg { width: 16px; height: 16px; }
.btn--primary { background: var(--color-brand); color: var(--color-white); box-shadow: 0 8px 22px rgba(var(--color-brand-rgb), .3); }
.btn--primary:hover { background: var(--color-brand-dark); box-shadow: 0 12px 30px rgba(var(--color-brand-rgb), .42); }
.btn__ripple {
  position: absolute;
  border-radius: 50%;
  background: rgba(var(--color-white-rgb), .55);
  transform: scale(0);
  pointer-events: none;
  animation: ripple-out .6s var(--ease) forwards;
}
.btn--light .btn__ripple { background: rgba(var(--color-brand-rgb), .18); }
@keyframes ripple-out { to { transform: scale(1); opacity: 0; } }
.btn--light { background: var(--color-bg); color: var(--color-ink); }
.btn--light:hover { background: var(--color-white); color: var(--color-brand); }

.link-more {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 500;
  color: var(--color-ink);
  transition: color .3s;
}
.link-more svg { width: 16px; height: 16px; color: var(--color-brand); transition: transform .3s; }
.link-more:hover { color: var(--color-brand); }
.link-more:hover svg { transform: translateX(4px); }
/* Rojo oscuro de la marca: el rojo base da 4.3:1 sobre el fondo claro en texto chico */
.link-more--brand { color: var(--color-brand-dark); }

/* 4. Encabezado de sección (subtítulo, línea roja, título con punto)
   ========================================================================== */
.kicker {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 500;
  color: var(--color-ink);
}
.kicker::after {
  content: "";
  display: block;
  width: 85px;
  height: 2px;
  margin-top: 36px;
  background: var(--color-brand);
}
.section-head--center { text-align: center; }
.section-head--center .kicker::after { margin-inline: auto; }
/* La línea roja se "dibuja" al aparecer */
.js .kicker.reveal::after { transform: scaleX(0); transform-origin: left; transition: transform 1s var(--ease) .35s; }
.js .section-head--center .kicker.reveal::after { transform-origin: center; }
.js .kicker.reveal.is-visible::after { transform: none; }

.title {
  margin-top: 24px;
  font-size: 50px;
  line-height: 1.1;
}
.title .dot { color: var(--color-brand); }

.lead {
  margin-top: 20px;
  max-width: 590px;
  font-size: 16px;
  line-height: 1.5;
}
.section-head--center .lead { margin-inline: auto; max-width: 860px; }

/* 5. Header
   ========================================================================== */
/* Transparente sobre el hero; al hacer scroll pasa a fondo claro con
   desenfoque y se compacta (patrón de la plantilla TSB). */
.site-header {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  background: transparent;
  transition: background-color .4s var(--ease), box-shadow .4s var(--ease);
}
.site-header.is-scrolled,
.site-header.is-menu-open {
  background: rgba(var(--color-bg-rgb), .9);
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  box-shadow: var(--shadow-sm);
}
.site-header__inner {
  display: flex;
  align-items: center;
  gap: 32px;
  min-height: var(--header-h);
  transition: min-height .4s var(--ease);
}
.site-header.is-scrolled .site-header__inner { min-height: var(--header-h-scrolled); }
.site-header__logo img { width: 200px; height: auto; transition: filter .4s var(--ease), width .4s var(--ease); }
.site-header.is-scrolled .site-header__logo img { width: 170px; }

/* Estado transparente: todo en blanco para leerse sobre la foto */
.site-header:not(.is-scrolled):not(.is-menu-open) .site-header__logo img { filter: brightness(0) invert(1); }
.site-header:not(.is-scrolled):not(.is-menu-open) .nav__list > .nav__item > .nav__link,
.site-header:not(.is-scrolled):not(.is-menu-open) .info-box__title,
.site-header:not(.is-scrolled):not(.is-menu-open) .nav-toggle { color: var(--color-white); }
.site-header:not(.is-scrolled):not(.is-menu-open) .info-box__text { color: rgba(var(--color-white-rgb), .78); }

/* Barra de progreso de lectura */
.scroll-progress {
  position: absolute;
  left: 0; bottom: 0;
  width: 100%;
  height: 3px;
  background: var(--color-brand);
  transform: scaleX(0);
  transform-origin: left;
  pointer-events: none;
}

.nav { flex: 1; }
.nav__list { display: flex; align-items: center; gap: 40px; }
.nav__item { position: relative; }
.nav__link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding-block: 20px;
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 500;
  color: var(--color-ink);
  transition: color .3s;
}
.nav__link svg { width: 10px; height: 10px; transition: transform .3s var(--ease); }
.nav__list > .nav__item:hover > .nav__link svg { transform: rotate(180deg); }
.nav__link:hover,
.nav__link.is-active,
.nav__item:focus-within > .nav__link { color: var(--color-brand-dark); }
.site-header:not(.is-scrolled):not(.is-menu-open) .nav__list > .nav__item > .nav__link:hover,
.site-header:not(.is-scrolled):not(.is-menu-open) .nav__list > .nav__item > .nav__link.is-active { color: var(--color-white); }
/* Subrayado rojo que crece desde el centro */
.nav__list > .nav__item > .nav__link { position: relative; }
.nav__list > .nav__item > .nav__link::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 12px;
  height: 2px;
  background: var(--color-brand);
  transform: scaleX(0);
  transition: transform .35s var(--ease);
}
.nav__list > .nav__item > .nav__link:hover::after,
.nav__list > .nav__item > .nav__link.is-active::after { transform: scaleX(1); }

.nav__sub {
  position: absolute;
  top: 100%;
  left: -16px;
  min-width: 230px;
  padding: 12px 0;
  background: var(--color-white);
  border-radius: var(--radius);
  box-shadow: var(--shadow-md);
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity .25s, transform .25s, visibility .25s;
}
.nav__item:hover > .nav__sub,
.nav__item:focus-within > .nav__sub { opacity: 1; visibility: visible; transform: none; }
.nav__sub .nav__sub { top: -12px; left: 100%; }
.nav__sub .nav__link {
  display: flex;
  justify-content: space-between;
  width: 100%;
  padding: 10px 20px;
}
.nav__sub .nav__link svg { transform: rotate(-90deg); }
.nav__sub .nav__link { transition: color .3s, padding-left .3s var(--ease); }
.nav__sub .nav__link:hover { padding-left: 26px; }

.header-info { display: flex; align-items: center; gap: 16px; }
.info-box { display: flex; align-items: center; gap: 16px; }
.info-box__icon {
  flex: none;
  display: grid;
  place-items: center;
  width: 48px; height: 48px;
  border-radius: 50%;
  background: var(--color-brand);
  color: var(--color-white);
}
.info-box__icon svg { width: 20px; height: 20px; }
.info-box__title { font-family: var(--font-display); font-size: 16px; font-weight: 500; color: var(--color-ink); }
.info-box__text { display: block; font-size: 14px; line-height: 1.5; color: var(--color-muted); }
.info-box--address .info-box__text { max-width: 260px; }
a.info-box:hover .info-box__text { color: var(--color-brand); }

.nav-toggle {
  display: none;
  margin-left: auto;
  width: 44px; height: 44px;
  align-items: center;
  justify-content: center;
  color: var(--color-navy);
}
.nav-toggle svg { width: 26px; height: 26px; }

/* 6. Hero del inicio
   ========================================================================== */
.hero {
  position: relative;
  display: flex;
  align-items: center;
  min-height: 100vh;
  min-height: 100svh;
  overflow: hidden;
  color: var(--color-white);
  background: var(--color-navy);
}
.hero__slides { position: absolute; inset: -20px; transition: transform .8s var(--ease); }
/* Oscurece arriba (header) y a la izquierda (texto) sin apagar la foto */
.hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    linear-gradient(180deg, rgba(var(--color-footer-rgb), .55) 0%, rgba(var(--color-footer-rgb), 0) 28%),
    linear-gradient(0deg, rgba(var(--color-footer-rgb), .55) 0%, rgba(var(--color-footer-rgb), 0) 26%),
    linear-gradient(90deg, rgba(var(--color-footer-rgb), .6) 0%, rgba(var(--color-footer-rgb), .15) 60%, rgba(var(--color-footer-rgb), 0) 100%);
  pointer-events: none;
}

/* Etapas del recorrido: nombre del espacio y barra que se llena */
.tour__steps {
  position: absolute;
  right: max(var(--gutter), calc((100vw - var(--container)) / 2));
  bottom: 44px;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  gap: 10px 14px;
  max-width: 470px;
  text-shadow: 0 1px 8px rgba(var(--color-black-rgb), .45);
}
.tour__caption {
  width: 100%;
  font-size: 12px;
  color: rgba(var(--color-white-rgb), .7);
}
.tour__step {
  display: grid;
  gap: 8px;
  width: 78px;
  padding-top: 6px;
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 500;
  text-align: left;
  color: rgba(var(--color-white-rgb), .55);
  transition: color .3s;
}
.tour__step:hover, .tour__step.is-active { color: var(--color-white); }
.tour__step i { position: relative; display: block; height: 3px; overflow: hidden; border-radius: 3px; background: rgba(var(--color-white-rgb), .28); }
.tour__step b { position: absolute; inset: 0; background: var(--color-white); transform: scaleX(0); transform-origin: left; }
.tour__step.is-active b { background: var(--color-brand); }

/* Indicador de "desliza" */
.hero__scroll {
  position: absolute;
  left: 50%;
  bottom: 36px;
  z-index: 2;
  display: grid;
  justify-items: center;
  gap: 8px;
  color: rgba(var(--color-white-rgb), .8);
  font-size: 12px;
  transform: translateX(-50%);
}
.hero__scroll i {
  position: relative;
  width: 24px; height: 38px;
  border: 2px solid rgba(var(--color-white-rgb), .7);
  border-radius: 14px;
}
.hero__scroll i::after {
  content: "";
  position: absolute;
  left: 50%; top: 7px;
  width: 4px; height: 8px;
  margin-left: -2px;
  border-radius: 2px;
  background: var(--color-white);
  animation: scroll-cue 1.8s var(--ease) infinite;
}
@keyframes scroll-cue { 0% { opacity: 0; transform: translateY(0); } 30% { opacity: 1; } 100% { opacity: 0; transform: translateY(12px); } }
/* Recorrido: cada espacio avanza con un acercamiento lento (como caminar
   hacia adelante) y al cambiar, el anterior "se atraviesa": crece y se
   desvanece encima del siguiente. */
.tour__stage {
  position: absolute;
  inset: 0;
  background: center / cover no-repeat var(--color-navy);
  opacity: 0;
  transform: scale(1);
}
.tour__stage.is-active { opacity: 1; transform: scale(1.14); transition: opacity 1.2s ease, transform var(--tour-dur, 6s) linear; }
.tour__stage.is-leaving { z-index: 1; opacity: 0; transform: scale(1.35); transition: opacity 1.1s ease, transform 1.1s cubic-bezier(.5, 0, .9, .6); }
.tour__stage--video.is-active { transform: none; }

/* Llegada en video. El clip es vertical: en pantallas anchas va en un
   marco a la derecha sobre la foto de la fachada; en celular llena todo. */
.tour__backdrop {
  position: absolute;
  inset: -30px;
  background: center / cover no-repeat;
  filter: blur(4px) brightness(.72);
  animation: tour-backdrop 16s linear forwards;
}
@keyframes tour-backdrop { from { transform: scale(1); } to { transform: scale(1.08); } }
.tour__frame {
  position: absolute;
  top: 50%;
  right: calc(max(var(--gutter), (100vw - var(--container)) / 2) + 20px);
  height: min(64vh, 580px);
  aspect-ratio: 480 / 848;
  overflow: hidden;
  border: 1px solid rgba(var(--color-white-rgb), .28);
  border-radius: 24px;
  background: var(--color-navy);
  box-shadow: 0 30px 80px rgba(var(--color-black-rgb), .55);
  transform: translateY(-50%);
}
.tour__video { width: 100%; height: 100%; object-fit: cover; }
.tour__tag {
  position: absolute;
  top: 14px; left: 14px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 11px;
  border-radius: 99px;
  background: rgba(var(--color-footer-rgb), .55);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  font-size: 11px;
  font-weight: 600;
}
.tour__tag i { width: 7px; height: 7px; border-radius: 50%; background: var(--color-brand); animation: tour-rec 1.4s ease-in-out infinite; }
@keyframes tour-rec { 50% { opacity: .25; } }
@media (max-width: 1099px) {
  .tour__backdrop, .tour__tag { display: none; }
  .tour__frame { inset: 0; top: 0; right: 0; height: auto; aspect-ratio: auto; border: 0; border-radius: 0; box-shadow: none; transform: none; }
}

.hero__content { position: relative; z-index: 2; padding-block: calc(var(--header-h) + 40px) 120px; }
.hero__title {
  max-width: 640px;
  font-size: 70px;
  line-height: 1.2;
  color: var(--color-white);
}
.hero__rotator {
  display: flex;
  align-items: baseline;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 70px;
  line-height: 1.2;
  color: var(--color-white);
}
.rotator { position: relative; display: inline-block; overflow: hidden; vertical-align: bottom; transition: width .4s ease; }
.rotator__word { display: block; width: max-content; white-space: nowrap; }
.rotator__word:not(.is-active):not(.is-leaving) { position: absolute; left: 0; top: 0; opacity: 0; }
.rotator__word.is-active { animation: rotator-in .6s ease both; }
.rotator__word.is-leaving { position: absolute; left: 0; top: 0; animation: rotator-out .6s ease both; }
@keyframes rotator-in { from { transform: translateY(100%); opacity: 0; } to { transform: none; opacity: 1; } }
@keyframes rotator-out { from { transform: none; opacity: 1; } to { transform: translateY(-100%); opacity: 0; } }
.hero__rotator .dot { color: var(--color-brand); }

.hero__text { max-width: 560px; margin-top: 24px; font-size: 16px; line-height: 1.5; }
.hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 18px 32px; margin-top: 36px; }
.hero .link-more { color: var(--color-white); }
.hero .link-more svg { color: var(--color-white); }

/* Botón "del plano a la obra" (opción 2 de _herramientas/propuestas-botones-hero.html).
   En reposo es un plano: cuadrícula y contorno punteado. Al pasar el mouse
   se traza el contorno, aparece encima una cota con la medida del botón
   (script.js §11) y el rojo "se cuela" de abajo hacia arriba como concreto.
   El recorte deja ver la cota por arriba y contiene el ripple en el botón. */
.btn--plan,
.btn--plan:hover {
  background: rgba(var(--color-navy-rgb), .35);
  background-image: linear-gradient(rgba(var(--color-white-rgb), .09) 1px, transparent 1px), linear-gradient(90deg, rgba(var(--color-white-rgb), .09) 1px, transparent 1px);
  background-size: 10px 10px;
}
.btn--plan {
  overflow: visible;
  clip-path: inset(-40px 0 0 0 round var(--radius));
  box-shadow: none;
  outline: 1px dashed rgba(var(--color-white-rgb), .6);
  outline-offset: -1px;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.btn--plan:hover { box-shadow: none; outline-color: transparent; }
.btn--plan:focus-visible { outline-color: transparent; }
.btn--plan::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  background: var(--color-brand);
  transform: scaleY(0);
  transform-origin: bottom;
  transition: transform .35s var(--ease);
}
.btn-plan__label { position: relative; z-index: 2; display: inline-flex; align-items: center; gap: 8px; pointer-events: none; }
.btn-plan__trace { position: absolute; inset: 0; z-index: 3; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
.btn-plan__trace rect { fill: none; stroke: var(--color-white); stroke-width: 2; stroke-dasharray: 1; stroke-dashoffset: 1; transition: stroke-dashoffset .3s var(--ease); }
/* Cota arriba: |—— 248 cm ——| */
.btn-plan__cota {
  position: absolute;
  left: 0; right: 0; bottom: calc(100% + 8px);
  height: 8px;
  border: solid rgba(var(--color-white-rgb), .85);
  border-width: 0 1px;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity .35s var(--ease), transform .35s var(--ease);
  pointer-events: none;
}
.btn-plan__cota::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; border-top: 1px solid rgba(var(--color-white-rgb), .85); }
.btn-plan__cota em {
  position: absolute;
  left: 50%; bottom: 6px;
  padding: 0 6px;
  transform: translateX(-50%);
  font: 500 11px/1 var(--font-body);
  font-style: normal;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--color-white);
}
.btn--plan:hover .btn-plan__trace rect, .btn--plan:focus-visible .btn-plan__trace rect { stroke-dashoffset: 0; transition-duration: .55s; }
.btn--plan:hover::before, .btn--plan:focus-visible::before { transform: scaleY(1); transition: transform .5s var(--ease) .45s; }
.btn--plan:hover .btn-plan__cota, .btn--plan:focus-visible .btn-plan__cota { opacity: 1; transform: none; }
.btn--plan .btn__ripple { z-index: 1; }
@media (prefers-reduced-motion: reduce) {
  .btn--plan::before, .btn-plan__trace rect, .btn-plan__cota { transition-duration: .01ms !important; transition-delay: 0s !important; }
}

/* 7. Hero de páginas internas (título + breadcrumb)
   ========================================================================== */
.page-hero {
  position: relative;
  overflow: hidden;
  padding-block: calc(var(--header-h) + 120px) 40px;
  background: var(--color-navy);
  color: var(--color-white);
}
.page-hero__bg {
  position: absolute;
  inset: -40px 0;
  background: center / cover no-repeat;
  animation: hero-zoom 1.6s var(--ease) both;
  will-change: transform;
}
@keyframes hero-zoom { from { transform: scale(1.12); opacity: .4; } to { transform: none; opacity: 1; } }
/* Fotos de fondo como <img> con srcset (antes background-image inline):
   llenan su contenedor, que conserva zoom, parallax, blur y máscaras. */
.page-hero__img,
.tour__img,
.plan__img,
.gate__img {
  display: block;
  width: 100%;
  max-width: none;
  height: 100%;
  object-fit: cover;
}
.page-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(var(--color-footer-rgb), .6) 0%, rgba(var(--color-footer-rgb), .35) 45%, rgba(var(--color-footer-rgb), .6) 100%);
}
.page-hero .container { position: relative; z-index: 2; }
.page-hero__title { font-size: 50px; color: var(--color-white); }
.page-hero__text { max-width: 950px; margin-top: 24px; font-size: 16px; }
.page-hero__bar {
  display: flex;
  justify-content: flex-end;
  margin-top: 8px;
  padding-top: 6px;
  border-top: 1px solid rgba(var(--color-white-rgb), .6);
}
.breadcrumb { display: flex; align-items: center; gap: 10px; font-size: 14px; }
.breadcrumb a:hover { color: var(--color-brand); }
.breadcrumb svg { width: 12px; height: 12px; }

/* 8. Servicios (01. 02. 03.)
   ========================================================================== */
.services-head { display: flex; align-items: center; justify-content: space-between; gap: 40px; }
.services-head .title { max-width: 560px; }
.services-list {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 30px;
  margin-top: 80px;
}
.service-num { display: flex; align-items: center; gap: 16px; }
.service-num__badge {
  flex: none;
  display: grid;
  place-items: center;
  width: 50px; height: 50px;
  border-radius: 50%;
  background: var(--color-brand);
  color: var(--color-white);
  font-family: var(--font-display);
  font-size: 19px;
  font-weight: 700;
}
.service-num__name { font-family: var(--font-display); font-size: 21px; font-weight: 600; }

/* 9. Quiénes somos (inicio)
   ========================================================================== */
.about { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: start; }
.about__media { position: relative; padding-bottom: 120px; }
.about__img-back { width: 375px; aspect-ratio: 375 / 563; object-fit: cover; }
.about__img-front {
  position: absolute;
  right: 0; bottom: 0;
  width: 375px;
  aspect-ratio: 355 / 532;
  object-fit: cover;
  border: 10px solid var(--color-gray);
}
.about__title { max-width: 500px; }
.about__grid { display: grid; grid-template-columns: 296px 1fr; gap: 30px; margin-top: 24px; }
.quality-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 40px 30px;
  background: var(--color-gray);
  text-align: center;
}
.quality-card svg { width: 36px; height: 36px; color: var(--color-brand); }
.quality-card h3 { margin-top: 24px; font-size: 21px; font-weight: 600; color: var(--color-navy); }
.quality-card p { margin-top: 6px; }

.skills { display: grid; gap: 40px; align-content: start; padding-top: 10px; }
.skill { position: relative; height: 30px; background: var(--color-gray); }
.skill__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 0;
  height: 100%;
  padding-inline: 15px;
  overflow: hidden;
  background: var(--color-navy);
  color: var(--color-white);
  font-size: 14px;
  font-weight: 500;
  white-space: nowrap;
  transition: width 1.5s ease;
}
.about .link-more { margin-top: 30px; }

/* 10. Galería del inicio (mosaico)
   ========================================================================== */
.home-gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 248px 352px;
  gap: 10px;
  margin-top: 60px;
  padding-inline: 5px;
}
.home-gallery a { position: relative; display: block; overflow: hidden; }
.home-gallery a:nth-child(1),
.home-gallery a:nth-child(2) { grid-row: span 2; }
.home-gallery img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s ease; }
.home-gallery a:hover img { transform: scale(1.06); }
.home-gallery__caption {
  position: absolute;
  inset: auto 0 0 0;
  padding: 24px;
  background: linear-gradient(transparent, rgba(var(--color-footer-rgb), .75));
  color: var(--color-white);
  opacity: 0;
  transition: opacity .3s;
}
.home-gallery a:hover .home-gallery__caption,
.home-gallery a:focus-visible .home-gallery__caption { opacity: 1; }
.home-gallery__caption strong { display: block; font-family: var(--font-display); font-size: 21px; }
.home-gallery__caption span { font-size: 14px; }

/* 11. CTA "Haz realidad tu próximo proyecto"
   ========================================================================== */
.cta { margin-top: 40px; padding-block: 50px 40px; background: var(--color-bg-soft); }
.cta .lead { margin-top: 36px; }
.cta__actions {
  display: flex;
  justify-content: center;
  gap: 16px;
  margin-top: 25px;
  padding-top: 20px;
  border-top: 1px solid var(--color-gray);
}

/* 12. Footer
   ========================================================================== */
/* Compacto (2026-10-21): logo blanco y texto a la izquierda, menús al
   centro y datos de contacto a la derecha (icono rojo, etiqueta y dato);
   abajo, derechos y redes en rojo */
.site-footer { margin-top: 40px; padding-top: 52px; background: var(--color-footer); color: var(--color-white); }
.footer-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, .6fr) minmax(0, .85fr) auto;
  grid-template-areas: "brand menu obras contact";
  gap: 28px 44px;
  padding-bottom: 34px;
}
/* Redes bajo la lista de Proyectos */
.footer-socials { margin-top: 22px; }
.footer-brand { grid-area: brand; }
.footer-col--menu { grid-area: menu; }
.footer-col--obras { grid-area: obras; }
.footer-logo { display: inline-block; }
.footer-logo img { width: 150px; filter: brightness(0) invert(1); }
.footer-about { max-width: 300px; margin-top: 16px; font-size: 13.5px; line-height: 1.6; color: var(--color-muted); }
.footer-col h2 { font: 600 11px/1 var(--font-display); color: var(--color-white); }
.footer-col ul { list-style: none; display: grid; gap: 10px; margin-top: 18px; font-size: 14px; color: var(--color-muted); }
.footer-col a:hover { color: var(--color-white); }
.footer-contact { grid-area: contact; justify-self: start; list-style: none; display: grid; gap: 16px; font-size: 14px; }
.footer-contact li {
  display: grid;
  grid-template-columns: 36px minmax(0, 1fr);
  grid-template-rows: auto auto;
  column-gap: 14px;
  align-items: center;
}
.footer-contact__ico {
  grid-row: span 2;
  display: grid;
  place-items: center;
  width: 36px; height: 36px;
  border: 1px solid rgba(var(--color-brand-rgb), .45);
  border-radius: 50%;
  background: rgba(var(--color-brand-rgb), .1);
  color: var(--color-brand);
  transition: background .3s, color .3s;
}
.footer-contact__ico svg { width: 16px; height: 16px; }
.footer-contact li:hover .footer-contact__ico { background: var(--color-brand); color: var(--color-white); }
.footer-contact__label { align-self: end; font: 600 10.5px/1.2 var(--font-display); color: var(--color-muted); }
.footer-contact a { align-self: start; line-height: 1.45; color: var(--color-white); transition: color .3s; }
.footer-contact a:hover { color: var(--color-brand); }
.footer-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding-block: 18px;
  border-top: 1px solid var(--color-line-dark);
  font-size: 13px;
  color: var(--color-muted);
}
.footer-legal { position: relative; color: var(--color-muted); transition: color .3s; }
.footer-legal::after { content: ""; position: absolute; left: 0; right: 0; bottom: -3px; height: 1px; background: var(--color-brand); transform: scaleX(0); transform-origin: left; transition: transform .35s var(--ease); }
.footer-legal:hover { color: var(--color-white); }
.footer-legal:hover::after { transform: none; }
.socials { display: flex; gap: 10px; }
/* Hover con color de marca: el color oficial de cada red sube desde abajo
   (sytez-standards §5, "Hover con color de marca") */
.socials a {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: grid;
  place-items: center;
  width: 34px; height: 34px;
  border: 1px solid rgba(var(--color-brand-rgb), .45);
  border-radius: 50%;
  color: var(--color-brand);
  transition: color .25s, border-color .25s, box-shadow .25s var(--ease), transform .25s var(--ease);
}
.socials a::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--net-fill, var(--color-brand));
  transform: translateY(101%);
  transition: transform .3s var(--ease);
}
.socials a:hover,
.socials a:focus-visible { border-color: transparent; color: var(--color-white); box-shadow: 0 10px 24px -6px var(--net-glow, rgba(var(--color-brand-rgb), .6)); transform: translateY(-2px); }
.socials a:hover::before,
.socials a:focus-visible::before { transform: none; }
.socials a:active { transform: translateY(0); }
.socials__link--facebook { --net-fill: var(--color-facebook); --net-glow: rgba(var(--color-facebook-rgb), .6); }
.socials__link--instagram { --net-fill: var(--color-instagram); --net-glow: rgba(var(--color-instagram-rgb), .6); }
.socials svg { width: 14px; height: 14px; }
@media (max-width: 1024px) {
  .footer-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-areas: "brand contact" "menu obras"; }
}
@media (max-width: 767px) {
  .site-footer { padding-top: 40px; }
  .footer-grid { grid-template-areas: "brand brand" "contact contact" "menu obras"; gap: 24px 20px; padding-bottom: 24px; }
  .footer-bottom { flex-direction: column; gap: 8px; }
}

/* 13. Nosotros
   ========================================================================== */
.why { padding: 60px; background: var(--color-bg-soft); }
.why .title { max-width: 880px; }
.pillars { display: grid; grid-template-columns: repeat(3, 1fr); gap: 60px; margin-top: 80px; align-items: start; }
.pillar .pillar__head {
  display: flex;
  align-items: center;
  gap: 15px;
  padding: 10px 30px;
  background: var(--color-brand);
  color: var(--color-white);
  font-family: var(--font-display);
  font-size: 19px;
  font-weight: 600;
}
.pillar__icon {
  display: grid;
  place-items: center;
  width: 64px; height: 64px;
  border-radius: 50%;
  background: var(--color-white);
  color: var(--color-brand);
}
.pillar__icon svg { width: 26px; height: 26px; }
.pillar__body { margin-top: 20px; padding: 20px 30px 30px; background: var(--color-brand); color: var(--color-white); }

.clients { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center; }
.clients__logos { display: flex; flex-wrap: wrap; justify-content: center; gap: 40px 60px; }
.clients__logos img { height: 40px; width: auto; }

.testimonials { display: grid; grid-template-columns: 1fr 1fr; align-items: center; }
.testimonials__cards {
  position: relative;
  z-index: 1;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc(50% - 12px);
  gap: 24px;
  margin-right: -52px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  border-top: 4px solid var(--color-brand);
}
.testimonials__cards::-webkit-scrollbar { display: none; }
.t-card { scroll-snap-align: start; }
.t-card { background: var(--color-white); border: 1px solid var(--color-gray); border-top: 0; }
.t-card__head { position: relative; display: flex; gap: 12px; padding: 26px 30px 8px; border-bottom: 1px solid var(--color-gray); }
.t-card__head img { width: 64px; height: 64px; border-radius: 50%; object-fit: cover; }
.t-card__name { font-size: 16px; }
.t-card__stars { display: flex; gap: 3px; margin-block: 4px; color: var(--color-star); }
.t-card__stars svg { width: 11px; height: 11px; }
.t-card__role { font-size: 14px; color: var(--color-muted); }
.t-card__ig { position: absolute; top: 26px; right: 30px; width: 22px; height: 22px; color: var(--color-ink); }
.t-card > p { padding: 12px 30px 30px; }
.testimonials__intro {
  padding: 125px 100px 150px 125px;
  background: var(--color-bg);
  box-shadow: 0 10px 50px rgba(var(--color-black-rgb), .08);
}
.testimonials__intro .title .accent { display: block; color: var(--color-brand); }

/* 14. Servicios (página)
   ========================================================================== */
.service-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 50px; }
.service-card__head { display: flex; align-items: center; gap: 10px; }
.service-card__head img { width: 30px; height: auto; }
.service-card__head h2 { font-size: 21px; font-weight: 600; }
.service-card p { margin-top: 12px; }

.photo-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
  margin-top: 60px;
}
.photo-grid a { display: block; overflow: hidden; aspect-ratio: 303 / 190; }
.photo-grid img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s ease; }
.photo-grid a:hover img { transform: scale(1.06); }
.photo-grid--masonry { display: block; columns: 4; column-gap: 10px; }
.photo-grid--masonry a { aspect-ratio: auto; margin-bottom: 10px; break-inside: avoid; }
.photo-grid--masonry img { height: auto; }
.gallery-block + .gallery-block { margin-top: 100px; }

/* 15. Preguntas frecuentes
   ========================================================================== */
.faq-hero { position: relative; display: grid; grid-template-columns: 1fr 340px; align-items: center; margin-top: 60px; }
.faq-hero__box { margin-right: -340px; padding: 60px 400px 60px 60px; background: var(--color-gray); }
.faq-hero__box .title { max-width: 680px; }
.faq-hero__box .cta__actions { justify-content: flex-start; margin-top: 24px; padding-top: 0; border: 0; }
.faq-hero__img { position: relative; z-index: 1; width: 340px; height: 470px; object-fit: cover; margin-top: -170px; }

.faq { max-width: 1100px; margin: 60px auto 0; }
.faq details { border-bottom: 1px solid var(--color-gray); }
.faq summary {
  display: flex;
  justify-content: space-between;
  gap: 20px;
  padding: 20px 0;
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 600;
  color: var(--color-navy);
  cursor: pointer;
  list-style: none;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary svg { flex: none; width: 16px; height: 16px; transition: transform .3s; }
.faq details[open] summary { color: var(--color-brand); }
.faq details[open] summary svg { transform: rotate(45deg); }
.faq details p { padding: 0 0 24px; }

/* 16. Contacto
   ========================================================================== */
.features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 60px; text-align: center; }
.feature svg { width: 44px; height: 44px; margin-inline: auto; color: var(--color-brand); }
.feature h2 { margin-top: 24px; font-size: 21px; font-weight: 600; }
.feature p { max-width: 300px; margin: 10px auto 0; }

.contact { display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: start; }
.contact__map { width: 100%; height: 620px; border: 0; }
.form { display: grid; grid-template-columns: 1fr 1fr; gap: 26px 20px; margin-top: 40px; }
.form__full { grid-column: 1 / -1; }
.form input,
.form select,
.form textarea {
  width: 100%;
  padding: 10px 0;
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--color-line);
  border-radius: 0;
  font-size: 14px;
  color: var(--color-ink);
}
.form textarea { min-height: 100px; resize: vertical; }
/* Select sin estilo nativo: en iOS el nativo ignora el padding y su texto
   choca con la etiqueta flotante. La flecha se dibuja con dos bordes. */
.form select {
  -webkit-appearance: none;
  appearance: none;
  padding-right: 28px;
  cursor: pointer;
}
.form__field--select::before {
  content: "";
  position: absolute;
  right: 6px;
  bottom: 18px;
  width: 8px;
  height: 8px;
  border-right: 1.5px solid var(--color-muted);
  border-bottom: 1.5px solid var(--color-muted);
  transform: rotate(45deg);
  pointer-events: none;
  transition: border-color .3s;
}
.form__field--select:focus-within::before { border-color: var(--color-brand); }
/* 16px en móvil: con menos, iOS hace zoom al tocar el campo */
@media (max-width: 767px) {
  .form input,
  .form select,
  .form textarea { font-size: 16px; }
}
.form input::placeholder,
.form textarea::placeholder { color: var(--color-muted); }
.form input:focus,
.form select:focus,
.form textarea:focus { outline: 0; border-color: var(--color-brand); }
.form button { justify-self: start; display: inline-flex; align-items: center; gap: 10px; color: var(--color-brand); font-family: var(--font-display); font-weight: 500; }
.form button svg { width: 16px; height: 16px; }
.form__status { grid-column: 1 / -1; font-size: 14px; }
/* Honeypot anti-spam de Web3Forms: fuera de la vista y del grid. Además
   lleva aria-hidden y tabindex="-1" en el HTML para lectores de pantalla. */
.botcheck {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* 17. Páginas de obras (antes / después)
   ========================================================================== */
.obras { padding-block: 40px 60px; }
.obra + .obra { margin-top: 80px; }
.obra__title { font-size: 38px; font-weight: 600; text-align: center; }
.obra__feature {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 80px;
  align-items: start;
  margin-top: 60px;
  padding-inline: 50px;
}
.obra__feature--solo { grid-template-columns: minmax(0, 830px); justify-content: center; }
.obra__single { width: 100%; border-radius: 8px; box-shadow: 0 10px 40px rgba(var(--color-black-rgb), .1); }
.obra__video { width: 100%; max-height: 700px; background: var(--color-black); }
.obra__pair { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 40px; padding-inline: 60px; }
.obra__pair--solo { grid-template-columns: minmax(0, 630px); justify-content: center; }
.obra__col h3 { margin-bottom: 24px; font-size: 28px; font-weight: 600; text-align: center; }

/* Carrusel con miniaturas */
.carousel__stage { position: relative; aspect-ratio: 631 / 450; overflow: hidden; background: var(--color-gray); }
.carousel__slide {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity .5s ease;
  cursor: zoom-in;
}
.carousel__slide.is-active { opacity: 1; }
.carousel__btn {
  position: absolute;
  top: 50%;
  z-index: 1;
  display: grid;
  place-items: center;
  width: 40px; height: 40px;
  color: var(--color-white);
  transform: translateY(-50%);
  filter: drop-shadow(0 1px 3px rgba(var(--color-black-rgb), .5));
}
.carousel__btn svg { width: 22px; height: 22px; }
.carousel__btn--prev { left: 6px; }
.carousel__btn--next { right: 6px; }
.carousel__thumbs { display: flex; gap: 10px; margin-top: 10px; overflow-x: auto; scrollbar-width: none; }
.carousel__thumbs::-webkit-scrollbar { display: none; }
.carousel__thumb { flex: 0 0 calc((100% - 40px) / 5); aspect-ratio: 4 / 3; opacity: .55; transition: opacity .3s; }
.carousel__thumb img { width: 100%; height: 100%; object-fit: cover; }
.carousel__thumb.is-active,
.carousel__thumb:hover { opacity: 1; }

/* Comparador antes / después */
.compare {
  --pos: 50%;
  position: relative;
  overflow: hidden;
  border-radius: 8px;
  box-shadow: 0 10px 40px rgba(var(--color-black-rgb), .1);
  user-select: none;
}
.compare img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; pointer-events: none; }
.compare__after { position: absolute; inset: 0; clip-path: inset(0 0 0 var(--pos)); }
.compare__after img { height: 100%; }
.compare__handle {
  position: absolute;
  top: 0; bottom: 0;
  left: var(--pos);
  width: 3px;
  margin-left: -1.5px;
  background: var(--color-white);
  pointer-events: none;
}
.compare__handle span {
  position: absolute;
  top: 50%; left: 50%;
  display: grid;
  place-items: center;
  width: 38px; height: 38px;
  border: 3px solid var(--color-white);
  border-radius: 50%;
  background: rgba(var(--color-black-rgb), .15);
  color: var(--color-white);
  transform: translate(-50%, -50%);
}
.compare__handle svg { width: 20px; height: 20px; }
.compare__label {
  position: absolute;
  top: 50%;
  padding: 6px 14px;
  background: rgba(var(--color-white-rgb), .2);
  color: var(--color-white);
  font-size: 13px;
  transform: translateY(-50%);
  opacity: 0;
  transition: opacity .3s;
  pointer-events: none;
}
.compare:hover .compare__label { opacity: 1; }
.compare__label--before { left: 16px; }
.compare__label--after { right: 16px; }
.compare input[type="range"] {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: ew-resize;
}

/* 18. Lightbox
   ========================================================================== */
.lightbox {
  position: fixed;
  inset: 0;
  z-index: 300;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(var(--color-black-rgb), .9);
}
.lightbox.is-open { display: flex; }
.lightbox img { max-width: 92vw; max-height: 86vh; width: auto; height: auto; }
.lightbox button { position: absolute; display: grid; place-items: center; width: 48px; height: 48px; color: var(--color-white); }
.lightbox button svg { width: 28px; height: 28px; }
.lightbox__close { top: 16px; right: 16px; }
.lightbox__prev { left: 16px; top: 50%; transform: translateY(-50%); }
.lightbox__next { right: 16px; top: 50%; transform: translateY(-50%); }
.lightbox__count { position: absolute; top: 28px; left: 24px; color: var(--color-on-dark-muted); font-size: 14px; }

/* 19. Animaciones de entrada (equivalentes a fadeInUp / fadeInDown)
   ========================================================================== */
.js .reveal { opacity: 0; transform: translateY(30px); transition: opacity .9s ease, transform .9s ease; }
.js .reveal--down { transform: translateY(-30px); }
.js .reveal.is-visible { opacity: 1; transform: none; }
/* Entrada del hero y de los encabezados de página: solo movimiento, sin
   opacidad. El texto se ve desde el primer pintado (es el LCP en móvil:
   con .reveal esperaba casi 4 s al JS) y aun así llega con un desliz. */
.hero__content > *,
.page-hero .container > * { animation: hero-rise .8s var(--ease) both; }
.hero__content > :nth-child(2),
.page-hero .container > :nth-child(2) { animation-delay: .08s; }
.hero__content > :nth-child(3),
.page-hero .container > :nth-child(3) { animation-delay: .16s; }
.hero__content > :nth-child(4) { animation-delay: .24s; }
@keyframes hero-rise { from { transform: translateY(18px); } }

/* 20. Responsive
   ========================================================================== */
@media (max-width: 1200px) {
  .header-info .info-box--address { display: none; }
}

@media (max-width: 1024px) {
  :root { --section-y: 80px; }
  .site-header__inner { min-height: 90px; }
  .header-info { display: none; }
  .nav-toggle { display: inline-flex; }
  .nav {
    position: absolute;
    top: 100%;
    left: 0; right: 0;
    display: none;
    padding: 12px var(--gutter) 24px;
    background: var(--color-bg);
    box-shadow: 0 12px 30px rgba(var(--color-footer-rgb), .1);
  }
  .nav.is-open { display: block; }
  .nav__list { flex-direction: column; align-items: stretch; gap: 0; }
  .nav__link { width: 100%; justify-content: space-between; padding-block: 12px; }
  .nav__sub,
  .nav__sub .nav__sub {
    position: static;
    display: none;
    min-width: 0;
    padding: 0 0 0 16px;
    box-shadow: none;
    opacity: 1;
    visibility: visible;
    transform: none;
  }
  .nav__item.is-open > .nav__sub { display: block; }
  .nav__sub .nav__link { padding: 10px 0; }
  .nav__sub .nav__link svg { transform: none; }

  .hero__title, .hero__rotator { font-size: 50px; }
  .title { font-size: 38px; }
  .obra__title { font-size: 28px; }
  .page-hero__title { font-size: 38px; }

  .about { grid-template-columns: 1fr; }
  .about__media { max-width: 690px; }
  .about__grid { grid-template-columns: 1fr 1fr; }
  .home-gallery { grid-template-rows: 200px 280px; }

  .pillars { gap: 24px; }
  .clients, .testimonials { grid-template-columns: 1fr; gap: 40px; }
  .testimonials__cards { order: 2; margin-right: 0; }
  .testimonials__intro { padding: 60px; }
  .service-cards { grid-template-columns: 1fr; gap: 30px; }
  .photo-grid { grid-template-columns: repeat(2, 1fr); }
  .photo-grid--masonry { columns: 2; }
  .faq-hero { grid-template-columns: 1fr; }
  .faq-hero__box { margin-right: 0; padding-right: 60px; }
  .faq-hero__img { display: none; }
  .contact { grid-template-columns: 1fr; }
  .contact__map { height: 400px; }
  .obra__feature { grid-template-columns: 1fr; gap: 30px; padding-inline: 0; }
  .obra__video { max-width: 400px; margin-inline: auto; }
  .obra__pair { padding-inline: 0; }
}

@media (max-width: 767px) {
  :root { --section-y: 60px; --gutter: 16px; }
  .site-header__logo img { width: 160px; }
  /* Pantalla completa también en móvil (svh: sin contar la barra del navegador) */
  .hero { min-height: 100vh; min-height: 100svh; }
  .hero__title, .hero__rotator { font-size: 38px; }
  .title { font-size: 28px; }
  .page-hero { padding-block: 100px 30px; }
  .page-hero__title { font-size: 32px; }
  .services-head { flex-direction: column; align-items: flex-start; gap: 24px; }
  .services-list { grid-template-columns: 1fr; gap: 20px; margin-top: 40px; }
  .about__img-back { width: 70%; }
  .about__img-front { width: 60%; }
  .about__media { padding-bottom: 90px; }
  .about__grid { grid-template-columns: 1fr; }
  .home-gallery { grid-template-columns: 1fr 1fr; grid-template-rows: none; grid-auto-rows: 180px; }
  .home-gallery a:nth-child(1), .home-gallery a:nth-child(2) { grid-row: span 1; }
  .cta__actions { flex-wrap: wrap; }
  .why { padding: 30px 20px; }
  .pillars { grid-template-columns: 1fr; margin-top: 40px; }
  .testimonials__cards { grid-auto-columns: 85%; }
  .testimonials__intro { padding: 40px 24px; }
  .faq-hero__box { padding: 30px 20px; }
  .features { grid-template-columns: 1fr; gap: 40px; }
  .form { grid-template-columns: 1fr; }
  .obra + .obra { margin-top: 60px; }
  .obra__pair { grid-template-columns: 1fr; gap: 40px; }
  .obra__col h3 { margin-bottom: 14px; font-size: 22px; }
  .carousel__thumb { flex-basis: calc((100% - 30px) / 4); }
}

/* ==========================================================================
   21. MEJORAS MODERNAS (2026-10-06)
   Piezas traídas de la plantilla TSB y de sus referencias, adaptadas a MAQISA.
   ========================================================================== */

/* 21.1 Nuestros servicios: índice + escenario fijo con el scroll ---------
   El bloque es una "pista" alta; dentro, índice y escenario se quedan fijos
   (sticky) mientras se baja. El escenario va en un marco de plano (marcas
   de corte y cotas con el nombre y el número de la obra) y cada tramo de
   scroll pasa a la obra siguiente: una línea de medición cruza el
   escenario y deja detrás la foto nueva (script.js §10). En escritorio el
   escenario se estira hacia la derecha hasta casi el borde de la ventana.
   El índice se marca solo y un clic lleva a ese tipo. En tablet/celular
   el escenario va arriba y el índice compacto abajo. */
#obras { overflow-x: clip; }
.svc {
  --svc-steps: 7;
  position: relative;
  height: calc(100svh + var(--svc-steps) * 90svh);
  margin-top: 48px;
}
.svc__pin {
  position: sticky;
  top: var(--header-h-scrolled);
  display: grid;
  grid-template-columns: minmax(0, 3.9fr) minmax(0, 8.1fr);
  grid-template-areas: "list stage";
  align-items: center;
  gap: 48px;
  height: calc(100svh - var(--header-h-scrolled));
  padding-block: 24px;
}

/* Marco de plano: el escenario va dentro, con marcas de corte en las
   esquinas, una cota arriba (nombre de la obra) y otra a la derecha
   (número de foto). Todo el marco se inclina un poco con el mouse. */
.svc__frame {
  --fr-t: 34px; --fr-r: 40px; --fr-b: 12px; --fr-l: 12px;
  grid-area: stage;
  position: relative;
  height: 100%;
  padding: var(--fr-t) var(--fr-r) var(--fr-b) var(--fr-l);
  transform: perspective(1400px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
  transition: transform .6s var(--ease);
}
/* Más ancho hacia la derecha: el marco sale del contenedor hasta 24px del
   borde de la ventana (la altura no cambia) */
@media (min-width: 1025px) {
  .svc__frame { margin-right: calc(24px - max(var(--gutter), (100vw - var(--container)) / 2)); }
}
.svc__crop { position: absolute; width: 20px; height: 20px; border: 0 solid var(--color-navy); }
.svc__crop--tl { top: calc(var(--fr-t) - 10px); left: calc(var(--fr-l) - 10px); border-width: 1.5px 0 0 1.5px; }
.svc__crop--tr { top: calc(var(--fr-t) - 10px); right: calc(var(--fr-r) - 10px); border-width: 1.5px 1.5px 0 0; }
.svc__crop--bl { bottom: calc(var(--fr-b) - 10px); left: calc(var(--fr-l) - 10px); border-width: 0 0 1.5px 1.5px; }
.svc__crop--br { bottom: calc(var(--fr-b) - 10px); right: calc(var(--fr-r) - 10px); border-width: 0 1.5px 1.5px 0; }
.svc__dim { position: absolute; border: solid var(--color-navy); }
.svc__dim::before { content: ""; position: absolute; border: 0 solid var(--color-navy); }
.svc__dim--h { top: 8px; left: var(--fr-l); right: var(--fr-r); height: 10px; border-width: 0 1px; }
.svc__dim--h::before { left: 0; right: 0; top: 50%; border-top-width: 1px; }
.svc__dim--v { top: var(--fr-t); bottom: var(--fr-b); right: 12px; width: 10px; border-width: 1px 0; }
.svc__dim--v::before { top: 0; bottom: 0; left: 50%; border-left-width: 1px; }
.svc__dim em {
  position: absolute;
  left: 50%; top: 50%;
  padding: 0 10px;
  background: var(--color-bg);
  font: 600 11px/1 var(--font-display);
  font-style: normal;
  white-space: nowrap;
  color: var(--color-navy);
  transform: translate(-50%, -50%);
}
.svc__dim--v em { color: var(--color-brand); transform: translate(-50%, -50%) rotate(-90deg); }
.svc__dim em.is-changing { animation: svc-chip .9s var(--ease) both; }

/* Escenario: lámina rectangular dentro del marco */
.svc__stage {
  position: relative;
  isolation: isolate;
  height: 100%;
  overflow: hidden;
  border-radius: 6px;
  background: var(--color-navy);
  color: var(--color-white);
  box-shadow: 0 30px 70px rgba(var(--color-footer-rgb), .22);
  transition: clip-path 1.4s var(--ease) .1s;
}
/* Entrada: el escenario sube desde abajo (el recorte deja margen para la
   sombra) */
.svc.reveal { opacity: 1; transform: none; }
.svc.reveal .svc__stage { clip-path: inset(100% -90px -90px -90px); }
.svc.reveal.is-visible .svc__stage { clip-path: inset(-90px); }
.svc.reveal .svc__item { opacity: 0; transform: translateX(-24px); transition: opacity .6s var(--ease), transform .7s var(--ease); }
.svc.reveal.is-visible .svc__item { opacity: 1; transform: none; }
.svc.reveal.is-visible .svc__item:nth-child(2) { transition-delay: .1s; }
.svc.reveal.is-visible .svc__item:nth-child(3) { transition-delay: .2s; }
.svc.reveal.is-visible .svc__item:nth-child(4) { transition-delay: .3s; }

.svc__media {
  position: absolute;
  inset: -18px;
  z-index: -1;
  transform: translate(var(--mx, 0px), var(--my, 0px));
  transition: transform .6s var(--ease);
}
/* Foto de respaldo y, encima, la capa de la obra que entra: se descubre
   detrás de una línea de medición blanca (con marcas de regla) que cruza
   el escenario; la foto se asienta con un acercamiento leve. Al subir,
   cruza de derecha a izquierda. */
.svc__img,
.svc__in,
.svc__in i {
  position: absolute;
  inset: 0;
}
.svc__img, .svc__in i { background: center / cover no-repeat; }
.svc__in { animation: svc-wipe 1.15s var(--ease) both; }
.svc__in.is-back { animation-name: svc-wipe-back; }
.svc__in i { animation: svc-settle 1.6s var(--ease) both; }
@keyframes svc-wipe { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0); } }
@keyframes svc-wipe-back { from { clip-path: inset(0 0 0 100%); } to { clip-path: inset(0); } }
@keyframes svc-settle { from { transform: scale(1.07); } to { transform: none; } }
.svc__seam {
  position: absolute;
  top: 0; bottom: 0; left: 0;
  width: 14px;
  margin-left: -7px;
  opacity: 0;
  pointer-events: none;
  background:
    linear-gradient(var(--color-white), var(--color-white)) center / 2px 100% no-repeat,
    repeating-linear-gradient(180deg, rgba(var(--color-white-rgb), .85) 0 1px, transparent 1px 12px) center / 8px 100% no-repeat,
    repeating-linear-gradient(180deg, var(--color-white) 0 1.5px, transparent 1.5px 60px) center / 14px 100% no-repeat;
  filter: drop-shadow(0 0 10px rgba(var(--color-black-rgb), .35));
}
.svc__seam.is-run { animation: svc-seam 1.15s var(--ease) both; }
.svc__seam.is-back.is-run { animation-name: svc-seam-back; }
@keyframes svc-seam { 0% { left: 0; opacity: 1; } 80% { opacity: 1; } 100% { left: 100%; opacity: 0; } }
@keyframes svc-seam-back { 0% { left: 100%; opacity: 1; } 80% { opacity: 1; } 100% { left: 0; opacity: 0; } }
/* Sombra para leer las etiquetas */
.svc__stage::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background:
    linear-gradient(180deg, rgba(var(--color-footer-rgb), .4) 0%, rgba(var(--color-footer-rgb), 0) 30%),
    linear-gradient(0deg, rgba(var(--color-footer-rgb), .7) 0%, rgba(var(--color-footer-rgb), 0) 40%);
  pointer-events: none;
}

/* Etiqueta de cristal con el nombre del proyecto */
.svc__chip {
  position: absolute;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 16px;
  border: 1px solid rgba(var(--color-white-rgb), .3);
  border-radius: 99px;
  background: rgba(var(--color-footer-rgb), .38);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  font-size: 13px;
  white-space: nowrap;
}
.svc__chip { left: 26px; bottom: 26px; overflow: hidden; font-weight: 500; }
.svc__chip[hidden] { display: none; }
.svc__chip svg { flex: none; width: 15px; height: 15px; color: var(--color-brand); }
.svc__chip em { font-style: normal; overflow: hidden; text-overflow: ellipsis; }
.svc__chip em.is-changing { animation: svc-chip .9s var(--ease) .3s both; }
@keyframes svc-chip { from { opacity: 0; filter: blur(4px); } to { opacity: 1; filter: none; } }

/* Botón "Saltar »" (versión 4): sin marco ni rojo. Texto blanco con sombra
   y un halo oscuro difuminado detrás (sin bordes) para que se distinga
   sobre cualquier foto; al pasar el mouse sale una línea bajo el texto y
   las flechas avanzan. Se va al llegar a la última foto (.is-off) */
.svc__skip {
  position: absolute;
  z-index: 3;
  right: 14px;
  bottom: 12px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 16px 20px;
  border: 0;
  background: radial-gradient(closest-side, rgba(var(--color-shade-rgb), .55), rgba(var(--color-shade-rgb), .25) 60%, transparent);
  font: 600 16px/1 var(--font-display);
  letter-spacing: .06em;
  color: var(--color-white);
  text-shadow: 0 1px 2px rgba(var(--color-black-rgb), .7), 0 0 14px rgba(var(--color-black-rgb), .55);
  cursor: pointer;
  transition: opacity .4s, visibility .4s;
}
.svc__skip span { position: relative; }
.svc__skip span::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -5px;
  height: 2px;
  border-radius: 2px;
  background: currentColor;
  box-shadow: 0 1px 3px rgba(var(--color-black-rgb), .6);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .4s var(--ease);
}
.svc__skip svg { width: 22px; height: 22px; filter: drop-shadow(0 1px 2px rgba(var(--color-black-rgb), .7)) drop-shadow(0 0 8px rgba(var(--color-black-rgb), .5)); transition: transform .35s var(--ease); }
.svc__skip:hover span::after { transform: scaleX(1); }
.svc__skip:hover svg { transform: translateX(5px); }
.svc__skip:focus-visible { outline: 2px solid var(--color-white); outline-offset: -4px; border-radius: 12px; }
.svc__skip.is-off { opacity: 0; visibility: hidden; }
html:not(.js) .svc__skip { display: none; }

/* Índice */
.svc__list { grid-area: list; display: flex; flex-direction: column; justify-content: center; border-top: 1px solid rgba(var(--color-navy-rgb), .14); }
.svc__item { position: relative; border-bottom: 1px solid rgba(var(--color-navy-rgb), .14); }
.svc__head {
  display: grid;
  grid-template-columns: 1fr;
  align-items: center;
  gap: 4px 12px;
  width: 100%;
  padding: 24px 0;
  text-align: left;
}
.svc__name {
  font-family: var(--font-display);
  font-size: clamp(22px, 2.1vw, 30px);
  font-weight: 700;
  line-height: 1.15;
  white-space: nowrap;
  color: var(--color-navy);
  transition: color .4s var(--ease), transform .5s var(--ease);
}
.svc__tag { font-size: 11px; transition: transform .5s var(--ease); color: var(--color-muted); }
.svc__head:hover .svc__name { transform: translateX(6px); }
.svc__item.is-active .svc__name { color: var(--color-brand); }
.svc__item.is-active .svc__name, .svc__item.is-active .svc__tag { transform: translateX(10px); }

.svc__body { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .6s var(--ease); }
.svc__body > div { overflow: hidden; padding-left: 10px; }
.svc__item.is-active .svc__body { grid-template-rows: 1fr; }
.svc__body p { max-width: 420px; margin-bottom: 14px; font-size: 15px; color: var(--color-ink); }
.svc__link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 26px;
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 600;
  color: var(--color-brand);
}
.svc__link svg { width: 16px; height: 16px; transition: transform .3s var(--ease); }
.svc__link:hover svg { transform: translateX(5px); }
/* Barra de avance del tipo activo sobre su línea inferior */
.svc__bar { position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; overflow: hidden; }
.svc__bar b { display: block; height: 100%; background: var(--color-brand); transform: scaleX(0); transform-origin: left; }

/* 21.2 Nuestros servicios en Nosotros: video protagonista -------------
   En lugar del escenario con scroll (que se queda en el inicio), el video
   de las 8 obras. Arriba: título a la izquierda y texto + "Ver Más" a la
   derecha. Abajo: el video grande, centrado y más ancho que el contenedor
   (hasta 24px de cada borde; el alto sale de la pantalla para que video y
   capítulos quepan juntos), en marco de plano con cota. Toda la imagen es
   el botón de pausa. Debajo, los 4 tipos como capítulos sobre una regla
   (un tramo por tipo, marca por segundo, cabezal rojo). script.js §10.1 */
.svc-film__head {
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  align-items: end;
  gap: 24px 64px;
  margin-bottom: 30px;
}
.svc-film__head .title { font-size: clamp(28px, 2.6vw, 40px); }
.svc-film__intro .lead { font-size: 15px; }
.svc-film__intro .link-more { margin-top: 12px; }
.svc-film__media {
  --w: min(calc(100vw - 48px), calc((100svh - var(--header-h-scrolled) - 150px) * 16 / 9));
  width: var(--w);
  margin-left: calc(50% - var(--w) / 2);
}
.svc-film__frame { position: relative; padding: 34px 12px 12px; }
.svc-film__video { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: 22px; background: var(--color-blueprint); box-shadow: 0 34px 70px rgba(var(--color-navy-rgb), .28); }
.svc-film__crop { position: absolute; width: 20px; height: 20px; border: 0 solid var(--color-navy); }
.svc-film__crop--tl { top: 24px; left: 2px; border-width: 1.5px 0 0 1.5px; }
.svc-film__crop--tr { top: 24px; right: 2px; border-width: 1.5px 1.5px 0 0; }
.svc-film__crop--bl { bottom: 2px; left: 2px; border-width: 0 0 1.5px 1.5px; }
.svc-film__crop--br { bottom: 2px; right: 2px; border-width: 0 1.5px 1.5px 0; }
/* Cota de arriba: |—— 8 obras · 4 tipos de servicio ——| */
.svc-film__dim { position: absolute; top: 8px; left: 12px; right: 12px; height: 10px; border: solid var(--color-navy); border-width: 0 1px; }
.svc-film__dim::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; border-top: 1px solid var(--color-navy); }
.svc-film__dim em { position: absolute; left: 50%; top: 50%; padding: 0 12px; background: var(--color-bg); transform: translate(-50%, -50%); font: 600 11px/1 var(--font-display); font-style: normal; white-space: nowrap; color: var(--color-navy); }
/* Toda la imagen pausa / sigue. Pausado se ve el icono de play al centro;
   al tocar, el icono aparece un momento (.is-flash) */
.svc-film__toggle { position: absolute; inset: 34px 12px 12px; display: grid; place-items: center; border-radius: 22px; cursor: pointer; }
.svc-film__toggle:focus-visible { outline: 3px solid var(--color-brand); outline-offset: 3px; }
.svc-film__state {
  display: grid;
  place-items: center;
  width: 76px;
  height: 76px;
  border: 1px solid rgba(var(--color-white-rgb), .35);
  border-radius: 50%;
  background: rgba(var(--color-footer-rgb), .4);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  color: var(--color-white);
  opacity: 0;
  transform: scale(.85);
  transition: opacity .35s, transform .35s var(--ease);
}
.svc-film__state svg { width: 28px; height: 28px; }
.svc-film__ico-pause, .svc-film.is-playing .svc-film__ico-play { display: none; }
.svc-film.is-playing .svc-film__ico-pause { display: block; }
.svc-film:not(.is-playing) .svc-film__state { opacity: 1; transform: none; }
.svc-film.is-playing .svc-film__toggle.is-flash .svc-film__state { animation: svc-film-flash .8s var(--ease); }
@keyframes svc-film-flash { 0% { opacity: 1; transform: none; } 60% { opacity: 1; } 100% { opacity: 0; transform: scale(1.15); } }
/* Capítulos sobre la regla */
.svc-film__chapters { position: relative; display: flex; gap: 10px; margin-top: 18px; padding-inline: 12px; }
.svc-film__chapters li[data-seg] { display: grid; gap: 10px; min-width: 0; }
.svc-film__ch { display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; min-width: 0; }
.svc-film__ch button { display: flex; align-items: flex-start; gap: 10px; min-width: 0; text-align: left; cursor: pointer; }
.svc-film__n { font: 600 12px/1 var(--font-display); color: var(--color-muted); transition: color .4s; }
.svc-film__name { font: 600 16px/1.15 var(--font-display); color: var(--color-navy); transition: color .4s; }
.svc-film__ch a { flex: none; display: grid; place-items: center; width: 30px; height: 30px; border: 1px solid rgba(var(--color-navy-rgb), .2); border-radius: 50%; color: var(--color-navy); transition: background .3s, border-color .3s, color .3s; }
.svc-film__ch a svg { width: 14px; height: 14px; transition: transform .3s var(--ease); }
.svc-film__ch a:hover { border-color: var(--color-brand); background: var(--color-brand); color: var(--color-white); }
.svc-film__ch a:hover svg { transform: translateX(2px); }
.svc-film__ch button:hover .svc-film__name { color: var(--color-brand); }
.svc-film__ch button:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 4px; border-radius: 4px; }
.svc-film__chapters li.is-active .svc-film__n, .svc-film__chapters li.is-active .svc-film__name { color: var(--color-brand); }
.svc-film__track {
  position: relative;
  display: block;
  height: 12px;
  border-bottom: 1px solid rgba(var(--color-navy-rgb), .45);
  background: linear-gradient(90deg, rgba(var(--color-navy-rgb), .4) 1px, transparent 1px) 0 100% / calc(100% / var(--s, 7)) 6px repeat-x;
  cursor: pointer;
}
.svc-film__track b { position: absolute; left: 0; right: 0; bottom: -2px; height: 3px; border-radius: 3px; background: var(--color-brand); transform: scaleX(var(--f, 0)); transform-origin: left; }
/* Las marcas ya medidas se pintan de rojo (--f = avance del tramo, del JS) */
.svc-film__track::after {
  content: "";
  position: absolute;
  inset: 0 0 0;
  background: linear-gradient(90deg, var(--color-brand) 1.5px, transparent 1.5px) 0 100% / calc(100% / var(--s, 7)) 8px repeat-x;
  clip-path: inset(0 calc(100% - var(--f, 0) * 100%) 0 0);
}
/* Hito donde empieza cada obra dentro del tramo (los pone el JS) */
.svc-film__hito { position: absolute; bottom: 0; width: 2px; height: 12px; margin-left: -1px; border-radius: 1px; background: rgba(var(--color-navy-rgb), .55); transition: height .5s var(--ease), background .4s; }
.svc-film__hito.is-past { height: 16px; background: var(--color-brand); }
/* Cabezal: lo mueve el JS sobre el tramo que suena; late al cambiar de obra */
.svc-film__head-mark { position: absolute; left: 0; bottom: 36px; width: 2px; height: 22px; margin-left: -1px; background: var(--color-brand); pointer-events: none; }
.svc-film__head-mark::before { content: ""; position: absolute; top: -4px; left: 50%; width: 9px; height: 9px; margin-left: -4.5px; border-radius: 50%; background: var(--color-brand); box-shadow: 0 0 0 4px rgba(var(--color-brand-rgb), .18); }
.svc-film__head-mark::after { content: ""; position: absolute; top: -4px; left: 50%; width: 9px; height: 9px; margin-left: -4.5px; border: 1.5px solid var(--color-brand); border-radius: 50%; opacity: 0; }
.svc-film__head-mark.is-pulse::after { animation: svc-film-pulse .9s var(--ease); }
@keyframes svc-film-pulse { 0% { opacity: .9; transform: scale(1); } 100% { opacity: 0; transform: scale(4.2); } }
/* Cota de la obra en pantalla: |—— 03 / 08 Casa Cumbres ——| bajo la regla.
   Se traza de izquierda a derecha a la par de la línea del video (.9 s) y
   la anterior se desvanece. Hay dos que se turnan (el JS clona la 2ª). */
.svc-film__chapters { padding-bottom: 40px; }
.svc-film__cota { position: absolute; left: 0; bottom: 6px; width: var(--cw, 0); height: 26px; transform: translateX(var(--cx, 0)); pointer-events: none; opacity: 0; transition: opacity .5s; }
.svc-film__cota.is-on { opacity: 1; transition: none; }
.svc-film__cota i {
  position: absolute;
  inset: 0 0 auto;
  height: 9px;
  border: solid var(--color-navy);
  border-width: 0 1.5px;
  clip-path: inset(-2px 100% -2px -2px);
}
.svc-film__cota i::before { content: ""; position: absolute; left: 0; right: 0; top: 4px; border-top: 1px solid var(--color-navy); }
.svc-film__cota.is-on i { clip-path: inset(-2px -2px -2px -2px); transition: clip-path .9s cubic-bezier(.65, 0, .35, 1); }
.svc-film__cota em {
  position: absolute;
  top: 13px;
  left: var(--lx, 0);
  font: 600 10.5px/1 var(--font-display);
  font-style: normal;
  white-space: nowrap;
  color: var(--color-navy);
  opacity: 0;
  filter: blur(4px);
  transform: translateY(-5px);
}
.svc-film__cota em b { color: var(--color-brand); font-weight: 700; }
.svc-film__cota.is-on em { opacity: 1; filter: none; transform: none; transition: opacity .5s .45s, filter .5s .45s, transform .6s .45s var(--ease); }
@media (max-width: 1024px) {
  .svc-film__head { grid-template-columns: minmax(0, 1fr); }
  .svc-film__media { --w: 100%; margin-left: 0; }
  .svc-film__name { font-size: 13px; }
  .svc-film__ch { gap: 4px; }
  .svc-film__ch button { gap: 6px; }
  .svc-film__ch a { width: 24px; height: 24px; }
  .svc-film__ch a svg { width: 12px; height: 12px; }
}
@media (max-width: 767px) {
  .svc-film__head { margin-bottom: 20px; }
  .svc-film__frame { padding: 30px 6px 6px; }
  .svc-film__video { border-radius: 14px; }
  .svc-film__toggle { inset: 30px 6px 6px; border-radius: 14px; }
  .svc-film__state { width: 56px; height: 56px; }
  .svc-film__state svg { width: 22px; height: 22px; }
  .svc-film__dim { left: 6px; right: 6px; }
  /* Capítulos en 2 columnas, cada uno con su tramo; sin cabezal */
  .svc-film__chapters { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 18px; padding-inline: 6px; padding-bottom: 0; }
  .svc-film__head-mark, .svc-film__cota { display: none; }
}

/* 21.3 Antes y después interactivo (inicio) ---------------------------- */
.showcase { display: grid; grid-template-columns: 380px 1fr; gap: 60px; align-items: center; margin-top: 60px; }
.showcase__tabs { display: grid; gap: 10px; }
.showcase__tab {
  position: relative;
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 16px 20px;
  border: 1px solid var(--color-gray);
  border-radius: 14px;
  background: var(--color-white);
  text-align: left;
  transition: border-color .3s var(--ease), box-shadow .3s var(--ease), transform .3s var(--ease);
}
.showcase__tab img { width: 64px; height: 52px; border-radius: 8px; object-fit: cover; }
.showcase__tab strong { display: block; font-family: var(--font-display); font-size: 16px; font-weight: 600; color: var(--color-navy); }
.showcase__tab span { font-size: 13px; color: var(--color-muted); }
.showcase__tab:hover { transform: translateX(6px); box-shadow: var(--shadow-sm); }
.showcase__tab.is-active { border-color: var(--color-brand); box-shadow: 0 10px 30px rgba(var(--color-brand-rgb), .14); }
.showcase__tab.is-active::before {
  content: "";
  position: absolute;
  left: -1px; top: 18%; bottom: 18%;
  width: 4px;
  border-radius: 4px;
  background: var(--color-brand);
}
.showcase__stage .compare { border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); }
.showcase__stage .compare img { aspect-ratio: 16 / 10; transition: opacity .4s var(--ease); }
.showcase__stage.is-swapping .compare img { opacity: 0; }
.showcase__foot { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 20px; }
.showcase__hint { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; color: var(--color-muted); }
.showcase__hint svg { width: 18px; height: 18px; color: var(--color-brand); }

/* Comparador: etiquetas siempre visibles y "guiño" la primera vez */
.compare__label { opacity: 1; border-radius: 30px; background: rgba(var(--color-footer-rgb), .45); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); top: auto; bottom: 18px; transform: none; }
.compare.is-hinting .compare__after,
.compare.is-hinting .compare__handle { transition: clip-path .8s var(--ease), left .8s var(--ease); }
.compare__handle span { background: var(--color-brand); border-color: var(--color-white); box-shadow: 0 4px 16px rgba(var(--color-black-rgb), .3); }

/* 21.4 CTA con video de fondo ----------------------------------------- */
.cta--video { position: relative; overflow: hidden; padding-block: 120px; background: var(--color-footer); color: var(--color-white); }
.cta__video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.cta--video::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(var(--color-footer-rgb), .72), rgba(var(--color-footer-rgb), .55) 50%, rgba(var(--color-footer-rgb), .8));
}
.cta--video .container { position: relative; z-index: 2; }
.cta--video .kicker,
.cta--video .title,
.cta--video .lead { color: var(--color-white); }
.cta--video .cta__actions { border-top-color: rgba(var(--color-white-rgb), .15); }
.cta--video .btn--light { background: rgba(var(--color-white-rgb), .12); color: var(--color-white); border: 1px solid rgba(var(--color-white-rgb), .35); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.cta--video .btn--light:hover { background: var(--color-white); color: var(--color-ink); }

/* 21.7 Footer con brillo que sigue al cursor + copiar correo ---------- */
.site-footer { position: relative; overflow: hidden; }
.site-footer::before {
  content: "";
  position: absolute;
  left: var(--fx, 50%); top: var(--fy, -200px);
  width: 520px; height: 520px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(var(--color-brand-rgb), .16), transparent 65%);
  transform: translate(-50%, -50%);
  pointer-events: none;
  transition: opacity .4s;
}
.site-footer > * { position: relative; }
.footer-contact__row { display: inline-flex; align-items: center; }
.footer-copy {
  position: relative;
  display: inline-grid;
  place-items: center;
  width: 26px; height: 26px;
  margin-left: 4px;
  border-radius: 6px;
  color: var(--color-muted);
  transition: background .3s, color .3s;
}
.footer-copy:hover { background: rgba(var(--color-white-rgb), .08); color: var(--color-white); }
.footer-copy svg { width: 14px; height: 14px; }
.footer-copy__tip {
  position: absolute;
  bottom: calc(100% + 6px);
  left: 50%;
  padding: 4px 8px;
  border-radius: 6px;
  background: var(--color-white);
  color: var(--color-ink);
  font-size: 12px;
  white-space: nowrap;
  opacity: 0;
  transform: translate(-50%, 4px);
  transition: opacity .25s, transform .25s;
  pointer-events: none;
}
.footer-copy:hover .footer-copy__tip,
.footer-copy.is-copied .footer-copy__tip { opacity: 1; transform: translate(-50%, 0); }
.footer-col a { position: relative; transition: color .3s, padding-left .3s var(--ease); }
.footer-col a:hover { padding-left: 8px; }

/* 21.8 Tarjetas con profundidad y spotlight ---------------------------- */
.pillar,
.quality-card,
.feature,
.service-card,
.t-card { transition: transform .45s var(--ease), box-shadow .45s var(--ease); }
.pillar:hover,
.quality-card:hover,
.service-card:hover { transform: translateY(-8px); }
.pillar__head, .pillar__body { border-radius: var(--radius); }
.pillar:hover .pillar__body,
.pillar:hover .pillar__head { box-shadow: 0 16px 34px rgba(var(--color-brand-rgb), .3); }
.pillar__icon { transition: transform .5s var(--ease); }
.pillar:hover .pillar__icon { transform: rotate(-12deg) scale(1.08); }
.quality-card { border-radius: var(--radius-lg); }
.quality-card:hover { box-shadow: var(--shadow-md); background: var(--color-white); }
.why { border-radius: var(--radius-lg); }
[data-spotlight] { position: relative; isolation: isolate; }
[data-spotlight]::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background: radial-gradient(420px circle at var(--spot-x, -500px) var(--spot-y, -500px), rgba(var(--color-brand-rgb), .1), transparent 60%);
  pointer-events: none;
}
.feature { padding: 34px 24px; border-radius: var(--radius-lg); }
.feature:hover { transform: translateY(-8px); background: var(--color-white); box-shadow: var(--shadow-md); }
.feature svg { transition: transform .5s var(--ease); }
.feature:hover svg { transform: scale(1.15) rotate(-6deg); }
.service-card { padding: 30px; border-radius: var(--radius-lg); background: var(--color-white); box-shadow: var(--shadow-sm); }
.service-card:hover { box-shadow: var(--shadow-md); }
.t-card { border-radius: 0 0 var(--radius) var(--radius); }
.t-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); }
.testimonials__intro { border-radius: var(--radius-lg); }
.clients__logos img { filter: grayscale(1); opacity: .6; transition: filter .4s, opacity .4s, transform .4s var(--ease); }
.clients__logos img:hover { filter: none; opacity: 1; transform: scale(1.06); }
.home-gallery a,
.photo-grid a { border-radius: var(--radius); }
.photo-grid a { position: relative; }
.photo-grid a::after,
.home-gallery a::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(var(--color-brand-rgb), .0) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m20 20-4-4M11 8v6M8 11h6'/%3E%3C/svg%3E") center / 0 no-repeat;
  transition: background-color .4s var(--ease), background-size .4s var(--ease);
  pointer-events: none;
}
.photo-grid a:hover::after,
.home-gallery a:hover::after { background-color: rgba(var(--color-footer-rgb), .35); background-size: 38px; }
.home-gallery__caption { z-index: 1; }
.about__img-back, .about__img-front { border-radius: var(--radius); }
.skill { border-radius: 4px; overflow: hidden; }
.skill__bar { position: relative; }
.skill__bar::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(100deg, transparent 30%, rgba(var(--color-white-rgb), .25) 50%, transparent 70%);
  transform: translateX(-100%);
  animation: shine 3s ease-in-out 2s infinite;
}
@keyframes shine { 60%, 100% { transform: translateX(100%); } }
.contact__map { border-radius: var(--radius-lg); }
.faq details { overflow: hidden; }
.faq summary { transition: color .3s, padding-left .3s var(--ease); }
.faq summary:hover { padding-left: 8px; color: var(--color-brand); }
.faq summary svg {
  box-sizing: content-box;
  padding: 6px;
  border-radius: 50%;
  background: var(--color-gray);
  transition: transform .4s var(--ease), background .3s, color .3s;
}
.faq details[open] summary svg { background: var(--color-brand); color: var(--color-white); }
.faq__body { overflow: hidden; }
.carousel__stage { border-radius: var(--radius); }
.carousel__thumb { border-radius: 6px; overflow: hidden; }
.obra__video { border-radius: var(--radius-lg); }

/* Canales rápidos en Contacto */
.quick-channels { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 28px; }
.quick-channels a,
.quick-channels button {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  border: 1px solid var(--color-gray);
  border-radius: 30px;
  background: var(--color-white);
  font-size: 14px;
  font-weight: 500;
  color: var(--color-ink);
  transition: border-color .3s, color .3s, transform .3s var(--ease), box-shadow .3s;
}
.quick-channels a:hover,
.quick-channels button:hover { border-color: var(--color-brand); color: var(--color-brand); transform: translateY(-2px); box-shadow: var(--shadow-sm); }
.quick-channels svg { width: 16px; height: 16px; color: var(--color-brand); }

/* Formulario: subrayado animado al enfocar */
.form__field { position: relative; }
.form__field::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 2px;
  background: var(--color-brand);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .45s var(--ease);
}
.form__field:focus-within::after { transform: scaleX(1); }
.form button[type="submit"] { padding: 14px 28px; border-radius: var(--radius); background: var(--color-brand); color: var(--color-white); box-shadow: 0 8px 22px rgba(var(--color-brand-rgb), .3); transition: background .3s, transform .3s var(--ease); }
.form button[type="submit"]:hover { background: var(--color-brand-dark); }

/* 21.9 Índice de obras (sticky) ---------------------------------------- */
.obras-index {
  position: sticky;
  top: var(--header-h-scrolled);
  z-index: 40;
  margin-bottom: 30px;
  padding-block: 12px;
  background: rgba(var(--color-bg-rgb), .92);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--color-gray);
}
.obras-index__inner { display: flex; align-items: center; gap: 16px; }
.obras-index__count { flex: none; font-family: var(--font-display); font-size: 14px; font-weight: 600; color: var(--color-navy); }
.obras-index__count b { color: var(--color-brand); }
.obras-index__list {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-mask-image: linear-gradient(90deg, var(--color-black) 92%, transparent);
          mask-image: linear-gradient(90deg, var(--color-black) 92%, transparent);
}
.obras-index__list::-webkit-scrollbar { display: none; }
.obras-index__list a {
  flex: none;
  padding: 7px 14px;
  border: 1px solid var(--color-gray);
  border-radius: 30px;
  background: var(--color-white);
  font-size: 13px;
  white-space: nowrap;
  transition: background .3s, color .3s, border-color .3s;
}
.obras-index__list a:hover { border-color: var(--color-brand); color: var(--color-brand); }
.obras-index__list a.is-active { background: var(--color-brand); border-color: var(--color-brand); color: var(--color-white); }
.obra { scroll-margin-top: calc(var(--header-h-scrolled) + 80px); }
.obra__title { display: flex; flex-direction: column; align-items: center; gap: 6px; }
.obra__num { font-size: 14px; font-weight: 600; letter-spacing: .15em; color: var(--color-brand-dark); }
.obra__tags { display: flex; justify-content: center; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.obra__tags span { padding: 4px 12px; border-radius: 30px; background: var(--color-gray); font-size: 12px; color: var(--color-ink); }

/* 21.10 Responsive de las mejoras -------------------------------------- */
@media (max-width: 1024px) {
  :root { --header-h: 84px; --header-h-scrolled: 68px; }
  .site-header__logo img, .site-header.is-scrolled .site-header__logo img { width: 160px; }
  .nav { border-radius: 0 0 var(--radius-lg) var(--radius-lg); }
  .nav__list > .nav__item > .nav__link::after { display: none; }
  .site-header.is-menu-open .nav__list > .nav__item > .nav__link { color: var(--color-ink); }
  /* Escenario arriba (llena lo que sobra), índice compacto abajo */
  .svc { margin-top: 36px; }
  .svc__pin { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) auto; grid-template-areas: "stage" "list"; gap: 14px; padding-block: 14px; }
  .svc__frame { --fr-t: 28px; --fr-r: 32px; --fr-b: 10px; --fr-l: 10px; }
  .svc__dim em { font-size: 10px; letter-spacing: .1em; }
  .svc__head { padding: 12px 0; }
  .svc__name { font-size: 19px; }
  .svc__body p { display: none; }
  .svc__link { margin-bottom: 12px; }
  .showcase { grid-template-columns: 1fr; gap: 30px; }
  .showcase__tabs { grid-template-columns: repeat(2, 1fr); }
  .hero__scroll { display: none; }
}

@media (max-width: 767px) {
  .hero__content { padding-bottom: 90px; }
  .tour__steps { bottom: 28px; left: var(--gutter); right: var(--gutter); flex-wrap: nowrap; gap: 8px; max-width: none; }
  .tour__caption { display: none; }
  .tour__step { flex: 1; width: auto; font-size: 11px; }
  .svc__pin { height: calc(100svh - var(--header-h-scrolled)); }
  .svc__chip { left: 16px; bottom: 16px; max-width: calc(100% - 130px); }
  .svc__skip { right: 6px; bottom: 6px; padding: 12px 14px; font-size: 14px; }
  .svc__head { padding: 10px 0; }
  .svc__name { font-size: 17px; }
  .svc__tag { display: none; }
  .svc__body > div { padding-left: 10px; }
  .showcase__tabs { grid-template-columns: 1fr; }
  .showcase__tab { padding: 12px 14px; }
  .showcase__foot { flex-direction: column; align-items: flex-start; }
  .cta--video { padding-block: 80px; }
  .obras-index__count { display: none; }
}

/* Teléfonos bajitos: el índice se queda solo con los nombres para que la
   foto no se encoja de más */
@media (max-width: 767px) and (max-height: 600px) {
  .svc__body { display: none; }
  .svc__head { padding: 8px 0; }
}

@media (prefers-reduced-motion: reduce) {
  .svc__chip em { animation: none !important; }
  .svc__stage, .svc__media, .svc__name, .svc__body { transition: none; }
  .hero__scroll i::after, .skill__bar::after, .page-hero__bg { animation: none; }
  .tour__stage, .tour__stage.is-active, .tour__stage.is-leaving { transform: none; transition: opacity .6s ease; }
  .tour__backdrop, .tour__tag i { animation: none; }
}

/* ==========================================================================
   22. Páginas internas: "del plano a la obra" (2026-10-08)
   Nosotros, Servicios, Preguntas frecuentes y Contacto con el lenguaje
   propio de MAQISA: planos con cotas que se dibujan, persianas (como
   "Nuestros servicios"), portones (como el botón del hero), barras de
   recorrido (como el hero) y comparador (como las obras). JS: script.js §19.
   ========================================================================== */

/* Persianas con máscara: franjas horizontales que se abren desde su centro.
   --bo = cuánto está abierta cada franja (0% cerrada, 101% abierta) */
@property --bo { syntax: "<percentage>"; inherits: false; initial-value: 0%; }
.voices-tour.is-tour .t-card,
.js .site-plan__map {
  -webkit-mask: linear-gradient(transparent calc(50% - var(--bo) / 2), var(--color-black) 0, var(--color-black) calc(50% + var(--bo) / 2), transparent 0) 0 0 / 100% var(--bh, 10%);
  mask: linear-gradient(transparent calc(50% - var(--bo) / 2), var(--color-black) 0, var(--color-black) calc(50% + var(--bo) / 2), transparent 0) 0 0 / 100% var(--bh, 10%);
}
@keyframes blinds-open { from { --bo: 0%; } to { --bo: 101%; } }

/* Lo que se activa con JS empieza oculto; sin JS no estorba */
.gsteps[hidden], .faq-ruler[hidden], .build[hidden] { display: none; }

/* Fondo de plano (cuadrícula) */
.plan, .site-plan__form {
  --grid: rgba(var(--color-white-rgb), .07);
  background-image: linear-gradient(var(--grid) 1px, transparent 1px), linear-gradient(90deg, var(--grid) 1px, transparent 1px);
  background-size: 24px 24px;
}

/* 22.1 Nosotros: principios que son planos y se revelan en la obra -----
   En reposo: plano azul con cuadrícula, líneas que se dibujan y cota. Al
   pasar el mouse (o al cruzar el centro de la pantalla en táctil) la obra
   se revela como una foto en el cuarto oscuro: una luz de borde difuminado
   sube de abajo hacia arriba, la imagen pasa de gris y suave a color y
   nítida mientras se aleja, y el dibujo del plano se disuelve. La foto se
   mueve apenas con el cursor (script.js §19.1). */
@property --rv { syntax: "<percentage>"; inherits: false; initial-value: 0%; }
.plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 28px; margin-top: 64px; }
.plan {
  position: relative;
  isolation: isolate;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  border-radius: 24px;
  background-color: var(--color-navy);
  color: var(--color-white);
  outline: 0;
  box-shadow: 0 24px 50px rgba(var(--color-navy-rgb), .22);
  transition: transform .9s var(--ease), box-shadow .9s var(--ease);
}
.plan__photo {
  position: absolute;
  inset: -16px;
  z-index: 0;
  background: center / cover no-repeat;
  -webkit-mask: linear-gradient(0deg, var(--color-black) calc(var(--rv) - 35%), transparent var(--rv));
  mask: linear-gradient(0deg, var(--color-black) calc(var(--rv) - 35%), transparent var(--rv));
  filter: grayscale(1) brightness(.5) blur(6px);
  transform: scale(1.14);
  translate: var(--px, 0px) var(--py, 0px);
  /* Al salir: regresa al plano sin prisa pero más rápido que al entrar */
  transition: --rv .9s cubic-bezier(.4, 0, .2, 1), filter .9s ease, transform 1.2s var(--ease), translate .8s var(--ease);
}
/* Sombra para leer el texto sobre la foto */
.plan::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(0deg, rgba(var(--color-footer-rgb), .88) 0%, rgba(var(--color-footer-rgb), .25) 50%, rgba(var(--color-footer-rgb), 0) 72%);
  opacity: 0;
  transition: opacity .9s var(--ease);
}
.plan__lines {
  position: absolute;
  top: 60px; left: 28px;
  z-index: 2;
  width: calc(100% - 56px);
  height: calc(52% - 60px);
  fill: none;
  stroke: rgba(var(--color-white-rgb), .7);
  stroke-width: 1.4;
  transform-origin: 50% 40%;
  transition: opacity .9s var(--ease), transform 1.2s var(--ease);
}
.plan__lines path { stroke-dasharray: 1; stroke-dashoffset: 1; transition: stroke-dashoffset 2.2s cubic-bezier(.65, 0, .35, 1); vector-effect: non-scaling-stroke; }
.plan__lines path:nth-child(2) { transition-delay: .5s; }
.plan__lines path:nth-child(3) { transition-delay: 1s; }
.plan.is-visible .plan__lines path { stroke-dashoffset: 0; }
/* Cota arriba del plano: |—— A-01 ——| */
.plan__cota {
  position: absolute;
  top: 26px; left: 28px; right: 28px;
  z-index: 3;
  height: 12px;
  border: solid rgba(var(--color-white-rgb), .6);
  border-width: 0 1px;
  transition: border-color .9s;
}
.plan__cota::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; border-top: 1px solid rgba(var(--color-white-rgb), .6); transition: border-color .9s; }
.plan__cota em {
  position: absolute;
  left: 50%; top: 50%;
  padding: 0 10px;
  transform: translate(-50%, -50%);
  background: var(--color-navy);
  font: 600 11px/1 var(--font-display);
  font-style: normal;
  letter-spacing: .14em;
  transition: background .9s, letter-spacing 1.2s var(--ease);
}
.plan__text { position: absolute; left: 28px; right: 28px; bottom: 28px; z-index: 3; transition: transform 1.2s var(--ease); }
.plan__icon { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 50%; background: var(--color-brand); }
.plan__icon svg { width: 22px; height: 22px; }
.plan h3 { position: relative; margin-top: 16px; padding-bottom: 12px; font-size: 26px; color: var(--color-white); }
/* Línea roja fina que crece bajo el título al revelarse */
.plan h3::after { content: ""; position: absolute; left: 0; bottom: 0; width: 44px; height: 2px; background: var(--color-brand); transform: scaleX(0); transform-origin: left; transition: transform .6s var(--ease); }
.plan p { margin-top: 12px; font-size: 15px; color: rgba(var(--color-white-rgb), .78); transition: color .9s; }

/* Revelado: la entrada es más lenta y escalonada que la salida */
.plan:hover, .plan:focus-visible, .plan.is-built { transform: translateY(-6px); box-shadow: 0 34px 70px rgba(var(--color-navy-rgb), .32); }
.plan:hover .plan__photo, .plan:focus-visible .plan__photo, .plan.is-built .plan__photo {
  --rv: 135%;
  filter: none;
  transform: scale(1.03);
  transition: --rv 1.7s cubic-bezier(.65, 0, .35, 1), filter 1.9s cubic-bezier(.22, 1, .36, 1) .25s, transform 2.6s var(--ease), translate .8s var(--ease);
}
.plan:hover::after, .plan:focus-visible::after, .plan.is-built::after { opacity: 1; transition-delay: .35s; }
.plan:hover .plan__lines, .plan:focus-visible .plan__lines, .plan.is-built .plan__lines { opacity: .12; transform: scale(1.05); transition-duration: 1.4s, 2s; }
.plan:hover .plan__cota, .plan:focus-visible .plan__cota, .plan.is-built .plan__cota,
.plan:hover .plan__cota::before, .plan:focus-visible .plan__cota::before, .plan.is-built .plan__cota::before { border-color: rgba(var(--color-white-rgb), .3); }
.plan:hover .plan__cota em, .plan:focus-visible .plan__cota em, .plan.is-built .plan__cota em { background: transparent; letter-spacing: .3em; }
.plan:hover .plan__text, .plan:focus-visible .plan__text, .plan.is-built .plan__text { transform: translateY(-6px); }
.plan:hover h3::after, .plan:focus-visible h3::after, .plan.is-built h3::after { transform: scaleX(1); transition-delay: .7s; }
.plan:hover p, .plan:focus-visible p, .plan.is-built p { color: rgba(var(--color-white-rgb), .92); }
.plan:focus-visible { box-shadow: 0 0 0 3px var(--color-brand), 0 34px 70px rgba(var(--color-navy-rgb), .32); }
@media (prefers-reduced-motion: reduce) {
  .plan, .plan__photo, .plan__lines, .plan__text, .plan h3::after { transition-duration: .01ms !important; transition-delay: 0s !important; }
  .plan__photo { filter: none; }
}

/* 22.2 Nosotros: cifra sobre cinta métrica + logos tras portones ------- */
.tally { max-width: 860px; margin-inline: auto; text-align: center; }
.tally .kicker::after { margin-inline: auto; }
.tape { position: relative; height: 30px; margin: 34px 0 28px; }
.tape__fill {
  position: absolute;
  left: 34px; top: 8px; bottom: 4px;
  right: 0;
  border-radius: 0 3px 3px 0;
  /* Se llena recortando (no cambiando el ancho) para no recalcular la página */
  clip-path: inset(0 100% 0 0);
  background:
    repeating-linear-gradient(90deg, rgba(var(--color-white-rgb), .95) 0 1.5px, transparent 1.5px 48px) 0 0 / 100% 12px no-repeat,
    repeating-linear-gradient(90deg, rgba(var(--color-white-rgb), .6) 0 1px, transparent 1px 8px) 0 0 / 100% 6px no-repeat,
    var(--color-brand);
  transition: clip-path 1.8s cubic-bezier(.19, 1, .22, 1);
}
.tally.is-visible .tape__fill { clip-path: inset(0); }
.tape__case {
  position: absolute;
  left: 0; top: 0;
  width: 40px; height: 30px;
  border-radius: 10px;
  background: var(--color-navy);
  box-shadow: inset 0 0 0 5px var(--color-navy-light);
}
.tape__case::after { content: ""; position: absolute; inset: 10px 14px; border-radius: 50%; background: var(--color-brand); }
.logo-gates { display: flex; flex-wrap: wrap; justify-content: center; gap: 18px; margin-top: 48px; }
.logo-gate {
  position: relative;
  display: grid;
  place-items: center;
  width: 190px; height: 96px;
  overflow: hidden;
  border-radius: 16px;
  background: var(--color-white);
  box-shadow: var(--shadow-sm);
  perspective: 600px;
}
.logo-gate img { max-height: 40px; width: auto; filter: grayscale(1); opacity: .6; transition: filter .4s, opacity .4s, transform .4s var(--ease); }
.logo-gate:hover img { filter: none; opacity: 1; transform: scale(1.08); }
.logo-gate i {
  position: absolute;
  top: 0; bottom: 0;
  width: 50%;
  background: var(--color-brand) repeating-linear-gradient(90deg, rgba(var(--color-black-rgb), .07) 0 2px, transparent 2px 16px);
  transition: transform 1s var(--ease);
  transition-delay: calc(var(--k, 0) * .12s + .2s);
}
.logo-gate i:first-of-type { left: 0; transform-origin: left; }
.logo-gate i:last-of-type { right: 0; transform-origin: right; }
.logo-gate:nth-child(2) { --k: 1; } .logo-gate:nth-child(3) { --k: 2; } .logo-gate:nth-child(4) { --k: 3; } .logo-gate:nth-child(5) { --k: 4; }
.logo-gates.is-visible .logo-gate i:first-of-type { transform: rotateY(-100deg); }
.logo-gates.is-visible .logo-gate i:last-of-type { transform: rotateY(100deg); }

/* 22.3 Nosotros: testimonios como el recorrido del hero ---------------- */
.voices-tour__intro { text-align: center; }
.voices-tour__intro .kicker::after { margin-inline: auto; }
.voices-tour__intro .lead { margin-inline: auto; }
.voices-tour .accent { color: var(--color-brand); }
.voices-tour__stage { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; margin-top: 56px; }
.voices-tour .t-card { border: 0; border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
/* Con JS: una opinión grande a la vez, sobre fondo de plano */
.voices-tour.is-tour .voices-tour__stage {
  display: grid;
  grid-template-columns: 1fr;
  max-width: 900px;
  margin-inline: auto;
}
.voices-tour.is-tour .t-card {
  grid-area: 1 / 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 0;
  background: transparent;
  box-shadow: none;
  text-align: center;
  visibility: hidden;
  --bh: 14px;
}
.voices-tour.is-tour .t-card:hover { transform: none; }
.voices-tour.is-tour .t-card.is-active { visibility: visible; animation: blinds-open 1s var(--ease) both; }
.voices-tour.is-tour .t-card > p {
  order: -1;
  padding: 0 0 30px;
  font-family: var(--font-display);
  font-size: clamp(22px, 2.4vw, 32px);
  font-weight: 500;
  line-height: 1.35;
  color: var(--color-navy);
}
.voices-tour.is-tour .t-card > p::before { content: "\201C"; display: block; height: 48px; font-family: Georgia, serif; font-size: 90px; line-height: 1; color: var(--color-brand); }
.voices-tour.is-tour .t-card__head { justify-content: center; align-items: center; padding: 0; border: 0; text-align: left; }
.voices-tour.is-tour .t-card__ig { display: none; }
.voices-steps { display: flex; justify-content: center; gap: 28px; margin-top: 40px; }
.voices-steps button {
  display: grid;
  gap: 10px;
  width: 170px;
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  color: var(--color-muted);
  text-align: left;
  transition: color .3s;
}
.voices-steps button:hover, .voices-steps button.is-active { color: var(--color-navy); }
.voices-steps i { position: relative; display: block; height: 3px; overflow: hidden; border-radius: 3px; background: var(--color-gray); }
.voices-steps b { position: absolute; inset: 0; background: var(--color-brand); transform: scaleX(0); transform-origin: left; }

/* 22.4 Servicios: cada área es una ventana con cortinas (2026-10-20) ----
   Capas: foto → texto → visillo (tela translúcida que desenfoca) →
   cortinas de 7 pliegues → riel con argollas → rótulo. Al abrir, el
   pliegue del borde arrastra a los demás y se juntan a los lados (el del
   centro sale primero), la tela se mece al frenar, un cordón rojo las
   amarra, el visillo se corre detrás y entra un rayo de luz por la ventana.
   En reposo los pliegues se mueven apenas, como con brisa. */
.gates { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; }
.gate {
  position: relative;
  isolation: isolate;
  height: clamp(440px, 62svh, 560px);
  overflow: hidden;
  border-radius: 24px;
  background: var(--color-navy);
  outline: 0;
  cursor: pointer;
  box-shadow: 0 24px 50px rgba(var(--color-navy-rgb), .2);
}
.gate__photo { position: absolute; inset: 0; background: center / cover no-repeat; transform: scale(1.15); transition: transform 1.6s var(--ease); }
/* Rayo de luz que cruza la obra al correr las cortinas */
.gate__photo::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(105deg, transparent 30%, rgba(var(--color-light-warm-rgb), .38) 46%, rgba(var(--color-light-soft-rgb), .12) 54%, transparent 66%);
  transform: translateX(-110%);
  transition: transform 0s .9s;
}
.gate__inside {
  position: absolute;
  z-index: 1;
  left: 0; right: 0; bottom: 0;
  /* a los lados deja libre lo que ocupan las cortinas recogidas */
  padding: 90px calc(14% + 16px) 30px;
  background: linear-gradient(0deg, rgba(var(--color-footer-rgb), .9), rgba(var(--color-footer-rgb), 0));
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .6s var(--ease), transform .8s var(--ease);
}
.gate__inside h2 { font-size: 24px; font-weight: 700; color: var(--color-white); }
.gate__inside p { margin-top: 10px; font-size: 15px; color: rgba(var(--color-white-rgb), .82); }

/* Visillo: dos mitades de tela blanca translúcida que desenfocan la obra */
.gate__sheer { position: absolute; inset: 0; z-index: 2; pointer-events: none; }
.gate__sheer::before, .gate__sheer::after {
  content: "";
  position: absolute;
  top: 0; bottom: 0;
  width: 50%;
  background:
    repeating-linear-gradient(90deg, rgba(var(--color-white-rgb), .22) 0 9px, rgba(var(--color-white-rgb), .08) 9px 20px),
    rgba(var(--color-white-rgb), .14);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  transition: transform 1.3s var(--ease) .12s;
}
.gate__sheer::before { left: 0; transform-origin: left; }
.gate__sheer::after { right: 0; transform-origin: right; }

/* Cortinas: cada pliegue <i> se recorre hacia su lado; el <b> es la tela */
.gate__curtain { position: absolute; z-index: 3; top: 12px; bottom: 0; width: 50%; pointer-events: none; --dir: 1; }
.gate__curtain--l { left: 0; }
.gate__curtain--r { right: 0; --dir: -1; }
.gate__curtain i {
  --k: 0;
  position: absolute;
  top: 0; bottom: 0;
  z-index: var(--k);
  width: calc(100% / 7 + 2px);
  transition: transform 1.25s cubic-bezier(.65, .02, .2, 1), filter 1.25s;
  transition-delay: calc((6 - var(--k)) * 45ms);
}
.gate__curtain--l i { left: calc(var(--k) * 100% / 7); }
.gate__curtain--r i { right: calc(var(--k) * 100% / 7); }
.gate__curtain i:nth-child(2) { --k: 1; }
.gate__curtain i:nth-child(3) { --k: 2; }
.gate__curtain i:nth-child(4) { --k: 3; }
.gate__curtain i:nth-child(5) { --k: 4; }
.gate__curtain i:nth-child(6) { --k: 5; }
.gate__curtain i:nth-child(7) { --k: 6; }
.gate__curtain b {
  position: absolute;
  inset: 0;
  border-radius: 0 0 46% 46% / 0 0 10px 10px;
  background:
    linear-gradient(90deg, rgba(var(--color-black-rgb), .42), rgba(var(--color-white-rgb), .08) 30%, rgba(var(--color-white-rgb), .17) 44%, rgba(var(--color-black-rgb), .04) 68%, rgba(var(--color-black-rgb), .45)),
    repeating-linear-gradient(0deg, rgba(var(--color-white-rgb), .035) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, var(--color-navy-soft), var(--color-navy) 70%, var(--color-navy-deep));
  box-shadow: 0 8px 14px rgba(var(--color-black-rgb), .25);
  transform-origin: 50% 0;
  animation: gate-brisa 6s ease-in-out infinite;
  animation-delay: calc(var(--k) * -.8s);
}
/* Argolla de cada pliegue, atravesada por el riel */
.gate__curtain i::before {
  content: "";
  position: absolute;
  top: -8px; left: 50%;
  width: 12px; height: 12px;
  margin-left: -6px;
  border: 2px solid var(--color-metal-edge);
  border-radius: 50%;
}
/* Bastón para jalar en el borde de cada cortina */
.gate__curtain i:nth-child(7)::after {
  content: "";
  position: absolute;
  top: 6px;
  width: 10px;
  height: 46%;
  background:
    radial-gradient(circle at 50% calc(100% - 6px), var(--color-brand) 4.5px, transparent 5px),
    linear-gradient(rgba(var(--color-white-rgb), .75), rgba(var(--color-white-rgb), .75)) 50% 0 / 2px calc(100% - 10px) no-repeat;
  transform-origin: 50% 0;
  animation: gate-baston 5s ease-in-out infinite;
}
.gate__curtain--l i:nth-child(7)::after { right: 4px; }
.gate__curtain--r i:nth-child(7)::after { left: 4px; animation-delay: -2.5s; }
/* Cordón que amarra la cortina recogida */
.gate__curtain::after {
  content: "";
  position: absolute;
  z-index: 10;
  top: 60%;
  width: calc(100% / 7 * 1.96 + 5px);
  height: 7px;
  border-radius: 4px;
  background: repeating-linear-gradient(-55deg, var(--color-brand-deep) 0 3px, var(--color-brand) 3px 6px);
  box-shadow: 0 3px 6px rgba(var(--color-black-rgb), .35);
  transform: scaleX(0);
  transition: transform .35s var(--ease);
}
.gate__curtain--l::after { left: -3px; transform-origin: left; }
.gate__curtain--r::after { right: -3px; transform-origin: right; }

/* Riel con remates */
.gate__rod {
  position: absolute;
  z-index: 4;
  top: 8px; left: 14px; right: 14px;
  height: 5px;
  border-radius: 3px;
  background: linear-gradient(180deg, var(--color-metal-light), var(--color-metal));
  box-shadow: 0 2px 4px rgba(var(--color-black-rgb), .3);
  pointer-events: none;
}
.gate__rod::before, .gate__rod::after {
  content: "";
  position: absolute;
  top: -4px;
  width: 13px; height: 13px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 35%, var(--color-white), var(--color-metal) 70%);
}
.gate__rod::before { left: -8px; }
.gate__rod::after { right: -8px; }

/* Rótulo sobre las cortinas: se va al abrir */
.gate__tag { position: absolute; inset: 0; z-index: 5; pointer-events: none; transition: opacity .45s, transform .6s var(--ease); }
.gate__n { position: absolute; top: 34px; left: 28px; font: 700 64px/1 var(--font-display); color: transparent; -webkit-text-stroke: 1.5px rgba(var(--color-white-rgb), .7); }
.gate__label { position: absolute; left: 28px; right: 28px; bottom: 30px; font: 700 26px/1.15 var(--font-display); color: var(--color-white); text-shadow: 0 2px 12px rgba(var(--color-black-rgb), .35); }
.gate__tag img { position: absolute; top: 34px; right: 28px; width: 54px; height: 54px; padding: 12px; border-radius: 50%; background: var(--color-white); object-fit: contain; }

/* Abierta */
.gate:is(:hover, :focus-visible, .is-open) .gate__curtain i { transform: translateX(calc(var(--k) * var(--dir) * -84%)); filter: brightness(.82); }
.gate:is(:hover, :focus-visible, .is-open) .gate__curtain b { animation: gate-vaiven 1.5s ease-out calc(1.05s + (6 - var(--k)) * 45ms) 1 both; }
.gate:is(:hover, :focus-visible, .is-open) .gate__curtain::after { transform: none; transition-delay: 1.05s; }
.gate:is(:hover, :focus-visible, .is-open) .gate__sheer::before,
.gate:is(:hover, :focus-visible, .is-open) .gate__sheer::after { transform: scaleX(0); transition-delay: .3s; }
.gate:is(:hover, :focus-visible, .is-open) .gate__photo { transform: none; }
.gate:is(:hover, :focus-visible, .is-open) .gate__photo::after { transform: translateX(110%); transition: transform 1.8s var(--ease) .45s; }
.gate:is(:hover, :focus-visible, .is-open) .gate__tag { opacity: 0; transform: translateY(-10px); }
.gate:is(:hover, :focus-visible, .is-open) .gate__inside { opacity: 1; transform: none; transition-delay: .7s; }
.gate:focus-visible { box-shadow: 0 0 0 3px var(--color-brand), 0 24px 50px rgba(var(--color-navy-rgb), .2); }
@keyframes gate-brisa {
  0%, 100% { transform: skewX(0) scaleX(1); }
  50% { transform: skewX(calc(var(--dir) * .9deg)) scaleX(1.025); }
}
@keyframes gate-vaiven {
  0% { transform: skewX(0); }
  25% { transform: skewX(calc(var(--dir) * 3.2deg)); }
  50% { transform: skewX(calc(var(--dir) * -1.6deg)); }
  75% { transform: skewX(calc(var(--dir) * .6deg)); }
  100% { transform: skewX(0); }
}
@keyframes gate-baston {
  0%, 100% { transform: rotate(-1.5deg); }
  50% { transform: rotate(1.5deg); }
}

/* 22.5 Servicios: galerías con barras tipo recorrido y cambio en persianas */
.gsteps { display: flex; justify-content: center; gap: 34px; margin-top: 30px; }
.gsteps__tab {
  display: grid;
  gap: 10px;
  width: 160px;
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 600;
  color: var(--color-muted);
  text-align: left;
  transition: color .3s;
}
.gsteps__tab:hover, .gsteps__tab.is-active { color: var(--color-navy); }
.gsteps__tab:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 6px; }
.gsteps__tab i { position: relative; display: block; height: 3px; overflow: hidden; border-radius: 3px; background: var(--color-gray); }
.gsteps__tab b { position: absolute; inset: 0; background: var(--color-brand); transform: scaleX(0); transform-origin: left; transition: transform .7s var(--ease); }
.gsteps__tab.is-active b { transform: scaleX(1); }
.gsteps__stage { position: relative; }
.gsteps--on .gsteps__panel { margin-top: 46px; }
.gsteps--on .gsteps__panel:not(.is-active) { display: none; }
.gsteps__blinds { position: absolute; inset: 0; z-index: 5; pointer-events: none; }
.gsteps__blinds i { position: absolute; left: 0; right: 0; background: var(--color-navy); transform: scaleY(0); }

/* 22.6 Preguntas frecuentes: video "del plano a la obra" con cota -------- */
.drafting { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; gap: 70px; margin-top: 70px; }
.drafting__text .cta__actions { justify-content: flex-start; margin-top: 26px; padding-top: 0; border: 0; }
.drafting__media { position: relative; justify-self: center; width: min(100%, 470px); padding-right: 60px; }
.draft { position: relative; aspect-ratio: 4 / 5; overflow: hidden; border-radius: 24px; background: var(--color-blueprint); box-shadow: 0 30px 60px rgba(var(--color-navy-rgb), .25); }
/* Video hecho con _herramientas/video-plano-obra.html: la fachada de Casa San
   Jerónimo se traza como plano y la obra terminada sube como concreto */
.draft__video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* Cota vertical con los años de experiencia */
.draft__cota { position: absolute; top: 0; bottom: 0; right: 14px; width: 14px; border: solid var(--color-navy); border-width: 1px 0; }
.draft__cota::before { content: ""; position: absolute; top: 0; bottom: 0; left: 50%; border-left: 1px solid var(--color-navy); }
.draft__cota > span {
  position: absolute;
  top: 50%; left: 50%;
  padding: 8px 0;
  background: var(--color-bg);
  transform: translate(-50%, -50%) rotate(-90deg);
  font: 600 14px/1 var(--font-display);
  color: var(--color-navy);
  white-space: nowrap;
}
.draft__cota b { font-size: 22px; color: var(--color-brand); }

/* 22.7 Preguntas frecuentes: regla de avance + respuestas con cota ------ */
/* Regla vertical a la izquierda de las preguntas, del alto de la lista; se
   llena de rojo de arriba abajo según cuántas preguntas distintas has abierto */
/* Separada de las preguntas: 60px fuera de la lista, o lo que quepa antes
   del borde de la pantalla en tabletas */
.faq-ruler { position: absolute; top: 0; bottom: 0; left: max(-60px, calc(14px - (100vw - min(900px, 100vw - 40px)) / 2)); width: 16px; }
.faq-ruler__scale {
  position: absolute;
  inset: 0;
  background:
    repeating-linear-gradient(180deg, var(--color-ruler) 0 1px, transparent 1px 64px) 100% 0 / 14px 100% no-repeat,
    repeating-linear-gradient(180deg, var(--color-ruler-light) 0 1px, transparent 1px 8px) 100% 0 / 7px 100% no-repeat;
  border-right: 1px solid var(--color-ruler);
}
.faq-ruler__scale i { position: absolute; top: 0; right: -2px; width: 3px; height: var(--fill, 0%); border-radius: 3px; background: var(--color-brand); transition: height .7s var(--ease); }
.faq--cota { position: relative; max-width: 900px; margin-top: 30px; counter-reset: faq; }
.faq--cota:has(.faq-ruler:not([hidden])) { padding-left: 46px; }
.faq--cota details { counter-increment: faq; }
.faq--cota summary { align-items: center; }
.faq--cota summary::before {
  content: "P-" counter(faq, decimal-leading-zero);
  flex: none;
  padding: 4px 8px;
  border: 1px solid currentColor;
  border-radius: 6px;
  font-size: 11px;
  letter-spacing: .08em;
  color: var(--color-muted);
  transition: color .3s, background .3s;
}
.faq--cota details[open] summary::before { border-color: var(--color-brand); background: var(--color-brand); color: var(--color-white); }
.faq--cota summary svg { margin-left: auto; }
/* Al abrir: una cota roja baja desde la etiqueta P-0X junto a la respuesta
   y el texto aparece entero, de desenfocado a nítido (antes eran persianas;
   al usuario no le gustó ver las letras en rayas) */
.faq--cota details p { position: relative; padding-left: 62px; }
.faq--cota details p::before,
.faq--cota details p::after { content: ""; position: absolute; left: 22px; background: var(--color-brand); }
.faq--cota details p::before { top: 0; bottom: 6px; width: 1px; transform-origin: top; }
.faq--cota details p::after { bottom: 6px; width: 9px; height: 1px; margin-left: -4px; }
.faq--cota details[open] p { animation: faq-texto .7s var(--ease) .12s both; }
.faq--cota details[open] p::before { animation: faq-cota .6s var(--ease) both; }
.faq--cota details[open] p::after { animation: faq-tope .25s ease .5s both; }
@keyframes faq-texto { from { opacity: 0; transform: translateY(10px); filter: blur(6px); } to { opacity: 1; transform: none; filter: none; } }
@keyframes faq-cota { from { transform: scaleY(0); } to { transform: scaleY(1); } }
@keyframes faq-tope { from { opacity: 0; transform: scaleX(0); } to { opacity: 1; transform: none; } }

/* 22.8 Contacto: compromisos que se recorren como etapas --------------- */
.pledges { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 40px; }
.pledge { position: relative; padding-bottom: 22px; cursor: default; }
.pledge svg { width: 46px; height: 46px; color: var(--color-muted); transition: color .4s, transform .6s var(--ease); }
.pledge h2 { margin-top: 20px; font-size: 21px; font-weight: 600; color: var(--color-muted-dark); transition: color .4s; }
.pledge p { margin-top: 8px; max-width: 320px; color: var(--color-muted-dark); transition: color .4s; }
.pledge__bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; overflow: hidden; border-radius: 3px; background: var(--color-gray); }
.pledge__bar b { position: absolute; inset: 0; background: var(--color-brand); transform: scaleX(0); transform-origin: left; }
.pledge.is-active svg { color: var(--color-brand); transform: translateY(-4px) rotate(-6deg); }
.pledge.is-active h2 { color: var(--color-navy); }
.pledge.is-active p { color: var(--color-ink); }
/* Sin JS (o antes de arrancar) los tres se ven activos */
.pledges:not(.is-running) .pledge svg { color: var(--color-brand); }
.pledges:not(.is-running) .pledge h2 { color: var(--color-navy); }
.pledges:not(.is-running) .pledge p { color: var(--color-ink); }

/* 22.9 Contacto: el formulario es el avance de la obra ----------------- */
.site-plan {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  overflow: hidden;
  border-radius: 28px;
  background: var(--color-white);
  box-shadow: var(--shadow-lg);
}
.site-plan__form { --grid: rgba(var(--color-navy-rgb), .045); padding: 56px; }
.build { margin-top: 30px; }
.build__title { display: flex; justify-content: space-between; font: 600 13px var(--font-display); color: var(--color-navy); }
.build__title b { font-size: 18px; color: var(--color-brand); letter-spacing: 0; }
.build__steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin: 12px 0 0; padding: 0; list-style: none; }
.build__steps li { display: grid; gap: 8px; font-size: 12px; color: var(--color-muted); transition: color .3s; }
.build__steps i { position: relative; display: block; height: 4px; overflow: hidden; border-radius: 4px; background: var(--color-gray); }
.build__steps b { position: absolute; inset: 0; background: var(--color-brand); transform: scaleX(0); transform-origin: left; transition: transform .7s var(--ease); }
.build__steps li.is-done { color: var(--color-navy); }
.build__steps li.is-done b { transform: scaleX(1); }
.form--float { margin-top: 26px; }
.form--float .form__field label {
  position: absolute;
  left: 0; top: 16px;
  font-size: 14px;
  color: var(--color-muted);
  pointer-events: none;
  transform-origin: left top;
  transition: transform .35s var(--ease), color .3s;
}
.form--float input, .form--float textarea, .form--float select { padding: 18px 0 10px; }
.form--float input:focus + label,
.form--float input:not(:placeholder-shown) + label,
.form--float textarea:focus + label,
.form--float textarea:not(:placeholder-shown) + label,
.form--float .form__field--select label { transform: translateY(-16px) scale(.82); color: var(--color-brand); }
.form--float input::placeholder, .form--float textarea::placeholder { color: transparent; }
/* Botón Enviar como portón (mismo gesto que el botón del hero) */
.form button.form__gate { position: relative; isolation: isolate; overflow: hidden; padding: 15px 40px; background: var(--color-navy); }
.form button.form__gate:hover { background: var(--color-navy); }
.form__gate-in { position: relative; z-index: 1; }
.form__gate-door { position: absolute; top: 0; bottom: 0; z-index: 2; width: 50%; background: var(--color-brand); transition: transform .7s var(--ease); }
.form__gate-door:first-of-type { left: 0; transform-origin: left; }
.form__gate-door:last-of-type { right: 0; transform-origin: right; }
.form__gate-out { position: absolute; inset: 0; z-index: 3; display: flex; align-items: center; justify-content: center; gap: 10px; transition: opacity .25s, transform .5s var(--ease); }
.form__gate-out svg { width: 16px; height: 16px; }
.form__gate:hover .form__gate-door:first-of-type, .form__gate:focus-visible .form__gate-door:first-of-type { transform: perspective(300px) rotateY(80deg); }
.form__gate:hover .form__gate-door:last-of-type, .form__gate:focus-visible .form__gate-door:last-of-type { transform: perspective(300px) rotateY(-80deg); }
.form__gate:hover .form__gate-out, .form__gate:focus-visible .form__gate-out { opacity: 0; transform: scale(.9); }
.form__gate .btn__ripple { z-index: 4; }
/* Mapa: se abre en persianas al llegar */
.site-plan__map { --bh: 8%; position: relative; min-height: 600px; background: var(--color-gray); }
.site-plan__map.is-visible { animation: blinds-open 1.4s var(--ease) both; }
.site-plan__map .contact__map { position: absolute; inset: 0; width: 100%; height: 100%; border-radius: 0; }
.site-plan__cota {
  position: absolute;
  left: 24px; right: 24px; bottom: 24px;
  height: 12px;
  border: solid var(--color-brand);
  border-width: 0 2px;
  pointer-events: none;
}
.site-plan__cota::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; border-top: 2px solid var(--color-brand); }
.site-plan__cota em {
  position: absolute;
  left: 50%; top: 50%;
  padding: 6px 12px;
  border-radius: 6px;
  transform: translate(-50%, -50%);
  background: var(--color-brand);
  font: 600 12px/1 var(--font-display);
  font-style: normal;
  white-space: nowrap;
  color: var(--color-white);
}

/* 22.10 Responsive de las páginas internas ------------------------------ */
@media (max-width: 1024px) {
  .voices-tour__stage { grid-template-columns: 1fr; max-width: 560px; margin-inline: auto; }
  .drafting { grid-template-columns: 1fr; gap: 50px; margin-top: 40px; }
  .pledges { grid-template-columns: 1fr; gap: 28px; }
  .site-plan { grid-template-columns: 1fr; }
  .site-plan__map { min-height: 380px; }
}
@media (max-width: 767px) {
  .plan h3 { font-size: 22px; }
  .tape { margin: 26px 0 22px; }
  .logo-gate { width: calc(50% - 9px); height: 80px; }
  .voices-steps { gap: 12px; }
  .voices-steps button { width: auto; flex: 1; font-size: 12px; }
  .gate__label { font-size: 22px; }
  .gsteps { gap: 14px; }
  .gsteps__tab { width: auto; flex: 1; font-size: 13px; }
  .drafting__media { padding-right: 46px; }
  .faq--cota summary { gap: 12px; }
  .faq--cota:has(.faq-ruler:not([hidden])) { padding-left: 24px; }
  .faq-ruler { left: 0; width: 10px; }
  .faq--cota details p { padding-left: 20px; }
  .faq--cota details p::before, .faq--cota details p::after { left: 5px; }
  .site-plan { border-radius: 22px; }
  .site-plan__form { padding: 32px 22px; }
  .build__steps { gap: 6px; }
  .site-plan__map { min-height: 320px; }
  /* En móvil la cota queda en un renglón: solo calle y número */
  .site-plan__cota-extra { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .plan__lines path { stroke-dashoffset: 0; transition: none; }
  .plan__photo, .gate__curtain i, .gate__curtain::after, .gate__sheer::before, .gate__sheer::after, .gate__photo, .gate__tag, .gate__inside, .logo-gate i, .tape__fill { transition-duration: .01ms; transition-delay: 0s; }
  .gate__curtain b, .gate__curtain i::after, .gate:is(:hover, :focus-visible, .is-open) .gate__curtain b { animation: none; }
  .gate__photo::after { display: none; }
  .voices-tour.is-tour .t-card.is-active, .site-plan__map.is-visible { animation: none; --bo: 101%; }
  .faq--cota details[open] p, .faq--cota details[open] p::before, .faq--cota details[open] p::after { animation: none; }
  .site-plan__map { --bo: 101%; }
}

/* ==========================================================================
   23. Detalle de medición (2026-10-09)
   El lenguaje del botón del hero (cota |—— 248 cm ——|, contorno trazado,
   cuadrícula de plano) repartido por el sitio: cotas que se dibujan al
   aparecer, marcas de corte en las esquinas y reglas con marcas.
   ========================================================================== */

/* 23.1 Cota: línea con topes en los extremos y la medida al centro.
   Se dibuja desde el centro al aparecer (con .reveal). --c = color,
   --cota-bg = fondo detrás de la etiqueta (el de la sección). */
.cota {
  --c: var(--color-navy);
  position: absolute;
  display: block;
  height: 10px;
  border: solid var(--c);
  border-width: 0 1px;
  pointer-events: none;
}
.cota::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; border-top: 1px solid var(--c); }
.cota em {
  position: absolute;
  left: 50%; top: 50%;
  padding: 0 10px;
  background: var(--cota-bg, var(--color-bg));
  font: 600 11px/1 var(--font-display);
  font-style: normal;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--c);
  transform: translate(-50%, -50%);
}
.cota em.is-changing { animation: svc-chip .9s var(--ease) both; }
.js .cota.reveal { opacity: 0; transform: none; transition: opacity .5s var(--ease); }
.js .cota.reveal::before { transform: scaleX(0); transition: transform 1.1s var(--ease) .25s; }
.js .cota.reveal em { opacity: 0; transition: opacity .6s var(--ease) .9s; }
.js .cota.reveal.is-visible { opacity: 1; }
.js .cota.reveal.is-visible::before { transform: none; }
.js .cota.reveal.is-visible em { opacity: 1; }

/* 23.2 Marcas de corte en las cuatro esquinas (como el marco de
   "Nuestros servicios"). --mo = separación (negativa = por fuera). */
.marcas {
  --mc: var(--color-navy);
  --ml: 18px;
  --mo: -10px;
  --mw: 1.5px;
  position: absolute;
  inset: var(--mo);
  z-index: 3;
  pointer-events: none;
  background:
    linear-gradient(var(--mc), var(--mc)) left top / var(--ml) var(--mw),
    linear-gradient(var(--mc), var(--mc)) left top / var(--mw) var(--ml),
    linear-gradient(var(--mc), var(--mc)) right top / var(--ml) var(--mw),
    linear-gradient(var(--mc), var(--mc)) right top / var(--mw) var(--ml),
    linear-gradient(var(--mc), var(--mc)) left bottom / var(--ml) var(--mw),
    linear-gradient(var(--mc), var(--mc)) left bottom / var(--mw) var(--ml),
    linear-gradient(var(--mc), var(--mc)) right bottom / var(--ml) var(--mw),
    linear-gradient(var(--mc), var(--mc)) right bottom / var(--mw) var(--ml);
  background-repeat: no-repeat;
}

/* 23.3 Encabezados: la línea roja bajo el subtítulo es una cota */
.kicker::after {
  height: 9px;
  margin-top: 32px;
  border: solid var(--color-brand);
  border-width: 0 2px;
  background: linear-gradient(var(--color-brand), var(--color-brand)) center / 100% 2px no-repeat;
}

/* 23.4 (El "Desliza" del hero conserva su animación original: el usuario
   pidió no cambiarlo) */

/* 23.5 Quiénes somos: cotas arriba y abajo de las fotos; las barras de
   porcentaje se miden sobre una regla */
.cota--about-top { top: -30px; left: 0; width: 375px; }
.cota--about-bottom { bottom: -30px; right: 0; width: 375px; --c: var(--color-brand); }
.skill {
  background:
    repeating-linear-gradient(90deg, rgba(var(--color-navy-rgb), .25) 0 1px, transparent 1px 10%) left bottom / 100% 6px no-repeat,
    repeating-linear-gradient(90deg, rgba(var(--color-navy-rgb), .45) 0 1px, transparent 1px 50%) left bottom / 100% 12px no-repeat,
    var(--color-gray);
}

/* 23.6 Antes y después: el comparador va en una lámina con marcas de corte
   y una cota con el nombre de la obra */
.showcase__sheet { position: relative; padding-top: 30px; }
.showcase__sheet > .cota { top: 2px; left: 0; right: 0; }
.showcase__sheet > .marcas { inset: 20px -10px -10px; }

/* 23.7 Galería: al pasar el mouse aparecen marcas de corte y una cota que
   mide la foto (script.js, [data-medir]) */
.home-gallery .marcas { --mc: var(--color-white); --mo: 14px; opacity: 0; transform: scale(1.04); transition: opacity .4s var(--ease), transform .5s var(--ease); }
.cota--in { --c: var(--color-white); top: 30px; left: 36px; right: 36px; z-index: 3; opacity: 0; transition: opacity .4s var(--ease); }
.cota--in::before { transform: scaleX(0); transition: transform .6s var(--ease); }
.cota--in em { text-transform: none; letter-spacing: .08em; padding: 4px 8px; border-radius: 4px; background: rgba(var(--color-footer-rgb), .5); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }
.home-gallery a:hover .marcas, .home-gallery a:focus-visible .marcas,
.home-gallery a:hover .cota--in, .home-gallery a:focus-visible .cota--in { opacity: 1; transform: none; }
.home-gallery a:hover .cota--in::before, .home-gallery a:focus-visible .cota--in::before { transform: none; }

/* 23.8 CTA: "Iniciar Proyecto" es el mismo botón de plano del hero; deja
   espacio arriba para su cota */
.cta--video .cta__actions { align-items: center; padding-top: 38px; }

/* 23.9 Footer: regla con marcas a lo largo del borde superior */
.site-footer {
  background:
    repeating-linear-gradient(90deg, rgba(var(--color-white-rgb), .14) 0 1px, transparent 1px 12px) left top / 100% 7px no-repeat,
    repeating-linear-gradient(90deg, rgba(var(--color-white-rgb), .32) 0 1px, transparent 1px 120px) left top / 100% 16px no-repeat,
    var(--color-footer);
}

@media (max-width: 767px) {
  .cota em { font-size: 10px; letter-spacing: .08em; }
  .cota--about-top { width: 70%; }
  .cota--about-bottom { width: 60%; }
}
@media (prefers-reduced-motion: reduce) {
  .js .cota.reveal, .js .cota.reveal::before, .js .cota.reveal em { transition: none; }
  .svc__in, .svc__in i, .svc__seam { animation: none !important; }
}

/* ==========================================================================
   24. Cada sección cabe en una pantalla (escritorio, 2026-10-12)
   El usuario pidió acoplar todas las secciones al tamaño de su pantalla
   (1920×1080 al 125% → ventana útil ≈ 1510×695 en Brave). Espacios, títulos
   e imágenes salen del alto de la ventana (svh) para que al llegar a una
   sección se vea completa debajo del header. --fit = alto útil.
   Las páginas de obras se acoplan por partes: título + comparador + video
   en una pantalla y "Antes / Después" en la siguiente.
   ========================================================================== */
@media (min-width: 1025px) {
  :root {
    --fit: calc(100svh - var(--header-h-scrolled));
    --section-y: clamp(32px, 5.5svh, 110px);
    --gap-y: clamp(16px, 3svh, 60px);
  }
  .kicker::after { margin-top: clamp(10px, 2svh, 32px); }
  .title { margin-top: clamp(10px, 1.6svh, 24px); font-size: clamp(30px, 5svh, 50px); }
  .lead { margin-top: clamp(8px, 1.4svh, 20px); }

  /* Hero: exactamente una pantalla */
  .hero { height: 100svh; min-height: 0; }
  .hero__content { padding-block: calc(var(--header-h) + 1svh) 12svh; }
  .hero__title, .hero__rotator { font-size: clamp(46px, 9svh, 70px); }
  .hero__text { margin-top: clamp(12px, 2svh, 24px); }
  .hero__actions { margin-top: clamp(18px, 3svh, 36px); }

  /* Quiénes somos (inicio) */
  .about__media { padding-bottom: 12svh; }
  .about__img-back { width: auto; height: calc(var(--fit) - 2 * var(--section-y) - 12svh); max-width: 100%; }
  .about__img-front { width: auto; height: calc(var(--fit) - 2 * var(--section-y) - 18svh); }
  .about__title { font-size: clamp(30px, 4.6svh, 50px); }
  .about__grid { margin-top: clamp(12px, 2svh, 24px); }
  .quality-card { padding: clamp(16px, 3svh, 40px) 24px; }
  .quality-card h3 { margin-top: clamp(8px, 1.6svh, 24px); }
  .skills { gap: clamp(14px, 3svh, 40px); }
  .about .link-more { margin-top: clamp(12px, 2svh, 30px); }

  /* Antes y después (inicio) */
  .showcase { margin-top: var(--gap-y); }
  .showcase__stage { justify-self: center; width: min(100%, calc((var(--fit) - 2 * var(--section-y) - 190px) * 1.6)); }
  .showcase__tab { padding-block: clamp(8px, 1.4svh, 16px); }

  /* Galería (inicio) */
  .home-gallery {
    --gal: calc(var(--fit) - 2 * var(--section-y) - 150px);
    grid-template-rows: calc(var(--gal) * .41) calc(var(--gal) * .59 - 10px);
    margin-top: var(--gap-y);
  }

  /* Misión / Visión / Valores (Nosotros) */
  .plans { margin-top: var(--gap-y); }
  .plan { aspect-ratio: auto; height: calc(var(--fit) - 2 * var(--section-y) - 150px); }

  /* Nuestros servicios en Nosotros: título compacto y video lo más grande
     que quepa junto con los capítulos */
  .svc-film__head { margin-bottom: clamp(12px, 2svh, 30px); }
  .svc-film__head .title { font-size: clamp(26px, 4svh, 40px); }
  .svc-film__head .lead { font-size: 14px; }
  .svc-film__chapters { margin-top: 12px; }

  /* Testimonios (Nosotros) */
  .voices-tour__stage { margin-top: var(--gap-y); }
  .voices-steps { margin-top: clamp(14px, 2.4svh, 40px); }

  /* Galerías de Servicios (2026-10-20, más grandes): se abren hasta 24px
     de cada borde y llenan la pantalla. Título a la izquierda y texto a la
     derecha en una franja; fotos en mosaico de 6 columnas × 2 filas con la
     primera grande (2×2) y la cuarta doble de ancho. */
  .gsteps { margin-top: clamp(8px, 1.6svh, 24px); }
  .gsteps__stage { width: calc(100vw - 48px); margin-left: calc(50% - 50vw + 24px); }
  .gsteps--on .gsteps__panel { margin-top: clamp(12px, 2svh, 36px); }
  .gsteps__panel > .section-head--center { display: flex; align-items: baseline; justify-content: space-between; gap: 40px; max-width: none; text-align: left; }
  .gsteps__panel > .section-head--center .title { flex: none; font-size: clamp(24px, 4svh, 40px); }
  .gsteps__panel > .section-head--center .lead { max-width: 560px; margin: 0; font-size: 14px; }
  .gallery-block .photo-grid,
  .gallery-block .photo-grid--masonry {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    grid-template-rows: repeat(2, calc((var(--fit) - 2 * var(--section-y) - 176px) / 2));
    gap: 10px;
    margin-top: clamp(12px, 2svh, 30px);
  }
  .gallery-block .photo-grid a { height: auto; margin: 0; aspect-ratio: auto; }
  .gallery-block .photo-grid a:nth-child(1) { grid-column: span 2; grid-row: span 2; }
  .gallery-block .photo-grid a:nth-child(4) { grid-column: span 2; }
  .gallery-block .photo-grid img { height: 100%; }

  /* Preguntas frecuentes */
  .drafting { margin-top: 0; }
  .drafting__media { width: min(100%, calc((var(--fit) - 2 * var(--section-y)) * .8 + 60px)); }
  .faq--cota { margin-top: clamp(12px, 2svh, 30px); }
  .faq--cota summary { padding-block: clamp(8px, 1.5svh, 20px); }

  /* Contacto: formulario compacto; el mapa toma su altura */
  .site-plan__form { padding: clamp(22px, 4svh, 56px) clamp(28px, 4svh, 56px); }
  .site-plan__form .lead { font-size: 15px; }
  .site-plan__form .title { font-size: clamp(26px, 4svh, 50px); }
  .site-plan__form { padding-block: clamp(18px, 3svh, 56px); }
  .plan { height: calc(var(--fit) - 2 * var(--section-y) - 156px); }
  .quick-channels { margin-top: clamp(10px, 1.8svh, 28px); }
  .quick-channels button { padding-block: 8px; }
  .build { margin-top: clamp(10px, 1.8svh, 30px); }
  .form--float { margin-top: clamp(6px, 1svh, 26px); gap: clamp(8px, 1.4svh, 26px) 20px; }
  .form--float input, .form--float textarea, .form--float select { padding: 16px 0 6px; }
  .form--float textarea { min-height: 0; height: clamp(54px, 9svh, 110px); }
  .form button.form__gate { padding-block: 12px; }
  .site-plan__map { min-height: 0; }

  /* Páginas de obras: dos pantallas por obra */
  .obra__title { font-size: clamp(26px, 4.4svh, 38px); }
  .obra__feature {
    --obra-h: calc(var(--fit) - 2 * var(--section-y) - 150px);
    margin-top: clamp(14px, 2.4svh, 60px);
    grid-template-columns: auto auto;
    justify-content: center;
    gap: clamp(24px, 4svh, 80px);
  }
  .obra__feature .compare { width: calc(var(--obra-h) * 4 / 3); }
  .obra__feature .compare img { height: var(--obra-h); }
  .obra__video { width: auto; height: var(--obra-h); max-height: none; }
  .obra__feature--solo { grid-template-columns: auto; }
  .obra__pair { --pair-h: calc(var(--fit) - 2 * var(--section-y) - 150px); margin-top: calc(2 * var(--section-y)); }
  .obra__col h3 { margin-bottom: clamp(8px, 1.6svh, 24px); font-size: clamp(22px, 3.4svh, 28px); }
  .obra__pair .carousel { width: min(100%, calc(var(--pair-h) * 631 / 450)); margin-inline: auto; }
  .obra + .obra { margin-top: calc(2 * var(--section-y)); }
}

/* Clientes que confían (Nosotros, 2026-10-12): separada del video de
   "Nuestros servicios" y más grande; en escritorio ocupa una pantalla con
   el contenido centrado */
.clientes { margin-top: clamp(40px, 8svh, 120px); border-top: 1px solid rgba(var(--color-navy-rgb), .1); }
.clientes .tally { max-width: 1040px; }
.clientes .tape { height: 40px; margin: clamp(22px, 4svh, 44px) 0 clamp(18px, 3svh, 34px); }
.clientes .tape__case { width: 52px; height: 40px; border-radius: 12px; }
.clientes .tape__case::after { inset: 13px 19px; }
.clientes .tape__fill { left: 44px; top: 10px; bottom: 5px; }
/* La cifra que cuenta tiene ancho fijo: al cambiar no reacomoda el título */
.clientes [data-count] { display: inline-block; min-width: 4.1ch; font-variant-numeric: tabular-nums; text-align: right; }
.clientes .lead { max-width: 820px; margin-inline: auto; font-size: 17px; }
.clientes .logo-gates { gap: 22px; margin-top: clamp(28px, 5svh, 64px); }
.clientes .logo-gate { width: 228px; height: 120px; border-radius: 20px; }
.clientes .logo-gate img { max-height: 54px; }
@media (min-width: 1025px) {
  /* 2026-10-21: ya sin logos, deja de ocupar una pantalla entera para que
     su título quede a la misma distancia del video de servicios que el
     título de servicios de Misión/Visión (ver --svc-gap en §24) */
  .clientes { margin-top: 0; padding-top: calc(var(--svc-gap) / 2 - 1px); }
  .clientes .title { font-size: clamp(36px, 6.6svh, 60px); }
}
@media (max-width: 767px) {
  .clientes .logo-gates { gap: 14px; }
  .clientes .logo-gate { width: calc(50% - 7px); height: 92px; }
  .clientes .logo-gate img { max-height: 44px; }
}

/* "Nuestros servicios" completo en una pantalla (inicio y Nosotros,
   2026-10-12): el título va arriba en una franja compacta (título a la
   izquierda, texto y "Ver Más" a la derecha). En el inicio la franja vive
   dentro del escenario fijo (.svc__pin), así no se va mientras se recorren
   las fotos; índice y foto toman el alto que queda. En Nosotros el video
   toma el alto que dejan la franja y los capítulos. */
.svc__band, .svc-film__head {
  grid-area: band;
  display: grid;
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
  align-items: end;
  gap: 10px 48px;
}
.svc__band .kicker, .svc-film__head .kicker { font-size: 14px; }
.svc__band .kicker::after, .svc-film__head .kicker::after { margin-top: 6px; }
.svc__band .title, .svc-film__head .title { margin-top: 6px; font-size: clamp(24px, 3.6svh, 34px); line-height: 1.15; }
.svc__band .lead, .svc-film__head .lead { margin-top: 0; font-size: 13.5px; line-height: 1.5; }
.svc__band .link-more, .svc-film__head .link-more { margin-top: 6px; }
.svc__pin {
  grid-template-rows: auto minmax(0, 1fr);
  grid-template-areas: "band band" "list stage";
  row-gap: clamp(12px, 2.2svh, 24px);
  padding-block: clamp(10px, 2svh, 24px);
}
@media (min-width: 1025px) {
  .svc__head { padding-block: clamp(8px, 1.6svh, 24px); }
  .svc__name { font-size: clamp(20px, 3.4svh, 30px); }
  .svc__body p { margin-bottom: 8px; font-size: 14px; }
  .svc__link { margin-bottom: clamp(10px, 1.8svh, 26px); }
}
@media (max-width: 1024px) {
  .svc__pin { grid-template-rows: auto minmax(0, 1fr) auto; grid-template-areas: "band" "stage" "list"; }
  .svc__band, .svc-film__head { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 767px) {
  .svc__band .lead { display: none; }
  .svc__band .title { font-size: 21px; }
}
@media (min-width: 1025px) {
  /* Nosotros (2026-10-21, video más grande): el título queda arriba y
     sube al bajar; video + regla + cota llenan solos una pantalla.
     --film-chrome = marco (46) + capítulos, regla y cota (~104) */
  .svc-film { --film-chrome: 154px; }
  /* 2026-10-21: misma distancia arriba (de las tarjetas de Misión/Visión
     al título "Nuestros servicios") y abajo (del rótulo de la cota al
     título de Clientes): --svc-gap. Arriba se descuenta el padding de la
     sección anterior (--section-y). Abajo la línea de Clientes queda a la
     mitad: 14px bajo el rótulo + este padding = la mitad, y el padding de
     .clientes la otra mitad */
  :root { --svc-gap: clamp(80px, 16.5svh, 220px); }
  #obras:has(.svc-film) { padding-block: calc(var(--svc-gap) - var(--section-y)) calc(var(--svc-gap) / 2 - 14px); }
  .svc-film__head { margin-bottom: clamp(16px, 3svh, 40px); }
  .svc-film__media { --w: min(calc(100vw - 48px), calc((var(--fit) - var(--film-chrome)) * 16 / 9)); }
  .svc-film__name { font-size: 13px; }
  .svc-film__ch { gap: 4px; }
  .svc-film__ch button { gap: 6px; }
  .svc-film__ch a { width: 24px; height: 24px; }
  .svc-film__ch a svg { width: 12px; height: 12px; }
}

/* ==========================================================================
   25. Aviso de privacidad, gracias y 404
   Páginas noindex que reusan el header, el page-hero y el footer del sitio.
   ========================================================================== */

/* Texto legal: columna de lectura de ~70 caracteres */
.legal {
  max-width: 70ch;
  margin-inline: auto;
  color: var(--color-ink);
  line-height: 1.7;
}
.legal__updated { margin-bottom: 40px; color: var(--color-muted-dark); font-size: 15px; }
.legal h2 { margin: 48px 0 14px; font-size: 22px; text-wrap: balance; }
.legal p { text-wrap: pretty; }
.legal p + p,
.legal ul + p { margin-top: 14px; }
.legal ul { margin: 14px 0 0 20px; }
.legal li + li { margin-top: 6px; }
.legal a {
  color: var(--color-brand-dark);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.legal a:hover { color: var(--color-brand-deep); }

/* Gracias y 404: mensaje corto con dos salidas */
.status { max-width: 640px; }
.status__text { color: var(--color-ink); font-size: 18px; line-height: 1.7; text-wrap: pretty; }
.status__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 24px; margin-top: 32px; }

/* ==========================================================================
   26. Ajustes por sección (antes estilos inline en el HTML)
   Doble clase a propósito: deben ganarle a .section y a la sección 24,
   igual que le ganaban los estilos inline.
   ========================================================================== */
.section.section--flush-top { padding-top: 0; }
.section.section--flush-bottom { padding-bottom: 0; }
.section.section--short-top { padding-top: 40px; }
.section.section--short-bottom { padding-bottom: 60px; }
.section.section--compact { padding-block: 80px 40px; }

/* Tramos de la línea de tiempo del video de Nosotros: el ancho y las marcas
   son proporcionales a los segundos de cada tramo (data-seg / data-end) */
.svc-film__chapter--7 { flex: 7; --s: 7; }
.svc-film__chapter--9 { flex: 9; --s: 9; }

/* WhatsApp (contacto y gracias): en reposo ícono verde; al pasar el cursor
   sube el verde oficial y el texto pasa a blanco (sytez-standards §5) */
.quick-channels .quick-channels__whatsapp,
.btn--whatsapp { position: relative; isolation: isolate; overflow: hidden; }
.quick-channels .quick-channels__whatsapp svg,
.btn--whatsapp svg { width: 16px; height: 16px; color: var(--color-whatsapp-dark); transition: color .25s; }
.quick-channels .quick-channels__whatsapp::before,
.btn--whatsapp::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--color-whatsapp);
  transform: translateY(101%);
  transition: transform .3s var(--ease);
}
.quick-channels .quick-channels__whatsapp:is(:hover, :focus-visible),
.btn--whatsapp:is(:hover, :focus-visible) { border-color: var(--color-whatsapp); color: var(--color-white); box-shadow: 0 10px 24px -6px rgba(var(--color-whatsapp-rgb), .6); transform: translateY(-2px); }
.quick-channels .quick-channels__whatsapp:is(:hover, :focus-visible)::before,
.btn--whatsapp:is(:hover, :focus-visible)::before { transform: none; }
.quick-channels .quick-channels__whatsapp:is(:hover, :focus-visible) svg,
.btn--whatsapp:is(:hover, :focus-visible) svg { color: var(--color-white); }
.btn--whatsapp { border: 1px solid rgba(var(--color-navy-rgb), .18); background: transparent; color: var(--color-ink); }
.btn--whatsapp:active { transform: translateY(0); }
