@charset "UTF-8";
/* ═══════════════════════════════════════════════════════════════════════════
   COPENA CONSTRUCCIONES — 02 · ESTRUCTURA
   Cabecera, navegación, menú móvil, hilo dorado, pie y contacto fijo.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══ CABECERA ═══════════════════════════════════════════════════════════
   Transparente sobre el hero; al hacer scroll pasa a carbón sólido, se
   encoge y aparece el filete dorado. El cambio lo dispara un centinela con
   IntersectionObserver, no un listener de scroll.                          */

.cabecera{
  position:fixed;inset:0 0 auto 0;z-index:1100;   /* escala en base.css */
  background:transparent;
  border-bottom:1px solid transparent;
  transition:background var(--v-medio) var(--dentro),
             border-color var(--v-medio) var(--dentro),
             backdrop-filter var(--v-medio);
}
.cabecera__caja{
  display:flex;align-items:center;justify-content:space-between;
  gap:var(--e4);
  height:var(--cabecera);
  transition:height var(--v-medio) var(--dentro);
}
.cabecera.fijada{
  background:var(--carbon);
  border-bottom-color:var(--oro);
}
.cabecera.fijada .cabecera__caja{height:var(--cabecera-fija)}

@supports (backdrop-filter:blur(8px)){
  .cabecera.fijada{background:rgba(21,22,19,.92);backdrop-filter:blur(10px)}
}

/* Centinela de 1px: mientras es visible, la cabecera está en reposo */
.centinela{position:absolute;top:0;left:0;width:1px;height:1px;pointer-events:none}

/* ── Marca ── */
.marca{
  display:flex;align-items:center;gap:var(--e3);
  text-decoration:none;color:var(--blanco);flex:none;
  min-height:var(--toque);
}
/* Logotipo oficial. Los atributos width/height del <img> evitan el salto de
   la cabecera mientras carga; height:auto (en base.css) conserva la
   proporción aunque los números no cuadren, así que el logo NO se deforma. */
/* La cabecera mide 88 px en reposo y 66 al fijarse; el logotipo se queda unos
   15 px por debajo para no tocar los bordes. Antes iba a 46 px sobre 72 y se
   leía como una miniatura. */
.marca__logo{
  height:clamp(38px,4.4vw,58px);width:auto;
  display:block;
}
.cabecera.fijada .marca__logo{height:clamp(32px,3.5vw,44px)}

/* El isotipo NO se usa en la cabecera. Se comprobó que el logotipo horizontal
   cabe hasta en 360 px: ocupa 126 px de los 248 disponibles junto al botón de
   menú. Quitar el nombre de la empresa de la cabecera en móvil, que es donde
   está la mayoría de las visitas, no compensaba ganar 60 px de hueco.
   El archivo del isotipo se sigue usando como favicon. */
.marca__iso-img{display:none}

/* ── Navegación de escritorio ── */
.nav{display:none}
.nav__lista{display:flex;align-items:center;gap:var(--e6);list-style:none}
.nav__enlace{
  font-family:var(--mono);
  font-size:var(--t-micro);
  font-weight:500;
  letter-spacing:.16em;
  text-transform:uppercase;
  text-decoration:none;
  color:var(--blanco);
  display:inline-flex;align-items:center;
  min-height:var(--toque);
  position:relative;
  white-space:nowrap;
}
.nav__enlace::after{
  content:"";position:absolute;left:0;right:0;bottom:2px;height:1px;
  background:var(--oro);
  transform:scaleX(0);transform-origin:left;
  transition:transform var(--v-medio) var(--sal);
}
.nav__enlace:hover::after,
.nav__enlace[aria-current="true"]::after{transform:scaleX(1)}

.cabecera .btn{display:none;min-height:48px;padding-inline:var(--e5);font-size:14px}

/* ── Botón hamburguesa ── */
.hamburguesa{
  width:var(--toque);height:var(--toque);flex:none;
  display:grid;place-items:center;
  background:transparent;border:1px solid var(--borde-osc);
  cursor:pointer;padding:0;border-radius:2px;
}
.hamburguesa__barras{display:block;width:20px;height:12px;position:relative}
.hamburguesa__barras i{
  position:absolute;left:0;right:0;height:2px;background:var(--oro);
  transition:transform var(--v-medio) var(--sal),opacity var(--v-rapido);
}
.hamburguesa__barras i:nth-child(1){top:0}
.hamburguesa__barras i:nth-child(2){top:5px}
.hamburguesa__barras i:nth-child(3){top:10px}
.hamburguesa[aria-expanded="true"] i:nth-child(1){transform:translateY(5px) rotate(45deg)}
.hamburguesa[aria-expanded="true"] i:nth-child(2){opacity:0}
.hamburguesa[aria-expanded="true"] i:nth-child(3){transform:translateY(-5px) rotate(-45deg)}

/* ═══ MENÚ MÓVIL A PANTALLA COMPLETA ═════════════════════════════════════ */

.menu{
  position:fixed;inset:0;z-index:1090;            /* escala en base.css */
  background:var(--carbon);
  display:flex;flex-direction:column;
  /* Abajo, sitio para el flotante y para el área segura del dispositivo */
  padding:calc(var(--cabecera) + var(--e5)) var(--canal)
          calc(var(--e8) + env(safe-area-inset-bottom));
  overflow-y:auto;
  overscroll-behavior:contain;
  visibility:hidden;opacity:0;
  transition:opacity var(--v-medio) var(--dentro),visibility 0s var(--v-medio);
}
.menu[data-abierto]{visibility:visible;opacity:1;transition-delay:0s}

.menu__lista{list-style:none;border-top:1px solid var(--borde-osc)}
.menu__lista li{border-bottom:1px solid var(--borde-osc)}
/* El cuerpo y el relleno bajaron al pasar de cinco entradas a nueve: con los
   anteriores (44px y 24px de aire) la lista medía 1126 px en una pantalla de
   844 y el botón de WhatsApp del pie quedaba por debajo del borde, que es el
   sitio exacto donde no puede estar. Sigue siendo tipografía grande, y el
   área táctil nunca baja de --toque. */
.menu__enlace{
  display:flex;align-items:center;justify-content:space-between;gap:var(--e4);
  min-height:var(--toque);
  padding:var(--e3) 0;
  text-decoration:none;color:var(--blanco);
  font-family:var(--display);font-weight:800;
  font-size:clamp(21px,5.6vw,32px);line-height:1;
  text-transform:uppercase;letter-spacing:var(--track-display);
}
.menu__enlace span{
  font-family:var(--mono);font-size:var(--t-micro);font-weight:400;
  letter-spacing:.16em;color:var(--oro);
}
.menu__pie{margin-top:auto;padding-top:var(--e6);display:grid;gap:var(--e3)}
.menu__pie .btn{width:100%}
.menu__dato{
  margin:var(--e5) 0 0;
  font-family:var(--mono);font-size:var(--t-micro);letter-spacing:.14em;
  text-transform:uppercase;color:var(--gris);
}

/* Bloqueo del fondo mientras el menú está abierto. La posición se conserva
   desde JS; aquí solo se congela el documento.                             */
html.menu-abierto,html.menu-abierto body{overflow:hidden}
html.menu-abierto body{position:fixed;inset:0;width:100%}

/* ═══ HILO DORADO ════════════════════════════════════════════════════════
   Cinco piezas alineadas que comparten la misma x y el mismo oro. La
   continuidad es geométrica, no un único elemento.                         */

/* 1 · Riel maestro. Solo transform: ni height ni top, que disparan layout. */
.hilo{
  position:fixed;left:16px;top:0;bottom:0;width:2px;z-index:40;
  display:none;pointer-events:none;
}
.hilo__base{position:absolute;inset:0;background:rgba(201,162,39,.16)}
.hilo__viva{
  position:absolute;inset:0;background:var(--oro);
  transform:scaleY(0);transform-origin:top;
  box-shadow:0 0 10px rgba(201,162,39,.5);
}
.hilo__punto{
  position:absolute;top:0;left:50%;width:9px;height:9px;margin-left:-4.5px;
  background:var(--oro);
}

/* 3 · Tramo vertical dentro de una sección */
.tramo{
  position:absolute;left:0;top:0;bottom:0;width:2px;
  background:var(--oro-linea);
  transform:scaleY(0);transform-origin:top;
  transition:transform var(--v-muy-lento) var(--sal);
  pointer-events:none;
}
.oscuro .tramo,.carbon .tramo,.verde-bg .tramo{background:var(--oro)}
.tramo.trazado{transform:scaleY(1)}

/* 2 y 5 · Tramos con quiebro, en SVG. El atributo d se recalcula solo al
   redimensionar; el revelado es una transición de un disparo.              */
/* El tramo con quiebro solo existe donde hay canal lateral para alojarlo.
   Por debajo de 1200px cruzaria el contenido, asi que no se dibuja: se
   conserva el significado y se tira el tejido conectivo que no cabe. */
/* La caja se declara AQUÍ, no desde JavaScript.
   Un <svg> sin ancho ni alto se pinta a su tamaño intrínseco por defecto
   (300×150). escenas.js le ponía después width/height al 100 %, y ese salto
   de 150 px a la altura del hero era el 84 % del CLS de la página: 0,318 de
   un total de 0,380 medido. Con la caja fijada desde el principio, el SVG
   nunca cambia de tamaño y JavaScript solo calcula el viewBox y la ruta. */
.trazo{
  position:absolute;left:0;top:0;width:100%;height:100%;
  overflow:visible;pointer-events:none;z-index:2;display:none;
}
/* Aparece donde aparece la grúa, que es de donde sale la línea */
@media(min-width:1000px){.trazo{display:block}}
.trazo path{
  fill:none;stroke:var(--oro);stroke-width:2;
  stroke-linecap:square;stroke-linejoin:miter;
  stroke-dasharray:var(--largo,1200);
  stroke-dashoffset:var(--largo,1200);
  transition:stroke-dashoffset 1.1s var(--sal);
}
.trazo.trazado path{stroke-dashoffset:0}

/* ═══ PIE ════════════════════════════════════════════════════════════════ */

.pie{
  background:var(--verde);
  color:var(--gris-claro);
  padding:var(--e9) 0 var(--e6);
  font-size:var(--t-menor);
  --foco:var(--oro-alto);
}
/* Mismo recurso que el hero, con una diferencia: data-calce-tope="1.3" acota
   la dispersión de cuerpos. Sin él, con 6, 14 y 10 letras el calce daba 2,20:1
   entre COPENA y CONSTRUCCIONES —medido: 384 / 174 / 237 px en 1440— y la
   palabra corta se leía como titular y las otras dos como subtítulo suyo.

   El clamp es solo el valor por defecto sin JS. El presupuesto de altura bajó
   de min(88svh,800px): con la dispersión acotada el techo lo pone el ancho,
   así que reservar casi una pantalla solo servía para que en monitores altos
   el bloque volviera a comerse el pie entero. */
.pie__marca{
  --calce-alto:min(72svh,660px);
  font-family:var(--display);font-weight:900;
  font-size:clamp(46px,15vw,190px);
  line-height:.86;letter-spacing:-.018em;
  color:var(--blanco);
  text-transform:uppercase;
  margin:0 0 var(--e6);
  /* A bandera izquierda, en el mismo eje que .pie__rejilla y que toda la
     página. Si alguna vez se quiere el bloque centrado, basta con añadir
     aquí text-align:center — el calce funciona igual. */
}
.pie__marca span{display:block}
.pie__marca .lin{
  display:block;overflow:hidden;
  padding-top:.14em;margin-top:-.14em;
  font-size:var(--cuerpo,inherit);
  line-height:.86;
}
.pie__marca .lin > i{display:block;font-style:normal}
.pie__marca .ciudad{color:var(--oro)}

.pie__rejilla{display:grid;gap:var(--e7);margin-top:var(--e10)}
.pie h4{
  font-family:var(--mono);font-size:var(--t-micro);font-weight:500;
  letter-spacing:var(--track-cota);text-transform:uppercase;
  color:var(--oro);margin:0 0 var(--e4);
}
.pie ul{list-style:none}
.pie li{margin-bottom:2px}
.pie li a{display:inline-flex;align-items:center;min-height:var(--toque)}
.pie a{color:var(--gris-claro);text-decoration:none;border-bottom:1px solid transparent}
.pie a:hover{color:var(--blanco);border-bottom-color:var(--oro)}

/* ═══ CORREO OFICIAL ══════════════════════════════════════════════════════
   copenacontrucciones@gmail.com · SIN la segunda «s». No es una errata.

   Tres reglas comunes a los tres sitios donde aparece —pie, contacto y menú
   móvil—, porque los tres tienen el mismo problema: son 29 caracteres sin
   espacios dentro de columnas que en un teléfono de 360 px miden menos que
   eso.

     · overflow-wrap:anywhere   parte la dirección antes de desbordar la
                                columna y provocar scroll horizontal.
     · text-transform:none      .cierre__datos va en versalitas, y en
                                mayúsculas la dirección se leería
                                COPENACONTRUCCIONES@GMAIL.COM, que no es
                                como se escribe.
     · letter-spacing normal    con .14em de tracking la arroba y el punto
                                se separan tanto que cuesta leerla.
   El texto es texto seleccionable, nunca una imagen.                      */
.pie__correo a,
.cierre__correo a,
.menu__correo{
  overflow-wrap:anywhere;
  text-transform:none;
  letter-spacing:normal;
  font-family:var(--texto);
}
/* En el pie hereda el color de .pie a (gris claro, 6:1 sobre verde) */
.cierre__correo a{color:var(--blanco);text-decoration:none;border-bottom:1px solid var(--oro-linea)}
.cierre__correo a:hover{border-bottom-color:var(--oro)}
.menu__correo{
  display:inline-flex;align-items:center;min-height:var(--toque);
  color:var(--gris-claro);text-decoration:none;
  font-size:var(--t-menor);
  border-bottom:1px solid transparent;
}
.menu__correo:hover{color:var(--blanco);border-bottom-color:var(--oro)}

.pie__legal{
  border-top:1px solid rgba(250,248,243,.2);
  margin-top:var(--e8);padding-top:var(--e5);
  display:flex;flex-wrap:wrap;gap:var(--e3) var(--e5);
  justify-content:space-between;align-items:center;
  font-family:var(--mono);font-size:var(--t-micro);letter-spacing:.1em;
}
/* «Privacidad» medía 20px de alto: por debajo del mínimo de área táctil. */
.pie__legal a{display:inline-flex;align-items:center;min-height:var(--toque)}
.pie__cierre{
  margin-top:var(--e5);
  font-family:var(--mono);font-size:var(--t-micro);
  letter-spacing:var(--track-cota);text-transform:uppercase;
  color:var(--oro);
}

/* ═══ BOTÓN FLOTANTE DE WHATSAPP ═════════════════════════════════════════
   Rectángulo, nunca un círculo. Oro sólido con tinta carbón: 7,5:1, y es el
   único elemento de la página con ese peso, así que se lee como LA acción.

   ANCLADO AL VIEWPORT Y A NADA MÁS. `right` y `bottom` son constantes; lo
   único que se mueve es un translateY, y va acotado desde JS. La versión
   anterior metía la variable de JS DENTRO de `bottom`:

       bottom: calc(28px + var(--alza-flota))

   y esa variable era «cuántos píxeles del pie se ven», una magnitud sin
   techo. Medido con la página al fondo: --alza-flota = 1343 px en 1440×900,
   con el botón en top:-523px. No es que subiera con la sección: es que se
   iba fuera de la pantalla y ya no volvía.

   Además animar `bottom` viola la regla 2 de animacion.css —solo transform,
   opacity y clip-path—, así que la elevación pasó a transform.             */
.flota{
  position:fixed;z-index:1000;                    /* escala en base.css */
  right:16px;
  bottom:calc(16px + env(safe-area-inset-bottom));
  display:inline-flex;align-items:center;justify-content:center;gap:var(--e3);
  min-width:56px;min-height:56px;padding:0 var(--e4);
  background:var(--oro);color:var(--carbon);
  border:1px solid var(--oro-alto);border-radius:2px;
  font-family:var(--display);font-weight:800;font-size:15px;
  letter-spacing:.1em;text-transform:uppercase;text-decoration:none;
  box-shadow:0 10px 30px rgba(0,0,0,.42);
  transition:opacity var(--v-medio) var(--sal),
             transform var(--v-medio) var(--sal),
             background var(--v-rapido) var(--dentro),
             visibility 0s var(--v-medio);
  /* El anillo de foco se pinta 3px POR FUERA del botón (base.css), así que
     cae sobre el fondo de la sección, no sobre el dorado. Con --foco en
     carbón sobre las secciones oscuras daba 1,02:1: invisible. El oro alto
     contrasta 10:1 sobre carbón y 6:1 sobre el verde. */
  --foco:var(--oro-alto);
}

/* El estado «oculto hasta que el scroll lo pida» CUELGA DE html.js.

   Antes estaba en la regla de arriba, sin la guarda: si escenas.js no se
   ejecutaba —404, bloqueador, error de red—, el botón de WhatsApp se quedaba
   en opacity:0 y visibility:hidden PARA SIEMPRE. Medido sin JavaScript: el
   CTA principal del sitio no aparecía nunca. Es exactamente lo que prohíbe
   la REGLA 1 de animacion.css. Sin JavaScript, ahora se ve desde el principio. */
.js .flota{
  opacity:0;visibility:hidden;
  transform:translateY(14px);
}

/* Visible = en su sitio, más la elevación que le haya tocado sobre el pie */
.flota[data-visible]{
  opacity:1;visibility:visible;
  transform:translateY(calc(-1 * var(--alza-flota,0px)));
  transition-delay:0s;
}

/* Sobre el pie sube, pero nunca más de lo que le permite el tope de JS */
.flota.is-above-footer{box-shadow:0 10px 30px rgba(0,0,0,.55)}

/* Al llegar a la línea legal el botón se retira con un fundido, no de golpe:
   ahí abajo ya hay tres enlaces de WhatsApp a la vista y taparlos sería
   exactamente el problema que se venía a resolver. */
.flota[data-retirado]{
  opacity:0;visibility:hidden;pointer-events:none;
  transform:translateY(14px);
}

.flota svg{
  width:24px;height:24px;fill:currentColor;flex:none;
  transition:transform var(--v-rapido) var(--sal);
}
.flota:hover{background:var(--oro-alto)}
.flota:hover svg{transform:translateX(2px)}

/* El texto se retira antes que el botón: por debajo de 1100 px queda el icono
   solo, y el nombre accesible sigue estando en el aria-label. */
.flota__txt{display:none}

@media (min-width:768px){
  /* El env() se conserva: en iPad y en iPhone en horizontal el indicador de
     inicio existe igual, y sin el inset el botón se le monta encima. Antes
     esta regla escribía `bottom:28px` a secas y perdía el margen seguro. */
  .flota{
    right:28px;
    bottom:calc(28px + env(safe-area-inset-bottom));
    min-width:0;min-height:52px;padding:0 var(--e5);
  }
}

/* Con el menú móvil abierto el botón queda tapado por el panel (z-index
   1090 sobre 1000), pero seguía existiendo para el lector de pantalla y
   para el cursor virtual, por debajo de un menú que sí atrapa el foco.
   Se retira de verdad mientras el menú está abierto. */
html.menu-abierto .flota{
  opacity:0;
  visibility:hidden;
  pointer-events:none;
}
@media (min-width:1100px){ .flota__txt{display:inline} }
