/* ==========================================================================
   JNG — Estilos
   Medidas y colores tomados del diseño (Diseño-web-JNG-HOME, artboard 1920px).
   ========================================================================== */

/* ---- Fuentes ---- */
@font-face {
	font-family: 'Futura Std';
	src: url('../fonts/FuturaStd-Light.woff2') format('woff2');
	font-weight: 300;
	font-display: swap;
}
@font-face {
	font-family: 'Futura Std';
	src: url('../fonts/FuturaStd-Book.woff2') format('woff2');
	font-weight: 400;
	font-display: swap;
}
@font-face {
	font-family: 'Futura Std';
	src: url('../fonts/FuturaStd-Medium.woff2') format('woff2');
	font-weight: 500;
	font-display: swap;
}
@font-face {
	font-family: 'Jost';
	src: url('../fonts/Jost-VariableFont_wght.woff2') format('woff2');
	font-weight: 100 900;
	font-display: swap;
}

/* ---- Tokens (muestreados del PDF) ---- */
:root {
	--c-red: #a50001;        /* rojo corporativo (bloques) */
	--c-red-dark: #7e0001;
	--c-accent: #fa3402;     /* rojo-naranja de etiquetas, títulos y mapa */
	--c-dark: #211316;       /* marrón casi negro */
	--c-cream: #f0e0d1;      /* crema */
	--c-green: #5c5e27;      /* verde oliva sostenibilidad */
	--c-orange: #ec5411;     /* naranja de la página de contacto */
	--c-wine: #531017;       /* granate de las fichas de especificaciones */
	--c-white: #ffffff;

	--f-display: 'Futura Std', 'Jost', sans-serif;
	--f-body: 'Jost', sans-serif;

	--header-h: 78px;                          /* barra blanca del diseño */
	--gutter: clamp(1.25rem, 4.4vw, 5.3rem);   /* 85px a 1920 */
	--gutter-lg: clamp(2rem, 7.8vw, 9.4rem);   /* 150px a 1920 */
	--section-y: clamp(4rem, 7.3vw, 8.75rem);  /* 140px a 1920 */

	--fs-hero: clamp(2.6rem, 4.567vw, 5.5rem);      /* 87.7px a 1920 (altura de caja = 64px del diseño) */
	--fs-claim: clamp(2.4rem, 4.7vw, 5.6rem);       /* ~90px */
	--fs-h2: clamp(2rem, 3.75vw, 4.5rem);           /* ~72px */
	--fs-stat: clamp(2rem, 3.18vw, 3.9rem);         /* 61px a 1920 */
	--fs-body: clamp(0.95rem, 0.99vw, 1.19rem);     /* ~19px */

	--hairline-light: 1px solid rgb(240 224 209 / 38%);
	--hairline-dark: 1px solid rgb(33 19 22 / 18%);

	--ease: cubic-bezier(0.22, 1, 0.36, 1);
	--dur: 1.1s;
}

/* ---- Reset mínimo ---- */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; scroll-padding-top: 84px; }
body {
	margin: 0;
	font-family: var(--f-body);
	font-weight: 300;
	font-size: var(--fs-body);
	color: var(--c-dark);
	background: var(--c-white);
	line-height: 1.55;
	-webkit-font-smoothing: antialiased;
}
img { max-width: 100%; height: auto; display: block; }
a { color: inherit; }
p { margin: 0 0 1em; }
h1, h2, h3 { font-family: var(--f-display); font-weight: 300; line-height: 1.08; margin: 0 0 0.5em; }
.screen-reader-text { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }

/* Líneas de título con pesos mezclados («Better source,» media / resto fina) */
.title-line { display: block; }
.title-line--strong { font-weight: 500; }
.title-line--thin { font-weight: 300; }

/* ---- Utilidades ---- */
.section--dark  { background: var(--c-dark); color: var(--c-white); }
.section--red   { background: var(--c-red); color: var(--c-cream); }
.section--cream { background: var(--c-cream); color: var(--c-dark); }
.section--green { background: var(--c-green); color: var(--c-cream); }
.section--orange { background: var(--c-orange); color: var(--c-white); }
.section--white { background: var(--c-white); color: var(--c-dark); }

/* Flecha larga y fina del diseño */
.arrow {
	display: inline-block;
	width: 3.4em; height: 1px;
	background: currentColor;
	position: relative;
	vertical-align: middle;
}
.arrow::after {
	content: '';
	position: absolute; right: 0; top: 50%;
	width: 0.55em; height: 0.55em;
	border-top: 1px solid currentColor;
	border-right: 1px solid currentColor;
	transform: translateY(-50%) rotate(45deg) scaleY(0.9);
}
.arrow--left { transform: rotate(180deg); }

/* Botones */
/* Medidas del diseño: caja de 284×60 con texto de 15px y flecha larga de 3.3em. */
.btn {
	display: inline-flex;
	align-items: center;
	gap: 1.14em;
	font-family: var(--f-body);
	font-size: clamp(0.8rem, 0.776vw, 1rem);
	font-weight: 400;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
	line-height: 1.2;
	padding: 1.36em 1.95em;
	border: 1px solid currentColor;
	background: transparent;
	transition: background 0.3s, color 0.3s, border-color 0.3s;
}
/* Flecha del diseño: línea fina larga con punta en ángulo. */
.btn--arrow { position: relative; }
.btn--arrow::after {
	content: '';
	width: 3.3em;
	height: 1px;
	background: currentColor;
}
.btn--arrow::before {
	content: '';
	position: absolute;
	right: 1.95em;
	top: 50%;
	width: 0.42em;
	height: 0.42em;
	border-top: 1px solid currentColor;
	border-right: 1px solid currentColor;
	transform: translate(1px, -50%) rotate(45deg);
}
.btn--red { background: var(--c-red); border-color: var(--c-red); color: var(--c-white); }
.btn--red:hover { background: var(--c-red-dark); border-color: var(--c-red-dark); }
.btn--dark { background: var(--c-dark); border-color: var(--c-dark); color: var(--c-cream); }
.btn--dark:hover { background: transparent; color: var(--c-dark); }
.btn--cream { background: var(--c-cream); border-color: var(--c-cream); color: var(--c-dark); }
.btn--cream:hover { background: transparent; color: var(--c-cream); }
.btn--outline-light:hover { background: var(--c-cream); color: var(--c-dark); }
.btn--outline-dark:hover { background: var(--c-dark); color: var(--c-cream); }

/* ==========================================================================
   Preloader — la foto del hero a pantalla completa con el logo encima; al
   terminar, la foto se encoge hasta su hueco de la retícula (ref. godaylight)
   ========================================================================== */
.preloader {
	position: fixed;
	inset: 0;
	z-index: 9999;
	display: grid;
	place-items: center;
	background: var(--c-dark);
	transition: background-color 0.7s var(--ease), opacity 0.45s var(--ease);
}
/* El marco que viaja: empieza a pantalla completa y acaba en la celda del hero.
   La imagen va con object-fit:cover, así que se recorta sola al encogerse.
   (FRA-279: se probó a animar solo `transform` para bajar el CLS -0,32
   medido-, pero dos intentos distintos dieron una regresión visual real
   sobre el elemento real -no reproducida en pruebas sobre un div nuevo,
   ver el comentario en main.js- y el segundo intento encima medía un CLS
   peor -~1,0- con un layout-shift instantáneo. Se mantiene el resize real,
   que es el que se ve suave; el CLS del morph queda fuera de alcance.) */
.preloader__media {
	position: fixed;
	top: 0; right: 0; bottom: 0; left: 0;
	overflow: hidden;
	transition:
		top 0.95s var(--ease), right 0.95s var(--ease),
		bottom 0.95s var(--ease), left 0.95s var(--ease);
}
/* Misma geometría que .parallax > img: la foto del hero es más alta que su
   celda para poder moverse, y si el marco que aterriza no la recortara igual
   habría un salto justo al acabar el viaje. */
.preloader__media-img {
	position: absolute;
	top: 50%;
	left: 0;
	width: 100%;
	height: calc(100% + 2 * var(--parallax-holgura, 0px));
	object-fit: cover;
	transform: translate3d(0, calc(-50% + var(--parallax, 0px)), 0);
}
.preloader__veil { position: absolute; inset: 0; background: rgb(20 14 14 / 28%); transition: opacity 0.6s var(--ease); }
.preloader__logo {
	position: relative;
	z-index: 2;
	opacity: 0;
	transform: translateY(12px);
	animation: preloader-logo 0.9s var(--ease) 0.15s forwards;
	transition: opacity 0.35s var(--ease), transform 0.35s var(--ease);
}
.preloader__img { width: clamp(200px, 26vw, 460px); }
@keyframes preloader-logo { to { opacity: 1; transform: none; } }
/* Se va el logo y el fondo oscuro; queda solo la foto viajando. */
.preloader.is-opening { background-color: transparent; }
.preloader.is-opening .preloader__logo { opacity: 0; transform: translateY(-10px); animation: none; }
.preloader.is-opening .preloader__veil { opacity: 0; }
.preloader.is-done { opacity: 0; pointer-events: none; }
/* Sin foto (páginas sin hero) se mantiene el barrido de siempre. */
.preloader:not(.preloader--media) { transition: clip-path 1s var(--ease), opacity 0.45s var(--ease); }
.preloader:not(.preloader--media).is-done { clip-path: inset(0 0 100% 0); }
body.is-loading { overflow: hidden; }

/* ---- Reveals ---- */
.reveal {
	opacity: 0;
	transform: translateY(28px);
	transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.reveal.is-visible { opacity: 1; transform: none; }

/* ---- Máscara: el texto sube desde detrás de su propia caja ----------------
   Para los titulares grandes, donde el fade genérico se queda corto. El
   elemento recorta y el <span> de dentro es el que viaja. Sirve tanto si la
   máscara es el propio .reveal como si el .reveal es un ancestro (una palabra
   sobre una foto, por ejemplo).
   El padding compensado deja sitio a las colas de las letras sin mover nada. */
.mask {
	display: block;
	overflow: hidden;
	padding-bottom: 0.12em;
	margin-bottom: -0.12em;
}
.mask > span {
	display: block;
	transform: translateY(110%);
	transition: transform 1.05s var(--ease);
}
.mask.is-visible > span,
.is-visible .mask > span { transform: none; }
/* Un titular partido en líneas las va soltando de arriba abajo (--i lo pone
   jng_title_lines). */
.mask > span { transition-delay: calc(var(--i, 0) * 0.1s); }
/* La máscara ya esconde el texto: sin fade ni desplazamiento encima. */
.reveal.mask,
.reveal:has(> .mask) { opacity: 1; transform: none; }

/* ---- Carruseles: arrastre con el ratón ------------------------------------
   Los tres carriles (productos, entradas y el bloque slider) se pueden llevar
   con el ratón. Mientras dura el arrastre no hay snap ni scroll suave, o cada
   uno tiraría para su lado. */
.productos__track, .blog__track, .slider__track { cursor: grab; }
.productos__track.is-dragging,
.blog__track.is-dragging,
.slider__track.is-dragging {
	cursor: grabbing;
	scroll-snap-type: none;
	scroll-behavior: auto;
}
/* Sin esto el navegador arrastra la propia foto en vez del carril. */
.productos__track img, .blog__track img, .slider__track img {
	-webkit-user-drag: none;
	user-select: none;
}

@media (prefers-reduced-motion: reduce) {
	.reveal, .preloader, .preloader__media, .preloader__logo { transition: none; animation: none; }
	.reveal { opacity: 1; transform: none; }
	.mask { overflow: visible; }
	.mask > span { transform: none; transition: none; }
	/* La barra se muestra llena, sin recorrido. */
	.hero__meter-fill { width: 100%; animation: none; }
	.hero__meter-fill::after { display: none; }
	/* El mapa aparece entero, sin barrido. */
	.cifras__map, .cifras__map.is-visible { animation: none; -webkit-mask-image: none; mask-image: none; }
	/* Con «reducir movimiento» se apaga el vídeo de fondo del hero y se queda
	   la imagen de debajo (misma foto, puesta como portada/respaldo). */
	.hero__bg-video { display: none; }
}

/* ==========================================================================
   Header — barra blanca fija, logo oscuro (como el diseño)
   ========================================================================== */
.site-header {
	/* El alto sale de estas dos: lo necesitan el desplegable, que cuelga del
	   borde de abajo de la barra, y el menú móvil, que arranca debajo. */
	--header-pad-y: 19px;
	--header-logo: clamp(30px, 2.08vw, 40px);
	--header-h: calc(2 * var(--header-pad-y) + var(--header-logo));
	position: sticky;
	top: 0; left: 0; right: 0;
	z-index: 100;
	background: var(--c-white);
	color: var(--c-dark);
}
/* Diseño: 78px de alto, logo de 40px, márgenes de 60px y nav a la derecha. */
.site-header__inner {
	padding: var(--header-pad-y) clamp(1.25rem, 3.13vw, 3.75rem);
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 2rem;
}
.site-logo, .site-header__brand img { height: var(--header-logo); width: auto; }
/* El nav se estira a toda la barra para que el desplegable pueda colgar de su
   borde inferior y no de la mitad del texto. */
.site-nav { align-self: stretch; display: flex; align-items: center; }
.site-nav__list {
	display: flex;
	align-items: stretch;
	height: 100%;
	gap: clamp(1.4rem, 2.6vw, 3.2rem);
	list-style: none;
	margin: 0; padding: 0;
}
.site-nav__list > li { display: flex; align-items: center; }
.site-nav__list a {
	font-size: clamp(0.75rem, 0.75vw, 0.95rem);
	font-weight: 400;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	text-decoration: none;
}
.site-nav__list a:hover,
.site-nav__list .current-menu-item > a,
.site-nav__list .current_page_item > a { color: var(--c-red); }
.site-nav__pie { display: none; }

/* ---- Selector de idioma (Polylang): ES · EN · FR --------------------- */
.site-lang {
	display: flex;
	gap: 0.9rem;
	list-style: none;
	margin: 0 0 0 clamp(1.4rem, 2.6vw, 3.2rem);
	padding: 0;
}
.site-lang a {
	font-size: clamp(0.75rem, 0.75vw, 0.95rem);
	letter-spacing: 0.06em;
	text-decoration: none;
	opacity: 0.55;
}
.site-lang a:hover,
.site-lang a[aria-current] { opacity: 1; }
.site-lang a[aria-current] { color: var(--c-red); }
/* Con el overlay abierto el fondo seguía haciendo scroll por debajo. */
body.nav-abierto { overflow: hidden; }

/* ---- El desplegable de «Productos» -------------------------------------
   Panel blanco colgado del elemento, con la misma hairline que el resto del
   sitio. Se abre al pasar el ratón, al enfocar con el teclado y al pulsar la
   flechita: los tres caminos acaban en el mismo estado. */
.site-nav__list > .menu-item-has-children { position: relative; gap: 0.4em; }
/* Entre el enlace y el panel queda el padding de la barra: sin este puente el
   ratón sale del `li` a mitad de camino y el desplegable se cierra solo. Va
   por debajo del enlace, así que no le roba el clic. */
.site-nav__list > .menu-item-has-children::after {
	content: '';
	position: absolute;
	top: 100%; left: 0; right: 0;
	height: var(--header-pad-y);
}
.site-nav__toggle {
	background: none; border: 0; padding: 0; cursor: pointer; color: inherit;
	width: 0.6em; height: 0.6em;
	border-right: 1.5px solid currentColor;
	border-bottom: 1.5px solid currentColor;
	transform: translateY(-0.18em) rotate(45deg);
	transition: transform 0.3s var(--ease), color 0.3s var(--ease);
}
.site-nav__list > .menu-item-has-children:hover > .site-nav__toggle,
.site-nav__list > .menu-item-has-children.is-open > .site-nav__toggle { color: var(--c-red); }
.site-nav__sub {
	position: absolute;
	/* Cuelga del borde de abajo de la barra, no del texto: el `li` llega hasta
	   el final del content box y falta justo el padding de la cabecera. */
	top: calc(100% + var(--header-pad-y));
	left: calc(-1 * clamp(1rem, 1.4vw, 1.6rem));
	margin: 0; padding: clamp(0.9rem, 1.1vw, 1.3rem) 0;
	list-style: none;
	min-width: max(220px, 100%);
	background: var(--c-white);
	border: 1px solid rgb(33 19 22 / 12%);
	box-shadow: 0 18px 40px rgb(33 19 22 / 8%);
	opacity: 0;
	visibility: hidden;
	transform: translateY(-6px);
	transition: opacity 0.25s var(--ease), transform 0.25s var(--ease), visibility 0.25s;
}
.site-nav__list > .menu-item-has-children:hover > .site-nav__sub,
.site-nav__list > .menu-item-has-children:focus-within > .site-nav__sub,
.site-nav__list > .menu-item-has-children.is-open > .site-nav__sub {
	opacity: 1; visibility: visible; transform: translateY(0);
}
.site-nav__sub a {
	display: block;
	padding: 0.5rem clamp(1rem, 1.4vw, 1.6rem);
	letter-spacing: 0.08em;
	white-space: nowrap;
	transition: color 0.2s var(--ease);
}
.site-nav__sub-item--todos {
	margin-top: 0.55rem;
	padding-top: 0.55rem;
	border-top: 1px solid rgb(33 19 22 / 12%);
}
.site-nav__sub-item--todos a { color: var(--c-red); }

.site-header__toggle { display: none; }

@media (max-width: 900px) {
	/* ---- Menú móvil: pantalla completa, tipos grandes y el submenú a la
	   vista. En táctil no hay hover, así que el desplegable de productos es un
	   acordeón y los objetivos miden 44px de alto como mínimo. ---- */
	.site-nav {
		position: fixed;
		inset: 0;
		display: flex;
		flex-direction: column;
		align-items: stretch;   /* el nav de escritorio los centra */
		background: var(--c-white);
		padding: calc(var(--header-h) + 1.5rem) var(--gutter) calc(var(--gutter) + 1rem);
		overflow-y: auto;
		overscroll-behavior: contain;
		opacity: 0;
		visibility: hidden;
		transition: opacity 0.35s var(--ease), visibility 0.35s;
	}
	.site-header.is-open .site-nav { opacity: 1; visibility: visible; }
	/* El logo y el botón se mantienen por encima del overlay. */
	.site-header__brand { position: relative; z-index: 12; }

	.site-nav__list { flex-direction: column; gap: 0; }
	.site-lang { margin: 1.5rem 0 0; gap: 0.25rem; }
	.site-lang a { display: block; padding: 0.7rem 0.9rem 0.7rem 0; font-size: 1rem; }
	.site-nav__list > li {
		display: block;   /* en escritorio son flex para centrarse en la barra */
		border-bottom: 1px solid rgb(33 19 22 / 12%);
		/* Entran escalonadas detrás del overlay, como los reveals del sitio. */
		opacity: 0;
		transform: translateY(14px);
		transition: opacity 0.45s var(--ease), transform 0.45s var(--ease);
	}
	.site-header.is-open .site-nav__list > li { opacity: 1; transform: none; }
	.site-header.is-open .site-nav__list > li:nth-child(1) { transition-delay: 0.08s; }
	.site-header.is-open .site-nav__list > li:nth-child(2) { transition-delay: 0.13s; }
	.site-header.is-open .site-nav__list > li:nth-child(3) { transition-delay: 0.18s; }
	.site-header.is-open .site-nav__list > li:nth-child(4) { transition-delay: 0.23s; }
	.site-header.is-open .site-nav__list > li:nth-child(5) { transition-delay: 0.28s; }
	.site-header.is-open .site-nav__list > li:nth-child(6) { transition-delay: 0.33s; }
	.site-nav__list > li > a {
		display: block;
		padding: 0.85rem 0;
		font-family: var(--f-display);
		font-weight: 300;
		font-size: clamp(1.35rem, 6.4vw, 1.9rem);
		letter-spacing: 0.02em;
	}

	/* El elemento con hijos deja de ser flex en línea: el enlace ocupa el
	   ancho, la flecha se va al extremo con 44px de lado propios y el submenú
	   cae en una segunda fila que se abre de 0fr a 1fr. Esa es la fila que se
	   anima: `auto` no transiciona y un `max-height` obligaría a adivinar
	   cuánto mide el submenú. */
	.site-nav__list > .menu-item-has-children {
		display: grid;
		grid-template-columns: 1fr auto;
		grid-template-rows: auto 0fr;
		align-items: center;
		gap: 0;
		transition: grid-template-rows 0.35s var(--ease);
	}
	.site-nav__list > .menu-item-has-children.is-open { grid-template-rows: auto 1fr; }
	/* El puente del hover no pinta nada pero taparía el elemento siguiente. */
	.site-nav__list > .menu-item-has-children::after { display: none; }
	.site-nav__toggle {
		width: 44px; height: 44px;
		border: 0;
		transform: none;
		display: grid;
		place-content: center;
		justify-self: end;
	}
	.site-nav__toggle::after {
		content: '';
		width: 9px; height: 9px;
		border-right: 1.5px solid currentColor;
		border-bottom: 1.5px solid currentColor;
		transform: translateY(-2px) rotate(45deg);
		transition: transform 0.3s var(--ease);
	}
	.menu-item-has-children.is-open > .site-nav__toggle::after { transform: translateY(2px) rotate(225deg); }

	.site-nav__sub {
		grid-column: 1 / -1;
		align-self: stretch;   /* que mida lo que la fila, para poder recortar */
		position: static;
		display: block;
		min-width: 0;
		min-height: 0;
		overflow: hidden;
		padding: 0;
		border: 0;
		box-shadow: none;
		opacity: 1;
		visibility: visible;
		transform: none;
		transition: none;
	}
	.site-nav__sub a {
		padding: 0.6rem 0 0.6rem 1.1rem;
		white-space: normal;
		border-left: 1px solid rgb(33 19 22 / 14%);
		font-size: 0.9rem;
	}
	.site-nav__sub-item:first-child a { padding-top: 0; }
	.site-nav__sub-item:last-child a { padding-bottom: 1.1rem; }
	.site-nav__sub-item--todos { margin-top: 0; padding-top: 0; border-top: 0; }

	/* Contacto al pie del panel: en móvil es el atajo más útil del menú. */
	.site-nav__pie {
		display: flex;
		flex-wrap: wrap;
		gap: 0.4rem 1.4rem;
		margin-top: auto;
		padding-top: 2.5rem;
		font-size: 0.85rem;
		letter-spacing: 0.06em;
	}
	.site-nav__pie a { text-decoration: none; }
	.site-nav__contacto { color: var(--c-red); }
	.site-nav__social { opacity: 0.65; text-transform: uppercase; }

	/* 44px de lado: es el objetivo táctil mínimo cómodo, y este botón es el
	   único acceso a la navegación en móvil. El padding lo agranda sin tocar
	   el dibujo de las dos rayas. */
	.site-header__toggle {
		display: grid; place-content: center;
		background: none; border: 0; z-index: 10; cursor: pointer; color: inherit;
		min-width: 44px; min-height: 44px;
		margin-right: -0.5rem;
	}
	.site-header__burger { display: grid; gap: 6px; }
	.site-header__bar {
		display: block; width: 26px; height: 1.5px;
		background: currentColor;
		transition: transform 0.35s var(--ease);
	}
	/* 6px de hueco + 1.5px de barra = 7,5px entre ejes: cada una recorre la
	   mitad para cruzarse en el centro exacto. */
	.site-header.is-open .site-header__bar:first-child { transform: translateY(3.75px) rotate(45deg); }
	.site-header.is-open .site-header__bar:last-child { transform: translateY(-3.75px) rotate(-45deg); }
}

@media (prefers-reduced-motion: reduce) {
	.site-nav, .site-nav__list > li, .site-nav__sub, .site-header__bar,
	.site-nav__list > .menu-item-has-children { transition: none; }
	.site-nav__list > li { opacity: 1; transform: none; }
}

/* ==========================================================================
   1 · Hero
   --------------------------------------------------------------------------
   Retícula calcada del diseño (artboard 1920×1080, cabecera de 78px):
     columnas  →  main 67.19% | rail 18.18% (líneas en x=1290 y x=1639) | links 14.64%
     filas     →  24.65% | 43.5% | 31.85%  (líneas a 243px y 672px del top del hero)
   ========================================================================== */
.hero {
	--hero-line: rgb(240 224 209 / 85%);   /* las líneas del diseño son crema casi opacas */
	/* Encima de 1180px las hairlines las pinta .hero__lines, que sí se puede
	   animar; los bordes de las celdas se quedan en transparente para no
	   duplicarlas sin tocar la caja. Por debajo vuelven a ser los bordes. */
	--hero-grid-line: var(--hero-line);
	--hero-rail-pad: clamp(0.75rem, 1.04vw, 1.4rem);   /* 20px @1920 */
	--hero-links-pad: clamp(0.9rem, 1.3vw, 1.7rem);    /* 25px @1920 */
	position: relative;
	min-height: calc(100svh - var(--header-h));
	display: grid;
	color: var(--c-white);
	overflow: hidden;
}
.hero__bg { position: absolute; inset: 0; }
.hero__bg img, .hero__bg video {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	/* El horizonte cae al 29.5% del alto del hero, como en el diseño. */
	object-position: center 36%;
	/* El diseño usa la foto muy apagada: cielo gris azulado y campo oscuro. */
	filter: brightness(0.5) saturate(0.92);
}
/* El vídeo va encima de la imagen (que se queda de portada/respaldo detrás). */
.hero__bg-video { z-index: 1; }
.hero__bg::after {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(180deg, rgb(20 14 14 / 16%) 0%, rgb(20 14 14 / 0%) 28%, rgb(20 14 14 / 0%) 62%, rgb(20 14 14 / 32%) 100%);
}

.hero__grid {
	position: relative;
	z-index: 2;
	display: grid;
	grid-template-columns: 1fr 18.18% 14.64%;
	/* FRA-617: la fila del titular+texto (43.5fr) se quedaba corta cuando el
	   contenido del panel era largo (p. ej. Sostenibilidad, "Transición a la
	   Agricultura Regenerativa"): el texto desbordaba `.hero__cell--main` y
	   chocaba con la hairline inferior. `minmax(min-content, 43.5fr)` deja el
	   reparto proporcional intacto mientras el contenido quepa (es el mismo
	   valor calculado, sin cambio visible) y solo fuerza la fila a crecer
	   cuando no quepa. */
	grid-template-rows: 24.65fr minmax(min-content, 43.5fr) 31.85fr;
}
.hero__cell { min-width: 0; }
/* Hairlines de la retícula: bordes de las propias celdas. */
.hero__cell--kicker, .hero__cell--meter, .hero__cell--void-top { border-bottom: 1px solid var(--hero-grid-line); }
.hero__cell--cta, .hero__cell--since, .hero__cell--void-bottom { border-top: 1px solid var(--hero-grid-line); }
.hero__cell--meter, .hero__cell--media, .hero__cell--since {
	border-left: 1px solid var(--hero-grid-line);
	border-right: 1px solid var(--hero-grid-line);
}

/* ---- Las hairlines, dibujándose al entrar ----------------------------------
   Mismas posiciones que los bordes de arriba, pero en una capa aparte para
   poder escalarlas: las verticales caen de arriba abajo y las horizontales
   se trazan de izquierda a derecha, antes de que entre el contenido.
   Los porcentajes salen de la propia retícula (columnas 1fr/18.18%/14.64%,
   filas 24.65/43.5/31.85): si se toca grid-template hay que tocarlos aquí. */
.hero__lines { display: none; }
@media (min-width: 1181px) {
	.hero { --hero-grid-line: transparent; }
	.hero__lines {
		display: block;
		position: absolute;
		inset: 0;
		pointer-events: none;
		/* Es un .reveal solo para engancharse a la cascada: no se desvanece. */
		opacity: 1;
		transform: none;
	}
	.hero__line {
		position: absolute;
		background: var(--hero-line);
		transition: transform 1s var(--ease);
	}
	.hero__line--v1, .hero__line--v2 {
		top: 0; bottom: 0; width: 1px;
		transform: scaleY(0);
		transform-origin: top;
	}
	.hero__line--v1 { left: 67.18%; }               /* 100 − 18.18 − 14.64 */
	.hero__line--v2 { right: 14.64%; }              /* último píxel del raíl */
	.hero__line--h1, .hero__line--h2 {
		left: 0; right: 0; height: 1px;
		transform: scaleX(0);
		transform-origin: left;
	}
	.hero__line--h1 { top: 24.65%; margin-top: -1px; }   /* borde inferior de la fila 1 */
	.hero__line--h2 { top: 68.15%; }                     /* 24.65 + 43.5 */
	.hero__lines.is-visible .hero__line { transform: none; }
	.hero__lines.is-visible .hero__line--v1 { transition-delay: 0.12s; }
	.hero__lines.is-visible .hero__line--v2 { transition-delay: 0.2s; }
	.hero__lines.is-visible .hero__line--h2 { transition-delay: 0.3s; }
}
@media (prefers-reduced-motion: reduce) {
	.hero__line, .hero__lines.is-visible .hero__line { transition: none; transform: none; }
}

/* Fila 1 — claim y medidor, alineados abajo contra la línea */
.hero__cell--kicker {
	display: flex;
	align-items: flex-end;
	padding: 0 0 clamp(0.8rem, 1.3vw, 1.7rem) var(--gutter-lg);
}
.hero__kicker {
	margin: 0;
	font-size: clamp(0.82rem, 0.94vw, 1.15rem);   /* 18px @1920 */
	letter-spacing: 0.1em;
	text-transform: uppercase;
	line-height: 1.2;
}
.hero__cell--meter {
	display: flex;
	align-items: flex-end;
	padding: 0 var(--hero-rail-pad) clamp(0.65rem, 0.95vw, 1.25rem);
}
.hero__meter { width: 100%; }
.hero__meter-bar {
	display: block;
	width: clamp(96px, 7.92vw, 200px);
	height: clamp(9px, 0.63vw, 15px);
	border: 1px solid var(--hero-line);
	margin-bottom: clamp(0.4rem, 0.5vw, 0.7rem);
	overflow: hidden;
}
/* Se rellena hasta el 100% al entrar el hero, con un brillo que recorre la barra. */
.hero__meter-fill {
	display: block;
	width: 0;
	height: 100%;
	background: var(--c-cream);
	position: relative;
}
.hero__meter-fill::after {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(90deg, transparent 0%, rgb(255 255 255 / 85%) 50%, transparent 100%);
	transform: translateX(-100%);
}
/* Antes arrancaba con `.reveal.is-visible` + un animation-delay fijo (1,2s):
   ese `.is-visible` lo pone el IntersectionObserver casi al cargar la
   página (el medidor está en el primer pliegue), muy por delante del
   preloader — así que con cualquier retraso fijo la barra se rellenaba
   entera tapada por él, y solo se veía ya llena al apartarse (medido con
   `elementFromPoint` sobre el hueco de la barra: seguía tapada al 98% del
   relleno). Ahora la arranca `main.js` con la clase `.is-filling` en cuanto
   sabe de verdad que el hueco vuelve a verse -en páginas con preloader,
   encadenado a que termine (`finish()`); si no hay preloader, en cuanto el
   propio medidor entra en pantalla-, así que el relleno siempre corre con
   la barra ya visible (FRA-280). */
.hero__meter-fill.is-filling {
	animation: meter-fill 1.7s var(--ease) forwards;
}
.hero__meter-fill.is-filling::after {
	animation: meter-shine 1.7s var(--ease) forwards;
}
@keyframes meter-fill { from { width: 0; } to { width: 100%; } }
@keyframes meter-shine { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
.hero__meter-label {
	margin: 0;
	font-size: clamp(0.75rem, 0.79vw, 0.98rem);   /* 15px @1920 */
	line-height: 1.2;
}

/* Fila 2 — titular, foto de pimientos y enlaces */
.hero__cell--main {
	/* FRA-617: sin hueco a la derecha, un titular+texto largo (p. ej.
	   Sostenibilidad) llega a tocar la hairline vertical de la columna de al
	   lado -reportado por Fran contra la captura de producción. `--gutter`
	   (no `--gutter-lg`, que es el margen de página, más grande) porque este
	   es un borde interno de la retícula, no el borde de la ventana.
	   Abajo, un poco de aire también: `minmax(min-content, …)` en
	   `.hero__grid` hace que la fila crezca justo lo que hace falta, ni un
	   px más, así que sin este padding el texto tocaría la hairline
	   inferior aunque ya no la desborde. */
	padding: clamp(1.6rem, 3.4vw, 4.4rem) var(--gutter) clamp(0.8rem, 1.6vw, 2rem) var(--gutter-lg);
}
.hero__title {
	font-size: var(--fs-hero);
	line-height: 1.072;          /* 94px de interlínea sobre 87.7px de cuerpo */
	margin: 0 0 0.18em;
}
/* La segunda línea del diseño va algo más estrecha que nuestro corte Light. */
.hero__title .title-line--thin { letter-spacing: -0.026em; }
.hero__text {
	font-size: clamp(1rem, 1.084vw, 1.35rem);   /* 21px @1920 */
	line-height: 1.2;
	margin: 0;
}
.hero__cell--media { display: grid; }
.hero__media { display: block; height: 100%; }
.hero__media-img { width: 100%; height: 100%; object-fit: cover; }
.hero__cell--words {
	padding: clamp(0.8rem, 1.2vw, 1.6rem) 0 0 var(--hero-links-pad);
}
/* No son enlaces: solo las palabras que definen cada hero. */
.hero__words {
	list-style: none;
	margin: 0;
	padding: 0;
	font-size: clamp(0.7rem, 0.74vw, 0.92rem);
	line-height: 1.55;
	letter-spacing: 0.05em;
	text-transform: uppercase;
}
.hero__words li { white-space: nowrap; }

/* Fila 3 — CTA y «Since» */
.hero__cell--cta {
	padding: clamp(1rem, 1.77vw, 2.3rem) 0 0 var(--gutter-lg);
}
.hero__cta {
	display: inline-flex;
	align-items: stretch;
	min-height: clamp(46px, 3.02vw, 72px);
	background: var(--c-white);
	color: var(--c-dark);
}
.hero__cta-label {
	display: flex;
	align-items: center;
	padding-left: clamp(0.9rem, 1.25vw, 1.6rem);
	padding-right: clamp(1.2rem, 2.55vw, 3.2rem);
	font-size: clamp(0.85rem, 0.89vw, 1.1rem);   /* 17px @1920 */
	line-height: 1.2;
}
.hero__cta-btn {
	border: 0;
	padding: 0 clamp(0.8rem, 0.83vw, 1.1rem);
	font-size: clamp(0.8rem, 0.95vw, 1.15rem);  /* 18px @1920 */
	letter-spacing: 0.1em;
	justify-content: center;
}
.hero__cell--since {
	padding: clamp(0.75rem, 1vw, 1.3rem) var(--hero-rail-pad) 0;
}
.hero__since {
	margin: 0;
	font-size: clamp(0.7rem, 0.7vw, 0.88rem);
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1.2;
}

/* ==========================================================================
   2 · Intro + Cifras
   --------------------------------------------------------------------------
   Medidas del artboard 1920: divisoria a 960, bloques de cifra de 270px de
   alto, columna izquierda con 85px de margen y el mapa a 721×361.
   ========================================================================== */
.cifras { border-top: var(--hairline-light); }
.cifras__inner { display: grid; grid-template-columns: 1fr 1fr; }
.cifras__intro {
	padding: clamp(2.5rem, 3.55vw, 4.5rem) var(--gutter) clamp(3rem, 5vw, 6.2rem);
	border-right: var(--hairline-light);
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	/* Título arriba, botón abajo (con el mapamundi y el texto en medio),
	   como reparte la columna el diseño. */
	justify-content: space-between;
	gap: clamp(1.5rem, 2.8vw, 3.6rem);
}
.cifras__title {
	font-size: clamp(1.35rem, 1.786vw, 2.2rem);  /* 34.3px @1920 */
	line-height: 1.207;                           /* 41.4px de interlínea */
	font-weight: 400;
	margin: 0;
	max-width: 21em;
}
.cifras__title-red { display: block; color: var(--c-accent); }

/* Mapamundi: reserva su hueco aunque aún no esté el SVG. */
.cifras__map {
	width: 91.3%;                /* 721px sobre los 790 de columna útil @1920 */
	aspect-ratio: 721 / 361;
	margin: 0;
}
.cifras__map svg, .cifras__map-img { width: 100%; height: 100%; display: block; }
/* El SVG entregado trae los puntos en fill="currentColor" (se le quitó la clase
   .cls-1 del exportador, demasiado genérica para insertarla en la página), así
   que el color se pone aquí. Es el naranja del diseño, no el rojo de marca. */
.cifras__map { color: #fa3402; }
.cifras__map svg { overflow: visible; }
/* Respaldo: si faltara el SVG del tema y tampoco hubiera imagen en el panel,
   la caja enseña una trama de puntos en su hueco exacto. */
.cifras__map--pendiente {
	background-image: radial-gradient(circle, rgb(250 52 2 / 55%) 1.1px, transparent 1.2px);
	background-size: 9px 9px;
}
/* Barrido de izquierda a derecha al entrar en pantalla: los puntos van
   apareciendo. Funciona con cualquier SVG, sin depender de su estructura. */
.cifras__map {
	-webkit-mask-image: linear-gradient(90deg, #000 0 55%, transparent 88%);
	mask-image: linear-gradient(90deg, #000 0 55%, transparent 88%);
	-webkit-mask-size: 230% 100%;
	mask-size: 230% 100%;
	-webkit-mask-position: 100% 0;
	mask-position: 100% 0;
}
.cifras__map.is-visible {
	animation: map-sweep 2.2s var(--ease) 0.2s forwards;
}
@keyframes map-sweep {
	from { -webkit-mask-position: 100% 0; mask-position: 100% 0; }
	to   { -webkit-mask-position: 0 0;    mask-position: 0 0; }
}

.cifras__text { max-width: 36.5em; margin: 0; font-size: clamp(1rem, 1.042vw, 1.3rem); line-height: 1.3; }
.cifras__text p { margin: 0 0 1.3em; }
.cifras__text p:last-child { margin-bottom: 0; }
.cifras__cta { margin: 0; }

.cifras__list { list-style: none; margin: 0; padding: 0; display: grid; }
.cifras__item {
	display: grid;
	align-content: center;
	gap: clamp(0.5rem, 0.85vw, 1.1rem);
	min-height: clamp(170px, 14.06vw, 300px);   /* 270px @1920 */
	padding: 2rem var(--gutter) 2rem clamp(2rem, 6.5vw, 7.8rem);
	border-top: var(--hairline-light);
	transition: background-color 0.35s var(--ease);
}
.cifras__item:first-child { border-top: 0; }
/* Los bloques rojos del diseño son el hover; en reposo van en oscuro. */
.cifras__item:hover { background: var(--c-red); }
.cifras__label {
	font-size: clamp(1.15rem, 1.55vw, 1.9rem);   /* 30px @1920 */
	color: var(--c-accent);
	transition: color 0.35s var(--ease);
}
.cifras__item:hover .cifras__label { color: var(--c-white); }
.cifras__value {
	font-family: var(--f-display);
	font-weight: 400;
	font-size: var(--fs-stat);
	line-height: 1.05;
	color: var(--c-white);
}
.cifras__unit { font-size: 0.42em; }

/* ==========================================================================
   3 · Productos
   ========================================================================== */
/* Artboard 1920×968: nombre centrado a 138px del top, subrayado y con flechas
   en círculo rojo de 54px a ±178px; debajo la línea de sectores y una plomada
   que baja hasta un punto sobre el montón de pimentón. */
.productos { padding: clamp(3.2rem, 5.781vw, 6.94rem) var(--gutter) clamp(1.5rem, 2.292vw, 2.75rem); text-align: center; }
/* Grid con la columna central de ancho fijo (no "auto"): así el nombre del
   producto crece o encoge SIN mover las flechas, que quedan ancladas a los
   bordes de las columnas laterales (1fr) en vez de pegadas al texto. El
   ancho de esa columna central cubre con margen el nombre más largo del
   catálogo actual ("Oleoresina Capsicum", ~330px a 1920); si un nombre no
   cupiera ahí, envuelve a una 2ª línea en vez de empujar nada (FRA-293). */
.productos__head {
	display: grid;
	grid-template-columns: 1fr clamp(9rem, 18.75vw, 22.5rem) 1fr;
	align-items: center;
	gap: clamp(0.6rem, 2.031vw, 2.44rem);   /* 39px a 1920, del círculo al subrayado */
}
.productos__name {
	justify-self: center;
	max-width: 100%;
	font-size: clamp(1.2rem, 1.46vw, 1.75rem);  /* 28px a 1920 */
	font-weight: 400;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	margin: 0;
	padding-bottom: 0.22em;
	border-bottom: 1px solid currentColor;      /* el subrayado del diseño */
	white-space: normal;
	overflow-wrap: break-word;
	text-align: center;
}
.productos__arrow--prev { justify-self: end; }
.productos__arrow--next { justify-self: start; }
.productos__arrow {
	width: clamp(38px, 2.81vw, 54px);           /* 54px a 1920 */
	aspect-ratio: 1;
	display: grid;
	place-items: center;
	padding: 0;
	background: none;
	border: 1px solid var(--c-red);
	border-radius: 50%;
	color: var(--c-red);
	cursor: pointer;
	transition: background 0.3s var(--ease), color 0.3s var(--ease);
}
.productos__arrow:hover { background: var(--c-red); color: var(--c-cream); }
/* Dentro del círculo la flecha es corta, no la larga de los botones. */
.productos__arrow .arrow { width: 1.5em; font-size: clamp(0.7rem, 0.73vw, 0.88rem); }
/* La línea de sectores la reescribe el JS al cambiar de producto, así que es
   un solo nodo de texto, no una lista. */
.productos__sectores {
	margin: clamp(1.6rem, 3.021vw, 3.63rem) 0 0;   /* 58px a 1920 */
	min-height: 1.4em;                             /* no salta si un producto no tiene */
	font-size: clamp(0.95rem, 1.15vw, 1.38rem);    /* 22px a 1920 */
	line-height: 1.4;
	font-weight: 400;
}
.productos__pointer {
	display: block;
	width: 1px; height: clamp(60px, 6.51vw, 125px);   /* 125px a 1920 */
	margin: clamp(1rem, 1.927vw, 2.31rem) auto 0;     /* 37px a 1920 */
	background: rgb(33 19 22 / 55%);
	position: relative;
}
.productos__pointer::after {
	content: '';
	position: absolute; bottom: -5px; left: 50%;
	width: 10px; height: 10px;
	border-radius: 50%;
	background: var(--c-dark);
	transform: translateX(-50%);
}
.productos__track {
	list-style: none;
	/* El montón sube por detrás de la plomada: el punto queda apoyado en él.
	   Ojo con el orden del clamp: en negativo el mínimo es el valor más grande
	   en magnitud (-74px a 1920), no al revés. */
	margin: clamp(-4.63rem, -3.854vw, -1rem) 0 0;
	padding: 0;
	display: flex;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
}
.productos__track::-webkit-scrollbar { display: none; }
.productos__slide { flex: 0 0 100%; scroll-snap-align: center; }
.productos__slide a { display: block; text-decoration: none; }
.productos__img {
	width: min(100%, 1151px);          /* el montón mide 1151×497 en el diseño */
	aspect-ratio: 1151 / 497;
	object-fit: contain;
	margin: 0 auto;
	mix-blend-mode: multiply; /* integra el producto sobre el fondo crema */
}
.productos__cta { margin-top: clamp(0.8rem, 1.354vw, 1.63rem); text-align: center; }

/* ==========================================================================
   4 · Sostenibilidad
   --------------------------------------------------------------------------
   Artboard 1920 × 940: foto y panel a mitades, regla vertical de la foto en
   x=861, línea de la lista en x=1045 y círculos de 53px a partir de x=1086.
   ========================================================================== */
.sostenibilidad {
	--sost-dot: clamp(38px, 2.76vw, 60px);        /* 53px @1920 */
	--sost-tick: clamp(24px, 2.14vw, 46px);       /* 41px: línea → círculo */
	--sost-line: rgb(240 224 209 / 65%);
	display: grid;
	grid-template-columns: 1fr 1fr;
	position: relative;
	font-weight: 400;
}
.sostenibilidad__media { position: relative; overflow: hidden; min-height: 640px; }
.sostenibilidad__media img {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	/* En el diseño la foto va bastante más apagada que el original. */
	filter: brightness(0.68) saturate(1.1);
}

/* Elipse de trazo discontinuo que señala la abeja. */
.sostenibilidad__spot {
	position: absolute;
	z-index: 2;
	left: 50.7%; top: 52.9%;
	width: 24.1%; aspect-ratio: 231 / 125;
	transform: translate(-50%, -50%);
	border: 1px dashed var(--c-cream);
	border-radius: 50%;
}

/* Regla vertical con el año arriba y el claim girado en el centro. */
.sostenibilidad__rule {
	position: absolute;
	z-index: 2;
	left: 89.7%;
	top: 9.6%; bottom: 7.7%;
	width: 1px;
	background: var(--c-cream);
	color: var(--c-cream);
}
.sostenibilidad__year {
	position: absolute;
	top: 0; right: clamp(0.8rem, 1.46vw, 1.9rem);
	font-size: clamp(0.75rem, 0.94vw, 1.15rem);
	line-height: 1;
	white-space: nowrap;
}
.sostenibilidad__caption {
	position: absolute;
	top: 50%; right: clamp(0.8rem, 1.46vw, 1.9rem);
	transform: translateY(-50%);
	writing-mode: vertical-rl;
	font-size: clamp(0.7rem, 0.75vw, 0.95rem);
	letter-spacing: 0.14em;
	text-transform: uppercase;
	white-space: nowrap;
}
.sostenibilidad__title {
	position: absolute;
	z-index: 2;
	left: clamp(1.25rem, 3.65vw, 4.4rem); bottom: 5.3%;
	margin: 0;
	color: var(--c-cream);
	font-size: clamp(2.2rem, 4.06vw, 5rem);   /* 78px @1920 */
	line-height: 1;
	font-weight: 300;
}

.sostenibilidad__panel {
	padding: clamp(2.5rem, 4.06vw, 5.2rem) var(--gutter) clamp(2.5rem, 3.75vw, 4.8rem);
	position: relative;
	z-index: 1;
}
.sostenibilidad__subtitle {
	font-size: clamp(1.5rem, 2.08vw, 2.55rem);  /* 40px @1920 */
	font-weight: 300;
	line-height: 1.15;
	margin: 0 0 clamp(0.5rem, 0.9vw, 1.2rem);
}
.sostenibilidad__text {
	max-width: 40.5em;
	font-size: clamp(0.95rem, 1.02vw, 1.28rem);
	line-height: 1.25;
	margin: 0 0 clamp(2.5rem, 4.06vw, 5.2rem);
}

/* Lista numerada: línea vertical de centro a centro y guiones hasta cada círculo. */
.sostenibilidad__list {
	counter-reset: sost;
	list-style: none;
	position: relative;
	margin: 0 0 clamp(3rem, 5.3vw, 6.8rem);
	padding: 0 0 0 var(--sost-tick);
	display: grid;
	gap: calc(1.27vw);
}
.sostenibilidad__list::before {
	content: '';
	position: absolute;
	left: 0;
	top: calc(var(--sost-dot) / 2);
	bottom: calc(var(--sost-dot) / 2);
	width: 1px;
	background: var(--sost-line);
}
.sostenibilidad__list li {
	counter-increment: sost;
	display: flex;
	align-items: center;
	gap: clamp(0.8rem, 1.1vw, 1.5rem);
	font-size: clamp(0.75rem, 0.825vw, 1rem);
	letter-spacing: 0.085em;
	text-transform: uppercase;
	position: relative;
}
/* Guion desde la línea vertical hasta el borde del círculo. */
.sostenibilidad__list li::after {
	content: '';
	position: absolute;
	left: calc(-1 * var(--sost-tick)); top: 50%;
	width: var(--sost-tick); height: 1px;
	background: var(--sost-line);
}
/* El punto 4 se prolonga por encima de la foto hasta la regla vertical. */
.sostenibilidad__list li:nth-child(4)::after {
	left: -11.72vw;
	width: 11.72vw;
	background: var(--c-cream);
}
.sostenibilidad__list li::before {
	content: counter(sost);
	display: grid;
	place-items: center;
	width: var(--sost-dot); height: var(--sost-dot);
	flex: 0 0 auto;
	border-radius: 50%;
	background: var(--badge, var(--c-red));
	color: var(--c-cream);
	font-size: clamp(0.75rem, 0.83vw, 1rem);
	z-index: 1;
}
/* Degradado de color de los badges, muestreado del diseño */
.sostenibilidad__list li:nth-child(1) { --badge: #211316; }
.sostenibilidad__list li:nth-child(2) { --badge: #a60001; }
.sostenibilidad__list li:nth-child(3) { --badge: #e80008; }
.sostenibilidad__list li:nth-child(4) { --badge: #f62200; }
.sostenibilidad__list li:nth-child(5) { --badge: #fa3402; }
.sostenibilidad__list li:nth-child(6) { --badge: #ec5411; }
.sostenibilidad__list li:nth-child(n+7) { --badge: #ec5411; }

/* ==========================================================================
   5 · Vídeo
   ========================================================================== */
.video { background: var(--c-dark); }
/* El diseño lo da a 1920×1076, o sea 16:9 clavado. `display: block` y no un
   `line-height: 0` en la sección: el hueco bajo el vídeo es el de una caja
   inline, y matarlo desde el padre se lo comía también a los párrafos de la
   portada, que se apilaban unos encima de otros. */
.video__player, .video__embed iframe { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }

/* ==========================================================================
   Bloque: retícula del claim (Oleoresina y pre-footer, y las interiores)

   Medido sobre el artboard de 1920 (docs/diseno/home.pdf):
     columnas  183 | 348 | 856 | 349 | 184   → hairlines en x=183, 531, 1387, 1735
     filas     523 | 434                     → hairline horizontal en y=523
   Las hairlines se pintan como bordes de las celdas, no como elementos aparte.
   ========================================================================== */
.claim {
	--claim-linea: rgb(240 224 209 / 55%);
	position: relative;
}
/* El rótulo va DENTRO de la retícula, arriba de la columna central, no encima
   del bloque: en el diseño las hairlines arrancan en el borde de la sección. */
.claim__kicker {
	grid-area: 1 / 3;
	align-self: start;
	text-align: center;
	font-family: var(--f-display);
	font-size: clamp(1.3rem, 1.77vw, 2.13rem);
	font-weight: 400;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	margin: 0;
	padding-top: clamp(2rem, 6.35vw, 7.6rem);   /* 122px a 1920 */
}
.claim__grid {
	position: relative;
	display: grid;
	grid-template-columns: 9.531% 18.125% 44.583% 18.177% 9.583%;
	grid-template-rows: 54.65% 45.35%;
	min-height: clamp(560px, 49.84vw, 1000px);
}
/*
 * La hairline horizontal del diseño cruza TODO el ancho, incluido el título
 * central — por eso va aparte, no como border-bottom de las celdas: el
 * título no es una `.claim__cell` (ocupa las dos filas y se centra sobre la
 * línea) y un border por celda dejaba el tramo central sin dibujar.
 */
.claim__grid::before {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	top: 54.65%;
	border-top: 1px solid var(--claim-linea);
}
/* Las celdas centrales llevan además las hairlines verticales del diseño. */
.claim__cell--foto-1 {
	grid-area: 1 / 2;
	border-left: 1px solid var(--claim-linea);
	border-right: 1px solid var(--claim-linea);
	display: flex;
	align-items: flex-end;      /* la foto se pega al hairline horizontal */
}
.claim__cell--texto-2 {
	grid-area: 1 / 4;
	border-left: 1px solid var(--claim-linea);
	border-right: 1px solid var(--claim-linea);
	display: flex;
	align-items: flex-end;
	justify-content: flex-start;
	padding: 0 clamp(1rem, 1.8vw, 2.2rem) clamp(1.2rem, 2vw, 2.2rem);
}
/* Sin hairlines verticales: en el diseño solo bordean la foto de encima
   (columna 2, fila 1); bajo el hairline horizontal la columna izquierda
   queda sin marcar. La columna derecha sí las lleva en las dos filas. */
.claim__cell--texto-1 {
	grid-area: 2 / 2;
	padding: clamp(1.6rem, 2.9vw, 3.4rem) clamp(1rem, 1.8vw, 2.2rem) 0;
}
.claim__cell--foto-2 {
	grid-area: 2 / 4;
	border-left: 1px solid var(--claim-linea);
	border-right: 1px solid var(--claim-linea);
	border-bottom: 0;
	display: flex;
	align-items: flex-start;    /* la foto arranca en el hairline horizontal */
}
/* El claim ocupa la columna central entera y lo parte el hairline: la 1ª línea
   queda justo encima y la 2ª justo debajo. Ambas van centradas. */
.claim__title {
	grid-area: 1 / 3 / 3 / 4;
	align-self: center;
	margin: 0;
	text-align: center;
	font-size: var(--fs-claim);
	line-height: 1.16;
	color: var(--c-cream);
}
.claim__title .title-line { display: block; }
.claim__title .title-line--strong { font-weight: 500; }
/* Con un line-height tan ajustado (1.16) el bloque de dos líneas no se
   centra exactamente sobre la hairline horizontal y la 2ª línea la cruzaba
   por encima de sus letras. Un margen fijo entre líneas la separa del
   hairline pase lo que pase con el centrado. */
.claim__title .title-line--thin { margin-top: clamp(1.2rem, 3vw, 3.6rem); }

.claim__media { width: 100%; }
.claim__img { width: 100%; aspect-ratio: 348 / 433; object-fit: cover; }
.claim__text {
	margin: 0;
	font-size: clamp(0.85rem, 0.93vw, 1.32rem);
	font-weight: 400;
	line-height: 1.42;
}

/* Artboard 1920×921: título a 30px del top, tarjetas de 428×540 a partir de
   y=255 (rótulo) / y=303 (foto) y bullets centrados a y=875. */
.blog { padding: clamp(1.5rem, 1.56vw, 1.88rem) 0 clamp(1.5rem, 2.19vw, 2.63rem); }
.blog__head { padding: 0 var(--gutter); }
.blog__title {
	font-size: clamp(1.6rem, 2.29vw, 2.75rem);   /* 44px a 1920 */
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	margin: 0;
	padding-bottom: 0.06em;
	/* fit-content en vez de inline-block: el subrayado queda igual de ajustado
	   pero sin el interlineado que mete la línea base de un inline. */
	display: block;
	width: fit-content;
	line-height: 1.05;
	border-bottom: 1px solid currentColor;       /* «BLOG» va subrayado */
	color: var(--c-cream);
}
.blog__subtitle {
	font-family: var(--f-display);
	font-size: clamp(1.3rem, 1.875vw, 2.25rem);  /* 36px a 1920 */
	line-height: 1.1;
	margin: 0.22em 0 0;
	color: var(--c-cream);
}
.blog__intro {
	margin: clamp(0.8rem, 1.25vw, 1.5rem) 0 0;   /* 24px a 1920 */
	/* Los saltos del panel ya parten el texto en dos líneas: el ancho solo
	   tiene que dejarles sitio (790px la más larga del diseño). */
	max-width: min(100%, 830px);
	line-height: 1.35;
	font-size: clamp(0.9rem, 0.99vw, 1.19rem);
}

.blog__slider { margin-top: clamp(1.4rem, 2.71vw, 3.25rem); }  /* 52px a 1920 */
.blog__track {
	list-style: none;
	margin: 0;
	padding: 0 var(--gutter);
	display: flex;
	gap: clamp(0.5rem, 0.73vw, 0.88rem);         /* 14px a 1920 */
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scroll-padding-left: var(--gutter);
	scrollbar-width: none;
}
.blog__track::-webkit-scrollbar { display: none; }
.blog__card {
	flex: 0 0 clamp(220px, 22.29vw, 428px);      /* 428px a 1920 */
	scroll-snap-align: start;
}
.blog__card a { text-decoration: none; display: block; }
/* Altura fija de dos líneas: los titulares reales tienen largos distintos y,
   sin esto, cada foto arrancaría a una altura y la fila quedaría escalonada. */
.blog__card-head {
	display: flex;
	align-items: flex-start;
	gap: 1.6rem;
	min-height: 2.6em;
	margin-bottom: clamp(0.7rem, 1.15vw, 1.38rem);  /* 22px a 1920 */
	font-size: clamp(0.85rem, 0.94vw, 1.13rem);     /* 18px a 1920 */
	line-height: 1.3;
}
.blog__card-title {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
}
.blog__card-head .arrow { margin-top: 0.55em; }
.blog__card-head .arrow { flex: 0 0 auto; transition: transform 0.3s var(--ease); }
.blog__card a:hover .arrow { transform: translateX(6px); }
.blog__img { width: 100%; aspect-ratio: 428 / 540; object-fit: cover; }

.blog__bullets { display: flex; justify-content: center; gap: 0.62rem; margin-top: clamp(1rem, 1.67vw, 2rem); }
.blog__bullet {
	width: 8px; aspect-ratio: 1;
	padding: 0;
	border: 1px solid var(--c-cream);
	border-radius: 50%;
	background: transparent;
	opacity: 0.6;
	cursor: pointer;
	transition: background 0.3s var(--ease), opacity 0.3s var(--ease);
}
.blog__bullet.is-current { background: var(--c-cream); opacity: 1; }

/* ==========================================================================
   8 · Origen
   ========================================================================== */
.origen { position: relative; min-height: 92svh; display: grid; place-items: center; text-align: center; color: var(--c-cream); overflow: hidden; }
.origen__bg, .origen__bg img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.origen__bg::after { content: ''; position: absolute; inset: 0; background: rgb(33 19 22 / 45%); }
.origen__bg img { filter: grayscale(1); }
.origen__inner { position: relative; z-index: 2; max-width: 72ch; padding: var(--section-y) var(--gutter); }
.origen__title {
	font-size: clamp(2.2rem, 3.9vw, 4.6rem); /* ~74px a 1920, escala de .calidad__title */
	line-height: 1.06;
	text-transform: uppercase;
	font-weight: 300;
	letter-spacing: 0.02em;
	margin-bottom: 0.5em;
}
.origen__text { max-width: 66ch; margin: 0 auto 2.8em; }

/* ==========================================================================
   9 · Calidad certificada
   ========================================================================== */
.calidad__inner {
	display: grid;
	grid-template-columns: 1fr 1fr;   /* el corte cae en x=960 */
	min-height: clamp(600px, 49.375vw, 1000px);   /* 948px a 1920 */
}
.calidad__content {
	padding: clamp(3rem, 7.55vw, 9.06rem) var(--gutter) clamp(3rem, 7vw, 8.4rem);
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: flex-start;
	text-align: center;
}
.calidad__title { font-size: clamp(2.2rem, 3.85vw, 4.6rem); margin: 0 0 0.62em; }  /* 74px a 1920 */
.calidad__title .title-word--strong { font-weight: 500; }
.calidad__title .title-word--thin { font-weight: 300; }
/* Interlineado del diseño: 24px sobre 19px de cuerpo, más apretado que el
   del resto del sitio; el ancho lo marca la línea más larga (557px). */
.calidad__text {
	line-height: 1.28;
	margin: 0 0 clamp(2.5rem, 4.7vw, 5.6rem);
	font-weight: 400;
}
.calidad__sellos {
	list-style: none;
	margin: 0 0 clamp(3rem, 5.3vw, 6.4rem);
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: clamp(1.2rem, 2.08vw, 2.5rem) clamp(1rem, 1.56vw, 1.88rem);
	max-width: 540px;   /* el diseño mete 5 sellos en la primera fila */
}
/* Los sellos van en blanco y negro y recuperan el color al pasar por encima.
   Se acotan por alto Y por ancho: los hay muy apaisados (el de la iniciativa
   de especias sostenibles es 5:1) y a alto fijo se comerían la fila entera. */
.calidad__sello {
	height: clamp(28px, 2.4vw, 46px);
	width: auto;
	max-width: clamp(64px, 5.42vw, 104px);
	object-fit: contain;
	filter: grayscale(1);
	transition: filter 0.35s var(--ease);
}
/* La página de Calidad reutiliza el mismo marcado de sellos (misma clase
   .calidad__sello) dentro de su propia lista .cal-sellos, así que el filtro
   se aplicaba pero nunca se quitaba al pasar por encima — la regla de hover
   solo miraba dentro de .calidad__sellos (la de la home). */
.calidad__sellos li:hover .calidad__sello,
.cal-sellos li:hover .calidad__sello { filter: none; }
.calidad__cta { margin-top: auto; }

.calidad__media { position: relative; overflow: hidden; }
.calidad__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* Retícula sobre la foto: verticales a 32.85% y 69.24%, horizontales a 28.59%
   y 74.16% del alto (x=1276/1625, y=271/703 sobre el artboard). */
.calidad__grid {
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	--l: rgb(255 255 255 / 55%);
	background-image:
		linear-gradient(to right, var(--l), var(--l)),
		linear-gradient(to right, var(--l), var(--l)),
		linear-gradient(to bottom, var(--l), var(--l)),
		linear-gradient(to bottom, var(--l), var(--l));
	background-size: 1px 100%, 1px 100%, 100% 1px, 100% 1px;
	background-position: 32.85% 0, 69.24% 0, 0 28.59%, 0 74.16%;
	background-repeat: no-repeat;
}
/* La foto pequeña ocupa exactamente la celda central: 349×432. */
.calidad__inset {
	position: absolute;
	z-index: 2;
	left: 32.85%;
	top: 28.59%;
	width: 36.39%;
	height: 45.57%;
}
.calidad__img-inset { width: 100%; height: 100%; object-fit: cover; }

/* ==========================================================================
   Footer
   ========================================================================== */
.site-footer {
	background: var(--c-dark);
	color: var(--c-cream);
	padding: clamp(4rem, 8vw, 9rem) var(--gutter) 2.5rem;
}
/*
 * Tres columnas lado a lado en el comp (contrastado contra home.pdf Y
 * sostenibilidad.pdf, misma retícula en las dos): marca (izq.) | sellos +
 * texto de ayudas (centro, alineados a la izquierda) | navegación + legal +
 * copyright (dcha., arranca ~74,5vw en ambos PDFs). Grid con la 1ª y 3ª
 * columna de ancho fijo y la del medio a `1fr`: si la columna del medio
 * fuera de ancho automático (como con flex + margin-right), su ancho real
 * dependería de cuánto ocupe el texto de ayudas, que varía con el contenido,
 * y la columna de navegación se desplazaría a la izquierda con él — pasaba
 * exactamente eso (arrancaba al 63vw en vez del 74,5vw del diseño).
 * Las dos primeras se anclan abajo (align-self: end); la tercera reparte su
 * contenido de arriba abajo (nav arriba, copyright al fondo).
 */
.site-footer__inner {
	display: grid;
	/* Columna 2 es un hueco vacío (el gap entre marca y ayudas): con
	   `column-gap` uniforme, ensanchar ese hueco también desplazaría el
	   arranque de la columna de navegación, que tiene que quedar fijo. */
	grid-template-columns: clamp(200px, 18.2vw, 362px) clamp(1rem, 13.5vw, 14.4rem) 1fr clamp(220px, 25.1vw, 538px);
	align-items: stretch;
}
.site-footer__brand {
	/* El diseño no lleva claim aparte: el propio SVG del logo ya trae "Quality
	   begins at origin". Si el campo ACF se rellena con algo, va debajo del
	   logo, no al lado — al lado no cabe (la columna solo mide lo que mide
	   el logo) y el texto se partía palabra a palabra. */
	grid-column: 1;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	align-self: end;
	gap: 0.6rem;
}
.site-footer__logo { width: 100%; height: auto; }
.site-footer__claim { margin: 0; font-size: clamp(0.8rem, 0.95vw, 1rem); line-height: 1.3; opacity: 0.7; }
.site-footer__ayudas {
	grid-column: 3;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	align-self: end;
	gap: clamp(1rem, 1.8vw, 2.2rem);
	max-width: clamp(280px, 30.3vw, 581px);
	text-align: left;
}
.site-footer__ayudas-sellos { display: flex; align-items: center; gap: clamp(1.2rem, 2.45vw, 2.9rem); flex-wrap: wrap; justify-content: flex-start; }
.site-footer__sello { display: block; height: clamp(2rem, 2.5vw, 3rem); width: auto; }
.site-footer__sello svg { display: block; height: 100%; width: auto; }
.site-footer__ayudas-texto { margin: 0; font-size: 0.8rem; line-height: 1.5; opacity: 0.85; }
/*
 * gap fijo en vez de justify-content:space-between: con contenido real esta
 * columna (nav+legal+copy) es la más alta de las tres, así que su propia
 * altura de contenido YA determina la de la fila entera — no queda "espacio
 * sobrante" que space-between pueda repartir y el copyright se pegaba justo
 * debajo del menú legal. El hueco del comp entre uno y otro (~80px a 1920)
 * se fija directamente aquí.
 */
.site-footer__col {
	grid-column: 4;
	display: flex;
	flex-direction: column;
	gap: clamp(2.5rem, 4.2vw, 5rem);
	text-align: left;
}
.site-footer__col > .site-footer__copy { margin-top: auto; }
/*
 * gap + line-height explícitos: heredaban el line-height: 1.55 del body
 * (pensado para párrafos largos) y la columna de navegación salía casi el
 * doble de alta que en el comp — eso es lo que dejaba a `.site-footer__col`
 * sin espacio de sobra y pegaba el copyright justo debajo del menú legal en
 * vez de al fondo de la columna.
 */
.site-footer__nav-group { display: grid; gap: clamp(1.2rem, 1.8vw, 2rem); }
/*
 * font-size/line-height puestos en el <ul>, no solo en el <a>: el line-height
 * del body es un número sin unidad (1.55) y se recalcula por elemento —  si
 * solo se reduce en el <a>, el <li> (que hereda el font-size ~19px del body)
 * sigue marcando una caja de línea grande y el menú no se comprime.
 */
.site-footer__menu {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 0.7rem;
	font-size: 0.85rem;
	line-height: 1.3;
}
.site-footer__menu a {
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
}
.site-footer__menu a:hover { color: var(--c-accent); }
.site-footer__social { list-style: none; margin: 0; padding: 0; display: flex; gap: 1rem; }
.site-footer__social a { display: block; line-height: 1; text-decoration: none; }
.site-footer__social svg { display: block; height: clamp(1rem, 1vw, 1.2rem); width: auto; }
.site-footer__social a:hover { opacity: 0.75; }
.site-footer__legal-menu {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 0.4rem;
	font-size: 0.9rem;
	line-height: 1.3;
}
.site-footer__legal-menu a { color: var(--c-accent); text-decoration: none; }
.site-footer__legal-menu a:hover { text-decoration: underline; }
.site-footer__copy { margin: 0; font-size: 0.85rem; opacity: 0.85; }

/* ==========================================================================
   Bloque: vídeo con portada
   El diseño tapa el vídeo con el titular y un play redondo; al pulsarlo la
   capa se va y aparecen los controles del navegador.
   ========================================================================== */
.video--portada { position: relative; }
.video--portada .video__player { aspect-ratio: 16 / 9; max-height: 100svh; }
.video__overlay {
	position: absolute;
	inset: 0;
	display: grid;
	align-content: center;
	justify-items: center;
	gap: 1.4rem;
	padding: var(--gutter);
	text-align: center;
	color: var(--c-white);
	background: rgb(33 19 22 / 22%);
	transition: opacity 0.5s var(--ease), visibility 0.5s;
}
.video.is-playing .video__overlay { opacity: 0; visibility: hidden; }
.video__title {
	margin: 0;
	font-size: var(--fs-h2);
	line-height: 1.12;
	max-width: 18ch;
	text-wrap: balance;
}
/* Los saltos de línea los pone el panel; el ancho solo tiene que dejarles
   sitio. Con `52ch` la línea más larga del texto se partía otra vez. */
.video__text { margin: 0; max-width: min(100%, 820px); }
.video__play {
	width: clamp(52px, 3.65vw, 70px);
	aspect-ratio: 1;
	border: 0;
	border-radius: 50%;
	background: rgb(33 19 22 / 62%);
	cursor: pointer;
	display: grid;
	place-items: center;
	transition: background 0.3s var(--ease), transform 0.3s var(--ease);
}
.video__play::after {
	content: '';
	width: 0; height: 0;
	margin-left: 0.22em;
	border-left: 0.9em solid var(--c-white);
	border-top: 0.55em solid transparent;
	border-bottom: 0.55em solid transparent;
}
.video__play:hover { background: var(--c-red); transform: scale(1.08); }
/* En móvil el 16:9 deja 219px de alto en una pantalla de 390: el titular de
   cinco líneas no cabe y se sale por arriba del vídeo. La portada pasa a
   vertical, que es lo que da sitio, y el vídeo desnudo se queda en 16:9. */
@media (max-width: 900px) {
	.video--portada .video__player { aspect-ratio: 3 / 4; max-height: 88svh; }
	.video__overlay { gap: 1rem; }
	.video__title { font-size: clamp(1.7rem, 8vw, 2.6rem); max-width: none; }
	.video__text { max-width: none; }
}

/* ==========================================================================
   Bloque: slider de fotos + columna de texto
   ========================================================================== */
.slider { padding: var(--section-y) var(--gutter); }
/* Artboard 1920: foto de 517×781 a partir de x=203, texto desde x=873. */
.slider__inner {
	display: grid;
	grid-template-columns: 30.5% minmax(0, 1fr);
	gap: clamp(2rem, 8.9vw, 10.7rem);
	align-items: center;
	max-width: 1590px;
	margin: 0 auto;
}
.slider__media { position: relative; }
.slider__track {
	display: flex;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
}
.slider__track::-webkit-scrollbar { display: none; }
.slider__slide { flex: 0 0 100%; scroll-snap-align: start; }
.slider__img { width: 100%; aspect-ratio: 517 / 781; object-fit: cover; }
.slider__bullets { display: flex; justify-content: center; gap: 0.7rem; margin-top: 1.6rem; }
.slider__bullet {
	width: 9px; aspect-ratio: 1;
	padding: 0;
	border: 1px solid currentColor;
	border-radius: 50%;
	background: transparent;
	opacity: 0.55;
	cursor: pointer;
	transition: background 0.3s var(--ease), opacity 0.3s var(--ease);
}
.slider__bullet.is-current { background: currentColor; opacity: 1; }
.slider__title { margin: 0 0 1.4rem; font-size: clamp(1.4rem, 1.72vw, 2.1rem); line-height: 1.2; }
.slider__title .title-line { display: block; }
.slider__title .title-line--strong { font-weight: 500; }
.slider__text > :last-child { margin-bottom: 0; }
.slider__text h3, .slider__text h4 {
	font-family: var(--f-display);
	font-size: clamp(1.2rem, 1.46vw, 1.75rem);
	font-weight: 400;
	margin: 2rem 0 0.6rem;
}
.slider__cta { margin-top: 2.2rem; }

/* ==========================================================================
   Bloque: formulario de contacto
   ========================================================================== */
.formulario { padding: var(--section-y) var(--gutter); }
.formulario__inner {
	display: grid;
	grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
	gap: clamp(2rem, 5vw, 6rem);
	align-items: start;
	max-width: 1600px;
	margin: 0 auto;
}
.formulario__kicker { margin: 0 0 1.2rem; font-size: 0.95em; }
.formulario__title {
	margin: 0 0 1.6rem;
	font-size: clamp(1.7rem, 2.4vw, 2.9rem);
	line-height: 1.15;
}
.formulario__title .title-line { display: block; }
/* En el diseño es la ÚLTIMA línea la que va en negrita, al revés que en el
   resto de titulares del sitio. */
.formulario__title .title-line--strong { font-weight: 300; }
.formulario__title .title-line:last-child { font-weight: 500; }
.formulario__text { max-width: 34ch; font-size: 0.95em; }

/* El fondo blanco lo lleva la caja de campos, no la columna entera: el botón
   de enviar va fuera, debajo y a la derecha. */
.formulario__caja {
	background: rgb(255 255 255 / 92%);
	color: var(--c-dark);
	padding: clamp(1.6rem, 2.6vw, 3rem) clamp(1.6rem, 2.6vw, 3rem) clamp(1.2rem, 1.9vw, 2.3rem);
}
.formulario__aviso {
	margin: 0 0 1.6rem;
	padding: 0.9rem 1.1rem;
	font-size: 0.9em;
	border-left: 3px solid var(--c-green);
}
.formulario__aviso--error { border-left-color: var(--c-red); }

.formulario__trampa { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* En el diseño los campos van a 51px de paso: etiqueta, línea y un respiro.
   Con el interlineado normal del sitio la caja se iba 300px de largo. */
.formulario__campo { margin: 0 0 clamp(0.35rem, 0.47vw, 0.56rem); display: grid; gap: 0.1rem; }
.formulario__label {
	font-size: clamp(0.7rem, 0.68vw, 0.82rem);
	line-height: 1.2;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--c-dark);
}
.formulario__req { color: var(--c-accent); text-decoration: none; margin-left: 0.2em; }
.formulario__input {
	width: 100%;
	padding: 0.1rem 0;
	font: inherit;
	font-size: clamp(0.8rem, 0.88vw, 1.06rem);
	line-height: 1.25;
	color: inherit;
	background: transparent;
	border: 0;
	border-bottom: 1px solid rgb(33 19 22 / 35%);
	border-radius: 0;
	transition: border-color 0.3s var(--ease);
}
.formulario__input:focus { outline: 0; border-bottom-color: var(--c-red); }
textarea.formulario__input { resize: vertical; min-height: 3.4em; }

.formulario__privacidad { margin: 2rem 0 0; font-size: 0.82rem; }
.formulario__privacidad label { display: flex; align-items: flex-start; gap: 0.6rem; }
/* En el diseño la casilla es un círculo, no el cuadrado nativo del navegador. */
.formulario__privacidad input {
	appearance: none;
	-webkit-appearance: none;
	width: 0.95em;
	height: 0.95em;
	margin-top: 0.15em;
	border: 1.5px solid currentColor;
	border-radius: 50%;
	cursor: pointer;
}
.formulario__privacidad input:checked { background: var(--c-dark); border-color: var(--c-dark); }
.formulario__privacidad a { color: var(--c-red); }
.formulario__enviar { margin: 1.8rem 0 0; display: flex; justify-content: flex-end; }
.formulario__enviar .btn { cursor: pointer; }

/* ==========================================================================
   Bloque: titular de sección (kicker + titular a dos líneas)
   ========================================================================== */
.titular { text-align: center; }
.titular__kicker {
	margin: 0 0 clamp(1rem, 1.72vw, 2.06rem);   /* 33px a 1920 */
	font-size: clamp(0.85rem, 0.94vw, 1.13rem); /* 18px a 1920 */
}
.titular__title {
	margin: 0;
	font-size: clamp(1.6rem, 2.19vw, 2.63rem);  /* 42px a 1920 */
	font-weight: 300;
	line-height: 1.22;
	text-transform: uppercase;
}
.titular__title .title-line--strong { font-weight: 500; }

/* ==========================================================================
   Productos — listado (archivo del CPT)

   Artboard 1920: tres columnas de 496px con 23px de calle, de x=192 a x=1726;
   tarjetas de 496×419 y 109px entre filas.
   ========================================================================== */
.rejilla {
	background: var(--c-white);
	padding: clamp(3rem, 7.4vw, 8.9rem) 10% clamp(3rem, 6vw, 7.2rem);
}
.rejilla__lista {
	list-style: none;
	margin: clamp(2.5rem, 5.36vw, 6.44rem) 0 0;   /* 103px a 1920 */
	padding: 0;
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	column-gap: 1.5%;                              /* 23px sobre 1534 */
	row-gap: clamp(2rem, 5.68vw, 6.81rem);         /* 109px a 1920 */
}
.rejilla__nombre {
	margin: 0 0 clamp(0.5rem, 0.94vw, 1.13rem);    /* 18px a 1920 */
	font-size: clamp(0.9rem, 1.04vw, 1.25rem);     /* 20px a 1920 */
}
.rejilla__card {
	position: relative;
	display: block;
	aspect-ratio: 496 / 419;
	border: 1px solid var(--c-red);
	overflow: hidden;
	text-decoration: none;
}
.rejilla__img { width: 100%; height: 100%; object-fit: contain; padding: 8%; }
/* Al pasar el ratón la tarjeta se oscurece y salen descripción y botón. */
.rejilla__hover {
	position: absolute;
	inset: 0;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	align-items: flex-start;
	gap: 1rem;
	padding: clamp(1rem, 1.72vw, 2.06rem);
	background: #2a0f16;
	color: var(--c-cream);
	opacity: 0;
	transition: opacity 0.4s var(--ease);
}
.rejilla__card:hover .rejilla__hover,
.rejilla__card:focus-visible .rejilla__hover { opacity: 1; }
.rejilla__desc { font-size: clamp(0.8rem, 0.88vw, 1.06rem); line-height: 1.45; }
.rejilla__btn { align-self: flex-end; }

/* ==========================================================================
   Productos — ficha
   ========================================================================== */
.ficha {
	background: var(--c-white);
	padding: clamp(3rem, 7.4vw, 8.9rem) var(--gutter) clamp(3rem, 5vw, 6rem);
	text-align: center;
}
.ficha__nombre {
	margin: clamp(2rem, 3.85vw, 4.63rem) 0 clamp(1rem, 1.56vw, 1.88rem);
	font-size: clamp(1.2rem, 1.46vw, 1.75rem);   /* 28px a 1920 */
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: 0.02em;
}
/* Los sectores van dentro de una caja de borde rojo, no sueltos como en la home. */
.ficha__sectores {
	display: inline-block;
	margin: 0;
	padding: 0.62em 1.4em;
	border: 1px solid var(--c-red);
	font-size: clamp(0.9rem, 1.04vw, 1.25rem);   /* 20px a 1920 */
	letter-spacing: 0.02em;
	text-transform: uppercase;
}
.ficha__packshot { margin: clamp(1.5rem, 2.6vw, 3.1rem) auto 0; }
/* El hueco del artboard son 1385×558. Con los packshots ya recortados
   (setup/recortar-packshots.py) el producto llena la caja como en el diseño. */
.ficha__img {
	width: min(100%, 1385px);
	max-height: clamp(280px, 29vw, 558px);
	height: auto;
	object-fit: contain;
	margin: 0 auto;
	mix-blend-mode: multiply;
}
.ficha__plomada {
	display: block;
	width: 1px;
	height: clamp(50px, 4.9vw, 94px);
	margin: 0 auto;
	background: rgb(83 16 23 / 70%);
	position: relative;
}
.ficha__plomada::after {
	content: '';
	position: absolute; bottom: -5px; left: 50%;
	width: 10px; height: 10px;
	border-radius: 50%;
	background: var(--c-wine);
	transform: translateX(-50%);
}
.ficha__subtitulo {
	margin: clamp(1.5rem, 2.4vw, 2.9rem) 0 clamp(0.8rem, 1.25vw, 1.5rem);
	font-size: clamp(1.1rem, 1.35vw, 1.63rem);   /* 26px a 1920 */
	font-weight: 400;
	text-transform: uppercase;
}
.ficha__texto {
	max-width: min(100%, 780px);
	margin: 0 auto;
	font-size: clamp(0.85rem, 0.94vw, 1.13rem);
	line-height: 1.45;
}
.ficha__texto > :last-child { margin-bottom: 0; }
.ficha__plomada--baja { margin-top: clamp(1.5rem, 2.6vw, 3.1rem); }

/* Las cuatro tarjetas de especificaciones, en degradado de granate a naranja. */
.ficha__specs {
	list-style: none;
	margin: clamp(2rem, 3.65vw, 4.4rem) auto 0;
	padding: 0;
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: clamp(0.4rem, 0.57vw, 0.69rem);          /* 11px a 1920 */
	width: min(100%, 1292px);                      /* de x=327 a 1619 */
	text-align: left;
}
.ficha__spec {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 0.35em;
	min-height: clamp(110px, 8.54vw, 164px);       /* 164px a 1920 */
	padding: clamp(0.9rem, 1.35vw, 1.63rem);
	color: var(--c-cream);
	overflow: hidden;
}
.ficha__spec:nth-child(1) { background: #531017; }
.ficha__spec:nth-child(2) { background: #a01008; }
.ficha__spec:nth-child(3) { background: #e5401b; }
.ficha__spec:nth-child(4) { background: #fc5d26; }
/* Tamaño y peso medidos contra el comp (docs/diseno/producto.pdf p2): la
   etiqueta va en negrita (weight 500, como el resto de acentos «fuertes»
   del proyecto) y el valor un peso por debajo de la etiqueta pero muy por
   encima del Light 300 que heredaban los dos del body (FRA-281). */
.ficha__spec-label { font-size: clamp(0.94rem, 1.04vw, 1.25rem); font-weight: 500; text-transform: uppercase; }
.ficha__spec-valor { font-size: clamp(0.94rem, 1.04vw, 1.25rem); font-weight: 400; line-height: 1.35; }
.ficha__spec-icono {
	position: absolute;
	right: clamp(0.8rem, 1.15vw, 1.38rem);
	top: 50%;
	transform: translateY(-50%);
	width: clamp(22px, 1.72vw, 33px);
	opacity: 0.9;
}
.ficha__spec-icono svg { width: 100%; height: auto; display: block; }
.ficha__spec-icono svg path,
.ficha__spec-icono svg polygon { fill: currentColor; }

/* ---- Contacto: foto a la izquierda y, apilados a la derecha, el texto y la
        caja. Artboard 1920: foto 512×768 en x=174 y caja de 773 en x=968. ---- */
.formulario--contacto { padding: clamp(3rem, 6vw, 7.2rem) 0 clamp(3rem, 5vw, 6rem); }
.formulario--contacto .formulario__inner {
	/* Porcentajes sobre el ancho útil (1572px tras el padding), no sobre 1920. */
	grid-template-columns: 32.57% 49.17%;
	/* La fila 1 se ajusta al texto y la 2 se queda con el resto; si no, la foto
	   —que ocupa las dos— reparte a medias y deja un hueco bajo el texto. */
	grid-template-rows: auto 1fr;
	justify-content: space-between;
	align-items: start;
	padding: 0 9.06%;
	max-width: none;
	column-gap: clamp(2rem, 4vw, 5rem);
	row-gap: 0;   /* el gap del bloque base separaba el texto de la caja 96px */
}
.formulario--contacto .formulario__media { grid-row: 1 / 3; }
.formulario--contacto .formulario__img { width: 100%; aspect-ratio: 512 / 768; object-fit: cover; }
.formulario--contacto .formulario__intro { grid-column: 2; margin-bottom: clamp(0.5rem, 0.9vw, 1.1rem); }
.formulario--contacto .formulario__card { grid-column: 2; }
/* Aquí los saltos vienen del panel y la columna mide 773px: sin quitar el
   max-width el texto se parte en el doble de líneas y empuja la caja. */
.formulario--contacto .formulario__text { max-width: none; }
.formulario--contacto .formulario__title { font-size: clamp(1.5rem, 2.08vw, 2.5rem); }
/* La caja blanca translúcida (.formulario__caja) se mezcla con el fondo de
   la sección: sobre el verde queda casi blanca (como en el diseño), pero
   sobre este naranja tan saturado da un tinte rosado que el PDF no tiene
   —ahí la caja es un gris neutro plano (#eaeaea)—, así que aquí se fija sin
   transparencia. */
.formulario--contacto .formulario__caja { background: #eaeaea; }

/* ==========================================================================
   Blog — listado

   Artboard 1920×2739, entero sobre el oscuro. Cabecera con la foto a la
   derecha (x=998 a 1798), la destacada debajo y el carrusel al final.
   ========================================================================== */
.blog-listado { padding-bottom: clamp(3rem, 6vw, 7.2rem); }
.blog-listado__cabecera {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 44.5%;   /* 800px de los 1798 útiles */
	align-items: center;
	column-gap: clamp(2rem, 4vw, 5rem);
	/* La foto no llega al borde: en el diseño acaba en x=1798. */
	padding: clamp(3rem, 6.5vw, 7.8rem) 6.35% clamp(2rem, 4vw, 4.8rem) 0;
	border-bottom: 1px solid rgb(240 224 209 / 22%);
}
.blog-listado__intro { padding-left: var(--gutter); }
.blog-listado__kicker {
	margin: 0 0 clamp(1.5rem, 2.6vw, 3.1rem);
	font-size: clamp(0.8rem, 0.83vw, 1rem);
	letter-spacing: 0.06em;
	text-transform: uppercase;
}
.blog-listado__title {
	margin: 0 0 clamp(1rem, 1.72vw, 2.06rem);
	font-size: clamp(2.2rem, 3.85vw, 4.63rem);   /* 74px a 1920 */
	line-height: 1.12;
}
.blog-listado__title .title-line--strong { font-weight: 500; }
/* Los saltos vienen del panel: el ancho solo tiene que dejarles sitio (631px
   la línea más larga del diseño). */
.blog-listado__text { margin: 0; max-width: min(100%, 660px); font-size: clamp(0.8rem, 0.88vw, 1.06rem); line-height: 1.45; }
.blog-listado__img { width: 100%; aspect-ratio: 800 / 589; object-fit: cover; }

/* ---- Entrada destacada ---- */
.blog-destacada {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 58.33%;
	align-items: start;
	column-gap: clamp(2rem, 4vw, 5rem);
	padding: clamp(2rem, 3.4vw, 4.1rem) var(--gutter);
	border-bottom: 1px solid rgb(240 224 209 / 22%);
}
.blog-destacada__meta {
	margin: 0 0 0.9em;
	font-size: clamp(0.7rem, 0.73vw, 0.88rem);
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--c-accent);
}
.blog-destacada__title {
	margin: 0 0 0.7em;
	font-family: var(--f-body);
	font-size: clamp(1rem, 1.15vw, 1.38rem);   /* 22px a 1920 */
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: 0.01em;
}
.blog-destacada__title a { text-decoration: none; }
.blog-destacada__title a:hover { color: var(--c-accent); }
.blog-destacada__extracto { margin: 0; max-width: 56ch; font-size: clamp(0.8rem, 0.83vw, 1rem); line-height: 1.45; }

.blog-listado__entradilla {
	padding: clamp(2rem, 3.4vw, 4.1rem) var(--gutter) clamp(1.5rem, 2.6vw, 3.1rem);
	font-size: clamp(0.8rem, 0.83vw, 1rem);
	line-height: 1.5;
}
.blog-listado__entradilla > :last-child { margin-bottom: 0; }
/* El carrusel es el mismo bloque que en la home, pero aquí no hay cabecera roja. */
.blog-listado .blog__slider { margin-top: 0; }

/* ==========================================================================
   Blog — entrada

   Foto centrada de 799px, titular y entradilla contra el margen izquierdo y el
   cuerpo en una columna de 796px desplazada a x=551 (28.7%).
   ========================================================================== */
.entrada { padding: clamp(2rem, 4.7vw, 5.6rem) var(--gutter) clamp(3rem, 5vw, 6rem); }
.entrada__media { width: min(100%, 799px); margin: 0 auto clamp(2rem, 3.9vw, 4.7rem); }
.entrada__img { width: 100%; aspect-ratio: 799 / 607; object-fit: cover; }
.entrada__header { width: min(100%, 1536px); margin: 0 auto; padding-left: 0.5%; }
.entrada__title {
	margin: 0 0 clamp(1rem, 1.72vw, 2.06rem);
	font-size: clamp(2.2rem, 3.85vw, 4.63rem);   /* 74px a 1920 */
	font-weight: 300;
	line-height: 1.12;
	max-width: 22ch;
}
.entrada__extracto { margin: 0 0 1.2em; max-width: 52ch; font-size: clamp(0.8rem, 0.83vw, 1rem); line-height: 1.45; }
.entrada__meta {
	margin: 0;
	font-size: clamp(0.7rem, 0.73vw, 0.88rem);
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--c-accent);
}
/* El cuerpo va desplazado a la derecha: arranca en x=551 sobre el artboard,
   o sea a un 26,6% del ancho útil, no centrado. */
.entrada__body {
	width: min(100%, 796px);
	margin: clamp(2rem, 4.4vw, 5.3rem) 0 0 min(26.6%, calc(100% - 796px));
	font-size: clamp(0.8rem, 0.83vw, 1rem);
	line-height: 1.5;
}
.entrada__body > :last-child { margin-bottom: 0; }
.entrada__relacionadas { padding-bottom: clamp(3rem, 6vw, 7.2rem); }
/* Sobre blanco los bullets del carrusel van oscuros. */
.entrada__relacionadas .blog__bullet { border-color: var(--c-dark); }
.entrada__relacionadas .blog__bullet.is-current { background: var(--c-dark); }

/* ==========================================================================
   Página Calidad

   Artboard 1920: tarjetas blancas de 1799×854 (x=60 a 1859) sobre el crema,
   con 65px de aire entre ellas. Foto 612px (34%) y texto el resto.
   ========================================================================== */
.cal {
	padding: clamp(1.5rem, 2.81vw, 3.38rem) 0 clamp(2rem, 3.4vw, 4.1rem);
	display: grid;
	gap: clamp(1.5rem, 3.39vw, 4.06rem);   /* 65px a 1920 */
}
.cal-tarjeta {
	display: grid;
	grid-template-columns: 34% minmax(0, 1fr);
	align-items: stretch;
	width: min(100% - 2 * 3.125%, 1799px);
	margin: 0 auto;
	min-height: clamp(420px, 44.48vw, 900px);   /* 854px a 1920 */
	background: var(--c-white);
	color: var(--c-dark);
}
/* Las impares llevan la foto a la derecha; el orden del DOM no cambia, así que
   el texto se lee siempre primero. */
.cal-tarjeta--invertida .cal-tarjeta__media { order: 2; }
.cal-tarjeta--invertida { grid-template-columns: minmax(0, 1fr) 34%; }
.cal-tarjeta__img { width: 100%; height: 100%; object-fit: cover; }
.cal-tarjeta__cuerpo {
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: clamp(1.5rem, 3.1vw, 3.75rem) clamp(1.5rem, 3.65vw, 4.4rem);
}
/* En el diseño el titular va alineado a la derecha en las tarjetas con la foto
   a la izquierda, y a la izquierda en las invertidas. */
.cal-tarjeta__title {
	margin: 0 0 clamp(1.2rem, 2.08vw, 2.5rem);
	font-size: clamp(2.1rem, 3.59vw, 4.31rem);   /* 69px a 1920 */
	font-weight: 300;
	line-height: 1.08;
	text-transform: uppercase;
	text-align: right;
}
.cal-tarjeta__title .title-line--thin { padding-right: 0; }
.cal-tarjeta--invertida .cal-tarjeta__title { text-align: left; }
/* «NUESTRO / LABORATORIO»: la segunda línea entra sangrada. */
.cal-tarjeta--invertida .cal-tarjeta__title .title-line--thin { padding-left: 1.6em; }
.cal-tarjeta__texto {
	max-width: 62ch;
	margin-left: auto;
	font-size: clamp(0.8rem, 0.83vw, 1rem);
	line-height: 1.45;
}
.cal-tarjeta--invertida .cal-tarjeta__texto { margin-left: 0; }
.cal-tarjeta__texto > :last-child { margin-bottom: 0; }
.cal-sellos {
	list-style: none;
	margin: clamp(1.5rem, 2.6vw, 3.1rem) 0 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: clamp(1rem, 1.72vw, 2.06rem);
	justify-content: flex-end;
	margin-left: auto;
}
.cal-tarjeta--invertida .cal-sellos { justify-content: flex-start; margin-left: 0; }
/* El botón acompaña al texto: a la derecha en las normales y a la izquierda en
   las invertidas. Sin esto el div ocupa todo el ancho y el botón se va al borde. */
.cal-tarjeta__cta { margin-top: clamp(1.5rem, 2.6vw, 3.1rem); align-self: flex-end; }
.cal-tarjeta--invertida .cal-tarjeta__cta { align-self: flex-start; }

/* ---- Apilado de las tarjetas ----
   Mismo patrón que la línea de generaciones de Origen: cada tarjeta se clava y
   la siguiente se le monta encima. Aquí la tarjeta es más estrecha que la
   pantalla, así que se ve el crema alrededor y el conjunto se lee como una
   baraja.
   El contenedor pasa a flujo normal: dentro de un grid cada tarjeta se fijaría
   dentro de su propia celda y no habría apilado ninguno. */
@media (min-width: 901px) and (prefers-reduced-motion: no-preference) {
	.cal { display: block; }
	.cal-tarjeta {
		position: sticky;
		top: calc(var(--header-h) + 1.5rem);
		min-height: 0;
		/* Alto MÍNIMO, no fijo: la tarjeta "Calidad certificada" (título de dos
		   líneas + texto + 9 sellos + CTA) no cabe en 85svh en portátiles de poca
		   altura (1280×720, 1366×768: 14-89px de más), y con `height` fijo el
		   sobrante se recortaba o salía como scroll interno de la caja. Con
		   min-height la tarjeta mide 85svh cuando el contenido cabe (diseño
		   intacto en pantallas grandes) y crece lo que haga falta cuando no. */
		min-height: calc(85svh - var(--header-h) - 3rem);
		margin-bottom: clamp(1.5rem, 3.39vw, 4.06rem);
	}
	/* Item de grid con `align-items: stretch`: por defecto su min-height
	   automático es el del contenido (la foto a tamaño real), así que la fila
	   crecía por encima de la altura fija de la tarjeta y la foto se salía por
	   debajo del bloque blanco — quedaban descuadradas. Con el alto de la tarjeta
	   ya no fijo, el cuerpo sí manda sobre la fila (es lo que se quiere) y la
	   foto no debe hacerlo: min-height:0 en __media. */
	.cal-tarjeta__media { min-height: 0; }
	/* Recorte del aire vertical "de sobra" (no del texto ni de su tamaño de
	   fuente) que la tarjeta más cargada (sellos) necesitaba para caber sin
	   desbordar: mismos topes de clamp() reducidos, mismos mínimos. */
	.cal-tarjeta__cuerpo {
		padding-top: clamp(1.5rem, 2vw, 2.5rem);
		padding-bottom: clamp(1.5rem, 2vw, 2.5rem);
	}
	.cal-tarjeta__title { margin-bottom: clamp(1rem, 1.4vw, 1.6rem); }
	.cal-sellos {
		margin-top: clamp(1rem, 1.4vw, 1.8rem);
		gap: clamp(0.7rem, 1.1vw, 1.4rem);
	}
	.cal-tarjeta__cta { margin-top: clamp(0.8rem, 1.3vw, 1.6rem); }
	.cal::after {
		content: '';
		display: block;
		height: calc(57svh - var(--header-h));
	}
}

/* El cierre reutiliza la retícula del claim sobre el crema. */
.claim--crema {
	--claim-linea: rgb(33 19 22 / 22%);
	background: var(--c-cream);
	color: var(--c-dark);
}
.claim--crema .claim__title { color: var(--c-dark); }

/* ==========================================================================
   Página Sostenibilidad

   Dos mitades: la primera entera en verde y la segunda en blanco. Las palabras
   grandes (EL ORIGEN, NUESTRO CULTIVO, VALOR, CIENCIA, BENEFICIOS) son el hilo
   conductor y van en crema sobre verde y en verde sobre blanco.
   ========================================================================== */
.sost--verde { background: var(--c-green); color: var(--c-cream); }
.sost--blanco { background: var(--c-white); color: var(--c-green); }

.sost-palabra {
	margin: 0;
	font-family: var(--f-display);
	font-size: clamp(3rem, 6.77vw, 8.13rem);    /* 130px a 1920 */
	font-weight: 400;
	line-height: 0.95;
	text-transform: uppercase;
	color: var(--c-cream);
}
.sost--blanco .sost-palabra { color: var(--c-green); }
.sost-titulillo {
	margin: 0 0 0.5em;
	font-family: var(--f-display);
	font-size: clamp(0.95rem, 1.15vw, 1.38rem);  /* 22px a 1920 */
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: 0.01em;
}
.sost-texto {
	margin: 0;
	font-size: clamp(0.8rem, 0.83vw, 1rem);      /* 16px a 1920 */
	line-height: 1.5;
	max-width: 52ch;
}

/* ---- Better Source + esquema ---- */
.sost-intro {
	padding: clamp(3rem, 5.83vw, 7rem) var(--gutter) clamp(2rem, 3.6vw, 4.3rem);
	text-align: center;
}
.sost-intro__title {
	margin: 0 0 clamp(1rem, 1.72vw, 2.06rem);
	font-size: clamp(1.8rem, 2.71vw, 3.25rem);   /* 52px a 1920 */
	font-weight: 300;
}
.sost-intro__title .title-word--strong { font-weight: 500; }
.sost-intro__text { margin: 0 auto; max-width: 72ch; font-size: clamp(0.8rem, 0.88vw, 1.06rem); }

/* El esquema es una llave: un tronco que baja y se abre a los tres nodos. */
.sost-esquema {
	/* FRA-617: el tronco/travesaño usaban `42%` fijo para caer justo donde
	   empieza la fila de nodos (`padding-top`) — coincide solo al ancho con
	   el que se midió ese 42%; en cualquier otro, `padding-top` (clamp en
	   rem/vw) y la altura total de `.sost-esquema` (que además depende del
	   alto real de los óvalos) escalan distinto y el travesaño se queda
	   corto o largo respecto a las bajantes de cada nodo -las líneas "no
	   enganchan bien", reportado por Fran. Con la misma variable en los dos
	   sitios quedan siempre exactos, a cualquier ancho. */
	--esquema-drop: clamp(3.4rem, 5.2vw, 4.80rem);
	list-style: none;
	margin: clamp(2.5rem, 4.9vw, 5.9rem) auto 0;
	padding: var(--esquema-drop) 0 0;
	width: min(100% - 2 * var(--gutter), 1420px);
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	position: relative;
}
.sost-esquema::before {   /* tronco central */
	content: '';
	position: absolute;
	top: 0; left: 50%;
	width: 1px; height: var(--esquema-drop);
	background: currentColor;
	opacity: 0.55;
}
.sost-esquema::after {    /* travesaño */
	content: '';
	position: absolute;
	top: var(--esquema-drop); left: 16.66%; right: 16.66%;
	height: 1px;
	background: currentColor;
	opacity: 0.55;
}
.sost-esquema__nodo {
	--nodo-drop: clamp(1.6rem, 2.9vw, 3.4rem);   /* alto de la bajante = donde empieza el círculo */
	--oval-font: clamp(0.62rem, 0.63vw, 0.75rem);   /* mismo font-size que el span, para poder calcular su alto real en "em" */
	position: relative;
	display: flex;
	justify-content: center;
	padding-top: var(--nodo-drop);
}
.sost-esquema__nodo::before {   /* bajante hasta la elipse */
	content: '';
	position: absolute;
	top: 0; left: 50%;
	width: 1px;
	height: var(--nodo-drop);
	background: currentColor;
	opacity: 0.55;
}
/* FRA-617: enlazar los tres círculos entre sí (a la altura de su centro),
   además de con la llave de arriba. Se dibuja desde el nodo central porque
   es la única columna cuyo ancho (1fr de 3) permite alcanzar el centro de
   las otras dos con un simple -50%/-50% (el porcentaje de un `left/right`
   absoluto se resuelve contra el ancho del *containing block* -aquí, el
   propio nodo, que mide justo 1 columna- no del elemento: -50% cae en el
   centro de la columna vecina, -100% se pasaría hasta su borde exterior,
   que es justo el bug que reportó Fran, "sobresale por los extremos").
   El alto real del círculo (span) no se puede leer en CSS puro, así que se
   calcula con la misma fórmula de su caja: borde(1px) + la mitad del
   padding-top(0.7em) + la mitad de una línea de texto(line-height 1.25em) →
   1px + 1.325em. Repite `font-size: var(--oval-font)` para que ese "em" sea
   el mismo que usa el span, y no el heredado del nodo. */
.sost-esquema__nodo:nth-child(2)::after {
	content: '';
	position: absolute;
	font-size: var(--oval-font);
	top: calc(var(--nodo-drop) + 1px + 1.325em);
	left: -50%; right: -50%;
	height: 1px;
	background: currentColor;
	opacity: 0.55;
}
.sost-esquema__nodo span {
	/* FRA-617: la línea de conexión (nodo:nth-child(2)::after) tachaba el
	   texto del óvalo. `background` sólido -el mismo verde de la sección-
	   tapa la línea donde pasa por debajo del óvalo; PERO Fran confirmó que
	   el background solo (sin más) no bastaba en su Safari real — hace
	   falta además `position:relative; z-index:1` para que el óvalo gane
	   también el pulso de apilado frente a la línea (z-index:auto). Las dos
	   cosas juntas, confirmadas por Fran contra producción: el background
	   cubre el caso general y el z-index fuerza el orden de pintado que
	   WebKit no resolvía solo con el background. */
	background: var(--c-green);
	position: relative;
	z-index: 1;
	display: grid;
	place-items: center;
	text-align: center;
	min-width: clamp(90px, 7.3vw, 140px);
	padding: 0.7em 1.2em;
	border: 1px dashed currentColor;
	border-radius: 50%;
	font-size: var(--oval-font);
	text-transform: uppercase;
	letter-spacing: 0.06em;
	line-height: 1.25;
}

/* ---- Bloque de palabra + pares + foto a sangre ---- */
/* La foto ocupa poco menos de la mitad derecha; el texto respira hasta ella. */
/*
 * "Nuestro cultivo" va en `position: absolute` sobre la foto y por eso no
 * cuenta para la altura de `__media` ni de la sección: sin este
 * padding-bottom la sección terminaba justo debajo de la foto y "CULTIVO",
 * que sobresale por fuera, se comía la lista numerada de la sección
 * siguiente. Va aquí (en el grid), no en `__media` — ahí `bottom: 0` del
 * texto se ancla al padding-box de `__media`, así que meterlo dentro solo
 * desplaza el ancla hacia abajo con él y no libera hueco de verdad. Medido
 * contra sostenibilidad.pdf a escala 1:1: ~263px de hueco a 1920 entre el
 * pie de "CULTIVO" y "01. SUELO VIVO".
 */
.sost-bloque {
	display: grid;
	grid-template-columns: minmax(0, 1.22fr) minmax(0, 1fr);
	align-items: start;
	column-gap: clamp(1.5rem, 2.6vw, 3.1rem);
	padding-bottom: clamp(4rem, 13.7vw, 16.4rem);
}
.sost-bloque__texto { padding: clamp(2rem, 3.9vw, 4.7rem) 0 clamp(2rem, 3.9vw, 4.7rem) var(--gutter); }
.sost-bloque__texto .sost-texto { max-width: none; }
.sost-bloque__pares { margin-top: clamp(1.6rem, 3.4vw, 4.1rem); display: grid; gap: clamp(1.4rem, 2.4vw, 2.9rem); }
.sost-bloque__media {
	position: relative;
	align-self: stretch;
	min-height: clamp(320px, 35vw, 700px);
}
/* FRA-617: con `align-self: stretch` la foto se estira a la altura de la
   columna de texto, que crece con el número de pares de "El origen"/"Ciencia"
   (repeater ACF) — con muchos pares la foto acaba con un recorte
   desproporcionado. A partir de 901px (por debajo el grid ya es de una sola
   columna y `.sost-bloque__img` fija su aspect-ratio, ver el bloque de
   "Páginas interiores en móvil") la foto deja de estirarse y en su lugar
   acompaña el scroll del texto, sticky bajo la cabecera — mismo patrón que
   `.cal-tarjeta`. */
@media (min-width: 901px) {
	.sost-bloque__media {
		position: sticky;
		top: calc(var(--header-h) + 1.5rem);
		align-self: start;
		/* Altura propia y ya no min-height: con align-self:start el min-height
		   solo no basta como base para el 100% de `.sost-bloque__img`. */
		height: clamp(320px, 35vw, 700px);
	}
}
.sost-bloque__img { width: 100%; height: 100%; object-fit: cover; }
/* La palabra se apoya en la esquina inferior izquierda de la foto y se sale
   hacia fuera; parte en dos líneas si hace falta, como en el diseño. */
.sost-palabra--sobre-foto {
	position: absolute;
	left: 0; bottom: 0;
	width: max-content;
	max-width: 7.4em;
	/* Medido contra el comp: el borde inferior de la foto cae dentro de la
	   1ª línea ("Nuestro" sobre todo en la foto, "Cultivo" ya en verde). */
	transform: translate(-0.06em, 67%);
	margin: 0;
	text-align: left;
	pointer-events: none;
}

/* ---- Foto + lista numerada ---- */
/* La foto no dicta dónde empieza la lista: en el diseño hay un hueco enorme
   entre las botas y el "01." (la lista arranca en 54,1vw, alineada con la
   columna de "NUESTRO CULTIVO" del bloque de arriba, no pegada a la foto).
   Por eso la 1ª columna reserva ese hueco entero y la foto solo ocupa su
   ancho real (25.9vw) dentro de ella. */
.sost-lista {
	display: grid;
	grid-template-columns: clamp(300px, 54.1vw, 1039px) minmax(0, 1fr);
	align-items: start;
	padding-bottom: clamp(2rem, 4vw, 4.8rem);
}
.sost-lista__media { width: 100%; max-width: clamp(220px, 25.9vw, 497px); }
/* La foto de las botas es vertical en el diseño (497 × 751 medido contra el
   PDF a escala 1:1), no casi cuadrada. */
.sost-lista__img { width: 100%; aspect-ratio: 497 / 751; object-fit: cover; }
.sost-lista__items {
	list-style: none;
	margin: 0;
	padding: clamp(1rem, 2vw, 2.4rem) var(--gutter) 0 0;
	counter-reset: sost;
	display: grid;
	gap: clamp(1.2rem, 2.08vw, 2.5rem);
}
.sost-lista__item { counter-increment: sost; }
/* La numeración 01, 02… la pone el CSS: en el panel solo se ordena. */
.sost-lista__titulo::before { content: counter(sost, decimal-leading-zero) '. '; }

/* ---- Valor ---- */
.sost-valor { padding: clamp(2rem, 4vw, 4.8rem) var(--gutter) clamp(3rem, 6vw, 7.2rem); }
/* «VALOR» se apoya sobre el borde superior de la foto, ligeramente a su derecha. */
.sost-valor__palabra {
	width: min(100%, 46%);
	margin: 0 auto -0.34em;
	text-align: right;
	position: relative;
	z-index: 1;
}
.sost-valor__cuerpo { width: min(100%, 46%); margin: 0 auto; }
.sost-valor__img { width: 100%; aspect-ratio: 440 / 250; object-fit: cover; }
.sost-valor__cuerpo .sost-titulillo { margin-top: clamp(1rem, 1.6vw, 1.9rem); }

/* ---- Beneficios (bajo la foto de Ciencia) ---- */
.sost-bloque--claro { padding-bottom: clamp(3rem, 6vw, 7.2rem); }
/* FRA-742: la foto de «Ciencia» es sticky (FRA-617), pero un sticky de grid se
   mueve por todo el contenedor, no solo por su fila: al hacer scroll la foto
   se deslizaba sobre la lista de beneficios y la tapaba. Aquí no hace falta
   que acompañe al texto (solo 2 pares), así que se queda en su fila. */
@media (min-width: 901px) {
	.sost-bloque--claro .sost-bloque__media { position: relative; top: auto; }
}
/* «BENEFICIOS» sobresale ~64% de su alto por debajo de la foto: la lista
   arranca pasado ese saliente (mismo clamp que .sost-palabra) más un respiro. */
.sost-beneficios { grid-column: 2; padding: calc(0.64 * clamp(3rem, 6.77vw, 8.13rem) + clamp(1.5rem, 2.6vw, 3.1rem)) var(--gutter) 0 0; }
.sost-beneficios__kicker {
	margin: 0 0 clamp(1rem, 1.72vw, 2.06rem);
	font-family: var(--f-display);
	font-size: clamp(0.9rem, 1.04vw, 1.25rem);
	text-transform: uppercase;
	color: var(--c-green);
}
.sost-beneficios__items { list-style: none; margin: 0; padding: 0; display: grid; gap: clamp(1rem, 1.72vw, 2.06rem); }
.sost-beneficios__items .sost-titulillo { color: var(--c-green); margin-bottom: 0.25em; }

/* ---- El cierre reutiliza la retícula del claim, en claro ---- */
.claim--claro {
	--claim-linea: rgb(33 19 22 / 20%);
	background: var(--c-white);
	color: var(--c-dark);
}
.claim--claro .claim__title { color: var(--c-green); }

/* ==========================================================================
   Página Origen — Historia

   Retícula propia (artboard 1920): 46 | 474 | 882 | 473 | 45, con hairlines
   en x=46, 520, 1402 y 1875, y filas de 711px por generación.
   ========================================================================== */
.historia-intro {
	--hist-linea: rgb(33 19 22 / 20%);
	padding: clamp(3rem, 5.2vw, 6.25rem) 0 clamp(3rem, 6vw, 7.2rem);
	background: var(--c-white);
	font-weight: 400;
}
.historia-intro__inner {
	width: min(100% - 2 * var(--gutter), 1612px);   /* x=154 a 1766 en el diseño */
	margin: 0 auto;
}
.historia-intro__title {
	font-size: clamp(1.5rem, 2.08vw, 2.5rem);    /* 40px a 1920 */
	font-weight: 400;
	text-transform: uppercase;
	letter-spacing: 0.005em;
	margin: 0 0 clamp(1.2rem, 1.98vw, 2.4rem);
}
.historia-intro__text { font-size: clamp(0.9rem, 0.94vw, 1.23rem); line-height: 1.45; }
.historia-intro__text > :last-child { margin-bottom: 0; }
/* La primera frase del texto va en rojo (el editor la marca en negrita). */
.historia-intro__text p:first-of-type strong,
.historia-intro__text p:first-of-type b { color: var(--c-accent); font-weight: inherit; }

.historia-intro__media { position: relative; margin: clamp(1.8rem, 3.4vw, 4.1rem) 0 0; }
.historia-intro__track {
	display: flex;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
}
.historia-intro__track::-webkit-scrollbar { display: none; }
.historia-intro__slide { position: relative; flex: 0 0 100%; scroll-snap-align: start; }
.historia-intro__img,
.historia-intro__slide .video__player { width: 100%; aspect-ratio: 1612 / 854; object-fit: cover; }
.historia-intro__slide--video .video__play {
	position: absolute;
	top: 50%; left: 50%;
	transform: translate(-50%, -50%);
}
.historia-intro__slide--video.is-playing .video__play { opacity: 0; pointer-events: none; }
.historia-intro__bullets { display: flex; justify-content: center; gap: 0.62rem; margin-top: 1.1rem; }
.historia-intro__bullet {
	width: 8px; aspect-ratio: 1;
	padding: 0;
	border: 1px solid var(--c-dark);
	border-radius: 50%;
	background: transparent;
	opacity: 0.55;
	cursor: pointer;
	transition: background 0.3s var(--ease), opacity 0.3s var(--ease);
}
.historia-intro__bullet.is-current { background: var(--c-dark); opacity: 1; }

.historia-intro__text--pie { margin-top: clamp(1rem, 1.5vw, 1.8rem); }
.historia-intro__claim {
	margin: clamp(1.5rem, 2.6vw, 3.1rem) 0 0;
	font-family: var(--f-display);
	font-size: clamp(1.6rem, 2.4vw, 2.9rem);   /* 46px a 1920 */
	line-height: 1.1;
}
.historia-intro__claim .title-word--strong { font-weight: 500; }
.historia-intro__claim .title-word--thin { font-weight: 300; }

/* ---- Nuestra historia + generaciones ---- */
.generaciones {
	--gen-linea: rgb(33 19 22 / 20%);
	--gen-c1: 2.396%;   /* 46px  */
	--gen-c2: 24.688%;  /* 474px */
	--gen-c3: 45.938%;  /* 882px */
	--gen-c4: 24.635%;  /* 473px */
	--gen-c5: 2.344%;   /* 45px  */
	background: var(--c-white);
	border-top: 1px solid var(--gen-linea);
}
.generaciones__head {
	display: grid;
	grid-template-columns: var(--gen-c1) var(--gen-c2) var(--gen-c3) var(--gen-c4) var(--gen-c5);
	align-items: start;
	padding: clamp(3rem, 6.56vw, 7.9rem) 0 clamp(3rem, 9.11vw, 11rem);   /* 126 / 175 a 1920 */
	margin: 0 8%;
}
.generaciones__head-texto {
	grid-column: 2 / 4;
	/* Mismo sangrado para "HISTORIA" y para el párrafo de debajo, que en el
	   diseño arrancan exactamente en la misma x — no puede ir en `em` en los
	   dos sitios porque el tamaño de letra es muy distinto entre el título y
	   el párrafo. */
	--gen-indent: clamp(3.45rem, 9.545vw, 11.38rem);
}
.generaciones__title {
	margin: 0 0 0.5em;
	/* El cliente pidió igualarlo al tamaño de los títulos de Calidad
	   (.cal-tarjeta__title) en vez del medido contra origen-historia.pdf: a
	   ese tamaño mayor, el line-height ajustado (0.87, para el mask) recortaba
	   la "O" por arriba. */
	font-size: clamp(2.1rem, 3.59vw, 4.31rem);  /* 69px a 1920, igual que Calidad */
	text-transform: uppercase;
	line-height: 1.08;
}
/* «NUESTRA / HISTORIA»: en el diseño las dos líneas van en el mismo peso —no
   una fuerte y otra fina, como el resto de titulares partidos en dos— y la
   segunda entra sangrada hasta la misma x que el párrafo de debajo. */
.generaciones__title .title-line--thin {
	padding-left: var(--gen-indent);
	font-weight: 500;
}
.generaciones__intro {
	margin: 0;
	padding-left: var(--gen-indent);
	font-size: clamp(0.85rem, 0.94vw, 1.33rem);
	line-height: 1.45;
	font-weight: 400;
}
.generaciones__marca { grid-column: 4; justify-self: center; }
.generaciones__marca-img { height: auto; }

/* Las cuatro hairlines verticales recorren toda la línea de generaciones
   (x=46, 520, 1402 y 1875 sobre el artboard). Van de fondo, no como bordes de
   celda, porque la foto cambia de columna en cada fila. */
/* ---- Apilado ----------------------------------------------------------
   Cada generación se clava arriba y la siguiente se le monta encima, como
   las tarjetas de godaylight.com. Es `position: sticky` puro; no hace falta
   ninguna librería.

   Cómo funciona: los hijos son hermanos en flujo normal, todos `sticky` a la
   misma altura. El primero se pega al llegar arriba y se queda; el segundo
   sube y lo tapa; y así. El contenedor acaba la fijación cuando se termina.

   Dos condiciones que lo rompen y no avisan:
   · un ancestro con overflow distinto de visible cancela el sticky,
   · y las tarjetas necesitan fondo propio, porque si son transparentes se ve
     la de debajo a través.

   La altura pasa a ser una pantalla en vez de los 711px del artboard: es lo
   que pide el efecto y está hablado.
   ------------------------------------------------------------------------ */
.generaciones__lista {
	list-style: none;
	margin: 0;
	padding: 0;
	background-image:
		linear-gradient(var(--gen-linea), var(--gen-linea)),
		linear-gradient(var(--gen-linea), var(--gen-linea)),
		linear-gradient(var(--gen-linea), var(--gen-linea)),
		linear-gradient(var(--gen-linea), var(--gen-linea));
	background-size: 1px 100%;
	background-position: 2.396% 0, 27.083% 0, 73.021% 0, 97.656% 0;
	background-repeat: no-repeat;
}
.generaciones__fila {
	display: grid;
	grid-template-columns: var(--gen-c1) var(--gen-c2) var(--gen-c3) var(--gen-c4) var(--gen-c5);
	min-height: clamp(420px, 37.03vw, 760px);   /* 711px a 1920 */
	border-top: 1px solid var(--gen-linea);
}
.generaciones__fila:last-child { border-bottom: 1px solid var(--gen-linea); }

@media (min-width: 901px) and (prefers-reduced-motion: no-preference) {
	.generaciones__fila {
		position: sticky;
		top: var(--header-h);
		min-height: 0;
		/* Alto MÍNIMO, no fijo: con `height` la fila recortaba el contenido en
		   viewports bajos (p. ej. 1536×730, ~70px fuera). min-height mantiene
		   los 66svh cuando el contenido cabe y crece si no. */
		min-height: calc(66svh - var(--header-h));
		/* Fondo propio: sin esto se transparenta la tarjeta de debajo. */
		background: var(--c-white);
	}
	/* Las hairlines verticales van pintadas de fondo en la lista, que ahora
	   queda tapada por las tarjetas; se repiten en cada una. */
	.generaciones__fila {
		background-image:
			linear-gradient(var(--gen-linea), var(--gen-linea)),
			linear-gradient(var(--gen-linea), var(--gen-linea)),
			linear-gradient(var(--gen-linea), var(--gen-linea)),
			linear-gradient(var(--gen-linea), var(--gen-linea));
		background-size: 1px 100%;
		background-position: 2.396% 0, 27.083% 0, 73.021% 0, 97.656% 0;
		background-repeat: no-repeat;
	}
	/* Un elemento sticky solo se queda fijo mientras su contenedor tenga
	   recorrido por debajo. La última tarjeta es el último hijo, así que sin
	   margen extra pasa de largo sin llegar a clavarse y la generación «Hoy»
	   no se lee.
	   Ojo: con padding-bottom NO se arregla. El recorrido de un sticky se
	   mide contra la caja de CONTENIDO del padre, y el relleno queda fuera de
	   ella. Hace falta contenido de verdad, y para eso vale un pseudoelemento
	   sin tener que ensuciar el marcado con un <li> vacío. */
	.generaciones__lista { background-image: none; }
	.generaciones__lista::after {
		content: '';
		display: block;
		height: calc(100svh - var(--header-h));
	}
	.generaciones__img { height: 100%; }
	.generaciones__cuerpo { align-self: center; }
}
.generaciones__foto { grid-column: 2; grid-row: 1; }
.generaciones__fila--derecha .generaciones__foto { grid-column: 4; }
.generaciones__img { width: 100%; height: 100%; object-fit: cover; }
.generaciones__cuerpo {
	grid-column: 3;
	grid-row: 1;
	align-self: center;
	text-align: center;
	padding: 2rem clamp(1rem, 3vw, 3.6rem);
}
.generaciones__gen {
	margin: 0 0 0.6em;
	font-size: clamp(1.8rem, 2.92vw, 3.5rem);   /* 56px a 1920 */
	font-weight: 500;
	text-transform: uppercase;
	color: var(--c-accent);
}
/* El color se va oscureciendo generación tras generación (muestreado del PDF). */
.generaciones__fila:nth-child(1) .generaciones__gen { color: #eb5414; }
.generaciones__fila:nth-child(2) .generaciones__gen { color: #f52300; }
.generaciones__fila:nth-child(3) .generaciones__gen { color: #e80008; }
.generaciones__fila:nth-child(4) .generaciones__gen { color: #bb0000; }
.generaciones__fila:nth-child(5) .generaciones__gen { color: #960000; }
.generaciones__fila:nth-child(6) .generaciones__gen { color: #510000; }
.generaciones__fila:nth-child(n+7) .generaciones__gen { color: var(--c-dark); }
.generaciones__kicker {
	margin: 0 0 0.6em;
	font-size: clamp(0.8rem, 0.83vw, 1rem);
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: inherit;
}
.generaciones__texto {
	margin: 0;
	font-size: clamp(0.8rem, 0.88vw, 1.06rem);
	line-height: 1.5;
	margin-inline: auto;
	font-weight: 400;
}
/* El texto de cada generación hereda el color de su titular. */
.generaciones__fila:nth-child(1) .generaciones__cuerpo { color: #eb5414; }
.generaciones__fila:nth-child(2) .generaciones__cuerpo { color: #f52300; }
.generaciones__fila:nth-child(3) .generaciones__cuerpo { color: #e80008; }
.generaciones__fila:nth-child(4) .generaciones__cuerpo { color: #bb0000; }
.generaciones__fila:nth-child(5) .generaciones__cuerpo { color: #960000; }
.generaciones__fila:nth-child(6) .generaciones__cuerpo { color: #510000; }

/* ---- Cierre de Origen: la retícula del claim con las medidas de esta página
        y el titular a la izquierda, no centrado. ---- */
.claim--historia {
	--claim-linea: rgb(33 19 22 / 20%);
	background: var(--c-white);
	color: var(--c-dark);
}
.claim--historia .claim__grid {
	grid-template-columns: 2.396% 24.688% 45.938% 24.635% 2.344%;
	grid-template-rows: 62.5% 37.5%;
	min-height: clamp(520px, 44.11vw, 900px);   /* 847px a 1920 */
}
.claim--historia .claim__title {
	grid-area: 1 / 2 / 3 / 4;
	align-self: center;
	text-align: left;
	color: var(--c-dark);
}
.claim--historia .claim__cell--foto-1,
.claim--historia .claim__cell--texto-1,
.claim--historia .claim__cell--texto-2 { display: none; }
.claim--historia .claim__cell--foto-2 {
	grid-area: 1 / 4;
	border: 0;
	align-items: stretch;
}
.claim--historia .claim__img { aspect-ratio: 473 / 330; }

/* ==========================================================================
   Blog / interiores
   ========================================================================== */
/* Ojo con el selector: body_class() pone «archive» y «single» en el <body>, así
   que sin acotarlo al elemento estas medidas se le aplicaban al body entero y
   estrujaban cualquier plantilla de archivo o de CPT. */
div.archive, article.single, article.page-content, div.error404-page {
	max-width: 1440px; margin: 0 auto;
	padding: clamp(3rem, 6vw, 6rem) var(--gutter) var(--section-y);
}
.archive__grid { list-style: none; margin: 3rem 0 0; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 2rem; }
.archive__card a { text-decoration: none; }
.archive__meta { display: block; margin-top: 1rem; font-size: 0.78rem; letter-spacing: 0.1em; text-transform: uppercase; opacity: 0.7; }
.single__body, .page-content__body { max-width: 72ch; }
.single__media img { width: 100%; }
.error404-page { text-align: center; }
.error404-page h1 { font-size: clamp(4rem, 12vw, 9rem); color: var(--c-red); }

/* ==========================================================================
   Responsive
   ========================================================================== */
@media (max-width: 1180px) {
	/* Sin columna derecha: la retícula se queda en una sola columna. */
	.hero__grid { grid-template-columns: 1fr; }
	.hero__cell--meter, .hero__cell--media, .hero__cell--words,
	.hero__cell--since, .hero__cell--void-top, .hero__cell--void-bottom { display: none; }
	.hero__cell--main { padding-right: var(--gutter-lg); }
}
@media (max-width: 900px) {
	/* Los saltos de línea del diseño no caben: que el texto fluya. */
	.hero__text br { display: none; }
	.hero__text { max-width: none; }
}
@media (max-width: 1024px) {
	/* La retícula del claim se deshace: una columna, el claim primero y las
	   hairlines fuera (no dicen nada apiladas). */
	.claim { padding: var(--section-y) var(--gutter); }
	/* La variante de Origen va nombrada aparte a propósito: su retícula se
	   declara como `.claim--historia .claim__grid`, gana por especificidad y
	   una media query no cambia eso. Sin esto, el cierre de Origen se quedaba
	   en cinco columnas dentro de 390px y el titular se salía por encima de
	   la foto. */
	.claim__grid,
	.claim--historia .claim__grid {
		grid-template-columns: 1fr;
		grid-template-rows: auto;
		min-height: 0;
		gap: clamp(2rem, 5vw, 3rem);
	}
	.claim__cell, .claim__title, .claim__kicker { grid-area: auto !important; border: 0 !important; padding: 0; }
	.claim__kicker { order: -2; }
	.claim__title { order: -1; text-align: left; }
	.claim__cell--texto-2 { justify-content: flex-start; }
	.claim__cell--texto-2 .claim__text { text-align: left; }
	.claim__media { max-width: 350px; }
	.claim__img { aspect-ratio: 4 / 3; }
	/* Los bloques compartidos pasan a una columna: primero el texto. */
	.slider__inner, .formulario__inner { grid-template-columns: 1fr; }
	.slider__body { order: -1; }
	.slider__img { aspect-ratio: 4 / 3; }
	.formulario__text { max-width: none; }
}
@media (max-width: 900px) {
	.cifras__inner, .sostenibilidad, .calidad__inner { grid-template-columns: 1fr; }
	.cifras__intro { border-right: 0; border-bottom: var(--hairline-light); }
	/* Los saltos manuales del diseño no caben: que el texto fluya. */
	.cifras__text br { display: none; }
	.cifras__item { min-height: 0; padding: 2rem var(--gutter); }
	.sostenibilidad__media { min-height: 60svh; }
	/* En una columna la línea larga del punto 4 no tiene a dónde ir. */
	.sostenibilidad__list li:nth-child(4)::after {
		left: calc(-1 * var(--sost-tick));
		width: var(--sost-tick);
		background: var(--sost-line);
	}
	.calidad__media { min-height: 70vw; }
	/* Sin columnas: las tres piezas del footer se apilan a ancho completo. */
	.site-footer__inner { display: flex; flex-direction: column; gap: clamp(3rem, 9vw, 5rem); }
	.site-footer__brand,
	.site-footer__ayudas {
		max-width: none;
		align-self: auto;
	}
	.site-footer__col { gap: clamp(3rem, 9vw, 5rem); }
	.archive__grid { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
	.hero__cta { flex-wrap: wrap; min-height: 0; }
	.hero__cta-label { padding: 0.7rem 1rem; }
	.hero__cta-btn { padding: 0.9rem 1.2rem; width: 100%; }
}

/* ==========================================================================
   Parallax de las fotos de la retícula

   Las fotos que van encajadas entre las hairlines se mueven algo más despacio
   que el scroll, como en kinncollective.co.uk. Es el recurso que mejor le
   sienta a este diseño: la retícula se queda quieta y lo que respira es la
   imagen dentro de su hueco.

   El marco recorta y la foto es más alta que él, así que puede desplazarse sin
   descubrir el fondo por ningún borde. El desplazamiento lo pone el JS en
   --parallax; sin JS la foto se queda centrada y no pasa nada.
   ========================================================================== */
.parallax {
	overflow: hidden;
	position: relative;
}
/* Las dos variables las pone el JS, en píxeles y por marco:
     --parallax-holgura  cuánto sobra de foto por arriba y por abajo
     --parallax          el desplazamiento de ahora mismo, acotado a la holgura
   Van en píxeles y no en porcentaje a propósito: el recorrido depende del alto
   de la ventana, que el CSS no sabe. Si el JS no llega, las dos valen 0 y la
   foto se queda clavada a su hueco, que es exactamente el diseño.

   Va absoluta y centrada con el propio transform, no con un margen negativo:
   los porcentajes de margin —también los verticales— se resuelven contra el
   ANCHO del contenedor, y en un marco apaisado se quedaban cortos y la foto
   descubría el borde de abajo. */
.parallax > img {
	--parallax: 0px;
	--parallax-holgura: 0px;
	position: absolute;
	top: 50%;
	left: 0;
	/* Explícitos porque hay fotos que venían con inset: 0 y, si se quedan,
	   sobredefinen la caja. */
	right: auto;
	bottom: auto;
	width: 100%;
	height: calc(100% + 2 * var(--parallax-holgura));
	object-fit: cover;
	transform: translate3d(0, calc(-50% + var(--parallax)), 0);
	will-change: transform;
}
@media (prefers-reduced-motion: reduce) {
	.parallax > img { top: 0; height: 100%; transform: none; }
}
/* La proporción pasa del <img> al marco: si se queda en la imagen, pelea con
   el alto extra que necesita para poder moverse. */
.claim__media.parallax { aspect-ratio: 348 / 433; }
.claim--historia .claim__media.parallax { aspect-ratio: 473 / 330; }
.sost-valor__media.parallax { aspect-ratio: 440 / 250; }
.claim__media.parallax > img,
.sost-valor__media.parallax > img { aspect-ratio: auto; }
/* Va aquí y no en el bloque responsive de más arriba porque la proporción del
   marco se declara en este, y a igual especificidad manda la última. */
@media (max-width: 1024px) {
	.claim__media.parallax,
	.claim--historia .claim__media.parallax { aspect-ratio: 4 / 3; }
}

/* ==========================================================================
   Páginas interiores en móvil

   Se montaron contra el artboard de 1920 y no tenían punto de ruptura: sus
   retículas seguían en dos, tres y cinco columnas dentro de 390px.

   El criterio aquí es práctico, no de diseño: una columna, tipos legibles y
   nada de recursos que dependen de que haya sitio (palabras a caballo de una
   foto, textos alineados a la derecha contra una hairline). En móvil esos
   recursos no se leen como intención, se leen como error.
   ========================================================================== */
@media (max-width: 900px) {

	/* Un hijo de grid tiene min-width: auto, así que no encoge por debajo de su
	   contenido: basta una palabra grande para que la columna mida más que la
	   pantalla y arrastre a toda la página. Aquí es lo que hacía que 390px de
	   viewport acabaran siendo 577. */
	.sost-bloque > *, .sost-lista > *, .generaciones__fila > *,
	.cal-tarjeta > *, .blog-listado__cabecera > *, .blog-destacada > *,
	.formulario__inner > *, .claim__grid > * { min-width: 0; }

	/* ---- Sostenibilidad ---- */
	.sost-bloque,
	.sost-lista { grid-template-columns: minmax(0, 1fr); }
	.sost-bloque__texto { padding: var(--section-y) var(--gutter) 0; }
	.sost-bloque__media { min-height: 0; margin-top: clamp(2rem, 6vw, 3rem); }
	.sost-bloque__img { aspect-ratio: 4 / 3; height: auto; }
	/* La palabra a caballo de la foto se salía del viewport y arrastraba la
	   página entera: 390px de pantalla se convertían en 577 y todo se veía
	   encogido. En móvil va debajo, dentro del margen y sin solaparse. */
	.sost-palabra--sobre-foto {
		position: static;
		transform: none;
		max-width: 100%;
		padding: 0 var(--gutter);
		margin-top: 0.6rem;
	}
	.sost-palabra { font-size: clamp(2.1rem, 11vw, 3.4rem); }
	.sost-lista__media { padding: 0 var(--gutter); }
	.sost-lista__img { aspect-ratio: 4 / 3; }
	.sost-lista__items { padding: clamp(1.6rem, 6vw, 2.4rem) var(--gutter) 0; }
	.sost-valor__palabra,
	.sost-valor__cuerpo { width: 100%; }
	.sost-valor__palabra { text-align: left; margin-bottom: 0.6rem; }
	.sost-esquema { grid-template-columns: 1fr; gap: 1.6rem; padding-top: 2rem; }
	/* Las líneas de la llave solo tienen sentido con los tres nodos en fila. */
	.sost-esquema::before, .sost-esquema::after,
	.sost-esquema__nodo::before,
	.sost-esquema__nodo:nth-child(2)::after { display: none; }
	.sost-esquema__nodo { padding-top: 0; }
	.sost-beneficios { grid-column: 1; padding: clamp(2rem, 8vw, 3rem) var(--gutter) 0; }
	.sost-texto { max-width: none; }

	/* ---- Origen — Historia ---- */
	.generaciones__head,
	.generaciones__fila {
		grid-template-columns: 1fr;
		min-height: 0;
	}
	.generaciones__head { padding: var(--section-y) var(--gutter); gap: 2rem; }
	.generaciones__head-texto, .generaciones__marca { grid-column: 1; }
	.generaciones__marca { justify-self: start; }
	.generaciones__title { font-size: clamp(2.2rem, 12vw, 3.6rem); }
	.generaciones__title .title-line--thin { padding-left: 0; }
	/* Las hairlines verticales se pintaban de fondo sobre cinco columnas. */
	.generaciones__lista { background-image: none; }
	.generaciones__foto,
	.generaciones__fila--derecha .generaciones__foto { grid-column: 1; grid-row: 1; }
	.generaciones__img { aspect-ratio: 4 / 3; height: auto; }
	.generaciones__cuerpo {
		grid-column: 1;
		grid-row: 2;
		text-align: left;
		padding: clamp(1.6rem, 6vw, 2.4rem) var(--gutter) clamp(2.5rem, 9vw, 3.5rem);
	}
	.generaciones__texto { margin-inline: 0; max-width: none; }
	.generaciones__gen { font-size: clamp(1.6rem, 8vw, 2.4rem); }
	.historia-intro__inner { width: calc(100% - 2 * var(--gutter)); }
	.claim--historia .claim__img { aspect-ratio: 4 / 3; }

	/* ---- Calidad ---- */
	.cal-tarjeta,
	.cal-tarjeta--invertida { grid-template-columns: 1fr; min-height: 0; }
	.cal-tarjeta { width: calc(100% - 2 * var(--gutter)); }
	.cal-tarjeta--invertida .cal-tarjeta__media { order: 0; }
	.cal-tarjeta__img { aspect-ratio: 4 / 3; height: auto; }
	/* Alineado a la derecha solo funciona con la foto al lado. */
	.cal-tarjeta__title,
	.cal-tarjeta--invertida .cal-tarjeta__title { text-align: left; font-size: clamp(1.8rem, 9vw, 2.6rem); }
	.cal-tarjeta--invertida .cal-tarjeta__title .title-line--thin { padding-left: 0; }
	.cal-tarjeta__texto,
	.cal-tarjeta--invertida .cal-tarjeta__texto { margin-left: 0; max-width: none; }
	.cal-sellos { justify-content: flex-start; margin-left: 0; }
	.cal-tarjeta__cta,
	.cal-tarjeta--invertida .cal-tarjeta__cta { align-self: flex-start; }

	/* ---- Productos ---- */
	.rejilla { padding-left: var(--gutter); padding-right: var(--gutter); }
	.rejilla__lista { grid-template-columns: 1fr; row-gap: clamp(1.6rem, 7vw, 2.5rem); }
	/* El hover no existe en táctil: la descripción y el botón se ven siempre. */
	.rejilla__card { aspect-ratio: auto; }
	.rejilla__hover {
		position: static;
		opacity: 1;
		background: #2a0f16;
		gap: 1.2rem;
	}
	.rejilla__img { aspect-ratio: 496 / 419; }
	.ficha__specs { grid-template-columns: 1fr; width: calc(100% - 2 * var(--gutter)); }
	.ficha__spec { min-height: 0; }
	.ficha__sectores { display: block; font-size: clamp(0.8rem, 3.4vw, 1rem); }
	.ficha__img { max-height: none; }

	/* ---- Blog ---- */
	.blog-listado__cabecera,
	.blog-destacada { grid-template-columns: 1fr; }
	.blog-listado__cabecera { padding: var(--section-y) var(--gutter); gap: 2rem; }
	.blog-listado__intro { padding-left: 0; }
	.blog-listado__title { font-size: clamp(2rem, 10vw, 3rem); }
	.blog-listado__img { aspect-ratio: 4 / 3; }
	.blog-destacada { gap: 1.6rem; }
	.blog-destacada__cta { order: 2; }
	.entrada__header { padding-left: 0; }
	.entrada__title { font-size: clamp(1.9rem, 9vw, 2.8rem); max-width: none; }
	.entrada__body { width: 100%; margin-left: 0; }
	.entrada__img { aspect-ratio: 4 / 3; }

	/* ---- Contacto ---- */
	.formulario--contacto .formulario__inner {
		grid-template-columns: 1fr;
		padding: 0 var(--gutter);
		row-gap: clamp(1.5rem, 6vw, 2.2rem);
	}
	.formulario--contacto .formulario__media { grid-row: auto; order: 2; }
	.formulario--contacto .formulario__intro,
	.formulario--contacto .formulario__card { grid-column: 1; }
	.formulario--contacto .formulario__img { aspect-ratio: 4 / 3; }
	.formulario__enviar { justify-content: flex-start; }

	/* ---- Titular de sección compartido ---- */
	.titular__title { font-size: clamp(1.4rem, 6.4vw, 2rem); }
}

/* iOS Safari hace zoom sobre el formulario en cuanto enfocas un campo con la
   letra por debajo de 16px, y al salir no vuelve. Da igual lo bien que esté
   maquetado: el formulario se siente roto. 16px es el mínimo, no una
   preferencia estética. */
@media (max-width: 900px) {
	.formulario__input,
	.formulario__input::placeholder { font-size: 16px; }
	textarea.formulario__input { min-height: 5em; }
}

/* Los rótulos pequeños del diseño quedan ilegibles por debajo de 13px. */
@media (max-width: 600px) {
	.hero__words li,
	.hero__since,
	.sostenibilidad__caption,
	.blog-destacada__meta,
	.entrada__meta { font-size: 0.8125rem; }
}
