/* ==========================================================================
   Fasoli Reyna — bloques

   style.css es la capa de sistema (tokens, tipografia, botones, cabecera,
   pie). Aca viven las primitivas decorativas y los bloques de cada pagina.

   La regla que ordena todo: ninguna pagina repite la secuencia de bloques de
   otra. La portada es cinematografica, empresa editorial, servicios un indice
   pegajoso y el catalogo una planilla densa. El unico bloque compartido es el
   cierre, porque es la accion que importa.
   ========================================================================== */

/* ==========================================================================
   1. Motor de scroll
   ========================================================================== */

/* El estado oculto lo pone el JS al marcar <html class="motor-listo">, nunca
   el CSS por su cuenta. Si el motor no arranca —sin JS, prefers-reduced-motion,
   saveData, navegador viejo— no hay nada que revelar y todo se ve de una.
   Es el error clasico de estos motores: contenido invisible esperando un
   evento que no llega. Aca no puede pasar. */

html.motor-listo [data-revelar] {
	opacity: 0;
	transform: translateY(26px);
}

/* Las entradas laterales arrancan corridas 34px y, sobre el borde derecho,
   eso asomaba fuera de la pantalla y aparecia una barra de scroll horizontal
   hasta que el bloque terminaba de entrar.
   Se usa "clip" y no "hidden" a proposito: hidden convierte a main en un
   contenedor de scroll y los position:sticky de adentro —el indice de
   servicios, la ficha de obra, la barra de filtros— dejarian de pegarse. */
main { overflow-x: clip; }

html.motor-listo [data-revelar].se-ve {
	opacity: 1;
	transform: none;
	transition: opacity .75s cubic-bezier(.2,.7,.3,1), transform .75s cubic-bezier(.2,.7,.3,1);
	transition-delay: var(--retardo, 0ms);
}

/* Variantes de entrada, para que no todo suba igual. */
html.motor-listo [data-revelar="lado"]    { transform: translateX(-34px); }
html.motor-listo [data-revelar="lado-d"]  { transform: translateX(34px); }
html.motor-listo [data-revelar="escala"]  { transform: scale(.94); }
html.motor-listo [data-revelar="cortina"] { clip-path: inset(0 0 100% 0); opacity: 1; transform: none; }
html.motor-listo [data-revelar="cortina"].se-ve { clip-path: inset(0 0 0 0); transition: clip-path .9s cubic-bezier(.2,.7,.3,1); }

/* ==========================================================================
   2. Primitivas decorativas

   Todas son de adorno: van con aria-hidden y ninguna aporta contenido.
   Si se apagaran, las paginas se leerian igual.
   ========================================================================== */

/* -- Retícula de plano tecnico ------------------------------------------- */
.reticula {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	opacity: .5;
	background-image:
		linear-gradient(to right, rgba(185,180,172,.10) 1px, transparent 1px),
		linear-gradient(to bottom, rgba(185,180,172,.10) 1px, transparent 1px);
	background-size: 48px 48px;
	mask-image: linear-gradient(to bottom, #000, transparent 85%);
}
.reticula--clara {
	background-image:
		linear-gradient(to right, rgba(43,47,52,.10) 1px, transparent 1px),
		linear-gradient(to bottom, rgba(43,47,52,.10) 1px, transparent 1px);
}

/* -- Curvas de nivel ------------------------------------------------------ */
/* Movimiento de suelos: el plano topografico es literalmente el oficio. */
.curvas-nivel {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	overflow: hidden;
}
.curvas-nivel svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.curvas-nivel path { fill: none; stroke: currentColor; stroke-width: 1.2; opacity: .13; }

/* -- Cifra fantasma ------------------------------------------------------- */
.cifra-fantasma {
	position: absolute;
	z-index: 0;
	pointer-events: none;
	font-family: var(--display);
	font-size: clamp(11rem, 30vw, 30rem);
	line-height: .72;
	letter-spacing: -.04em;
	color: currentColor;
	opacity: .055;
	user-select: none;
	right: calc(var(--gutter) * -.2);
	bottom: -.14em;
}

/* -- Marco tecnico -------------------------------------------------------- */
/* Esquinas en L, como las marcas de corte de un plano. */
.marco-tecnico { position: relative; }
.marco-tecnico::before,
.marco-tecnico::after {
	content: "";
	position: absolute;
	width: 18px;
	height: 18px;
	z-index: 3;
	pointer-events: none;
	transition: width .3s ease, height .3s ease;
}
.marco-tecnico::before {
	top: 10px; left: 10px;
	border-top: 2px solid var(--vial);
	border-left: 2px solid var(--vial);
}
.marco-tecnico::after {
	bottom: 10px; right: 10px;
	border-bottom: 2px solid var(--vial);
	border-right: 2px solid var(--vial);
}
.marco-tecnico:hover::before,
.marco-tecnico:hover::after { width: 30px; height: 30px; }

/* -- Linea de cota -------------------------------------------------------- */
.cota {
	display: flex;
	align-items: center;
	gap: .6rem;
	margin-block: 2.5rem;
	color: var(--acero);
	font-size: .66rem;
	font-weight: 700;
	letter-spacing: .2em;
	text-transform: uppercase;
}
.cota::before,
.cota::after {
	content: "";
	height: 1px;
	flex: 1;
	background: currentColor;
	opacity: .4;
}
.cota span {
	flex: none;
	border: 1px solid currentColor;
	padding: .25rem .6rem;
}

/* -- Hachurado ------------------------------------------------------------ */
/* Trama de corte de material. Reemplaza a la foto que no esta, y se lee como
   decision de plano, no como imagen rota. */
.hachurado {
	background-image: repeating-linear-gradient(
		135deg,
		var(--grafito) 0 14px,
		var(--asfalto-alto) 14px 28px
	);
}

/* -- Cinta (marquesina) --------------------------------------------------- */
.cinta {
	overflow: hidden;
	border-block: var(--borde);
	background: var(--hueso-claro);
	padding-block: 1.1rem;
	position: relative;
	z-index: 1;
}
.cinta--oscura {
	background: var(--asfalto);
	border-color: var(--grafito);
	color: var(--hueso);
}
.cinta__pista {
	display: flex;
	width: max-content;
	gap: 0;
	will-change: transform;
}
.cinta__grupo {
	display: flex;
	align-items: center;
	gap: 2.6rem;
	padding-right: 2.6rem;
	flex: none;
}
.cinta__item {
	font-family: var(--display);
	font-size: clamp(1rem, 1.7vw, 1.45rem);
	text-transform: uppercase;
	letter-spacing: .01em;
	white-space: nowrap;
	color: inherit;
	text-decoration: none;
	flex: none;
}
a.cinta__item:hover { color: var(--oxido); }
.cinta--oscura a.cinta__item:hover { color: var(--vial); }
.cinta__punto {
	width: 9px;
	height: 9px;
	background: var(--vial);
	flex: none;
	transform: rotate(45deg);
}
/* Sin motor, la pista no se mueve: se la deja quieta y recortada. */
html.sin-animacion .cinta__pista { animation: none; }

/* ==========================================================================
   3. Bloques compartidos
   ========================================================================== */

/* -- Encabezado de pagina (se le suma decoracion al que ya existia) ------- */
.encabezado-pagina { position: relative; overflow: hidden; }
.encabezado-pagina .envoltura { position: relative; z-index: 2; }
.encabezado-pagina__bajada {
	max-width: 56ch;
	color: var(--cemento);
	margin-top: 1.5rem;
	font-size: clamp(1rem, 1.4vw, 1.15rem);
}

/* -- Rotulo de seccion con contador --------------------------------------- */
.titulo-bloque {
	display: flex;
	flex-wrap: wrap;
	align-items: end;
	justify-content: space-between;
	gap: 1.5rem;
	margin-bottom: clamp(2.2rem, 5vw, 3.5rem);
}
.titulo-bloque h2 { margin: 0; max-width: 18ch; }

/* -- Tarjeta de obra: se le agrega el marco tecnico ----------------------- */
.obra .marco-tecnico::before,
.obra .marco-tecnico::after { opacity: 0; transition: opacity .3s ease; }

.obra::before,
.obra::after {
	content: "";
	position: absolute;
	width: 16px;
	height: 16px;
	z-index: 3;
	opacity: 0;
	transition: opacity .3s ease, width .3s ease, height .3s ease;
	pointer-events: none;
}
.obra::before {
	top: 12px; left: 12px;
	border-top: 2px solid var(--vial);
	border-left: 2px solid var(--vial);
}
.obra::after {
	bottom: 12px; right: 12px;
	border-bottom: 2px solid var(--vial);
	border-right: 2px solid var(--vial);
}
.obra:hover::before,
.obra:hover::after,
.obra:focus-visible::before,
.obra:focus-visible::after { opacity: 1; width: 26px; height: 26px; }

/* Obra sin foto: el hachurado con su numero y rubro bien grandes. */
.obra__sinfoto {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	background-image: repeating-linear-gradient(
		135deg,
		var(--grafito) 0 14px,
		var(--asfalto-alto) 14px 28px
	);
}
.obra__sinfoto span {
	font-family: var(--display);
	font-size: clamp(3rem, 7vw, 5rem);
	color: rgba(233,229,222,.14);
	line-height: 1;
}

/* ==========================================================================
   4. Portada — ritmo cinematografico
   ========================================================================== */

/* -- Hero con video ------------------------------------------------------- */
.hero__media {
	position: absolute;
	inset: 0;
	z-index: 0;
	overflow: hidden;
}
.hero__media img,
.hero__media video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	opacity: .32;
	filter: grayscale(.85) contrast(1.15);
}
.hero__ticker {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem 1.6rem;
	margin-top: clamp(2rem, 5vw, 3rem);
	padding-top: 1.5rem;
	border-top: 1px solid var(--grafito);
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: var(--acero);
}
.hero__ticker span { display: flex; align-items: center; gap: .6rem; }
.hero__ticker span::before {
	content: "";
	width: 7px; height: 7px;
	background: var(--vial);
	transform: rotate(45deg);
	flex: none;
}

/* -- Contadores ----------------------------------------------------------- */
.cifras {
	position: relative;
	background: var(--hueso-claro);
	border-block: var(--borde);
	padding-block: clamp(3rem, 7vw, 4.5rem);
	overflow: hidden;
	color: var(--asfalto);
}
.cifras__grid {
	position: relative;
	z-index: 1;
	display: grid;
	/* A 150px entran de a dos en un telefono; a 190 quedaba una sola por fila
	   y la seccion se estiraba cuatro pantallas. */
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr));
	gap: clamp(1.5rem, 4vw, 3rem);
}
.cifra { border-left: 2px solid var(--asfalto); padding-left: 1.25rem; }
.cifra__numero {
	font-family: var(--display);
	font-size: clamp(2.8rem, 6vw, 4.6rem);
	line-height: .9;
	display: flex;
	align-items: baseline;
	gap: .04em;
}
.cifra__sufijo { color: var(--vial); }
.cifra__texto {
	font-size: .72rem;
	font-weight: 700;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--acero);
	margin-top: .6rem;
	max-width: 18ch;
}

/* -- Servicios con revelacion de foto ------------------------------------- */

/* Son ocho: en cuatro columnas cierran dos filas justas. A tres queda una
   celda vacia al final, que se lee como una tarjeta que falto cargar. */
@media (min-width: 1180px) {
	.grilla-servicios { grid-template-columns: repeat(4, 1fr); }
}

.servicio { overflow: hidden; }
.servicio__foto {
	position: absolute;
	inset: 0;
	z-index: 0;
	opacity: 0;
	transform: scale(1.08);
	transition: opacity .45s ease, transform .7s cubic-bezier(.2,.7,.3,1);
	pointer-events: none;
}
.servicio__foto img {
	width: 100%; height: 100%;
	object-fit: cover;
	filter: grayscale(1) contrast(1.2) brightness(.42);
}
.servicio:hover .servicio__foto,
.servicio:focus-visible .servicio__foto { opacity: 1; transform: none; }
.servicio > *:not(.servicio__foto) { position: relative; z-index: 1; }
.servicio:focus-visible { background: var(--asfalto); color: var(--hueso); }

/* -- Proceso (scrollytelling) --------------------------------------------- */
.proceso {
	background: var(--asfalto);
	color: var(--hueso);
	position: relative;
	/* "clip" y no "hidden": hidden convierte a la seccion en contenedor de
	   scroll y el bloque pegajoso de adentro deja de pegarse. Solo hace falta
	   recortar la reticula del fondo, y para eso clip alcanza. */
	overflow: clip;
	padding-block: clamp(3.5rem, 9vw, 7rem);
}
.proceso__grid {
	position: relative;
	z-index: 1;
	display: grid;
	grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
	gap: clamp(2rem, 6vw, 5rem);
	/* Sin align-items:start la columna se estira a lo alto de la fila, que es
	   lo que le da recorrido al bloque pegajoso de adentro. */
}
.proceso__fijo { position: sticky; top: calc(var(--tope) + 2rem); transition: top .28s cubic-bezier(.2,.7,.3,1); }
.proceso__fijo h2 { max-width: 12ch; }
.proceso__fijo .rotulo { color: var(--cemento); }

/* Barra de avance de los pasos. */
.proceso__barra {
	margin-top: 2.5rem;
	height: 4px;
	background: var(--grafito);
	position: relative;
	max-width: 260px;
}
.proceso__barra i {
	position: absolute;
	inset: 0 auto 0 0;
	width: 25%;
	background: var(--vial);
	transition: width .45s cubic-bezier(.2,.7,.3,1);
}
.proceso__cuenta {
	margin-top: .9rem;
	font-family: var(--display);
	font-size: 1.1rem;
	color: var(--acero);
}
.proceso__cuenta b { color: var(--vial); font-weight: 400; }

.proceso__pasos { display: flex; flex-direction: column; gap: 1px; background: var(--grafito); }
.paso {
	background: var(--asfalto);
	padding: clamp(1.75rem, 3.5vw, 2.75rem) 0 clamp(1.75rem, 3.5vw, 2.75rem) clamp(1.5rem, 3vw, 2.5rem);
	border-left: 3px solid transparent;
	transition: border-color .4s ease, background .4s ease;
	position: relative;
}
.paso.activo { border-left-color: var(--vial); background: var(--asfalto-alto); }

/* Donde hay dos columnas, cada paso ocupa casi media pantalla: es lo que le da
   recorrido al bloque pegajoso de al lado y hace que cada etapa tenga su
   momento en vez de pasar las cuatro de un scrollazo. */
@media (min-width: 1001px) {
	.paso {
		min-height: 46vh;
		display: flex;
		flex-direction: column;
		justify-content: center;
	}
}
.paso__indice {
	font-family: var(--display);
	font-size: .95rem;
	color: var(--acero);
	letter-spacing: .08em;
	transition: color .4s ease;
}
.paso.activo .paso__indice { color: var(--vial); }
.paso h3 { margin: .5rem 0 .7rem; }
.paso p { color: var(--cemento); margin: 0; max-width: 48ch; font-size: .97rem; }

/* -- Mosaico de obras destacadas ------------------------------------------ */
/* Asimetrico a proposito: el catalogo ya tiene la grilla pareja, y si la
   portada la repitiera las dos paginas se leerian igual. */
.mosaico {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	grid-auto-rows: minmax(0, 1fr);
	gap: clamp(.75rem, 1.5vw, 1.25rem);
}
.mosaico .obra { aspect-ratio: auto; min-height: 230px; }
.mosaico .obra:first-child {
	grid-column: span 2;
	grid-row: span 2;
	min-height: 480px;
}
.mosaico .obra:first-child .obra__titulo { font-size: clamp(1.35rem, 2.6vw, 2.1rem); }

/* -- Banda de maquinaria (scroll horizontal) ------------------------------ */
/* Las seis maquinas entran en tres columnas por dos filas y se ven todas de
   una: en fila con scroll, la mitad quedaba fuera de pantalla. El hilo de 1px
   sobre el grafito es lo que les da el aire de ficha tecnica. */
.flota {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 270px), 1fr));
	gap: 1px;
	background: var(--grafito);
	border: 1px solid var(--grafito);
}
.maquina {
	background: var(--asfalto);
	color: var(--hueso);
	padding: 1.9rem 1.6rem;
	display: flex;
	flex-direction: column;
	gap: .6rem;
	min-height: 230px;
	user-select: none;
}
.maquina__indice { font-family: var(--display); font-size: .9rem; color: var(--vial); }
.maquina h3 { margin: 0; font-size: clamp(1.15rem, 1.8vw, 1.5rem); }
.maquina p { margin: 0; font-size: .9rem; color: var(--cemento); }
.maquina__ideal {
	margin-top: auto;
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .13em;
	text-transform: uppercase;
	color: var(--acero);
	border-top: 1px solid var(--grafito);
	padding-top: .8rem;
}

/* -- Pilares -------------------------------------------------------------- */
.pilares {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 290px), 1fr));
	gap: clamp(1rem, 2vw, 1.6rem);
}
.pilar {
	border: var(--borde);
	background: var(--hueso-claro);
	padding: clamp(1.9rem, 3vw, 2.6rem) clamp(1.5rem, 2.5vw, 2rem);
	position: relative;
	display: flex;
	flex-direction: column;
	gap: .85rem;
}
.pilar__indice {
	font-family: var(--display);
	font-size: clamp(2.4rem, 4vw, 3.4rem);
	line-height: 1;
	color: var(--cemento);
}
.pilar h3 { margin: 0; max-width: 15ch; }
.pilar p { margin: 0; font-size: .96rem; color: var(--grafito); }

/* ==========================================================================
   5. Empresa — ritmo editorial
   ========================================================================== */

.manifiesto {
	display: grid;
	grid-template-columns: minmax(0, 4fr) minmax(0, 7fr);
	gap: clamp(2rem, 6vw, 5rem);
	/* Igual que en el bloque Proceso: la columna se estira para que la frase
	   destacada tenga por donde viajar. */
}
.manifiesto__entrada {
	position: sticky;
	top: calc(var(--tope) + 2rem);
	transition: top .28s cubic-bezier(.2,.7,.3,1);
	font-family: var(--display);
	font-size: clamp(1.5rem, 2.6vw, 2.1rem);
	line-height: 1.06;
	text-transform: uppercase;
	border-left: 4px solid var(--vial);
	padding-left: 1.5rem;
}
/* Capitular: el primer parrafo arranca con una letra de titular. */
.manifiesto__cuerpo > p:first-of-type::first-letter {
	font-family: var(--display);
	font-size: 3.6em;
	line-height: .78;
	float: left;
	margin: .06em .12em 0 0;
	color: var(--oxido);
}
.manifiesto__cuerpo h2 { font-size: clamp(1.5rem, 2.6vw, 2rem); margin-top: 2em; }
.manifiesto__cuerpo h4 { display: none; } /* el "Nuestra" suelto del contenido viejo */

/* -- Carrusel de obra ------------------------------------------------------ */

/* Tres tarjetas del mismo ancho a la vista. Con mas de tres fotos la pista
   lleva el grupo dos veces y gira de corrido, igual que la cinta de clientes
   de la portada; con tres o menos queda una grilla quieta. */

.carrusel {
	--hueco: clamp(.75rem, 1.5vw, 1.15rem);
	--visibles: 3;
	overflow: hidden;
}

.carrusel__pista {
	display: flex;
	gap: var(--hueco);
	width: max-content;
}
.carrusel__grupo {
	display: flex;
	gap: var(--hueco);
	flex: none;
	margin-right: var(--hueco);
}

/* Sin giro no hace falta pista: una grilla pareja alcanza y no depende del JS. */
.carrusel:not(.carrusel--gira) .carrusel__pista,
.carrusel:not(.carrusel--gira) .carrusel__grupo {
	display: grid;
	grid-template-columns: repeat(var(--visibles), 1fr);
	width: auto;
	margin-right: 0;
}

.banda__foto {
	/* El motor calcula el ancho en pixeles y lo deja en --ancho-tarjeta: un
	   porcentaje no sirve porque la pista mide max-content y la referencia
	   seria circular. Hasta que llega, el flex-basis de respaldo evita el salto. */
	flex: 0 0 var(--ancho-tarjeta, calc((100vw - 2 * var(--gutter) - 2 * var(--hueco)) / 3));
	aspect-ratio: 4 / 3;
	border: var(--borde);
	overflow: hidden;
	position: relative;
	background: var(--asfalto);
}
.banda__foto img {
	width: 100%; height: 100%;
	object-fit: cover;
	filter: grayscale(.5) contrast(1.08);
	transition: filter .4s ease, transform .6s cubic-bezier(.2,.7,.3,1);
	user-select: none;
	-webkit-user-drag: none;
}
.banda__foto:hover img,
.banda__foto:focus-visible img { filter: grayscale(0); transform: scale(1.04); }

/* Sin motor la pista no gira, asi que se la deja deslizar a mano. */
html.sin-animacion .carrusel { overflow-x: auto; scrollbar-width: thin; }
html.sin-animacion .carrusel__grupo[aria-hidden="true"] { display: none; }

/* -- Cobertura ------------------------------------------------------------- */

/* Reemplaza el bloque de Google Maps del contenido importado, que imprimia
   "API Key Is Missing". Un mapa dibujado a mano no decia nada que el dato no
   diga mejor: donde se trabajo y cuanto, ordenado de mayor a menor. */

.cobertura__intro { max-width: 60ch; margin-bottom: clamp(2rem, 5vw, 3.5rem); }

.cobertura__lista {
	list-style: none;
	margin: 0;
	padding: 0;
	border-top: 2px solid var(--asfalto);
	counter-reset: lugar;
}
.cobertura__lista li {
	display: flex;
	align-items: baseline;
	gap: clamp(.75rem, 2vw, 1.5rem);
	padding-block: clamp(.85rem, 1.8vw, 1.3rem);
	border-bottom: 1px solid var(--cemento);
}

.cobertura__lugar {
	font-family: var(--display);
	font-size: clamp(1.35rem, 3.4vw, 2.6rem);
	line-height: 1;
	text-transform: uppercase;
	flex: none;
	transition: color .25s ease;
}
.cobertura__lista li:first-child .cobertura__lugar { color: var(--oxido); }

/* El filete de puntos que une el nombre con la cifra, como en un indice. */
.cobertura__filete {
	flex: 1 1 auto;
	height: 0;
	min-width: 1.5rem;
	border-bottom: 2px dotted var(--cemento);
	transform: translateY(-.28em);
}

.cobertura__cuenta {
	flex: none;
	font-family: var(--display);
	font-size: clamp(1.35rem, 3.4vw, 2.6rem);
	line-height: 1;
	color: var(--oxido);
	display: flex;
	align-items: baseline;
	gap: .5rem;
}
.cobertura__cuenta em {
	font-family: var(--texto);
	font-style: normal;
	font-size: .62rem;
	font-weight: 700;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--acero);
}

/* ==========================================================================
   6. Servicios — indice pegajoso
   ========================================================================== */

.indice-servicios {
	display: grid;
	grid-template-columns: minmax(0, 3fr) minmax(0, 9fr);
	gap: clamp(2rem, 5vw, 4.5rem);
	/* Sin align-items:start el <nav> se estira a lo alto de la fila, que es lo
	   que le da recorrido al indice pegajoso de adentro. */
}
.indice {
	position: sticky;
	top: calc(var(--tope) + 2rem);
	transition: top .28s cubic-bezier(.2,.7,.3,1);
	list-style: none;
	margin: 0;
	padding: 0;
	border-top: 1px solid var(--cemento);
}
.indice li { border-bottom: 1px solid var(--cemento); }
.indice a {
	display: flex;
	align-items: baseline;
	gap: .8rem;
	padding: .75rem 0 .75rem .5rem;
	text-decoration: none;
	font-size: .78rem;
	font-weight: 700;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--acero);
	border-left: 3px solid transparent;
	transition: color .3s ease, border-color .3s ease, padding-left .3s ease;
}
.indice a em { font-style: normal; font-family: var(--display); font-size: .85rem; flex: none; }
.indice a:hover { color: var(--asfalto); }
.indice li.activo a {
	color: var(--asfalto);
	border-left-color: var(--vial);
	padding-left: 1rem;
}

.ficha-servicio {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: clamp(1.5rem, 4vw, 3rem);
	align-items: center;
	padding-block: clamp(2.5rem, 6vw, 4.5rem);
	border-top: var(--borde);
	scroll-margin-top: 120px;
}
.ficha-servicio:first-child { border-top: 0; padding-top: 0; }
/* Alternan lado: ocho filas iguales cansan, y asi el ojo tiene donde apoyarse. */
.ficha-servicio:nth-child(even) .ficha-servicio__foto { order: -1; }

.ficha-servicio__foto {
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background: var(--asfalto);
	border: var(--borde);
}
.ficha-servicio__foto img {
	width: 100%; height: 100%;
	object-fit: cover;
	filter: grayscale(.5) contrast(1.08);
	transition: filter .45s ease, transform .7s cubic-bezier(.2,.7,.3,1);
}
.ficha-servicio:hover .ficha-servicio__foto img { filter: grayscale(0); transform: scale(1.04); }
.ficha-servicio__indice { font-family: var(--display); font-size: 1.1rem; color: var(--vial); }
.ficha-servicio h2 { margin: .5rem 0 1.2rem; font-size: clamp(1.6rem, 3.2vw, 2.6rem); }

/* -- Checklist de capacidades --------------------------------------------- */
/* Los servicios guardan sus capacidades como parrafos sueltos; en realidad
   siempre fueron una lista. */
.capacidades { list-style: none; margin: 0 0 1.75rem; padding: 0; }
.capacidades li {
	position: relative;
	padding: .55rem 0 .55rem 1.9rem;
	border-bottom: 1px solid var(--cemento);
	font-size: .97rem;
}
.capacidades li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 1.02em;
	width: 9px;
	height: 9px;
	background: var(--vial);
	transform: rotate(45deg);
}
.seccion--oscura .capacidades li { border-color: var(--grafito); }

/* ==========================================================================
   7. Obras — catalogo denso
   ========================================================================== */

/* Barra de filtros pegada abajo de la cabecera. */
.barra-filtros {
	position: sticky;
	top: var(--tope);
	transition: top .28s cubic-bezier(.2,.7,.3,1);
	z-index: 40;
	background: var(--hueso);
	border-bottom: var(--borde);
	padding-block: 1rem;
	margin-bottom: clamp(1.75rem, 4vw, 2.75rem);
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
}
.barra-filtros .filtros { margin-bottom: 0; }
.filtro em {
	font-style: normal;
	opacity: .55;
	margin-left: .45rem;
	font-size: .9em;
}
.filtro[aria-pressed="true"] em { opacity: 1; color: var(--vial); }

/* Conmutador de vista. */
.vistas { display: flex; gap: 0; flex: none; }
.vista {
	background: transparent;
	border: 2px solid var(--asfalto);
	color: var(--asfalto);
	padding: .6rem .9rem;
	cursor: pointer;
	display: flex;
	align-items: center;
	gap: .5rem;
	font-family: var(--texto);
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	transition: background .16s ease, color .16s ease;
}
.vista + .vista { border-left: 0; }
.vista:hover { background: var(--cemento); }
.vista[aria-pressed="true"] { background: var(--asfalto); color: var(--vial); }
.vista svg { width: 14px; height: 14px; flex: none; }

.cuenta-obras {
	font-family: var(--display);
	font-size: 1.1rem;
	text-transform: uppercase;
	color: var(--acero);
	margin-bottom: 1.5rem;
}
.cuenta-obras b { color: var(--asfalto); font-weight: 400; }

/* -- Vista listado -------------------------------------------------------- */
/* Existe por las 16 obras sin foto: en la grilla siempre pierden contra las
   que tienen imagen, y aca las 42 compiten en igualdad. */
.listado-obras { display: none; border-top: var(--borde); }
.catalogo--listado .grilla-obras { display: none; }
.catalogo--listado .listado-obras { display: block; }

.fila-obra {
	display: grid;
	grid-template-columns: 3.5rem minmax(0, 5fr) minmax(0, 4fr) minmax(0, 3fr);
	gap: 1rem;
	align-items: baseline;
	padding: 1.05rem .6rem;
	border-bottom: 1px solid var(--cemento);
	text-decoration: none;
	transition: background .18s ease, padding-left .18s ease;
}
.fila-obra.oculta { display: none; }
.fila-obra:hover,
.fila-obra:focus-visible { background: var(--hueso-claro); padding-left: 1.2rem; }
.fila-obra__indice { font-family: var(--display); font-size: .92rem; color: var(--acero); }
.fila-obra__tarea {
	font-family: var(--display);
	font-size: clamp(1rem, 1.5vw, 1.22rem);
	text-transform: uppercase;
	line-height: 1.08;
}
.fila-obra:hover .fila-obra__tarea { color: var(--oxido); }
.fila-obra__lugar { font-size: .9rem; color: var(--grafito); }
.fila-obra__rubro {
	font-size: .66rem;
	font-weight: 700;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--acero);
	justify-self: end;
	text-align: right;
}
.sin-resultados { padding: 3rem 0; color: var(--acero); }

/* ==========================================================================
   8. Ficha de obra — expediente
   ========================================================================== */

.ficha__portada img { will-change: transform; }
.miga {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .55rem;
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--cemento);
	margin-bottom: 1.5rem;
}
.miga a { text-decoration: none; }
.miga a:hover { color: var(--vial); }
.miga__sep { color: var(--acero); }

.ficha__expediente {
	font-family: var(--display);
	font-size: .82rem;
	letter-spacing: .1em;
	color: var(--acero);
	border-bottom: 2px solid var(--cemento);
	padding-bottom: .8rem;
	margin-bottom: 1.4rem;
}
.ficha__expediente b { color: var(--oxido); font-weight: 400; }

.galeria {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
	gap: clamp(.75rem, 1.5vw, 1.15rem);
	margin-top: clamp(2.5rem, 5vw, 3.5rem);
}
.galeria figure { margin: 0; border: var(--borde); overflow: hidden; background: var(--asfalto); }
.galeria img {
	width: 100%;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	filter: grayscale(.4) contrast(1.06);
	transition: filter .4s ease, transform .6s cubic-bezier(.2,.7,.3,1);
}
.galeria figure:hover img { filter: grayscale(0); transform: scale(1.04); }

/* Anterior / siguiente con miniatura de fondo. */
.navegacion-obras a { position: relative; overflow: hidden; padding: 1.4rem 1.2rem; flex: 1 1 0; }
.navegacion-obras a img {
	position: absolute;
	inset: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	opacity: .13;
	filter: grayscale(1);
	transition: opacity .4s ease, transform .6s cubic-bezier(.2,.7,.3,1);
	z-index: 0;
}
.navegacion-obras a:hover img { opacity: .3; transform: scale(1.06); }
.navegacion-obras a > span,
.navegacion-obras a > b { position: relative; z-index: 1; }
.navegacion-obras a > b { font-weight: 400; font-family: var(--display); font-size: 1.05rem; text-transform: uppercase; }
.navegacion-obras--vacio { flex: 1 1 0; }

/* ==========================================================================
   9. Hoja de servicio
   ========================================================================== */

.hoja__portada {
	position: relative;
	background: var(--asfalto);
	overflow: hidden;
	min-height: clamp(300px, 42vh, 460px);
	display: flex;
	align-items: flex-end;
	color: var(--hueso);
}
.hoja__portada img {
	position: absolute;
	inset: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	opacity: .34;
	filter: grayscale(.7) contrast(1.12);
	will-change: transform;
}
.hoja__portada::after {
	content: "";
	position: absolute; inset: 0; z-index: 1;
	background: linear-gradient(to top, rgba(16,18,21,.95) 6%, rgba(16,18,21,.45) 60%, rgba(16,18,21,.2) 100%);
}
.hoja__portada .envoltura { position: relative; z-index: 2; padding-block: clamp(2.5rem, 6vw, 4rem); }

/* ==========================================================================
   10. Cierre y 404
   ========================================================================== */

/* -- Cierre: presupuesto por WhatsApp ------------------------------------- */

/* Es el bloque que mas tiene que convertir, asi que todo apunta al boton: el
   titular grande a la izquierda y el boton solo en su columna, con un estilo
   que no se repite en ningun otro lugar del sitio. */

.cierre {
	position: relative;
	overflow: clip;
	padding-block: clamp(3.5rem, 9vw, 6.5rem);
}

/* Trama diagonal muy tenue sobre el amarillo, como una lona de obra. */
.cierre__trama {
	position: absolute;
	inset: 0;
	pointer-events: none;
	opacity: .07;
	background-image: repeating-linear-gradient(135deg, var(--asfalto) 0 2px, transparent 2px 22px);
}

.cierre__grid {
	position: relative;
	z-index: 1;
	display: grid;
	grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
	gap: clamp(2.5rem, 6vw, 5rem);
	align-items: center;
}

.cierre__rotulo {
	display: inline-flex;
	align-items: center;
	gap: .6rem;
	margin: 0 0 1.1rem;
	padding: .45rem .8rem;
	background: var(--asfalto);
	color: var(--vial);
	font-size: .7rem;
	font-weight: 700;
	letter-spacing: .2em;
	text-transform: uppercase;
}
.cierre__rotulo::before {
	content: "";
	width: 8px; height: 8px;
	border-radius: 50%;
	background: #25d366;
	box-shadow: 0 0 0 0 rgba(37,211,102,.6);
	animation: latido 2s ease-out infinite;
}

.cierre h2 {
	margin: 0;
	max-width: 14ch;
	font-size: clamp(2.6rem, 6.5vw, 5rem);
}
.cierre__bajada {
	max-width: 44ch;
	margin: 1.1rem 0 0;
	font-size: clamp(1rem, 1.4vw, 1.15rem);
	font-weight: 500;
}

/* El boton. Negro sobre amarillo es el contraste mas fuerte de la paleta, y
   el circulo verde es lo que se reconoce de un vistazo como WhatsApp. */
.boton-wa {
	position: relative;
	display: inline-flex;
	align-items: center;
	gap: 1rem;
	padding: .85rem 2rem .85rem .85rem;
	background: var(--asfalto);
	color: var(--hueso);
	text-decoration: none;
	font-size: clamp(.95rem, 1.5vw, 1.15rem);
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	box-shadow: 8px 8px 0 rgba(22,24,27,.28);
	transition: transform .2s ease, box-shadow .2s ease;
}
.boton-wa:hover,
.boton-wa:focus-visible {
	transform: translate(-3px, -3px);
	box-shadow: 12px 12px 0 rgba(22,24,27,.32);
}
.boton-wa:active { transform: translate(2px, 2px); box-shadow: 3px 3px 0 rgba(22,24,27,.3); }

.boton-wa__icono {
	position: relative;
	display: grid;
	place-items: center;
	width: 3.6rem;
	height: 3.6rem;
	flex: none;
	border-radius: 50%;
	background: #25d366;
	color: #fff;
}
.boton-wa__icono svg { width: 1.6rem; height: 1.6rem; }

/* Onda que sale del icono cada tanto: llama la vista sin volverse molesta. */
.boton-wa__icono::after {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: 50%;
	border: 2px solid #25d366;
	animation: onda 2.4s ease-out infinite;
}

.boton-wa__flecha {
	font-size: 1.4em;
	line-height: 1;
	color: var(--vial);
	transition: transform .25s cubic-bezier(.2,.7,.3,1);
}
.boton-wa:hover .boton-wa__flecha { transform: translateX(6px); }

@keyframes onda {
	0%   { transform: scale(1);   opacity: .9; }
	80%  { transform: scale(1.75); opacity: 0; }
	100% { transform: scale(1.75); opacity: 0; }
}
@keyframes latido {
	0%   { box-shadow: 0 0 0 0 rgba(37,211,102,.55); }
	70%  { box-shadow: 0 0 0 9px rgba(37,211,102,0); }
	100% { box-shadow: 0 0 0 0 rgba(37,211,102,0); }
}

/* Sin animacion todo queda quieto. */
html.sin-animacion .boton-wa__icono::after,
html.sin-animacion .cierre__rotulo::before { animation: none; }

.cierre__accion { justify-self: end; }

@media (max-width: 900px) {
	.cierre__grid { grid-template-columns: 1fr; }
	.cierre__accion { justify-self: start; }
}
@media (max-width: 560px) {
	.cierre__accion { width: 100%; }
	.boton-wa { width: 100%; padding-right: 1.1rem; gap: .8rem; }
	.boton-wa__texto { flex: 1; }
}

.error-404 { position: relative; overflow: hidden; }
.error-404 .envoltura { position: relative; z-index: 1; }
.error-404__trama {
	position: absolute;
	inset: 0;
	z-index: 0;
	opacity: .05;
	background-image: repeating-linear-gradient(135deg, var(--asfalto) 0 16px, transparent 16px 32px);
}

/* ==========================================================================
   11. Responsive
   ========================================================================== */

@media (max-width: 1000px) {
	.proceso__grid,
	.manifiesto { grid-template-columns: 1fr; }
	.proceso__fijo,
	.manifiesto__entrada { position: static; }
	.proceso__columna,
	.manifiesto__columna { display: contents; }

	.indice-servicios { grid-template-columns: 1fr; }
	/* El nav es un item de grilla: sin esto su min-width:auto lo estira hasta
	   el ancho del indice sin cortes y desborda la pagina entera. */
	.indice-servicios > * { min-width: 0; }
	.indice {
		position: sticky;
		top: var(--tope);
		z-index: 30;
		display: flex;
		gap: 0;
		overflow-x: auto;
		background: var(--hueso);
		border-top: 0;
		border-bottom: var(--borde);
		scrollbar-width: none;
	}
	.indice::-webkit-scrollbar { display: none; }
	.indice li { border-bottom: 0; flex: none; }
	.indice a { border-left: 0; border-bottom: 3px solid transparent; padding: .9rem 1rem; white-space: nowrap; }
	.indice li.activo a { border-left: 0; border-bottom-color: var(--vial); padding-left: 1rem; }
}

@media (max-width: 860px) {
	.carrusel { --visibles: 2; }
	.mosaico { grid-template-columns: repeat(2, 1fr); }
	.mosaico .obra:first-child { grid-column: span 2; grid-row: span 1; min-height: 300px; }

	.ficha-servicio { grid-template-columns: 1fr; }
	.ficha-servicio:nth-child(even) .ficha-servicio__foto { order: 0; }

	.fila-obra { grid-template-columns: 2.5rem minmax(0, 1fr); row-gap: .3rem; }
	.fila-obra__lugar { grid-column: 2; }
	.fila-obra__rubro { grid-column: 2; justify-self: start; text-align: left; }
}

@media (max-width: 780px) {
	.cifra-fantasma { font-size: clamp(8rem, 42vw, 15rem); }
}

@media (max-width: 560px) {
	.carrusel { --visibles: 1; }
	.mosaico { grid-template-columns: 1fr; }
	.mosaico .obra:first-child { grid-column: span 1; min-height: 260px; }
	.mosaico .obra { min-height: 220px; }
	.manifiesto__cuerpo > p:first-of-type::first-letter { font-size: 2.8em; }
	.cierre__acciones { width: 100%; }
}

/* El sistema ya apaga transiciones y animaciones en style.css; aca se
   completa con lo que depende de estado, para que nada quede a medio camino. */
@media (prefers-reduced-motion: reduce) {
	html.motor-listo [data-revelar] { opacity: 1 !important; transform: none !important; clip-path: none !important; }
}
