/*
 * NAPISA — Naves y Parques Industriales S.A.
 * napisa.com
 * Desarrollo: EENDA · eenda.com
 * © 2026
 */

/*
 * napisa.com — Hoja del front (mobile-first)
 *
 * Estructura:
 *   1. Tokens
 *   2. Puente con Bootstrap
 *   3. Base
 *   4. Accesibilidad
 *   5. Header
 *   6. Botones
 *   7. Hero
 *   8. Cifras
 *   9. Slider de obra
 *  10. Pie
 *  11. Distintivo de contenido de muestra
 *  18. Servicios: indice por necesidad y ficha
 *  19. Obras: casos y desglose por sector
 *  20. Suelo y promociones: catalogo, ficha, galeria
 *  21. Nosotros y empleo
 *  22. Blog: tarjetas, paginacion y articulo
 *  23. Credito de EENDA (cierre de la web)
 *
 * Los breakpoints viven en responsive.css, siempre con min-width.
 * Esta hoja es del FRONT. La del panel es static/media/css/xpanel/style.css
 * y no se mezclan.
 */


/* ==========================================================================
   1. Tokens
   --------------------------------------------------------------------------
   Los dos colores corporativos salen del vectorial de marca
   (static/media/images/logo.svg), no de la guia impresa: donde una superficie
   de CSS toque la placa del logotipo se veria la costura si no coincidieran.

   CONTRASTE — medido, no estimado (.github/docs/DESIGN.md §66 exige AA):

       #F6A548 sobre claro .......  1,87:1   NO CUMPLE — nunca como texto
       #1D1D1B sobre #F6A548 .....  8,36:1   AA
       #F6A548 sobre #151412 .....  9,11:1   AA
       #9A5D0D sobre #F7F6F3 .....  4,92:1   AA
       #6E6A63 sobre #F7F6F3 .....  4,98:1   AA

   De ahi la separacion entre --np-brand y --np-brand-ink. El naranja de marca
   es SUPERFICIE y grafico; para texto de acento sobre fondo claro se usa el
   derivado oscurecido, que es el naranja de marca bajado hasta cruzar el 4,5:1
   manteniendose en el mismo tono.
   ========================================================================== */

:root{
	/* Marca */
	--np-brand:            #F6A548;
	--np-brand-rgb:        246, 165, 72;
	--np-brand-hover:      #E89935;
	--np-brand-ink:        #9A5D0D;

	/* Superficies */
	--np-ground:           #F7F6F3;
	--np-surface:          #FFFFFF;
	--np-night:            #151412;

	/* Texto */
	--np-ink:              #1D1D1B;
	--np-muted:            #6E6A63;
	--np-night-ink:        #F2EFE9;
	--np-night-muted:      #A19B91;

	/* Estructura — el §61 prefiere el borde de 1px a la sombra */
	--np-line:             rgba(29, 29, 27, .16);
	--np-line-soft:        rgba(29, 29, 27, .08);
	--np-night-line:       rgba(242, 239, 233, .18);

	/* Tipografia */
	--np-display:          "IBM Plex Sans Condensed", "Helvetica Neue", Arial, sans-serif;
	--np-body:             "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif;
	--np-mono:             "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;

	/* Ritmo */
	--np-gutter:           1.25rem;
	--np-header-h:         4.25rem;
	--np-ease:             cubic-bezier(.22, .61, .36, 1);
	--np-speed:            280ms;
}


/* ==========================================================================
   2. Puente con Bootstrap
   --------------------------------------------------------------------------
   Reasignar las variables de Bootstrap en lugar de sobrescribir sus clases:
   asi .btn, .navbar, .offcanvas y el resto salen ya con la identidad de NAPISA
   sin duplicar una linea de CSS (§5-6, regla Bootstrap-first).
   ========================================================================== */

:root{
	--bs-body-font-family:  var(--np-body);
	--bs-body-color:        var(--np-ink);
	--bs-body-bg:           var(--np-ground);
	--bs-primary:           var(--np-brand);
	--bs-primary-rgb:       var(--np-brand-rgb);
	--bs-border-color:      var(--np-line);
	--bs-border-radius:     0;
	--bs-link-color:        var(--np-brand-ink);
	--bs-link-hover-color:  var(--np-ink);
	--bs-focus-ring-color:  rgba(var(--np-brand-rgb), .55);
}


/* ==========================================================================
   3. Base
   ========================================================================== */

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

html{
	-webkit-text-size-adjust: 100%;
}

body{
	margin: 0;
	background: var(--np-ground);
	color: var(--np-ink);
	font-family: var(--np-body);
	font-size: 1rem;
	line-height: 1.6;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

img,
svg{
	max-width: 100%;
	height: auto;
}

/*
 * Escala tipografica del §10. Los titulares son Condensed: es el corte que da
 * caracter industrial sin recurrir a la mayuscula generalizada.
 *
 * Los tamanos NO llevan jerarquia semantica asociada por si mismos: h1, h2 y
 * h3 se usan por estructura del documento y se les da tamano con clase cuando
 * hace falta. La web actual hace lo contrario —usa h3 y h4 por tamano— y por
 * eso su esquema de encabezados no describe la pagina
 * (.github/docs/AUDIT_SITE_ACTUAL.md §1).
 */
h1, h2, h3, h4{
	font-family: var(--np-display);
	font-weight: 700;
	letter-spacing: -.02em;
	line-height: 1.02;
	text-wrap: balance;
	margin: 0 0 1rem;
}

/*
 * El minimo baja a 1.9rem para que "Su proyecto industrial." quepa en una
 * linea a 375 px. Con 2.35rem la frase no entraba y el reparto dejaba "Un"
 * solo al final de la segunda linea.
 */
h1{ font-size: clamp(1.9rem, 7vw, 3.9rem); line-height: .98; }
h2{ font-size: clamp(1.8rem, 5vw, 2.6rem); }
h3{ font-size: clamp(1.25rem, 3.5vw, 1.5rem); }

p{
	margin: 0 0 1rem;
}

a{
	color: var(--np-brand-ink);
	text-decoration-thickness: 1px;
	text-underline-offset: .18em;
}

a:hover{
	color: var(--np-ink);
}

/*
 * El contenedor es .container-xl de Bootstrap. Aqui solo se ajustan su ancho y
 * su canal reasignando las variables del propio componente, sin reescribir la
 * clase (regla Bootstrap-first, §5-7).
 *
 * --bs-gutter-x va en .container-xl y NO en :root: Bootstrap la declara en la
 * propia clase, asi que un valor heredado desde :root nunca gana y el canal se
 * quedaba en los 1,5rem por defecto.
 */
.container-xl{
	--bs-gutter-x: calc(var(--np-gutter) * 2);
	max-width: 78rem;
}

/* Etiqueta monoespaciada: cotas, epigrafes y metadatos */
.np-label{
	font-family: var(--np-mono);
	font-size: .6875rem;
	letter-spacing: .13em;
	text-transform: uppercase;
	color: var(--np-muted);
	margin: 0;
}


/* ==========================================================================
   4. Accesibilidad
   ========================================================================== */

/*
 * El mostrar/ocultar lo hace .visually-hidden-focusable de Bootstrap; aqui
 * solo va la identidad y la posicion al recibir el foco.
 */
.np-skip:focus-visible,
.np-skip:focus{
	position: absolute;
	z-index: 100;
	left: var(--np-gutter);
	top: .625rem;
	background: var(--np-ink);
	color: var(--np-night-ink);
	padding: .75rem 1.25rem;
	font-weight: 600;
	text-decoration: none;
}

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

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


/* ==========================================================================
   5. Header
   ========================================================================== */

/*
 * Cabecera en Process Black.
 *
 * No es una decision estetica suelta: el logotipo de NAPISA trae su placa
 * naranja dentro del propio SVG y no se puede quitar sin reinterpretar la
 * marca, cosa que el §3 prohibe. Sobre blanco, esa placa flota como una
 * pegatina; sobre negro corporativo lee como lo que es, una marca compuesta.
 *
 * De paso el negro encadena con el panel de obra y con el pie, y deja el hero
 * claro como unica zona de lectura: es la alternancia claro/oscuro del §4.10
 * y §60, no dark mode.
 */
.np-header{
	background: var(--np-night);
	color: var(--np-night-ink);
	border-bottom: 0;
}

.np-header__inner{
	min-height: var(--np-header-h);
}

.np-brand{
	display: block;
	line-height: 0;
	flex: none;
}

.np-brand svg,
.np-brand img{
	height: 2.375rem;
	width: auto;
	display: block;
}

/* El icono de Bootstrap viene en oscuro: sobre cabecera negra hay que virarlo. */
.np-header .navbar-toggler-icon{
	filter: invert(1) grayscale(1) brightness(2);
}

/* Solo la separacion en movil: el resto lo hacen navbar-nav, d-flex y gap-lg-4. */
.np-nav{
	--bs-nav-link-padding-x: 0;
}

.np-nav a{
	display: inline-block;
	padding: .375rem 0;
	color: var(--np-night-ink);
	font-weight: 600;
	font-size: .9375rem;
	text-decoration: none;
	border-bottom: 2px solid transparent;
	transition: border-color var(--np-speed) var(--np-ease), color var(--np-speed) var(--np-ease);
}

.np-nav a:hover,
.np-nav a:focus-visible{
	color: var(--np-brand);
	border-bottom-color: var(--np-brand);
}

.np-nav a[aria-current="page"]{
	border-bottom-color: var(--np-brand);
}

/* El offcanvas es el de Bootstrap; aqui solo va la identidad. */
.np-menu{
	background: var(--np-night);
	color: var(--np-night-ink);
	border-left: 0;
}

.np-menu .btn-close{
	filter: invert(1) grayscale(1) brightness(2);
}

.np-menu .np-nav li + li{
	border-top: 1px solid var(--np-night-line);
}

.np-menu .np-nav a{
	padding: .875rem 0;
	font-family: var(--np-display);
	font-size: 1.5rem;
	border-bottom: 0;
}


/* ==========================================================================
   6. Botones
   --------------------------------------------------------------------------
   Sobre .btn de Bootstrap, no un sistema paralelo (§41).
   El naranja va SIEMPRE con texto Process Black encima: 8,36:1.
   ========================================================================== */

.btn-napisa{
	--bs-btn-color:          var(--np-ink);
	--bs-btn-bg:             var(--np-brand);
	--bs-btn-border-color:   var(--np-brand);
	--bs-btn-hover-color:    var(--np-ink);
	--bs-btn-hover-bg:       var(--np-brand-hover);
	--bs-btn-hover-border-color: var(--np-brand-hover);
	--bs-btn-border-radius:  0;
	--bs-btn-font-weight:    600;
	--bs-btn-padding-x:      1.25rem;
	--bs-btn-padding-y:      .625rem;

	display: inline-flex;
	align-items: center;
	gap: .625rem;
	white-space: nowrap;
}

/*
 * Variante fantasma para la cabecera.
 *
 * Con dos botones naranjas macizos sobre el pliegue —el de la cabecera y el
 * del hero— compiten entre si y ninguno lee como principal. El de la cabecera
 * es el acceso permanente; el del hero es la oferta. Solo uno puede ser
 * primario, y es el del hero.
 */
.btn-napisa--ghost{
	--bs-btn-color:              var(--np-night-ink);
	--bs-btn-bg:                 transparent;
	--bs-btn-border-color:       rgba(var(--np-brand-rgb), .55);
	--bs-btn-hover-color:        var(--np-ink);
	--bs-btn-hover-bg:           var(--np-brand);
	--bs-btn-hover-border-color: var(--np-brand);
}

/* Sobre fondo claro: relleno de tinta y contorno de tinta. */
.btn-napisa--ink{
	--bs-btn-color:              var(--np-night-ink);
	--bs-btn-bg:                 var(--np-ink);
	--bs-btn-border-color:       var(--np-ink);
	--bs-btn-hover-color:        var(--np-ink);
	--bs-btn-hover-bg:           var(--np-brand);
	--bs-btn-hover-border-color: var(--np-brand);
}

.btn-napisa--outline{
	--bs-btn-color:              var(--np-ink);
	--bs-btn-bg:                 transparent;
	--bs-btn-border-color:       var(--np-ink);
	--bs-btn-hover-color:        var(--np-ink);
	--bs-btn-hover-bg:           var(--np-brand);
	--bs-btn-hover-border-color: var(--np-brand);
}

.btn-napisa .np-arrow{
	width: 1.125rem;
	height: .625rem;
	flex: none;
	/*
	 * .np-arrow es tambien el boton del slider (seccion 9), que fija color
	 * claro y borde. Dentro de un boton la flecha toma el color del texto.
	 */
	color: inherit;
	border: 0;
	/* A este tamano un trazo de 1,6 se difumina y la flecha desaparece. */
	stroke-width: 2;
	transition: transform var(--np-speed) var(--np-ease);
}

.btn-napisa:hover .np-arrow{
	transform: translateX(.1875rem);
}


/* ==========================================================================
   7. Hero
   --------------------------------------------------------------------------
   Direccion B: el dato es el material visual. El titular y las cifras son
   FIJOS; lo que rota es la prueba (§13-16).
   ========================================================================== */

.np-hero{
	background: var(--np-surface);
	border-bottom: 1px solid var(--np-line);
}

/*
 * El hero no vive dentro del contenedor: su propia rejilla reproduce el margen
 * en la primera pista para alinear el texto, y deja que el panel de obra
 * sangre hasta el borde del viewport.
 */
.np-hero__grid{
	display: grid;
	grid-template-columns: minmax(0, 1fr);
}

/*
 * min-width: 0 en las dos columnas del hero.
 *
 * Un elemento de rejilla o de flex arranca con min-width: auto, asi que se
 * niega a bajar del ancho minimo de su contenido y arrastra a toda la pagina.
 * Es lo que hacia que en movil el titular, el segundo CTA y la tercera cifra
 * quedaran cortados fuera del viewport.
 */
.np-hero__body,
.np-deck{
	min-width: 0;
}

.np-hero__body{
	gap: 2rem;
	/* El canal lo pone el propio cuerpo: aqui no hay contenedor que lo herede. */
	padding: 2.25rem var(--np-gutter) 1.75rem;
}

.np-hero__kicker{
	color: var(--np-brand-ink);
	margin-bottom: 1.125rem;
}

/*
 * text-wrap: balance reparte las lineas, pero con una medida demasiado corta
 * acaba dejando huerfanos ("... Un" al final de la segunda linea). Con 18ch
 * el titular respira y las dos frases caen enteras.
 */
/*
 * El titular se dimensiona contra SU columna, no contra el viewport. Con el
 * panel sangrando, la columna de texto vuelve a ser ancha y el tope sube, pero
 * no hasta 3.9rem: ahi "Su proyecto industrial." se queda al limite y el
 * reparto deja "Un" huerfano al final de la segunda linea.
 */
.np-hero h1{
	font-size: clamp(1.9rem, 4.6vw, 3.5rem);
	max-width: 22ch;
	margin-bottom: 1.25rem;
}

.np-hero__lede{
	font-size: 1.0625rem;
	color: var(--np-muted);
	max-width: 46ch;
	margin: 0 0 1.75rem;
}

/*
 * Llamadas a la accion del hero. El objetivo del proyecto es lead cualificado,
 * asi que la primera pantalla no puede quedarse sin salida.
 *
 * Son dos y no una porque Search Console demuestra dos demandas distintas:
 * quien quiere construir y quien busca suelo. /buscar-suelo acumula 7.096
 * impresiones en tres meses y la ficha de suelo mejor posicionada convierte al
 * 23 % (.github/docs/marketing/). Mandarlos a los dos al mismo formulario
 * seria perder al segundo.
 */
.np-cta-alt{
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	font-weight: 600;
	font-size: .9375rem;
	color: var(--np-ink);
	text-decoration: none;
	border-bottom: 2px solid var(--np-brand);
	padding-bottom: .125rem;
	transition: gap var(--np-speed) var(--np-ease);
}

.np-cta-alt:hover{
	color: var(--np-ink);
	gap: .8125rem;
}

.np-cta-alt svg{
	width: 1.125rem;
	height: .625rem;
	flex: none;
	stroke-width: 2;
}

.np-hero__lede strong{
	color: var(--np-ink);
	font-weight: 600;
}


/* ==========================================================================
   8. Cifras
   --------------------------------------------------------------------------
   Numeros grandes y estaticos. Nada de contadores animados: los datos son
   evidencia, no entretenimiento (§65).
   ========================================================================== */

/*
 * minmax(0, 1fr) y no 1fr: 1fr equivale a minmax(auto, 1fr), y ese "auto" es
 * el ancho minimo del contenido. Con etiquetas como "CONSTRUYENDO DESDE" en
 * monoespaciada, tres pistas asi suman mas que la pantalla de un movil.
 */
/* La retícula es .row/.row-cols de Bootstrap; aquí solo el filete superior. */
.np-figures{
	border-top: 1px solid var(--np-ink);
	margin: 0;
}

.np-figure{
	/*
	 * column-reverse: el marcado lleva <dt> antes de <dd> porque es lo que
	 * exige una <dl>, pero la cifra se lee primero. Se invierte la
	 * presentacion, no la estructura.
	 */
	display: flex;
	flex-direction: column-reverse;
	justify-content: flex-end;

	/*
	 * El filete separador va a la IZQUIERDA y con aire por los dos lados. Con
	 * border-right y sin padding-left, el texto de la columna siguiente queda
	 * pegado al filete y las tres cifras se leen como un bloque apelmazado.
	 */
	min-width: 0;
	padding: 1rem .75rem 0;
	border-left: 1px solid var(--np-line-soft);
	margin: 0;
}

.np-figure:first-child{
	padding-left: 0;
	border-left: 0;
}

.np-figure__n{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.75rem, 6vw, 2.5rem);
	line-height: .92;
	letter-spacing: -.02em;
	display: block;
	font-variant-numeric: tabular-nums;
	margin: 0;
}

/*
 * En movil la etiqueta baja de cuerpo e interletrado para caber entera.
 *
 * NO se usa overflow-wrap: break-word: partia "CONSTRUYENDO" como
 * "CONSTRUYEND / O" y una palabra rota a mitad delata descuido antes que
 * cualquier otra cosa. Se ajusta el tipo hasta que cabe, no el texto.
 */
.np-figure__t{
	display: block;
	margin: .5rem 0 0;
	font-size: .625rem;
	letter-spacing: .06em;
}

.np-figure__n + .np-figure__t,
.np-figure__t{
	margin-inline-start: 0;
}


/* ==========================================================================
   9. Slider de obra
   --------------------------------------------------------------------------
   No es un slider de hero convencional de los que prohibe el §77: el titular
   y las cifras no se mueven. Lo que rota es la ficha de una obra entregada,
   de modo que cada vuelta anade evidencia en lugar de repetir un mensaje.

   La primera diapositiva se ve por CSS, no por JavaScript: si el script no
   llega, queda una ficha estatica completa y nunca un hueco (§35).
   ========================================================================== */

.np-deck{
	position: relative;
	background: var(--np-night);
	color: var(--np-night-ink);
	display: flex;
	flex-direction: column;
}

/*
 * Las diapositivas se apilan en la MISMA celda de una rejilla, no con
 * position:absolute.
 *
 * Con posicionamiento absoluto habia que devolver la activa al flujo para que
 * ocupara el ancho, y al hacerlo dejaba de llenar el contenedor: se encogia al
 * ancho de su texto. Apiladas en grid-area 1/1, todas ocupan la celda entera
 * siempre, la altura la marca la mas alta y no hace falta tocar el positioning
 * al cambiar de ficha.
 */
.np-deck__stage{
	flex: 1;
	display: grid;
	min-height: 0;
}

/*
 * En movil, foto arriba y ficha debajo, cada una con su altura. En escritorio
 * (responsive.css, lg) la ficha pasa a ir SOBRE la foto: con la ficha debajo,
 * la foto se quedaba con lo que sobraba del panel —unos 630x280, un 2,3:1
 * que obligaba a recortar cualquier edificio alto—. En movil no se superpone
 * porque a 375px de ancho la ficha taparia casi toda la foto.
 */
.np-slide{
	grid-area: 1 / 1;
	display: grid;
	grid-template-rows: auto auto;
	min-width: 0;
	margin: 0;
	opacity: 0;
	visibility: hidden;
	transition: opacity var(--np-speed) var(--np-ease);
}

.np-slide.is-active{
	opacity: 1;
	visibility: visible;
}

/*
 * En movil la foto marca su propia altura a 4:3. En escritorio (responsive.css)
 * la proporcion se libera y la foto llena la altura del panel, que fija el
 * texto del hero.
 */
.np-slide__media{
	position: relative;
	overflow: hidden;
	aspect-ratio: 4 / 3;
	background:
		repeating-linear-gradient(135deg, rgba(var(--np-brand-rgb), .045) 0 12px, transparent 12px 24px),
		radial-gradient(120% 90% at 20% 0%, #2A2723 0%, var(--np-night) 70%);
}

.np-slide__media img{
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/*
 * El trazo de la marca como filigrana, no como logotipo.
 *
 * Conserva su proporcion. Estirandolo a una altura fija deja de leerse como
 * perfil de cubierta y pasa a parecer un garabato: la forma solo significa
 * algo con su relacion de aspecto original.
 */
.np-slide__roof{
	position: absolute;
	left: -8%;
	top: 22%;
	width: 116%;
	height: auto;
	opacity: .13;
	color: var(--np-brand);
}

.np-slide__ph{
	position: absolute;
	left: 1.25rem;
	top: 1rem;
	color: rgba(242, 239, 233, .42);
	margin: 0;
}

/* Ficha tecnica: tabla real, no lista de iconos (§24 y §56). */
.np-sheet{
	border-top: 1px solid var(--np-night-line);
	padding: 1.25rem 1.25rem 1rem;
}

.np-sheet__client{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1.5rem;
	line-height: 1.05;
	letter-spacing: -.012em;
	color: var(--np-night-ink);
	margin: 0 0 .1875rem;
}

.np-sheet__place{
	color: var(--np-night-muted);
	margin-bottom: .875rem;
}

.np-sheet__rows{
	margin: 0;
}

.np-sheet__row{
	padding: .4375rem 0;
	border-top: 1px solid var(--np-night-line);
}

.np-sheet__row dt{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	color: var(--np-night-muted);
	margin: 0;
}

.np-sheet__row dd{
	margin: 0;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1rem;
	font-variant-numeric: tabular-nums;
}

/* Controles */
.np-deck__ctrl{
	padding: 0 1.25rem 1.25rem;
}

.np-dot{
	width: 1.375rem;
	height: 3px;
	padding: 0;
	border: 0;
	cursor: pointer;
	background: rgba(242, 239, 233, .26);
	transition: background var(--np-speed) var(--np-ease);
}

.np-dot[aria-current="true"]{
	background: var(--np-brand);
}

.np-dot:hover{
	background: rgba(var(--np-brand-rgb), .65);
}

.np-arrow{
	width: 2.25rem;
	height: 2rem;
	border: 1px solid var(--np-night-line);
	background: transparent;
	color: var(--np-night-ink);
	cursor: pointer;
	display: grid;
	place-items: center;
	transition: border-color var(--np-speed) var(--np-ease), color var(--np-speed) var(--np-ease);
}

.np-arrow:hover{
	border-color: var(--np-brand);
	color: var(--np-brand);
}

.np-arrow svg{
	width: .9375rem;
	height: .625rem;
}


/* ==========================================================================
   10. Pie
   ========================================================================== */

.np-footer{
	background: var(--np-night);
	color: var(--np-night-ink);
	padding: 3rem 0 2rem;
}

.np-footer a{
	color: var(--np-night-ink);
	text-decoration: none;
}

.np-footer a:hover{
	color: var(--np-brand);
	text-decoration: underline;
}

.np-footer__top{
	padding-bottom: 2rem;
	border-bottom: 1px solid var(--np-night-line);
}

.np-footer__brand svg,
.np-footer__brand img{
	height: 2.5rem;
	width: auto;
}

.np-footer__descriptor{
	color: var(--np-night-muted);
	max-width: 34ch;
	margin: 1.25rem 0 0;
}

.np-footer__title{
	font-family: var(--np-mono);
	font-size: .6875rem;
	letter-spacing: .13em;
	text-transform: uppercase;
	color: var(--np-night-muted);
	margin: 0 0 .875rem;
}

.np-footer__bottom{
	padding-top: 1.5rem;
}

.np-footer__copy{
	color: var(--np-night-muted);
	font-size: .875rem;
	margin: 0;
}

.np-footer__legal{
	font-size: .875rem;
}


/* ==========================================================================
   12. Franja "Por donde empezar" — cuatro puertas
   --------------------------------------------------------------------------
   Cuatro filas a todo el ancho. Se descarto la retícula de cuatro columnas
   porque a 1.248 px cada columna cae a 270 px y el titular se parte; y porque
   en movil —donde NAPISA convierte cinco veces mas: 3,02 % de CTR frente a
   0,59 % en escritorio— una fila completa es un objetivo tactil de borde a
   borde, mientras que una columna estrecha no lo es.

   Sin numeracion delante: cuatro necesidades son opciones paralelas, no una
   secuencia.
   ========================================================================== */

/*
 * Sobre hueso, no sobre blanco.
 *
 * El hero tiene su columna de texto en blanco y esta franja tambien lo estaba:
 * dos superficies identicas separadas por un filete de rgba casi invisible se
 * leen como una sola franja larga. El cambio de tono da el corte que el filete
 * no daba.
 *
 * Ritmo resultante de la home, sin dos superficies iguales seguidas:
 *   cabecera oscura · hero blanco+oscuro · puertas hueso ·
 *   respuesta oscura · clientes blanco · pie oscuro
 */
.np-band{
	background: var(--np-ground);
	padding: 3.25rem 0 3.5rem;
}

.np-band__kicker{
	color: var(--np-brand-ink);
	margin-bottom: 1rem;
}

.np-band__h{
	max-width: 20ch;
	margin-bottom: .75rem;
}

.np-band__lede{
	color: var(--np-muted);
	max-width: 62ch;
	margin: 0 0 2.25rem;
}

.np-doors{
	border-top: 1px solid var(--np-ink);
}

/*
 * La fila entera es el enlace. isolation: isolate crea el contexto de apilado
 * para que el fondo del ::before pueda ir detras del texto sin escaparse por
 * debajo de la seccion.
 */
.np-door{
	position: relative;
	isolation: isolate;

	/*
	 * Mobile-first: la cifra cae DEBAJO del texto y la flecha ocupa las dos
	 * filas. En 375 px, texto y cifra en la misma linea dejan al titular sin
	 * medida y lo parten en cuatro.
	 */
	display: grid;
	grid-template-columns: minmax(0, 1fr) 1.25rem;
	grid-template-areas:
		"texto flecha"
		"cifra flecha";
	gap: .875rem 1.125rem;
	align-items: center;

	padding: 1.375rem 0;
	border-bottom: 1px solid var(--np-line-soft);
	color: inherit;
	text-decoration: none;
}

/*
 * Fondo que se despliega desde la izquierda.
 *
 * Solo desborda por la IZQUIERDA, lo justo para dar sitio al filete de marca.
 * Por la derecha termina exactamente donde terminan los filetes de la fila:
 * si tambien desbordara, el fondo sobresaldria de las lineas y el canto se
 * veria descuadrado.
 */
.np-door::before{
	content: "";
	position: absolute;
	inset: 0 0 0 calc(var(--np-gutter) * -0.6);
	z-index: -1;
	background: rgba(var(--np-brand-rgb), .06);
	transform: scaleX(0);
	transform-origin: left center;
	transition: transform 340ms var(--np-ease);
}

/* Filete de marca que crece en el canto izquierdo. */
.np-door::after{
	content: "";
	position: absolute;
	left: calc(var(--np-gutter) * -0.6);
	top: 0;
	bottom: 0;
	width: 2px;
	background: var(--np-brand);
	transform: scaleY(0);
	transform-origin: center;
	transition: transform 280ms var(--np-ease);
}

.np-door__h{
	font-size: clamp(1.4rem, 2.6vw, 2rem);
	line-height: 1.04;
	margin: 0 0 .3125rem;
}

.np-door__p{
	display: block;
	font-size: .9375rem;
	color: var(--np-muted);
	max-width: 58ch;
}

.np-door__t,
.np-door__m{
	display: block;
	transition: transform 340ms var(--np-ease);
}

.np-door__t{ grid-area: texto; }
.np-door__m{ grid-area: cifra; }

.np-door__n{
	display: block;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.5rem, 3vw, 1.9rem);
	line-height: 1;
	letter-spacing: -.02em;
	font-variant-numeric: tabular-nums;
	transition: color 280ms var(--np-ease);
}

.np-door__u{
	display: block;
	margin-top: .375rem;
}

.np-door__arrow{
	grid-area: flecha;
	width: 1.25rem;
	height: .6875rem;
	color: var(--np-muted);
	transition: transform 340ms var(--np-ease), color 280ms var(--np-ease);
}

/*
 * Un unico gesto —desplazamiento hacia la derecha— dicho en cuatro sitios: el
 * fondo se despliega, el filete crece, el texto avanza y la flecha sale. No
 * son cuatro efectos: es el mismo, y por eso no se lee como adorno.
 *
 * El foco recibe el mismo trato que el raton y en todos los dispositivos: quien
 * navega con teclado tiene derecho a la misma informacion.
 */
.np-door:focus-visible::before{ transform: scaleX(1); }
.np-door:focus-visible::after{ transform: scaleY(1); }
.np-door:focus-visible .np-door__t{ transform: translateX(.5rem); }
.np-door:focus-visible .np-door__arrow{ transform: translateX(.375rem); color: var(--np-brand-ink); }
.np-door:focus-visible .np-door__n{ color: var(--np-brand-ink); }

/*
 * El movimiento solo donde hay puntero real. En tactil no existe el hover y
 * dejarlo suelto produce filas que se quedan "encendidas" tras el toque.
 */
@media (hover: hover){
	.np-door:hover::before{ transform: scaleX(1); }
	.np-door:hover::after{ transform: scaleY(1); }
	.np-door:hover .np-door__t{ transform: translateX(.5rem); }
	.np-door:hover .np-door__arrow{ transform: translateX(.375rem); color: var(--np-brand-ink); }
	.np-door:hover .np-door__n{ color: var(--np-brand-ink); }
}


/* ==========================================================================
   13. Franja "Respuesta destacada"
   --------------------------------------------------------------------------
   Sobre Process Black. El ritmo de la home alterna: cabecera oscura, hero
   claro con panel oscuro, cuatro puertas en claro, esta franja en oscuro.
   El §60 pide reservar el oscuro para bloques con peso, y este lo tiene: es la
   unica franja que ataca el problema medido —posicion 1 con un CTR del
   0,09 %— porque la respuesta se da hoy por encima del enlace.
   ========================================================================== */

.np-answer{
	background: var(--np-night);
	color: var(--np-night-ink);
	padding: 3.5rem 0 3.75rem;
}

.np-answer__kicker{
	color: var(--np-brand);
	margin-bottom: 1.25rem;
}

.np-answer__h{
	color: var(--np-night-ink);
	max-width: 20ch;
	margin-bottom: 1.25rem;
}

/*
 * La respuesta directa va marcada con el filete de marca y en cuerpo mayor: es
 * el fragmento que un motor de respuesta puede citar entero, y tiene que
 * distinguirse del desarrollo que viene detras (§49).
 */
.np-answer__lead{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.2rem, 2.4vw, 1.6rem);
	line-height: 1.28;
	letter-spacing: -.012em;
	color: var(--np-night-ink);
	border-left: 3px solid var(--np-brand);
	padding-left: 1.25rem;
	margin: 0 0 1.125rem;
}

.np-answer__p{
	color: var(--np-night-muted);
	max-width: 58ch;
	margin: 0;
}

.np-answer__list{
	border-top: 1px solid var(--np-night-line);
}

.np-answer__item{
	padding: 1rem 0;
	border-bottom: 1px solid var(--np-night-line);
}

.np-answer__q{
	font-size: 1.0625rem;
	line-height: 1.3;
	color: var(--np-night-ink);
	margin: 0 0 .375rem;
}

.np-answer__a{
	font-size: .9375rem;
	color: var(--np-night-muted);
	margin: 0;
	max-width: 56ch;
}


/* ==========================================================================
   14. Franja "Clientes y certificaciones"
   --------------------------------------------------------------------------
   Cierra la respuesta destacada. Mientras no haya autorizacion para publicar
   los logotipos, el nombre va en texto: es informacion igual de indexable y no
   compromete la marca de un tercero.
   ========================================================================== */

.np-proof{
	background: var(--np-surface);
	padding: 3.25rem 0 3.5rem;
	border-bottom: 1px solid var(--np-line);
}

.np-proof__kicker{
	color: var(--np-brand-ink);
	margin-bottom: 1rem;
}

.np-proof__h{
	max-width: 24ch;
	margin-bottom: 1.75rem;
}

/* La retícula es .row/.row-cols de Bootstrap; aquí solo los filetes. */
.np-clients{
	border-top: 1px solid var(--np-ink);
	border-left: 1px solid var(--np-line-soft);
}

.np-clients li{
	aspect-ratio: 5 / 3;
	display: grid;
	place-items: center;
	padding: .875rem;
	border-right: 1px solid var(--np-line-soft);
	border-bottom: 1px solid var(--np-line-soft);
}

.np-clients span{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1rem;
	line-height: 1.1;
	color: var(--np-muted);
	text-align: center;
}

.np-certs{
	margin-top: 2rem;
	padding-top: 1.5rem;
	border-top: 1px solid var(--np-line-soft);
}

.np-cert{
	align-items: start;
}

/* El sello no encoge: sin esto flex se lo come cuando el texto es largo. */
.np-cert__mark{
	flex: 0 0 3.5rem;
}

/* Marca provisional: el sello real de AENOR hay que pedirlo. */
.np-cert__mark{
	aspect-ratio: 1;
	display: grid;
	place-items: center;
	border: 1px solid var(--np-line);
	font-family: var(--np-mono);
	font-size: .5rem;
	letter-spacing: .08em;
	line-height: 1.35;
	color: var(--np-muted);
	text-align: center;
}

.np-cert__h{
	font-size: 1.0625rem;
	line-height: 1.2;
	margin: 0 0 .25rem;
}

.np-cert__p{
	display: block;
	font-size: .875rem;
	color: var(--np-muted);
}


/* ==========================================================================
   15. Franja "Obra entregada"
   --------------------------------------------------------------------------
   Sobre hueso: la franja de clientes es blanca y el pie es oscuro, asi que
   este tono corta con las dos sin repetir superficie contigua.

   La franja de clientes da el logotipo —credito superficial— y esta da el
   expediente: cliente, superficie, sector y modalidad. Es la escalada que
   .github/docs/COMPETENCIA.md §4.2 senala como la brecha mas clara del sector.
   ========================================================================== */

.np-works{
	background: var(--np-ground);
	padding: 3.25rem 0 3.5rem;
}

.np-works__kicker{
	color: var(--np-brand-ink);
	margin-bottom: 1rem;
}

.np-works__h{
	max-width: 22ch;
	margin-bottom: .75rem;
}

.np-works__lede{
	color: var(--np-muted);
	max-width: 60ch;
	margin: 0 0 2rem;
}

.np-work{
	display: flex;
	flex-direction: column;
	min-width: 0;
	color: inherit;
	text-decoration: none;
}

.np-work__media{
	position: relative;
	display: block;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background:
		repeating-linear-gradient(135deg, rgba(var(--np-brand-rgb), .045) 0 12px, transparent 12px 24px),
		radial-gradient(120% 90% at 20% 0%, #2A2723 0%, var(--np-night) 70%);
}

.np-work__media img{
	width: 100%;
	height: 100%;
	object-fit: cover;
	/*
	 * El zoom del §22 va en la IMAGEN, no en la tarjeta: escalando el
	 * contenedor se moverian tambien el titular y la ficha, y el dato tiene
	 * que quedarse quieto para poder leerse.
	 */
	transition: transform 520ms var(--np-ease);
}

.np-work__roof{
	position: absolute;
	left: -8%;
	bottom: 14%;
	width: 116%;
	height: auto;
	opacity: .13;
	color: var(--np-brand);
}

.np-work__ph{
	position: absolute;
	left: .875rem;
	bottom: .75rem;
	color: rgba(242, 239, 233, .42);
}

.np-work__h{
	font-size: 1.35rem;
	line-height: 1.06;
	margin: 1rem 0 .1875rem;
	transition: color var(--np-speed) var(--np-ease);
}

.np-work__loc{
	display: block;
	margin-bottom: .75rem;
}

/* Ficha tecnica: tabla real, no lista de iconos (§24 y §56). */
.np-work__rows{
	margin: 0;
	border-top: 1px solid var(--np-line-soft);
}

.np-work__rows > div{
	padding: .375rem 0;
	border-bottom: 1px solid var(--np-line-soft);
}

.np-work__rows dt{
	font-family: var(--np-mono);
	font-size: .59375rem;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--np-muted);
	margin: 0;
}

.np-work__rows dd{
	margin: 0;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: .9375rem;
	font-variant-numeric: tabular-nums;
}

@media (hover: hover){
	.np-work:hover .np-work__media img{ transform: scale(1.03); }
	.np-work:hover .np-work__h{ color: var(--np-brand-ink); }
}

.np-work:focus-visible .np-work__media img{ transform: scale(1.03); }
.np-work:focus-visible .np-work__h{ color: var(--np-brand-ink); }

.np-works__more{
	display: inline-flex;
	align-items: center;
	gap: .625rem;
	margin-top: 1.75rem;
	font-family: var(--np-mono);
	font-size: .65625rem;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--np-brand-ink);
	text-decoration: none;
	border-bottom: 2px solid var(--np-brand);
	padding-bottom: .1875rem;
	transition: gap var(--np-speed) var(--np-ease);
}

.np-works__more:hover{
	color: var(--np-brand-ink);
	gap: .9375rem;
}

.np-works__more svg{
	width: 1.125rem;
	height: .625rem;
	flex: none;
}


/* ==========================================================================
   16. Formulario
   --------------------------------------------------------------------------
   Los componentes son los de Bootstrap: .form-label, .form-control,
   .form-select, .form-text, .form-check e .invalid-feedback, con la validacion
   de .needs-validation / .was-validated.

   Aqui NO se sustituye ninguno: solo se les da identidad reasignando las
   variables del propio Bootstrap. El radio y el anillo de foco por defecto no
   son motivo para escribir un componente paralelo — son dos variables.
   ========================================================================== */

:root{
	/* Sin esquinas redondeadas en toda la interfaz (§62). */
	--bs-border-radius:        0;
	--bs-border-radius-sm:     0;
	--bs-border-radius-lg:     0;
	--bs-border-radius-xl:     0;

	/* El anillo de foco, en el acento accesible y sin difuminado. */
	--bs-focus-ring-width:     2px;
	--bs-focus-ring-opacity:   1;
	--bs-focus-ring-blur:      0;
	--bs-focus-ring-color:     var(--np-brand-ink);

	/* Estados de validacion en la paleta del proyecto. */
	--bs-form-invalid-color:        #A8321A;
	--bs-form-invalid-border-color: #A8321A;
	--bs-form-valid-color:          var(--np-brand-ink);
	--bs-form-valid-border-color:   var(--np-brand);
}

.form-label{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	color: var(--np-muted);
	margin-bottom: .375rem;
}

.np-opcional{
	text-transform: none;
	letter-spacing: .02em;
	opacity: .75;
}

/*
 * Alto minimo comun a input y select: un <select> no calcula su altura igual
 * que un <input> aunque compartan tipo y relleno, y sin esto quedan
 * desalineados unos pixeles, distintos en cada navegador.
 */
.form-control,
.form-select{
	min-height: 2.875rem;
	border-color: var(--np-line);
}

.form-control:hover,
.form-select:hover{
	border-color: var(--np-brand);
}

.form-control:focus,
.form-select:focus{
	border-color: var(--np-brand);
	box-shadow: none;
}

.form-text{
	color: var(--np-muted);
}

.form-check-label{
	font-size: .875rem;
	color: var(--np-muted);
}

.form-check-input{
	border-color: var(--np-line);
}

.form-check-input:checked{
	background-color: var(--np-brand);
	border-color: var(--np-brand);
}

/*
 * Solo se marca lo que falla, no lo que va bien.
 *
 * Para el navegador un campo OPCIONAL y VACIO es valido, asi que Bootstrap le
 * pinta su marca verde. Un tic sobre una casilla vacia dice lo contrario de lo
 * que pasa, de modo que se anula el estado valido y se conserva solo el
 * invalido. Contrastes medidos: el rojo da 6,70:1 sobre claro y 8,63:1 sobre
 * oscuro, ambos AA (§66).
 */
.was-validated .form-control:valid,
.was-validated .form-select:valid,
.was-validated .form-control:valid:focus,
.was-validated .form-select:valid:focus{
	border-color: var(--np-line);
	box-shadow: none;
}

.was-validated .form-control:valid{
	background-image: none;
}

/* El <select> conserva su flecha: solo se le quita la marca de validacion. */
.was-validated .form-select:valid{
	background-image: var(--bs-form-select-bg-img);
}

.was-validated .form-check-input:valid{
	border-color: var(--np-line);
}

.was-validated .form-check-input:valid:checked{
	background-color: var(--np-brand);
	border-color: var(--np-brand);
}

.was-validated .form-check-input:valid ~ .form-check-label{
	color: var(--np-muted);
}


/*
 * Sobre fondo oscuro el formulario invierte entero, campos incluidos.
 *
 * Seis rectangulos blancos sobre Process Black pesan mas que todo lo que hay
 * alrededor y rompen la franja. Un campo oscuro se lee igual de bien mientras
 * el filete tenga contraste y el foco se vea: la afordancia la da el borde, no
 * el relleno.
 */
.np-close .form-label,
.np-close .form-text,
.np-close .form-check-label{
	color: var(--np-night-muted);
}

.np-close .form-check-label a{
	color: var(--np-brand);
}

.np-close .form-control,
.np-close .form-select{
	background-color: transparent;
	color: var(--np-night-ink);
	border-color: rgba(242, 239, 233, .3);
}

.np-close .form-control:hover,
.np-close .form-select:hover,
.np-close .form-control:focus,
.np-close .form-select:focus{
	background-color: transparent;
	color: var(--np-night-ink);
	border-color: var(--np-brand);
}

/* El desplegable pinta su lista con los colores del sistema: hay que fijarlos. */
.np-close .form-select option{
	background: var(--np-night);
	color: var(--np-night-ink);
}

.np-close .form-check-input{
	background-color: transparent;
	border-color: rgba(242, 239, 233, .4);
}

.np-close .form-check-input:checked{
	background-color: var(--np-brand);
	border-color: var(--np-brand);
}

.np-close .invalid-feedback{
	color: #E8A08D;
}

.np-close.was-validated .form-control:valid,
.np-close.was-validated .form-select:valid,
.np-close .was-validated .form-control:valid,
.np-close .was-validated .form-select:valid{
	border-color: rgba(242, 239, 233, .3);
}

.np-close .was-validated .form-check-input:valid ~ .form-check-label{
	color: var(--np-night-muted);
}


/* ==========================================================================
   17. Franja de cierre y páginas interiores
   ========================================================================== */

/*
 * En oscuro y pegada al pie: el §73 quiere que cierre y pie funcionen como un
 * solo bloque final. Es la única pareja de franjas del mismo tono de toda la
 * página, y es deliberada.
 */
.np-close{
	background: var(--np-night);
	color: var(--np-night-ink);
	padding: 3.25rem 0 3.5rem;
	border-bottom: 1px solid var(--np-night-line);
}

.np-close__kicker{
	color: var(--np-brand);
	margin-bottom: 1rem;
}

.np-close__h{
	color: var(--np-night-ink);
	max-width: 18ch;
	margin-bottom: .75rem;
}

.np-close__lede{
	color: var(--np-night-muted);
	max-width: 46ch;
	margin: 0;
}

.np-close__phone{
	margin-top: 2rem;
	padding-top: 1.25rem;
	border-top: 1px solid var(--np-night-line);
}

.np-close__phone a{
	display: inline-block;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.75rem, 4vw, 2.4rem);
	line-height: 1;
	letter-spacing: -.02em;
	color: var(--np-night-ink);
	text-decoration: none;
	margin: .5rem 0 .5rem;
	font-variant-numeric: tabular-nums;
	transition: color var(--np-speed) var(--np-ease);
}

.np-close__phone a:hover{
	color: var(--np-brand);
}

.np-close__hours{
	color: var(--np-night-muted);
}

/* Cabecera de página interior */
.np-page{
	background: var(--np-surface);
	padding: 2.75rem 0 3.25rem;
}

.np-page__kicker{
	color: var(--np-brand-ink);
	margin-bottom: 1rem;
}

.np-page__lede{
	font-size: 1.0625rem;
	color: var(--np-muted);
	max-width: 54ch;
	margin: 0;
}

.np-page__head{
	padding-bottom: 2.25rem;
	margin-bottom: 2.5rem;
	border-bottom: 1px solid var(--np-ink);
}

.np-contact__h{
	font-size: clamp(1.35rem, 2.6vw, 1.75rem);
	margin-bottom: .5rem;
}

.np-contact__lede{
	color: var(--np-muted);
	max-width: 50ch;
	margin: 0 0 1.75rem;
}

.np-contact__direct{
	border-top: 1px solid var(--np-ink);
	padding-top: 1.25rem;
}

/* .np-label es un <span> y quedaba en la misma linea que el numero. */
.np-contact__direct .np-label{
	display: block;
}

.np-contact__direct a{
	display: inline-block;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.5rem, 3.4vw, 2rem);
	line-height: 1.05;
	letter-spacing: -.02em;
	color: var(--np-ink);
	text-decoration: none;
	margin-top: .3125rem;
	transition: color var(--np-speed) var(--np-ease);
}

.np-contact__direct a:hover{
	color: var(--np-brand-ink);
}

.np-contact__office{
	margin: 2rem 0 0;
	border-top: 1px solid var(--np-line-soft);
}

.np-contact__office > div{
	padding: .875rem 0;
	border-bottom: 1px solid var(--np-line-soft);
}

.np-contact__office dt{
	margin: 0 0 .25rem;
}

.np-contact__office dd{
	margin: 0;
	font-size: .9375rem;
}


/* ==========================================================================
   18. Servicios: indice por necesidad y ficha
   --------------------------------------------------------------------------
   Reutiliza .np-door (12), .np-answer (13) y .np-close (17). Aqui solo va lo
   que esas franjas no tienen: los grupos del indice, la miga de pan, la
   prosa de la ficha y su tabla lateral.
   ========================================================================== */

/*
 * Indice
 *
 * Pestanas de necesidad: el .nav de Bootstrap con sus variables reasignadas.
 * Son anclas, y se ven como botones de contorno para que se entienda que se
 * pueden pulsar; el numero es cuantos servicios hay detras.
 */
.np-pills{
	--bs-nav-link-color:       var(--np-ink);
	--bs-nav-link-hover-color: var(--np-ink);
	--bs-nav-link-padding-x:   1.125rem;
	--bs-nav-link-padding-y:   .6875rem;
	--bs-nav-link-font-weight: 600;
	gap: .75rem;
	margin-top: 1.5rem;
}

.np-pills .nav-link{
	display: inline-flex;
	align-items: center;
	gap: .625rem;
	font-size: .9375rem;
	border: 1px solid var(--np-line);
	background: var(--np-surface);
	transition: border-color var(--np-speed) var(--np-ease), background-color var(--np-speed) var(--np-ease);
}

.np-pills .nav-link:hover,
.np-pills .nav-link:focus-visible{
	border-color: var(--np-ink);
	background: var(--np-ground);
}

.np-pills__n{
	font-family: var(--np-mono);
	font-size: .6875rem;
	letter-spacing: .1em;
	color: var(--np-muted);
}

/* Grupo con comparativa */
.np-group{
	margin-top: 3rem;
}

.np-page__head + .np-group{
	margin-top: 0;
}

.np-group__head{
	padding-bottom: .875rem;
	margin-bottom: 1.5rem;
	border-bottom: 1px solid var(--np-ink);
}

.np-group__h{
	font-size: clamp(1.5rem, 2.8vw, 2.125rem);
	line-height: 1;
	color: var(--np-brand-ink);
	margin: 0;
}

.np-group__lede{
	font-size: .9375rem;
	color: var(--np-muted);
	max-width: 60ch;
	margin: 0;
}

/*
 * Tarjeta de modalidad. Tres iguales, con las mismas filas en el mismo orden:
 * la comparacion se hace con la vista, y el boton a todo el ancho es lo que
 * dice "esto se pulsa". La destacada va en oscuro con el boton naranja; las
 * otras dos, sobre hueso con el boton de tinta.
 */
.np-option{
	background: var(--np-ground);
	color: var(--np-ink);
	border-top: 3px solid var(--np-ink);
	padding: 1.375rem 1.5rem 1.5rem;
}

.np-option--hi{
	background: var(--np-night);
	color: var(--np-night-ink);
	border-top-color: var(--np-brand);
}

.np-option__kicker{
	color: var(--np-brand-ink);
	margin-bottom: .375rem;
}

.np-option--hi .np-option__kicker{
	color: var(--np-brand);
}

.np-option__h{
	font-size: clamp(1.5rem, 2.6vw, 1.875rem);
	line-height: 1;
	margin-bottom: .375rem;
}

.np-option__sub{
	font-size: .875rem;
	line-height: 1.45;
	color: var(--np-muted);
	margin: 0 0 .875rem;
}

.np-option--hi .np-option__sub{
	color: var(--np-night-muted);
}

/* Ficha tecnica: tabla real, no lista de iconos (§24 y §56). */
.np-option__rows{
	margin: 0 0 1.25rem;
}

.np-option__rows > div{
	padding: .5625rem 0;
	border-top: 1px solid var(--np-line-soft);
}

.np-option--hi .np-option__rows > div{
	border-top-color: var(--np-night-line);
}

.np-option__rows dt{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	font-weight: 400;
	color: var(--np-muted);
	margin: 0;
	flex: none;
}

.np-option--hi .np-option__rows dt{
	color: var(--np-night-muted);
}

.np-option__rows dd{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1rem;
	line-height: 1.2;
	letter-spacing: -.01em;
}

/* Salida para quien no quiere decidir. */
.np-help{
	margin-top: 1.5rem;
	padding: 1.25rem 1.5rem;
	background: rgba(var(--np-brand-rgb), .10);
	border-left: 3px solid var(--np-brand);
}

.np-help__h{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1.25rem;
	line-height: 1.1;
	margin: 0 0 .125rem;
}

.np-help__p{
	font-size: .875rem;
	color: var(--np-muted);
	margin: 0;
}

/* Necesidad con un solo servicio: una fila a todo el ancho con su boton. */
.np-single{
	margin-top: 2.5rem;
	padding-top: 1.625rem;
	border-top: 1px solid var(--np-ink);
}

.np-single + .np-single{
	margin-top: 1.625rem;
}

.np-single__h{
	font-size: clamp(1.35rem, 2.6vw, 1.75rem);
	line-height: 1.04;
	margin-bottom: .25rem;
}

.np-single__p{
	font-size: .9375rem;
	color: var(--np-muted);
	margin: 0;
}

/*
 * Miga de pan: el .breadcrumb de Bootstrap, con su separador y su tipografia
 * reasignados. Va con el estilo de etiqueta monoespaciada del resto de
 * metadatos (kickers, cotas), porque eso es: un metadato de la pagina.
 */
.np-crumbs{
	--bs-breadcrumb-divider: "\00b7";
	--bs-breadcrumb-divider-color: var(--np-muted);
	--bs-breadcrumb-item-active-color: var(--np-ink);
	--bs-breadcrumb-item-padding-x: .625rem;
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	color: var(--np-muted);
	margin-bottom: 1.75rem;
}

.np-crumbs a{
	color: var(--np-muted);
	text-decoration: none;
	transition: color var(--np-speed) var(--np-ease);
}

.np-crumbs a:hover{
	color: var(--np-brand-ink);
}

/* Cabecera de ficha: el lede es mas largo que en /contacto y lleva CTAs. */
.np-service__lede{
	font-size: clamp(1.0625rem, 1.5vw, 1.25rem);
	max-width: 58ch;
}

.np-service__cta{
	margin-top: 1.5rem;
}

/*
 * Prosa. Los <h2> del texto son apartados, no titulares de franja: van en el
 * tamano del titulo de grupo, no en el de un <h2> de la home.
 */
.np-prose{
	max-width: 64ch;
}

.np-prose p,
.np-prose ul{
	margin: 0 0 1.125rem;
}

.np-prose h2{
	font-size: clamp(1.35rem, 2.6vw, 1.75rem);
	margin: 2rem 0 .75rem;
}

.np-prose ul{
	padding-left: 1.25rem;
}

.np-prose li{
	margin-bottom: .375rem;
}

.np-prose li::marker{
	color: var(--np-brand-ink);
}

.np-prose em{
	font-style: italic;
}

/* Enlace al video, sin iframe (§31). */
.np-service__video{
	display: inline-flex;
	flex-direction: column;
	gap: .25rem;
	margin-top: .5rem;
	font-weight: 600;
	color: var(--np-ink);
	text-decoration: none;
	border-left: 3px solid var(--np-brand);
	padding-left: 1rem;
	transition: color var(--np-speed) var(--np-ease);
}

.np-service__video:hover{
	color: var(--np-brand-ink);
}

/* Ficha tecnica lateral: tabla real, no lista de iconos (§24 y §56). */
.np-facts{
	border-top: 1px solid var(--np-ink);
	padding-top: 1.25rem;
}

.np-facts__img{
	display: block;
	width: 100%;
	height: auto;
	margin-bottom: 1.25rem;
}

.np-facts__t{
	margin-bottom: .5rem;
}

.np-facts__rows > div{
	padding: .5rem 0;
	border-top: 1px solid var(--np-line-soft);
}

.np-facts__rows dt{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	color: var(--np-muted);
	font-weight: 400;
	margin: 0;
	flex: none;
}

.np-facts__rows dd{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1rem;
	line-height: 1.2;
	letter-spacing: -.01em;
}


/* ==========================================================================
   19. Obras: casos y desglose por sector
   --------------------------------------------------------------------------
   Reutiliza la tarjeta .np-work y las cifras .np-figures. Aqui va lo que no
   tienen: la tarjeta sin enlace, la franja del desglose y la tabla.
   ========================================================================== */

.np-cases{
	margin-top: 0;
}

/*
 * Tarjeta sin enlace: no hay ficha de caso a la que ir todavia. Se anulan
 * los gestos de hover de .np-work, que prometen un destino que no existe.
 */
.np-work--static:hover .np-work__media img{ transform: none; }
.np-work--static:hover .np-work__h{ color: inherit; }

.np-work__rows dd.text-end{
	text-align: right;
}

/* Desglose sobre hueso, como la franja de obra de la home. */
.np-breakdown{
	background: var(--np-ground);
	padding: 3.25rem 0 3.5rem;
}

.np-breakdown__figures{
	margin-bottom: 2.5rem;
}

.np-breakdown__figures .np-figure{
	padding-bottom: 1rem;
}

.np-breakdown__figures .np-figure__n{
	font-size: clamp(1.5rem, 3.2vw, 2.125rem);
}

.np-breakdown__figures .np-figure__n small{
	font-size: .5em;
	font-weight: 600;
	color: var(--np-muted);
}

/*
 * La tabla es la de Bootstrap con sus variables. Fondo transparente para
 * que herede el hueso de la franja; filetes suaves entre filas y de tinta
 * entre categorias.
 */
.np-table{
	--bs-table-bg:           transparent;
	--bs-table-color:        var(--np-ink);
	--bs-table-border-color: var(--np-line-soft);
	--bs-table-hover-bg:     rgba(var(--np-brand-rgb), .06);
	margin: 0;
	font-size: .9375rem;
}

.np-table > :not(caption) > * > *{
	padding: .625rem 0;
}

.np-table thead th{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	font-weight: 400;
	color: var(--np-muted);
	border-bottom: 1px solid var(--np-ink);
}

.np-table tbody{
	border-top: 0;
}

.np-table .np-table__cat > *{
	padding-top: 1.5rem;
	border-bottom: 1px solid var(--np-ink);
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1.125rem;
	vertical-align: bottom;
}

.np-table__h{
	font-size: clamp(1.25rem, 2.4vw, 1.5rem);
	line-height: 1;
	margin: 0;
	color: var(--np-brand-ink);
}

.np-table td.text-end,
.np-table th + td{
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

.np-table tfoot th,
.np-table tfoot td{
	padding-top: 1.25rem;
	border-top: 2px solid var(--np-ink);
	border-bottom: 0;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1.25rem;
}


/* ==========================================================================
   20. Suelo y promociones: catalogo, ficha, galeria
   --------------------------------------------------------------------------
   Las fichas de suelo no tienen fotografia en produccion y no se inventa una:
   el dato es el material visual (§13-16). La superficie va en grande y el
   resto en tabla.
   ========================================================================== */

/* Chips densos para los filtros del catalogo. */
.np-pills--dense{
	--bs-nav-link-padding-x: .875rem;
	--bs-nav-link-padding-y: .5rem;
	gap: .5rem;
	margin-top: 0;
}

.np-pills--dense .nav-link{
	font-size: .875rem;
}

.np-pills .nav-link.is-active{
	border-color: var(--np-ink);
	background: var(--np-ink);
	color: var(--np-night-ink);
}

.np-pills .nav-link.is-active .np-pills__n{
	color: var(--np-night-muted);
}

.np-filters{
	display: flex;
	flex-direction: column;
	gap: 1.25rem;
	margin-bottom: 2rem;
}

.np-filters__t{
	margin-bottom: .625rem;
}

/* El <details> de Bootstrap no existe: se estiliza el nativo, sin script. */
.np-filters__more{
	margin-top: .75rem;
}

.np-filters__more summary{
	cursor: pointer;
	color: var(--np-brand-ink);
	list-style: none;
	display: inline-flex;
	align-items: center;
	gap: .5rem;
}

.np-filters__more summary::-webkit-details-marker{ display: none; }

.np-filters__more summary::before{
	content: "+";
	font-family: var(--np-mono);
	font-size: .875rem;
	line-height: 1;
}

.np-filters__more[open] summary::before{ content: "\2013"; }

.np-filters__more .np-pills{
	margin-top: .75rem;
}

/* Etiqueta de estado: vendido, reservado, proximamente. */
.np-tag{
	display: inline-block;
	font-family: var(--np-mono);
	font-size: .59375rem;
	letter-spacing: .12em;
	text-transform: uppercase;
	padding: .25rem .5rem;
	line-height: 1;
	background: var(--np-ground);
	border: 1px solid var(--np-line);
	color: var(--np-ink);
	white-space: nowrap;
}

.np-tag--reservado{
	background: var(--np-brand);
	border-color: var(--np-brand);
}

.np-tag--vendido,
.np-tag--indisponible{
	background: var(--np-ink);
	border-color: var(--np-ink);
	color: var(--np-night-ink);
}

.np-tag--disponible{
	border-color: var(--np-ink);
}

/*
 * Tarjeta de parcela. Enlace entero, sin fotografia: la superficie hace de
 * imagen. Mismo gesto de hover que las puertas de la home —filete de marca
 * que crece por la izquierda—, para que se lea como enlace.
 */
.np-plot{
	position: relative;
	display: flex;
	flex-direction: column;
	gap: .375rem;
	padding: 1.125rem 1.25rem 1.25rem;
	background: var(--np-ground);
	border-top: 2px solid var(--np-ink);
	color: var(--np-ink);
	text-decoration: none;
	transition: background-color var(--np-speed) var(--np-ease);
}

.np-plot::after{
	content: "";
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	width: 3px;
	background: var(--np-brand);
	transform: scaleY(0);
	transform-origin: top;
	transition: transform 280ms var(--np-ease);
}

.np-plot:hover,
.np-plot:focus-visible{
	background: var(--np-surface);
	color: var(--np-ink);
}

.np-plot:hover::after,
.np-plot:focus-visible::after{ transform: scaleY(1); }

.np-plot--hi{
	border-top-color: var(--np-brand);
}

.np-plot__n{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.9rem, 3.4vw, 2.5rem);
	line-height: .95;
	letter-spacing: -.02em;
	font-variant-numeric: tabular-nums;
	margin-top: .25rem;
}

.np-plot__n small{
	font-size: .5em;
	font-weight: 600;
	color: var(--np-muted);
}

.np-plot__h{
	font-size: 1.125rem;
	line-height: 1.1;
	margin: .25rem 0 0;
}

.np-plot__sub{
	font-size: .8125rem;
	line-height: 1.4;
	color: var(--np-muted);
}

/* Ficha tecnica: tabla real, no lista de iconos (§24 y §56). */
.np-plot__rows{
	margin: .875rem 0 0;
	border-top: 1px solid var(--np-line-soft);
}

.np-plot__rows > div{
	padding: .375rem 0;
	border-bottom: 1px solid var(--np-line-soft);
}

.np-plot__rows dt{
	font-family: var(--np-mono);
	font-size: .59375rem;
	letter-spacing: .1em;
	text-transform: uppercase;
	font-weight: 400;
	color: var(--np-muted);
	margin: 0;
}

.np-plot__rows dd{
	margin: 0;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: .9375rem;
	font-variant-numeric: tabular-nums;
}

.np-plots__note{
	margin: 1.5rem 0 0;
	font-size: .875rem;
	color: var(--np-muted);
}

/* Aviso de ficha no disponible: mismo bloque de ayuda, en tinta. */
.np-help--warn{
	background: var(--np-ground);
	border-left-color: var(--np-ink);
	margin: 1.5rem 0 0;
}

/* Entradilla de ficha: la respuesta directa, con el filete de marca. */
.np-lead{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: clamp(1.15rem, 2.2vw, 1.45rem);
	line-height: 1.3;
	letter-spacing: -.01em;
	border-left: 3px solid var(--np-brand);
	padding-left: 1.125rem;
	margin: 0 0 1.5rem;
}

/*
 * Promocion: tarjeta ancha con foto. El enlace es la fila entera; el "Ver la
 * nave" es un <span> con el estilo del CTA secundario, no un segundo enlace
 * dentro de un enlace.
 */
.np-promo{
	display: flex;
	margin-top: 1.5rem;
	background: var(--np-ground);
	border-top: 2px solid var(--np-ink);
	color: var(--np-ink);
	text-decoration: none;
	transition: background-color var(--np-speed) var(--np-ease);
}

.np-promo:first-of-type{ margin-top: 0; }

.np-promo:hover,
.np-promo:focus-visible{
	background: var(--np-surface);
	color: var(--np-ink);
}

.np-promo__media{
	display: block;
	aspect-ratio: 3 / 2;
	overflow: hidden;
	background: var(--np-night);
}

.np-promo__media img{
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 600ms var(--np-ease);
}

.np-promo:hover .np-promo__media img{ transform: scale(1.03); }

.np-promo__body{
	padding: 1.25rem 1.25rem 1.375rem;
	gap: .375rem;
}

.np-promo__h{
	font-size: clamp(1.35rem, 2.4vw, 1.75rem);
	line-height: 1.05;
	margin: .25rem 0 0;
}

.np-promo__sub{
	font-size: .9375rem;
	color: var(--np-muted);
	max-width: 56ch;
}

.np-promo__rows{
	margin: 1rem 0 0;
	border-top: 1px solid var(--np-line-soft);
}

.np-promo__rows > div{
	padding: .4375rem 0;
	border-bottom: 1px solid var(--np-line-soft);
}

.np-promo__rows dt{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	font-weight: 400;
	color: var(--np-muted);
	margin: 0;
}

.np-promo__rows dd{
	margin: 0;
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1.0625rem;
	font-variant-numeric: tabular-nums;
}

.np-promo__more{
	margin-top: 1rem;
}

.np-promo--soon .np-promo__media img{ filter: grayscale(.6); }

/* Galeria de la ficha: primera foto grande, resto en reticula, sin script. */
.np-gallery{
	margin-bottom: 2.5rem;
}

.np-gallery__main{
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background: var(--np-night);
}

.np-gallery__main img{
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.np-gallery__thumb{
	display: block;
	aspect-ratio: 3 / 2;
	overflow: hidden;
	background: var(--np-night);
}

.np-gallery__thumb img{
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 600ms var(--np-ease);
}

.np-gallery__thumb:hover img{ transform: scale(1.04); }


/* ==========================================================================
   21. Nosotros y empleo
   --------------------------------------------------------------------------
   Reutiliza .np-pills, .np-figures, .np-facts, .np-option, .np-help y la
   reticula de galeria. Aqui: el enlace al video, la tarjeta de persona y los
   ritmos propios de la pagina.
   ========================================================================== */

.np-about{
	margin-top: 0;
}

.np-about__h{
	font-size: clamp(1.5rem, 2.8vw, 2.125rem);
	line-height: 1.02;
	margin-bottom: 1rem;
}

.np-about__figures{
	margin-top: 2.5rem;
}

.np-about__figures .np-figure{
	padding-bottom: 1rem;
}

/* Enlace al video: fotograma en local y boton de play en naranja. */
.np-video{
	display: flex;
	flex-direction: column;
	gap: .375rem;
	color: var(--np-ink);
	text-decoration: none;
}

.np-video__media{
	position: relative;
	display: block;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background: var(--np-night);
}

.np-video__media img{
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 600ms var(--np-ease), opacity var(--np-speed) var(--np-ease);
}

.np-video__play{
	position: absolute;
	left: 50%;
	top: 50%;
	width: 4rem;
	height: 4rem;
	margin: -2rem 0 0 -2rem;
	display: grid;
	place-items: center;
	background: var(--np-brand);
	color: var(--np-ink);
	transition: transform var(--np-speed) var(--np-ease);
}

.np-video__play svg{ margin-left: .1875rem; }

.np-video:hover .np-video__media img{ transform: scale(1.03); opacity: .9; }
.np-video:hover .np-video__play{ transform: scale(1.06); }

.np-video__t{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1.125rem;
	line-height: 1.1;
	margin-top: .5rem;
}

/* Persona: retrato 4:5 sobre hueso, nombre y cargo. */
.np-person{
	display: flex;
	flex-direction: column;
	gap: .25rem;
}

.np-person__media{
	display: block;
	aspect-ratio: 4 / 5;
	overflow: hidden;
	background: var(--np-night);
	margin-bottom: .5rem;
}

.np-person__media img{
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.np-person__h{
	font-size: 1.125rem;
	line-height: 1.1;
	margin: 0;
}

.np-team__photo{
	overflow: hidden;
	aspect-ratio: 16 / 9;
	background: var(--np-night);
}

.np-team__photo img{
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.np-team__awards{
	margin-top: 1.25rem;
	border-top: 1px solid var(--np-ink);
}

.np-team__awards > div:first-child{ border-top: 0; }

/* Oficina e instalaciones comparten seccion blanca; filete entre ambas. */
.np-premises{
	margin-top: 3rem;
	padding-top: 2.5rem;
	border-top: 1px solid var(--np-ink);
}

.np-premises .np-gallery__thumb{ aspect-ratio: 4 / 3; }

/* Empleo */
.np-jobs{
	margin-bottom: 3rem;
}

.np-profiles{
	padding-top: 2.5rem;
	border-top: 1px solid var(--np-ink);
}

.np-spontaneous{
	margin-top: 3rem;
}

.np-spontaneous .np-help__h{ font-size: 1.5rem; }


/* ==========================================================================
   22. Blog: tarjetas, paginacion y articulo
   ========================================================================== */

/* Tarjeta de articulo: enlace entero, imagen 4:3 recortada de la 725x750. */
.np-post{
	display: flex;
	flex-direction: column;
	gap: .375rem;
	color: var(--np-ink);
	text-decoration: none;
}

.np-post__media{
	display: block;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background: var(--np-night);
	margin-bottom: .625rem;
}

.np-post__media img{
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 600ms var(--np-ease);
}

.np-post:hover .np-post__media img{ transform: scale(1.03); }

.np-post__cat{
	color: var(--np-brand-ink);
}

.np-post__h{
	font-size: 1.25rem;
	line-height: 1.1;
	margin: 0;
	transition: color var(--np-speed) var(--np-ease);
}

.np-post:hover .np-post__h{ color: var(--np-brand-ink); }

.np-post__p{
	font-size: .9375rem;
	line-height: 1.45;
	color: var(--np-muted);
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.np-post__date{
	padding-top: .5rem;
}

/* Paginacion: la de Bootstrap con sus variables. */
.np-pagination{
	margin-top: 2.5rem;
	padding-top: 1.5rem;
	border-top: 1px solid var(--np-ink);
}

.np-pagination .pagination{
	--bs-pagination-color:               var(--np-ink);
	--bs-pagination-bg:                  transparent;
	--bs-pagination-border-color:        var(--np-line);
	--bs-pagination-border-radius:       0;
	--bs-pagination-hover-color:         var(--np-ink);
	--bs-pagination-hover-bg:            var(--np-ground);
	--bs-pagination-hover-border-color:  var(--np-ink);
	--bs-pagination-focus-color:         var(--np-ink);
	--bs-pagination-focus-bg:            var(--np-ground);
	--bs-pagination-active-color:        var(--np-night-ink);
	--bs-pagination-active-bg:           var(--np-ink);
	--bs-pagination-active-border-color: var(--np-ink);
	--bs-pagination-disabled-color:      var(--np-muted);
	--bs-pagination-disabled-bg:         transparent;
	--bs-pagination-disabled-border-color: var(--np-line-soft);
	--bs-pagination-font-size:           .9375rem;
	--bs-pagination-padding-x:           .875rem;
	--bs-pagination-padding-y:           .5rem;
	flex-wrap: wrap;
	gap: .375rem;
}

.np-pagination .page-link{
	font-weight: 600;
	margin: 0;
}

/* Articulo */
.np-article__head{
	padding-bottom: 1.75rem;
}

.np-article__by{
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .5rem;
	margin: 1.25rem 0 0;
	font-size: .9375rem;
}

.np-article__by a{
	font-weight: 600;
	color: var(--np-ink);
	text-decoration: none;
	border-bottom: 2px solid var(--np-brand);
}

.np-article__cover{
	aspect-ratio: 2 / 1;
	overflow: hidden;
	background: var(--np-night);
	margin-bottom: 2.5rem;
}

.np-article__cover img{
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.np-prose--article{
	max-width: 68ch;
	font-size: 1.0625rem;
	line-height: 1.6;
}

.np-prose--article h3{
	font-size: 1.15rem;
	margin: 1.5rem 0 .5rem;
}

.np-prose--article img{
	max-width: 100%;
	height: auto;
	display: block;
	margin: 1.5rem 0;
}

.np-prose--article blockquote{
	margin: 1.5rem 0;
	padding-left: 1.125rem;
	border-left: 3px solid var(--np-brand);
	color: var(--np-muted);
}

.np-prose--article table{
	width: 100%;
	margin: 1.5rem 0;
	border-collapse: collapse;
	font-size: .9375rem;
}

.np-prose--article th,
.np-prose--article td{
	padding: .5rem .625rem;
	border-bottom: 1px solid var(--np-line-soft);
	text-align: left;
	vertical-align: top;
}

.np-prose--article th{
	font-family: var(--np-mono);
	font-size: .625rem;
	letter-spacing: .11em;
	text-transform: uppercase;
	font-weight: 400;
	color: var(--np-muted);
	border-bottom-color: var(--np-ink);
}

/* Video o documento convertido en enlace (§31). */
.np-embed{
	display: inline-flex;
	align-items: center;
	gap: .625rem;
	font-weight: 600;
	color: var(--np-ink);
	text-decoration: none;
	border-left: 3px solid var(--np-brand);
	padding: .25rem 0 .25rem 1rem;
}

.np-embed::before{
	content: "";
	width: 0;
	height: 0;
	border-style: solid;
	border-width: .375rem 0 .375rem .625rem;
	border-color: transparent transparent transparent var(--np-brand-ink);
}

.np-embed:hover{ color: var(--np-brand-ink); }

.np-article__bridge{
	margin-top: 1.5rem;
	padding-top: 1.25rem;
	border-top: 1px solid var(--np-ink);
}

.np-article__bridge .np-label{ display: block; margin-bottom: .625rem; }

.np-article__bridge-p{
	margin: .625rem 0 0;
	font-size: .875rem;
	color: var(--np-muted);
}


/* Paginas de error: mismo contenedor y cabecera que una pagina interior. */
.np-error{
	min-height: 60vh;
}

/* La cabecera ya trae su filete: las filas no repiten el suyo. */
.np-error .np-doors{ border-top: 0; }

.np-error .np-door__h{
	font-size: clamp(1.25rem, 2.4vw, 1.5rem);
}

.np-error__cta{
	margin-top: 2.25rem;
}


/* Legales: indice lateral de documentos. */
.np-legal__list{
	border-top: 1px solid var(--np-line-soft);
}

.np-legal__item{
	display: flex;
	flex-direction: column;
	gap: .125rem;
	padding: .625rem 0;
	border-bottom: 1px solid var(--np-line-soft);
}

.np-legal__item a,
.np-legal__item > span:first-child{
	font-family: var(--np-display);
	font-weight: 700;
	font-size: 1rem;
	color: var(--np-ink);
	text-decoration: none;
}

.np-legal__item a:hover{ color: var(--np-brand-ink); }

.np-legal__item.is-active{
	border-left: 3px solid var(--np-brand);
	padding-left: .75rem;
}


/* Visita virtual: portada ancha con play; el tour se abre en su pestana. */
.np-video--wide{
	margin-bottom: 1.5rem;
}

.np-video--wide .np-video__media{
	aspect-ratio: 21 / 9;
}


/* ==========================================================================
   23. Crédito de EENDA (cierre de la web)
   --------------------------------------------------------------------------
   Franja en hueso bajo el pie oscuro, texto pequeño y centrado. El latido
   del corazón se para con prefers-reduced-motion.
   ========================================================================== */

.np-credito{
	background: var(--np-ground);
	color: var(--np-muted);
	font-size: .8125rem;
	text-align: center;
	padding: 1.125rem 0;
}

.np-credito p{
	margin: 0;
}

.np-credito__corazon{
	color: var(--np-brand);
	vertical-align: -2px;
	margin: 0 .15rem;
	animation: np-latido 1.6s ease-in-out infinite;
}

.np-credito a{
	color: var(--np-ink);
	font-weight: 600;
	text-decoration: none;
	border-bottom: 1px solid var(--np-brand);
}

.np-credito a:hover{
	color: var(--np-brand-ink);
}

@keyframes np-latido{
	0%, 100%{ transform: scale(1); }
	14%{ transform: scale(1.25); }
	28%{ transform: scale(1); }
	42%{ transform: scale(1.18); }
	70%{ transform: scale(1); }
}

@media (prefers-reduced-motion: reduce){
	.np-credito__corazon{ animation: none; }
}


/* ==========================================================================
   11. Distintivo de contenido de muestra
   --------------------------------------------------------------------------
   El §78 exige marcar como tal el contenido provisional. Lo enciende
   $config['contenido']['borrador'] en require/custom-vars.php.

   No se pasa a produccion con este distintivo puesto.
   ========================================================================== */

/* Marca la cifra concreta que aun no tiene fuente, no la franja entera. */
.np-sample-inline{
	color: var(--np-brand-ink);
	letter-spacing: .13em;
}

.np-sample{
	position: absolute;
	top: 1rem;
	left: 1rem;
	z-index: 4;
	background: var(--np-brand);
	color: var(--np-ink);
	font-family: var(--np-mono);
	font-size: .59375rem;
	letter-spacing: .13em;
	text-transform: uppercase;
	padding: .25rem .5625rem;
	margin: 0;
}

/*
 * En flujo, no flotando: para franjas donde no hay un panel al que anclarlo.
 *
 * Va DESPUES de .np-sample a proposito. Con la misma especificidad gana la
 * ultima regla, y declarado antes el position:absolute de la clase base lo
 * anulaba: el distintivo se iba a la esquina del documento.
 */
.np-sample--static{
	position: static;
	display: inline-block;
	margin: 1.25rem 0;
}
