/*
 * Componentes del tema.
 *
 * REGLA DEL PROYECTO
 * ------------------
 * Prohibido escribir un color, tamano de fuente o espaciado literal en este
 * archivo. Todo referencia un token de theme.json:
 *
 *   color:     var(--wp--preset--color--brand);
 *   font-size: var(--wp--preset--font-size--lg);
 *   padding:   var(--wp--preset--spacing--40);
 *
 * Asi, cuando llegue la identidad real del cliente, vestir la tienda es editar
 * theme.json y subir el logo. Ni un solo archivo CSS se toca.
 *
 * Los unicos valores crudos permitidos son geometria pura —radios, anchos de
 * borde, opacidades— porque no forman parte de la identidad de marca.
 */

/* --------------------------------------------------------------------------
   Cimientos
   -------------------------------------------------------------------------- */

:root {
	/* Alias historico. Nacio como un literal de 2 px cuando la geometria del
	   sitio era recta; hoy apunta al escalon base de la escala para que un solo
	   sitio siga mandando. Las reglas que de verdad necesitan otra forma —lo que
	   se pulsa, los paneles— nombran su token directamente. */
	--pep-radio: var(--wp--custom--radio--base);
	--pep-borde: 1px solid var(--wp--preset--color--neutral-200);
	/* Aqui vivia `--pep-transicion: 140ms ease`, un segundo vocabulario de
	   movimiento en paralelo al del theme.json: dos sitios donde cambiar el ritmo
	   del sitio, y ninguna forma de saber cual era el bueno. Sus dieciocho usos
	   —todos en la misma posicion, `transition: <propiedad> var(...)`— pasaron a
	   `movimiento--instante` (120 ms) con la curva `suave`, que es la que ya
	   usaban las otras veintinueve reglas. A esa duracion la diferencia es
	   imperceptible, y de paso el token de 120 ms deja de estar muerto. */

	/* El alto de un campo de formulario. Lo usan tres cosas a la vez —el propio
	   campo, la caja del icono que va dentro, y la prueba que suma el presupuesto
	   vertical de la pantalla de acceso—, y tenerlo en un solo sitio es lo que
	   evita que se separen. Son los mismos 44 px de altura minima que el resto del
	   sitio le da a cualquier cosa que se pulsa. */
	--pep-campo-alto: 2.75rem;

	/* Alto aproximado de la cabecera pegada. Se usa para que un enlace a un
	   ancla no deje la seccion escondida DEBAJO de ella, que es el fallo mas
	   comun de una cabecera fija y el mas irritante. */
	/* Se midio: 8 de carril + 32 de relleno + 44 de contenido + 2 de filo = 94.
	   Seis rem son 96, o sea el alto real con dos pixeles de holgura, que es lo
	   que hace falta para que un ancla no deje su seccion justo debajo del filo
	   de la barra. */
	--pep-cabecera: 7rem;
}

/* El desplazamiento a un ancla es suave, salvo para quien pidio menos
   movimiento —eso ya lo apaga el interruptor general de mas abajo—. */
html {
	scroll-behavior: smooth;
}

/* Cualquier destino de ancla se detiene por debajo de la cabecera. */
:target,
[id]:not(body) {
	scroll-margin-top: var(--pep-cabecera);
}

/* --------------------------------------------------------------------------
   LOS ANCHOS EN LOS QUE PENSAMOS
   Cuatro, y siempre los mismos. Antes habia tres cortes sueltos puestos donde
   hizo falta, que es como se llega a un sitio que se ve bien en el monitor de
   quien lo hizo y en ningun otro.

   CSS no deja usar una variable dentro de `@media`, asi que la lista vive aqui
   como acuerdo escrito. Si hace falta un corte nuevo, se agrega a esta lista
   antes de usarlo, no despues.

     30rem   480px   telefono
     46rem   736px   telefono grande / tableta vertical
     64rem  1024px   tableta horizontal
     80rem  1280px   escritorio

   Regla: se disena para el mas chico y se sube. Un corte solo existe si a ese
   ancho el contenido de verdad deja de funcionar, no porque toque redondear.

   Y un dato medido, que es el que hay que tener presente al elegir el ultimo
   corte: 1280 px NO es donde empieza el escritorio de la gente. Windows viene de
   fabrica con la pantalla al 150 % en casi cualquier portatil moderno, y un
   monitor de 1920x1080 al 150 % da una ventana de 1276x670 px CSS. Cuatro
   pixeles por DEBAJO de este corte, y con la mitad del alto que uno supone.

   Se midio en la pantalla del cliente: su captura tenia el bloque de contenido a
   1815 px de imagen contra los 1216 px que declara `contentSize`, o sea un
   factor de 1.49. De ahi salieron dos cosas que no se veian de otra forma: que
   el sitio no tenia margen lateral en su pantalla, y que el boton de entrar a la
   cuenta le quedaba fuera. `composer test:vistas` suma hoy ese alto y falla si
   deja de caber.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   ESPACIADO FLUIDO
   WordPress rechaza `clamp()` dentro de los presets de espaciado de theme.json
   —se comprobo: descarta el arreglo entero y cae a su escala de fabrica—, asi
   que la escala se declara alli en valores simples, que es lo que ve el dueno
   en el editor, y aqui se le da el comportamiento fluido redefiniendo la misma
   variable.

   Esto tiene una ventaja que no es obvia: las plantillas de bloques escriben
   `var(--wp--preset--spacing--70)` como estilo EN LINEA. Redefinir la variable
   los vuelve fluidos a todos de golpe, sin tocar una sola plantilla.

   Los dos primeros escalones no escalan a proposito: un hueco de 8 o 16 px
   escala mal y descuadra alineaciones finas.
   -------------------------------------------------------------------------- */

:root {
	--wp--preset--spacing--40: clamp(1.25rem, 1.13rem + 0.6vw, 1.5rem);
	--wp--preset--spacing--50: clamp(1.75rem, 1.4rem + 1.75vw, 2.5rem);
	--wp--preset--spacing--60: clamp(2.25rem, 1.4rem + 4.25vw, 4rem);
	--wp--preset--spacing--70: clamp(2.75rem, 1.2rem + 7.75vw, 6rem);
}

/* Los titulos van en Fraunces, que es una fuente variable con eje de tamano
   optico: a cuerpo grande el navegador pide un dibujo de mas contraste, y a
   cuerpo chico uno mas robusto. Es automatico, pero se declara para que no
   dependa de que el navegador acierte con el valor por omision.

   `text-wrap: balance` reparte las lineas de un titulo para que no quede una
   sola palabra colgando en el ultimo renglon. Es la diferencia entre un titular
   compuesto y uno escupido. */
h1, h2, h3, h4, h5, h6,
.wp-block-heading {
	font-optical-sizing: auto;
	text-wrap: balance;
}

/* El foco siempre visible. Un checkout que no se puede recorrer con teclado
   deja fuera a gente que si iba a comprar.

   Se define aqui una sola vez y se hereda en todo el sitio. El anillo va
   separado del elemento para que se lea igual sobre el suelo claro y sobre un
   panel navy. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 3px;
}

/* Y aqui NO se declara `border-radius`, aunque antes si.

   Habia un `border-radius: var(--wp--custom--radio--minimo)` en esta regla, y
   con la geometria recta no se notaba: todo media dos pixeles. Con formas
   redondeadas es un error visible, porque esta regla alcanza a TODO lo enfocable
   —enlaces, botones, campos, cualquier cosa con `tabindex`— y le imponia su
   radio al elemento, no al anillo. Un boton en forma de pastilla se volvia
   rectangular al recibir el foco.

   No hace falta: desde hace anos el `outline` sigue por si solo la curva del
   elemento que rodea. Quitarlo es a la vez el arreglo y la simplificacion. */

/* Interruptor general del movimiento.
   No basta con quitar `transition`: hay animaciones con `animation` y hay
   desplazamiento suave. Se apaga todo de una vez, y el revelado se resuelve
   mostrando el contenido sin animar en vez de dejarlo invisible. */
@media (prefers-reduced-motion: reduce) {

	*,
	*::before,
	*::after {
		animation-duration: 1ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 1ms !important;
		transition-delay: 0ms !important;
		scroll-behavior: auto !important;
	}

	.pep-js [data-revelar],
	.pep-js .pep-revelar,
	.pep-js .pep-escalonado > * {
		opacity: 1;
		transform: none;
	}
}

/* Prosa a un ancho legible.
   El contenedor mide 76rem para que titulos y rejillas alineen al mismo borde,
   pero un parrafo de 76rem es ilegible: se pasa de los 65 caracteres por linea
   donde el ojo pierde el renglon. */
/* Las dos piezas del hero estaban tambien en este selector y se han sacado. No
   por gusto: viven dentro de `.pep-hero__texto`, que ya es una caja constrenida
   de 36rem alineada a la izquierda, asi que el `max()` de aqui abajo les daba
   siempre cero y lo unico que hacia era pelearse a `!important` con la regla
   propia de la entrada. Dos declaraciones con `!important` sobre la misma
   propiedad del mismo elemento, y ganaba la ultima escrita en el archivo: el
   comentario de veinte lineas que sigue describia un calculo que para ellas no
   se aplicaba nunca. */
.pep-prosa {
	max-width: var(--wp--custom--medida--prosa);

	/* Aqui hay una trampa del layout "constrained" de WordPress que costo una
	   desalineacion visible: a cada hijo le pone `max-width: content-size` y
	   `margin-left/right: auto !important`, o sea que lo CENTRA.

	   Poner `margin-inline-start: 0` —que era lo que habia— no alinea el
	   parrafo con su titulo: lo pega al borde de la SECCION, que en una banda
	   a ancho completo esta casi cien pixeles mas a la izquierda que la
	   columna de contenido. El parrafo del hero salia descolgado.

	   Lo correcto es reproducir el mismo margen que la propia columna se pone:
	   la mitad de lo que sobra entre la seccion y el ancho de contenido. Asi el
	   parrafo empieza exactamente donde empieza el titulo, y en pantallas mas
	   angostas que la columna el `max()` lo deja en cero. */
	margin-inline-start: max(
		0px,
		calc((100% - var(--wp--style--global--content-size)) / 2)
	) !important;
	margin-inline-end: auto !important;
}

/* --------------------------------------------------------------------------
   Secciones de la ficha de producto
   -------------------------------------------------------------------------- */

.pep-seccion {
	margin-block: var(--wp--preset--spacing--60);
}

.pep-seccion__titulo {
	font-size: var(--wp--preset--font-size--xl);
	margin-block: 0 var(--wp--preset--spacing--30);
}

.pep-seccion__intro {
	color: var(--wp--preset--color--neutral-600);
	font-size: var(--wp--preset--font-size--sm);
	margin-block: 0 var(--wp--preset--spacing--30);
}

/* --------------------------------------------------------------------------
   Tabla de datos tecnicos
   -------------------------------------------------------------------------- */

/* Las tablas anchas se desplazan dentro de su contenedor. El cuerpo de la
   pagina nunca debe moverse de lado en movil. */
.pep-tabla-envoltura {
	overflow-x: auto;
	border: var(--pep-borde);
	border-radius: var(--pep-radio);
	background-color: var(--wp--preset--color--neutral-050);
}

.pep-tabla {
	width: 100%;
	border-collapse: collapse;
	font-size: var(--wp--preset--font-size--sm);
}

.pep-tabla th,
.pep-tabla td {
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	text-align: left;
	vertical-align: top;
	border-bottom: var(--pep-borde);
}

.pep-tabla tr:last-child th,
.pep-tabla tr:last-child td {
	border-bottom: 0;
}

.pep-tabla th {
	width: 34%;
	font-weight: 500;
	color: var(--wp--preset--color--neutral-600);
	white-space: nowrap;
}

/* Los valores tecnicos en monoespaciada: las cifras alinean y las formulas se
   leen sin ambiguedad entre uno y ele. */
.pep-tabla td {
	font-family: var(--wp--preset--font-family--mono);
	color: var(--wp--preset--color--neutral-900);
	font-variant-numeric: tabular-nums;
	overflow-wrap: anywhere;
}

/* --------------------------------------------------------------------------
   Pureza
   -------------------------------------------------------------------------- */

.pep-pureza {
	display: flex;
	align-items: baseline;
	gap: 0.5ch;
	margin-block: var(--wp--preset--spacing--20);
}

.pep-pureza__cifra {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	color: var(--wp--preset--color--accent);
	font-variant-numeric: tabular-nums;
}

.pep-pureza__etiqueta {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
}

/* --------------------------------------------------------------------------
   Avisos
   -------------------------------------------------------------------------- */

.pep-aviso {
	border-left: 3px solid var(--wp--preset--color--neutral-400);
	background-color: var(--wp--preset--color--neutral-100);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	font-size: var(--wp--preset--font-size--sm);
	border-radius: 0 var(--wp--custom--radio--tarjeta) var(--wp--custom--radio--tarjeta) 0;
	margin-block: var(--wp--preset--spacing--30);
}

.pep-aviso--urgente {
	border-left-color: var(--wp--preset--color--warning);
	color: var(--wp--preset--color--warning);
	background-color: var(--wp--preset--color--neutral-050);
	font-weight: 500;
}

/* El aviso de uso en investigacion no puede pasar desapercibido: es lo ultimo
   que se lee antes de comprar, y sostiene todo el encuadre legal. */
.pep-aviso--ruo {
	border-left-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-800);
}

.pep-aviso--ruo strong {
	color: var(--wp--preset--color--neutral-900);
}

/* --------------------------------------------------------------------------
   Certificados de analisis
   -------------------------------------------------------------------------- */

.pep-coa__lista {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: var(--wp--preset--spacing--20);
}

.pep-coa__enlace {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	border: var(--pep-borde);
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: var(--wp--preset--color--neutral-050);
	text-decoration: none;
	color: inherit;
	transition: border-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave), background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.pep-coa__enlace:hover,
.pep-coa__enlace:focus-visible {
	border-color: var(--wp--preset--color--brand);
	background-color: var(--wp--preset--color--neutral-100);
}

/* El lote es un codigo que el comprador coteja caracter por caracter contra la
   etiqueta del vial. Monoespaciada no es decoracion aqui. */
.pep-coa__lote {
	font-family: var(--wp--preset--font-family--mono);
	font-weight: 600;
	color: var(--wp--preset--color--neutral-900);
}

.pep-coa__fecha {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
}

.pep-coa__accion {
	margin-left: auto;
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	color: var(--wp--preset--color--accent);
}

/* --------------------------------------------------------------------------
   WooCommerce: rejilla, precios y botones sobre nuestros tokens
   -------------------------------------------------------------------------- */

.woocommerce ul.products {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
	gap: var(--wp--preset--spacing--40);
	margin: 0;
	padding: 0;
	list-style: none;
}

.woocommerce ul.products::before,
.woocommerce ul.products::after {
	content: none;
}

.woocommerce ul.products li.product {
	width: auto;
	margin: 0;
	float: none;
	display: flex;
	flex-direction: column;
	padding: var(--wp--preset--spacing--30);
	border: var(--pep-borde);
	background-color: var(--wp--preset--color--surface, var(--wp--preset--color--neutral-050));
	transition: border-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.woocommerce ul.products li.product:hover {
	border-color: var(--wp--preset--color--brand-light);
}

.woocommerce ul.products li.product img {
	border-radius: var(--pep-radio);
	margin-block-end: var(--wp--preset--spacing--30);
}

.woocommerce ul.products li.product .woocommerce-loop-product__title {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	line-height: 1.25;
	padding: 0;
	margin-block: 0 var(--wp--preset--spacing--20);
}

/* El precio empuja el boton al fondo de la tarjeta, para que todas las tarjetas
   de una fila terminen alineadas aunque los nombres midan distinto. */
.woocommerce ul.products li.product .price {
	margin-block: auto var(--wp--preset--spacing--30);
	color: var(--wp--preset--color--neutral-900);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	font-variant-numeric: lining-nums; /* tabular NO: en Schibsted el punto decimal entra en `tnum` y sale «699 . 00». */
}

.woocommerce ul.products li.product .price del {
	color: var(--wp--preset--color--neutral-400);
	font-weight: 400;
	font-size: var(--wp--preset--font-size--sm);
	margin-inline-end: 0.5ch;
}

.woocommerce ul.products li.product .price ins {
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
}

.woocommerce span.onsale {
	background-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-050);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 600;
	padding: 0.125rem 0.5rem;
	min-height: 0;
	min-width: 0;
	line-height: 1.6;
}

.woocommerce div.product p.price,
.woocommerce div.product span.price {
	color: var(--wp--preset--color--neutral-900);
	font-size: var(--wp--preset--font-size--xxl);
	font-weight: 600;
	font-variant-numeric: lining-nums; /* Idem: el punto decimal se ensancha con `tnum`. */
}

.woocommerce div.product p.price ins {
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
}

/* El texto va en `neutral-900`, y es el mismo arreglo medido que ya se hizo en
   el distintivo de oferta y en el menu de Mi cuenta. A este boton se le escapo.

   Estaba en `neutral-050` sobre `brand`: 1.85:1, cuando el minimo legible es
   4.5:1. Y al pasar el raton el fondo se iba a `brand-dark`, con lo que el par
   quedaba en 1.05:1 — texto casi exactamente del mismo color que su fondo, o
   sea un boton que se borra justo cuando lo estas apuntando.

   El `theme.json` ya decia lo correcto para el boton de bloques (9.07:1). Eran
   dos definiciones del mismo boton contradiciendose; ahora dicen lo mismo, y el
   hover aclara —`brand-light`— en vez de oscurecer. */
.woocommerce #respond input#submit,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button {
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
	border-radius: var(--wp--custom--radio--pastilla);
	font-weight: 600;
	font-size: var(--wp--preset--font-size--sm);
	padding: 0.75rem 1.25rem;
	transition: background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.woocommerce #respond input#submit:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover {
	background-color: var(--wp--preset--color--brand-light);
	color: var(--wp--preset--color--neutral-900);
}

.woocommerce #respond input#submit.alt,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt {
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
}

.woocommerce #respond input#submit.alt:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button.alt:hover {
	background-color: var(--wp--preset--color--brand-light);
}

/* Disponibilidad legible: WooCommerce la deja en gris claro por defecto. */
.woocommerce div.product .stock {
	color: var(--wp--preset--color--success);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
}

.woocommerce div.product .stock.out-of-stock {
	color: var(--wp--preset--color--danger);
}

/* --------------------------------------------------------------------------
   Utilidades
   -------------------------------------------------------------------------- */

.pep-solo-lectores {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* --------------------------------------------------------------------------
   Nada debe desbordar el ancho del telefono
   -------------------------------------------------------------------------- */

.woocommerce-result-count {
	margin-inline-end: var(--wp--preset--spacing--30);
}

@media (max-width: 46rem) {
	.wp-block-search {
		max-width: 100%;
	}

	.wp-block-search__input {
		min-width: 0;
	}

	.pep-coa__accion {
		margin-left: 0;
		width: 100%;
	}

	.pep-tabla th {
		width: 42%;
		white-space: normal;
	}

	.woocommerce-ordering {
		inline-size: 100%;
		margin-block-start: var(--wp--preset--spacing--20);
	}

	.woocommerce-ordering select {
		flex: 1 1 auto;
	}
}

/* --------------------------------------------------------------------------
   Buscador del encabezado

   Se le da ancho por CSS y no por atributo del bloque: el atributo se pinta
   como estilo en linea, gana siempre, y en un telefono empuja el encabezado
   mas alla del ancho de la pantalla. Eso desborda la pagina entera de lado.
   -------------------------------------------------------------------------- */

/* El ancho del buscador ya no se negocia con la navegacion y el carrito.

   Aqui habia un reparto flexible —«crece con el espacio que sobre, no baja de
   14rem»— que existia porque el campo estaba SIEMPRE abierto y tenia que
   convivir con lo demas en el mismo renglon. Desde que se despliega desde la
   lupa, cerrado no ocupa nada y abierto se lleva lo que sobre hasta un tope;
   eso lo decide ahora la rejilla de `.pep-busca`. */
.pep-buscador {
	inline-size: 100%;
}

@media (max-width: 46rem) {
	.pep-buscador {
		max-width: 100%;
	}
}

/* Red de seguridad: ningun elemento debe poder ensanchar el documento. */
html,
body {
	max-width: 100%;
	overflow-x: clip;
}

/* --------------------------------------------------------------------------
   Mi cuenta

   WooCommerce trae su propia maquetacion para esta zona. Aqui solo se ajusta
   lo que choca con el resto de la tienda: la navegacion lateral, las tablas de
   pedidos y las tarjetas guardadas.
   -------------------------------------------------------------------------- */

.woocommerce-account .woocommerce-MyAccount-navigation ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 2px;
}

.woocommerce-account .woocommerce-MyAccount-navigation li a {
	display: block;
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
	border-radius: var(--wp--custom--radio--pastilla);
	text-decoration: none;
	color: var(--wp--preset--color--neutral-600);
	font-size: var(--wp--preset--font-size--sm);
	transition: background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave), color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.woocommerce-account .woocommerce-MyAccount-navigation li a:hover {
	background-color: var(--wp--preset--color--neutral-100);
	color: var(--wp--preset--color--neutral-900);
}

/* Mismo arreglo que el distintivo de oferta y por el mismo motivo medido:
   `neutral-050` sobre `brand` daba 1.85:1. La pagina en la que estas era la
   unica del menu que no se podia leer. Ahora da 9.07:1. */
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
	font-weight: 600;
}

.woocommerce-account table.woocommerce-orders-table,
.woocommerce-account table.woocommerce-MyAccount-paymentMethods,
.woocommerce table.shop_table {
	border: var(--pep-borde);
	border-radius: var(--pep-radio);
	border-collapse: separate;
	border-spacing: 0;
	font-size: var(--wp--preset--font-size--sm);
	width: 100%;
}

.woocommerce table.shop_table th,
.woocommerce table.shop_table td {
	border-bottom: var(--pep-borde);
	padding: var(--wp--preset--spacing--30);
}

.woocommerce table.shop_table tr:last-child td {
	border-bottom: 0;
}

/* Los ultimos cuatro digitos y la expiracion son cifras que se comparan de un
   vistazo con la tarjeta fisica. */
.woocommerce-MyAccount-paymentMethods .payment-method-details,
.woocommerce-MyAccount-paymentMethods .payment-method-expires {
	font-family: var(--wp--preset--font-family--mono);
	font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   Formularios de cuenta
   -------------------------------------------------------------------------- */

.woocommerce form .form-row label {
	font-size: var(--wp--preset--font-size--tiny);
	font-weight: 500;
	color: var(--wp--preset--color--neutral-800);
	margin-block-end: 0.25rem;
	display: block;
}

.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select {
	/* `border-box` porque esta regla combina ancho y relleno, y en este tema NO
	   hay `box-sizing` global: el sitio se escribio evitando esa combinacion. Sin
	   declararlo, la caja de borde sale 24 px mas ancha que su contenedor y el
	   sobrante se derrama a la derecha. Es el mismo fallo que torcio el boton del
	   carrito, y esta regla era la segunda de las cuatro que lo tenian. */
	box-sizing: border-box;
	width: 100%;
	padding: 0.625rem 0.75rem;
	border: var(--pep-borde);
	border-radius: var(--wp--custom--radio--tarjeta);
	/* En un tema oscuro un campo del mismo color que la pagina desaparece: no
	   se ve donde hay que escribir. La superficie lo separa del fondo y el filo
	   lo remata. */
	background-color: var(--wp--preset--color--neutral-100);
	/* `xs` y no `base`. Estaba en `base`, que en este tema son 19 px: el cuerpo
	   de texto del sitio, no el de un campo. Y ganaba por especificidad a la
	   regla general de controles, que ya estaba en `xs`. Era la mitad de por que
	   la pantalla de cuenta se sentia ampliada. */
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--neutral-900);
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		box-shadow var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.woocommerce form .form-row input.input-text::placeholder,
.woocommerce form .form-row textarea::placeholder {
	color: var(--wp--preset--color--neutral-400);
}

/* El foco se marca con cian y un halo. Sobre negro un borde azul apenas se
   distingue del filo normal, y perder el foco en un checkout es perder la
   venta de quien navega con teclado. */
.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus {
	border-color: var(--wp--preset--color--accent);
	box-shadow: 0 0 0 3px color-mix(in srgb, var(--wp--preset--color--accent) 18%, transparent);
	outline: none;
}

/* Los avisos de WooCommerce comparten el lenguaje visual de los nuestros.

   Y hay que declarar mas de lo que parece, porque lo que esta regla NO diga se
   queda en el valor de WooCommerce y no avisa nadie. Aqui se quedaban tres cosas
   y las tres se veian:

     - `color: #515151` sobre nuestra superficie `neutral-100` daba **2.24:1**.
       El mensaje de «contrasena incorrecta» era practicamente invisible, y es el
       estado mas frecuente de la pantalla de acceso despues del inicial.
     - `border-top: 3px solid #720eec`, una linea morada cruzando el aviso ademas
       del filo de marca de la izquierda. Dos bordes, y uno de un color que no
       existe en `theme.json`.
     - `margin: 0 0 2em`, treinta y dos pixeles por debajo de cada aviso.

   El icono tambien hay que recolocarlo. WooCommerce lo ancla en `left: 1.5em`
   contando con su propio `padding-left: 3.5em`; al bajar el relleno, el glifo
   caia ENCIMA de las primeras letras. Se le devuelve sitio por la izquierda y se
   ancla al mismo escalon de espaciado, para que los dos se muevan juntos. */
.woocommerce-message,
.woocommerce-info,
.woocommerce-error {
	position: relative;
	margin-block: 0 var(--wp--preset--spacing--30);
	border-block-start: 0;
	border-left: 3px solid var(--wp--preset--color--brand);
	background-color: var(--wp--preset--color--neutral-100);
	/* neutral-900 sobre neutral-100: 15.24:1. */
	color: var(--wp--preset--color--neutral-900);
	border-radius: 0 var(--wp--custom--radio--tarjeta) var(--wp--custom--radio--tarjeta) 0;
	padding:
		var(--wp--preset--spacing--30)
		var(--wp--preset--spacing--40)
		var(--wp--preset--spacing--30)
		var(--wp--preset--spacing--50);
	font-size: var(--wp--preset--font-size--sm);
	list-style: none;
}

/* Los enlaces de dentro de un aviso —«iniciar sesion», «ver carrito»— tambien
   heredaban el gris de WooCommerce. */
.woocommerce-message a,
.woocommerce-info a,
.woocommerce-error a {
	color: var(--wp--preset--color--accent);
}

/* El glifo, a la izquierda del texto y no encima. Se usan propiedades logicas a
   proposito aunque WooCommerce use fisicas: una declaracion logica posterior
   gana a la fisica que sustituye, y el resto del archivo habla ese idioma. */
.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before {
	inset-block-start: var(--wp--preset--spacing--30);
	inset-inline-start: var(--wp--preset--spacing--30);
	color: var(--wp--preset--color--neutral-600);
}

.woocommerce-message::before {
	color: var(--wp--preset--color--success);
}

.woocommerce-error::before {
	color: var(--wp--preset--color--danger);
}

.woocommerce-message {
	border-left-color: var(--wp--preset--color--success);
}

.woocommerce-error {
	border-left-color: var(--wp--preset--color--danger);
}

/* --------------------------------------------------------------------------
   ACCESO Y ALTA DE CUENTA

   Es la primera pantalla que ve un cliente nuevo, y hasta ahora era WooCommerce
   crudo: dos formularios completos lado a lado, titulares de 48 px sobre
   columnas de 584, campos de 19 px y asteriscos rojos por todas partes.

   El marcado lo pone `woocommerce/myaccount/form-login.php` del tema, que es la
   unica plantilla de WooCommerce que este proyecto copia. Ahi esta explicado por
   que.

   Contrastes medidos y anotados. El unico par que se movio respecto del primer
   borrador fue el de las notas: `neutral-400` sobre la superficie del panel daba
   4.23:1, por debajo del 4.5:1 que pide un texto.
   -------------------------------------------------------------------------- */

/* El titulo «Mi cuenta» deja de verse en la pantalla de acceso.

   Sigue en el HTML y sigue anunciandose en un lector de pantalla: es el `h1` de
   la pagina y quitarlo dejaria el documento sin encabezado de primer nivel. Lo
   que se quita es su PESO VISUAL, porque repetia el nombre del menu por el que
   acabas de entrar y costaba noventa de los seiscientos setenta pixeles de alto
   que tiene una ventana de portatil.

   En cuanto hay sesion vuelve a verse: ahi si es el titulo de una seccion con
   varias pantallas dentro, y hace falta para saber donde estas. */
body.woocommerce-account:not(.logged-in) .wp-block-post-title {
	position: absolute;
	inline-size: 1px;
	block-size: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

/* El relleno de arriba de esta pagina NO se toca desde aqui, y conviene saber
   por que antes de intentarlo.

   En un tema de bloques el relleno del `<main>` es un atributo del bloque, y
   WordPress lo emite como estilo EN LINEA. Un estilo en linea gana a cualquier
   selector de la hoja: la regla que habia aqui —`body.woocommerce-account
   main`— parecia razonable y no aplicaba nunca. Peor: la prueba del presupuesto
   vertical la estaba leyendo y daba por bueno un relleno de 24 px donde el
   navegador pintaba 64.

   El relleno de esta pagina vive en `templates/page-mi-cuenta.html`, que es una
   plantilla propia como ya las tienen el carrito y el checkout, y la prueba lo
   lee de alli. Es tambien la razon de que la prueba mire la plantilla y no la
   hoja: mide lo que el navegador aplica, no lo que a uno le gustaria. */

/* --------------------------------------------------------------------------
   LA AURORA: ALGO QUE MEREZCA VERSE A TRAVES

   Esto va primero y no es adorno: sin esto, el cristal de mas abajo no existe.

   Un desenfoque es un promedio ponderado, y el promedio de un color constante es
   ESE MISMO COLOR. Detras del panel habia `neutral-100` plano sobre `neutral-050`
   plano —y el grano del sitio vive en `z-index: 0`, por debajo del contenido, asi
   que ni se transparenta—. Sobre eso, `backdrop-filter: blur()` no produce
   absolutamente ningun efecto. Ni con CSS ni con WebGL: es aritmetica, no una
   limitacion de la tecnica.

   El cristal de un sistema operativo se ve porque siempre hay una foto, un fondo
   de pantalla o contenido pasando por debajo. Aqui habia que ponerlo.

   Tres manchas grandes y muy suaves, sin un solo borde duro. Es el mismo idioma
   que ya usa el carrito vacio —`radial-gradient` con `color-mix`, «da profundidad
   sin introducir un solo borde duro»—, aqui a otra escala. Los porcentajes NO son
   libres: la prueba de contraste los lee, compone las tres capas sobre el fondo,
   le pone el cristal encima y comprueba que el texto que va arriba sigue pasando
   su umbral. Subirlos pone la prueba en rojo.

   `z-index: -1` con `isolation: isolate` en el padre: la aurora se pinta detras
   del contenido de la pagina pero no puede escaparse por encima de la cabecera
   pegada ni del cajon del carrito.
   -------------------------------------------------------------------------- */
.pep-main--cuenta {
	position: relative;
	isolation: isolate;
}

.pep-main--cuenta::before {
	content: "";
	position: absolute;
	z-index: -1;
	inset-block-start: calc(-1 * var(--pep-cabecera));
	inset-inline: -10vw;
	block-size: 140%;
	pointer-events: none;
	background-image:
		radial-gradient(60rem 40rem at 18% 2%, color-mix(in srgb, var(--wp--preset--color--brand) 34%, transparent) 0%, transparent 68%),
		radial-gradient(45rem 34rem at 88% 24%, color-mix(in srgb, var(--wp--preset--color--accent) 12%, transparent) 0%, transparent 62%),
		radial-gradient(52rem 40rem at 62% 98%, color-mix(in srgb, var(--wp--preset--color--senal-fondo) 55%, transparent) 0%, transparent 70%);
}

.pep-acceso {
	display: grid;

	/* `minmax(0, ...)` en las dos, y no `1fr 1fr`.

	   `1fr` es en realidad `minmax(auto, 1fr)`: su MINIMO es el contenido. Y
	   como los dos formularios se alternan con `display: none` —y lo oculto no
	   aporta nada a la maquetacion—, ese minimo CAMBIABA al cambiar de pestana:
	   la pagina entera se recolocaba al pulsar «Crear cuenta». Un salto de
	   maquetacion disparado por un control que presume de funcionar sin
	   JavaScript.

	   El panel queda en 34rem, los mismos que ya usaba `--solo-entrar`, asi que
	   mide igual en las tres vistas de esta pantalla: con alta, sin alta, y en
	   una sola columna. Un numero que comprobar en vez de tres. */
	grid-template-columns: minmax(0, 1fr) minmax(0, 34rem);
	gap: var(--wp--preset--spacing--60);
	align-items: start;
	margin-block-start: 0;
}

/* Cuando el alta esta apagada desde los ajustes de WooCommerce no hay pestanas
   ni segunda columna, y una rejilla de dos con una sola cosa dentro deja medio
   ancho vacio. La plantilla marca ese caso con su propia clase. */
.pep-acceso--solo-entrar {
	grid-template-columns: minmax(0, 34rem);
	justify-content: center;
}

@media (max-width: 64rem) {

	/* Una sola columna, y CON TOPE.

	   Sin el, a 1023 px el panel se servia a casi mil pixeles y los campos a
	   ochocientos y pico: una linea de escritura de noventa caracteres para
	   meter un correo. El tope es el mismo `34rem` de la rejilla de arriba, asi
	   que el panel NO cambia de ancho al cruzar el corte; lo que cambia es que
	   la columna de razones se va debajo.

	   Y de paso desarma una trampa: `.pep-acceso--solo-entrar` tiene la MISMA
	   especificidad que `.pep-acceso`, esta escrita antes, y un `@media` no
	   anade especificidad — asi que aqui dentro perdia su propio tope y el panel
	   se estiraba igual. Ahora los dos valores coinciden y da lo mismo quien
	   gane. */
	.pep-acceso {
		grid-template-columns: minmax(0, 34rem);
		justify-content: center;
		gap: var(--wp--preset--spacing--50);
	}

	/* En telefono el formulario va primero: quien llega aqui viene a entrar, no
	   a leer por que le conviene tener cuenta. El panel de razones no tiene
	   enlaces, asi que moverlo no descoloca el recorrido con teclado. */
	.pep-acceso__panel {
		order: -1;
	}
}

/* --------------------------------------------------------------------------
   EL PANEL DE LA IZQUIERDA: POR QUE HACE FALTA UNA CUENTA
   -------------------------------------------------------------------------- */

/* El titulo arranca al ras del filo de arriba de la tarjeta, sin relleno.

   Habia aqui un `padding-block-start` de 16 px que era un intento de alinear
   este titulo con la ETIQUETA de la pestana activa, y se quedaba corto por unos
   quince. Esa alineacion no se puede escribir con un numero: depende del medio
   interlineado de un titulo de 26 px y del centrado optico de una etiqueta de 14
   dentro de una caja de 44, y las dos cosas se mueven con la rampa fluida. Un
   numero asi caduca en cuanto alguien toca el theme.json, y ya habia caducado.

   La alineacion que SI se lee es de filo a filo: el borde de arriba del titulo
   contra el borde de arriba de la tarjeta, los dos en cero.

   neutral-900 sobre neutral-050: 16.78:1. */
.pep-acceso__titulo {
	margin-block: 0 var(--wp--preset--spacing--30);
	font-size: var(--wp--preset--font-size--xl);
	line-height: 1.15;
}

/* neutral-600 sobre neutral-050: 7.65:1. */
.pep-acceso__entrada {
	max-width: 44ch;
	margin-block: 0 var(--wp--preset--spacing--50);
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.6;
	color: var(--wp--preset--color--neutral-600);
}

.pep-acceso__ventajas {
	display: grid;
	gap: var(--wp--preset--spacing--40);
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Cada ventaja es una rejilla de dos columnas y dos renglones: el icono ocupa
   los dos renglones a la izquierda, y a su derecha el que y el detalle. Asi el
   detalle queda alineado con el titulo y no debajo del icono. */
.pep-ventaja {
	display: grid;
	grid-template-columns: auto 1fr;
	grid-template-rows: auto auto;
	column-gap: var(--wp--preset--spacing--30);
	align-items: start;
}

/* El icono hereda el cian por `currentColor`, igual que los tres de la portada.
   accent sobre neutral-050: 10.82:1. */
.pep-ventaja__icono {
	grid-row: 1 / 3;
	display: block;
	inline-size: 1.75rem;
	block-size: 1.75rem;
	color: var(--wp--preset--color--accent);
}

/* neutral-900 sobre neutral-050: 16.78:1. */
.pep-ventaja__que {
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	line-height: 1.3;
	color: var(--wp--preset--color--neutral-900);
}

/* neutral-600 sobre neutral-050: 7.65:1. */
.pep-ventaja__detalle {
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.5;
	color: var(--wp--preset--color--neutral-600);
}

/* --------------------------------------------------------------------------
   EL PANEL DEL FORMULARIO
   -------------------------------------------------------------------------- */

.pep-acceso__panel {
	/* Los radios del selector viven aqui dentro en posicion absoluta. */
	position: relative;
	box-sizing: border-box;
	/* Relleno uniforme. Era 40/40/50 —mas abajo que arriba— para compensar el
	   margen inferior que WooCommerce le ponia al formulario; desmontada esa
	   caja, la asimetria ya no compensa nada y solo deja hueco. */
	padding: var(--wp--preset--spacing--40);
	/* Este es el estado BASE, y es opaco a proposito.

	   El cristal se anade despues, dentro de un `@supports`. Al reves —cristal
	   de base y respaldo opaco para quien no lo soporte— el panel se serviria
	   semitransparente sobre nada en cualquier navegador que no entienda
	   `backdrop-filter`, y semitransparente sobre nada es simplemente mas claro:
	   se pierde el filo entre la tarjeta y la pagina. Asi, lo que no entiende el
	   efecto ve la tarjeta solida de siempre. */
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--panel);
	background-color: var(--wp--preset--color--neutral-100);
}

/* --------------------------------------------------------------------------
   EL CRISTAL

   Ahora que hay una aurora detras, el desenfoque tiene algo que promediar y el
   panel se convierte en material en vez de en un rectangulo mas claro.

   Tres capas, y las tres hacen falta:

     - `blur` recoge la aurora y la deja irreconocible pero presente, que es lo
       que distingue un cristal de un plastico;
     - `saturate` por encima del 100 % compensa que el desenfoque apaga el color
       al promediarlo: sin ese empujon el cristal sale gris;
     - el filo pasa a ser luz y no linea. `neutral-900` al 14 % sobre un fondo
       que ya varia se lee como un borde captando claridad, no como un trazo.

   La sombra es la del propio tema, `apoyada`, que sobre oscuro ya esta definida
   como un realce interior de una linea —no como una sombra proyectada, que sobre
   negro no existe—. Aqui por fin sirve para algo: le da grosor al canto.
   -------------------------------------------------------------------------- */
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {

	.pep-acceso__panel {
		border-color: color-mix(in srgb, var(--wp--preset--color--neutral-900) 14%, transparent);
		background-color: color-mix(in srgb, var(--wp--preset--color--neutral-100) 72%, transparent);
		box-shadow: var(--wp--custom--sombra--apoyada);
		-webkit-backdrop-filter: blur(24px) saturate(150%);
		backdrop-filter: blur(24px) saturate(150%);
	}
}

/* Y quien pide menos transparencia se queda sin cristal, con la tarjeta solida.

   Es una preferencia del sistema operativo, y hasta hoy este tema no la miraba
   en ninguna parte. Un panel translucido sobre un fondo que se mueve es
   exactamente lo que esa preferencia existe para apagar. Va DESPUES del
   `@supports` porque las dos reglas tienen la misma especificidad y decide el
   orden. */
@media (prefers-reduced-transparency: reduce) {

	.pep-acceso__panel {
		border-color: var(--wp--preset--color--neutral-200);
		background-color: var(--wp--preset--color--neutral-100);
		-webkit-backdrop-filter: none;
		backdrop-filter: none;
	}
}

/* --------------------------------------------------------------------------
   EL SELECTOR DE FORMULARIO

   Dos radios y sus etiquetas. Los radios se esconden de la vista pero NO del
   teclado ni del lector de pantalla: `display: none` los sacaria del recorrido
   y del grupo, y entonces el selector solo funcionaria con raton.

   Un grupo de radios se recorre con las flechas y se anuncia como «opcion 1 de
   2, seleccionada», que es exactamente lo que esto es. Y como el estado vive en
   el propio control, funciona con el JavaScript apagado.
   -------------------------------------------------------------------------- */

.pep-acceso__radio {
	position: absolute;
	inline-size: 1px;
	block-size: 1px;
	margin: 0;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

.pep-acceso__pestanas {
	/* El indicador vive aqui dentro, en posicion absoluta. */
	position: relative;
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 2px;
	margin-block-end: var(--wp--preset--spacing--40);
	padding: 4px;
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: var(--wp--preset--color--neutral-050);
}

@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {

	.pep-acceso__pestanas {
		border-color: color-mix(in srgb, var(--wp--preset--color--neutral-900) 10%, transparent);
		background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 55%, transparent);
		-webkit-backdrop-filter: blur(12px);
		backdrop-filter: blur(12px);
	}
}

@media (prefers-reduced-transparency: reduce) {

	.pep-acceso__pestanas {
		border-color: var(--wp--preset--color--neutral-200);
		background-color: var(--wp--preset--color--neutral-050);
		-webkit-backdrop-filter: none;
		backdrop-filter: none;
	}
}

/* EL INDICADOR QUE SE DESLIZA

   Antes el fondo azul lo pintaba la propia etiqueta, asi que al cambiar de
   pestana el color saltaba de un lado a otro sin recorrer el camino. Ahora el
   relleno es una sola caja que se mueve, y el ojo la sigue: el cambio se explica
   solo, sin que nadie tenga que releer las dos etiquetas para ver cual quedo
   encendida.

   Las cuentas, para que nadie tenga que redescubrirlas. Una caja absoluta
   resuelve sus porcentajes contra la caja de RELLENO de su antepasado
   posicionado, que aqui mide el contenido mas los 8 px de relleno. Si el
   contenido mide C, cada mitad mide (C - 2 de hueco) / 2 = C/2 - 1, y
   `calc(50% - 5px)` da (C + 8)/2 - 5 = C/2 - 1: el mismo numero. El filo
   izquierdo de la segunda mitad cae en 4 + (C/2 - 1) + 2 = C/2 + 5, y
   `calc(50% + 1px)` da (C + 8)/2 + 1 = C/2 + 5. Tambien el mismo. No hay ningun
   ancho escrito a mano: el control funciona igual a cualquier medida.

   El filo `brand-light` no es adorno. Contra el carril el relleno `brand` solo
   da 1.85:1, y a un limite de control se le piden 3:1; `brand-light` sobre
   `neutral-050` da 3.45:1. Es lo que hace que la mitad activa se distinga
   tambien sin color.

   Quien pidio menos movimiento ya lo tiene apagado por el interruptor general
   del tema, que anula toda transicion. */
.pep-acceso__pestanas::before {
	content: "";
	position: absolute;
	inset-block: 4px;
	inset-inline-start: 4px;
	inline-size: calc(50% - 5px);
	border: 1px solid var(--wp--preset--color--brand-light);
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: var(--wp--preset--color--brand);
	transition: inset-inline-start var(--wp--custom--movimiento--base) var(--wp--custom--curva--salida);
}

#pep-ver-alta:checked ~ .pep-acceso__pestanas::before {
	inset-inline-start: calc(50% + 1px);
}

/* neutral-600 sobre neutral-050: 7.65:1.

   El `margin: 0` no es decorativo: `woocommerce-blocktheme.css` trae
   `.woocommerce-page label { margin-bottom: .7em }` y alcanza a estas dos
   etiquetas, porque el body de esta pagina lleva esa clase. Eran 9.75 px metidos
   DENTRO de la rejilla, que inflaban la pista y empujaban el borde inferior del
   carril: tres pixeles de aire arriba y 12.75 abajo. Ese es el espacio muerto
   que se veia, y no habia forma de deducirlo mirando esta hoja.

   El alto sube a 44: el propio tema declara ese minimo para cualquier cosa que
   se pulsa —`--pep-campo-alto`, y el riel de familias lo sube ahi en tactil— y
   estas pestanas se habian quedado en 40. */
.pep-pestana {
	/* `position: relative` no es decoracion: sin el, las etiquetas son hijos EN
	   FLUJO y el indicador es un descendiente POSICIONADO, o sea que se pinta
	   encima y les tapa el texto. Posicionadas, se pintan en la misma capa y
	   despues, por orden de arbol. Ningun `z-index` hace falta. */
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-block-size: var(--pep-campo-alto);
	border-radius: var(--wp--custom--radio--pastilla);
	cursor: pointer;
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 600;
	color: var(--wp--preset--color--neutral-600);
	transition: color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

/* Y el margen va en regla aparte, porque hay que ganar por ESPECIFICIDAD.

   La de WooCommerce es `.woocommerce-page label`: una clase y un elemento,
   (0,1,1). Un `margin: 0` escrito dentro de `.pep-pestana` es (0,1,0) y pierde
   —lo escribi asi primero y se quedo puesto sin hacer nada—. Con el carril
   delante son (0,2,0) y gana. Que alla diga `margin-bottom` y aqui `margin` es
   indiferente: las dos resuelven la misma propiedad y decide la cascada.

   Va aparte tambien por otra razon: `.pep-pestana` tiene que seguir SOLA en su
   renglon y sin sangrar, porque la prueba del presupuesto vertical la busca por
   texto exacto anclado a principio de linea. */
.pep-acceso__pestanas .pep-pestana {
	margin: 0;
}

.pep-pestana:hover {
	color: var(--wp--preset--color--neutral-900);
}

/* La pestana elegida. neutral-900 sobre brand: 9.07:1 — el mismo par que la
   pastilla activa del riel del catalogo y que la pagina activa del menu de la
   cuenta. El fondo ya no lo pone la etiqueta: lo pone el indicador. */
#pep-ver-entrar:checked ~ .pep-acceso__pestanas .pep-pestana[for="pep-ver-entrar"],
#pep-ver-alta:checked ~ .pep-acceso__pestanas .pep-pestana[for="pep-ver-alta"] {
	color: var(--wp--preset--color--neutral-900);
}

/* El anillo de foco del sitio, trasladado del radio escondido a su etiqueta.
   Sin esto, quien navega con teclado no ve donde esta. */
#pep-ver-entrar:focus-visible ~ .pep-acceso__pestanas .pep-pestana[for="pep-ver-entrar"],
#pep-ver-alta:focus-visible ~ .pep-acceso__pestanas .pep-pestana[for="pep-ver-alta"] {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 2px;
}

/* La caja que WooCommerce le dibuja a cada formulario, desactivada.

   `woocommerce.css` trae esto, y no es un detalle:

     .woocommerce form.login,
     .woocommerce form.register { border:1px solid #cfc8d8; padding:20px;
                                  margin:2em 0; border-radius:5px }

   Nadie lo apagaba. En una tarjeta oscura eso pinta un marco LILA CLARO —un
   color que no existe en `theme.json`— y, peor, mete veintiun pixeles de sangria
   por lado: la tira de pestanas es hija directa del panel y llega al borde, pero
   los campos empiezan veintiun pixeles mas adentro. El escalon se ve a simple
   vista y parece un error de maquetacion, que es exactamente lo que era.

   El `margin: 2em 0` ademas COLAPSABA con el `margin-block-end` de las pestanas:
   donde esta hoja dice veinticuatro, el navegador pintaba treinta y dos. Y por
   debajo del boton dejaba entre ochenta y ciento diez pixeles de tarjeta vacia,
   sumando su relleno, su borde, su margen y el del panel.

   Se anula entero. La separacion entre pestanas y formulario la pone el
   `margin-block-end` de las pestanas, que es un solo sitio. */
.woocommerce .pep-acceso__panel form.login,
.woocommerce .pep-acceso__panel form.register {
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
}

/* Y aqui el selector hace su trabajo: se ve uno de los dos, no los dos. */
#pep-ver-entrar:checked ~ #customer_login .u-column2,
#pep-ver-alta:checked ~ #customer_login .u-column1 {
	display: none;
}

/* WooCommerce pone las dos columnas al 48 % y flotadas. Aqui van una sobre otra
   y solo se ve una, asi que hay que deshacer las dos cosas. */
.pep-acceso__panel #customer_login {
	display: block;
}

.pep-acceso__panel #customer_login .u-column1,
.pep-acceso__panel #customer_login .u-column2 {
	float: none;
	inline-size: auto;
	width: auto;
}

/* --------------------------------------------------------------------------
   LOS CAMPOS, A ESCALA DE FORMULARIO
   -------------------------------------------------------------------------- */


/* neutral-600 sobre neutral-100: 7.08:1.

   Va en `neutral-600` y no en `neutral-400`: sobre la superficie del panel,
   `neutral-400` daba 4.23:1, por debajo del 4.5:1 que pide un texto. */
.pep-acceso__nota {
	margin-block: 0 var(--wp--preset--spacing--30);
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.5;
	color: var(--wp--preset--color--neutral-600);
}

.pep-acceso__nota--activacion {
	margin-block-start: var(--wp--preset--spacing--30);
	padding-block-start: var(--wp--preset--spacing--30);
	border-block-start: var(--pep-borde);
}

/* El campo va sobre el fondo de la pagina y no sobre el del panel: los dos son
   `neutral-100` en la regla general de formularios de cuenta, y un campo del
   mismo color que su tarjeta desaparece. */
/* El orden del selector importa, y lo tuve mal.

   `.woocommerce` es el `<div>` que WooCommerce pone ALREDEDOR del shortcode, o
   sea un ANTEPASADO del panel, no algo de dentro. Escrito como
   `.pep-acceso__panel .woocommerce` el selector no coincidia con nada, y como un
   selector que no coincide no da ningun error, las tres reglas de aqui abajo
   llevaban puestas sin aplicarse:

     - los campos se quedaban en `neutral-100`, el MISMO color del panel, que es
       justo lo que el comentario de arriba dice querer evitar;
     - la separacion entre filas la seguia poniendo WooCommerce con `1em`, que
       sobre un cuerpo de 19 px eran 19 px por fila;
     - y la fila del boton perdia por especificidad contra `.woocommerce form
       .form-row`, asi que arrastraba otro margen de mas.

   Con `.woocommerce` delante, el selector coincide y ademas gana en
   especificidad (0,3,2 contra 0,2,1). */
.woocommerce .pep-acceso__panel form .form-row input.input-text,
.woocommerce .pep-acceso__panel form .form-row select,
.woocommerce .pep-acceso__panel form .form-row textarea {
	border-radius: var(--wp--custom--radio--tarjeta);
	background-color: var(--wp--preset--color--neutral-050);
	border-color: var(--wp--preset--color--neutral-400);
}

/* Dentro del cristal, el campo tambien es cristal: un pozo mas oscuro que la
   tarjeta, no una caja opaca pegada encima. Se hunde en vez de posarse, que es
   lo que lo hace legible como sitio donde escribir. */
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {

	.woocommerce .pep-acceso__panel form .form-row input.input-text,
	.woocommerce .pep-acceso__panel form .form-row select,
	.woocommerce .pep-acceso__panel form .form-row textarea {
		background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 55%, transparent);
		border-color: color-mix(in srgb, var(--wp--preset--color--neutral-900) 16%, transparent);
	}
}

@media (prefers-reduced-transparency: reduce) {

	.woocommerce .pep-acceso__panel form .form-row input.input-text,
	.woocommerce .pep-acceso__panel form .form-row select,
	.woocommerce .pep-acceso__panel form .form-row textarea {
		background-color: var(--wp--preset--color--neutral-050);
		border-color: var(--wp--preset--color--neutral-400);
	}
}

.woocommerce .pep-acceso__panel form .form-row {
	margin-block-end: var(--wp--preset--spacing--30);
	padding: 0;
}

/* WooCommerce le pone `line-height: 2` a las etiquetas de formulario, que sobre
   una etiqueta de 13 px son 26 px de caja para una linea de texto. Multiplicado
   por cada campo, es medio formulario de aire. */
.woocommerce .pep-acceso__panel form .form-row label {
	line-height: 1.3;
}

/* La fila del «mantener la sesion» y el enlace de contrasena olvidada, en el
   mismo renglon: son las dos cosas secundarias del formulario y juntas ocupan
   una linea en vez de dos. */
.pep-acceso__fila-recordar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
}

/* La especificidad, que aqui la perdia una regla nuestra contra otra nuestra.

   `.woocommerce form .form-row label` (0,2,2) le gana a
   `.woocommerce-form-login__rememberme` (0,1,0), asi que de esta regla no se
   aplicaba casi nada: mandaba el `display: block` de la otra y con el se caian
   `align-items` y `gap`, que solo existen en un contenedor flexible. La casilla
   volvia a apoyarse en la linea base —visiblemente mas baja que su texto— y la
   unica separacion entre las dos era el espacio literal del HTML. Ademas el
   texto salia en `tiny` mientras el enlace de al lado, en el mismo renglon,
   salia en `xs`: dos tamanos en la misma linea.

   Se le anade el nombre del elemento para subir a (0,3,2) y ganar. */
.woocommerce form .form-row label.woocommerce-form-login__rememberme {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	margin-block-end: 0;
	cursor: pointer;
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 400;
	color: var(--wp--preset--color--neutral-600);
}

.woocommerce-form-login__rememberme input {
	inline-size: 1rem;
	block-size: 1rem;
	margin: 0;
	accent-color: var(--wp--preset--color--accent);
}

/* accent sobre neutral-100: 10.02:1. */
.pep-acceso__olvide {
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}

.pep-acceso__olvide:hover,
.pep-acceso__olvide:focus-visible {
	text-decoration: underline;
}

.woocommerce .pep-acceso__panel form .form-row.pep-acceso__fila-boton {
	margin-block-end: 0;
}

/* --------------------------------------------------------------------------
   UN ICONO DENTRO DE CADA CAMPO

   Es la mayor diferencia visual que queda entre esta pantalla y la de la
   competencia a igualdad de contenido, y no es solo adorno: un sobre y un
   candado dicen de que va cada campo antes de leer la etiqueta, que es lo que
   hace que un formulario se «lea» de un vistazo en vez de renglon por renglon.

   Van con `mask-image` y no con `background-image` a proposito. Un SVG metido
   como fondo trae su color dentro del propio archivo, y eso seria un color
   literal escondido en un `url()` — la regla 3 con otro disfraz. Con mascara, el
   SVG aporta SOLO la forma y el color lo pone `background-color`, o sea un token
   del theme.json como cualquier otro: cambiar la marca tambien recolorea estos
   iconos.

   El `%23000` de dentro del SVG no es una decision de color. Una mascara mira la
   opacidad, no el tono: cualquier color opaco pinta la misma forma, y ese solo
   dice «aqui hay tinta».

   El trazo es 1.5, que es el de los otros siete iconos del proyecto.
   -------------------------------------------------------------------------- */
.woocommerce .pep-acceso__panel form .pep-campo {
	position: relative;
}

/* El icono se ancla al fondo de la fila y no al centro: la fila es etiqueta mas
   campo, asi que su centro cae en el hueco entre los dos. Anclado abajo y con el
   alto del campo, queda centrado dentro del campo pase lo que pase con la
   etiqueta. */
/* El icono lo ENCIENDE el modificador, no esta regla.

   `content` vive abajo, junto a cada mascara, y no aqui. Una mascara ausente no
   recorta nada: un `.pep-campo` al que se le olvide el modificador no se
   quedaria sin icono, pintaria una barra solida de 18x44 px en `neutral-400`
   encima del campo. Con `content` en el modificador, un campo sin modificador
   simplemente no pinta nada, que es lo que cualquiera espera. */
.woocommerce .pep-acceso__panel form .pep-campo::after {
	position: absolute;
	inset-block-end: 0;
	inset-inline-start: var(--wp--preset--spacing--30);
	inline-size: 1.125rem;
	block-size: var(--pep-campo-alto);
	background-color: var(--wp--preset--color--neutral-400);
	mask-position: center;
	mask-repeat: no-repeat;
	mask-size: 1.125rem 1.125rem;
	pointer-events: none;
	transition: background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

/* Cuando el campo tiene el foco, el icono acompana. Sin esto se queda apagado
   justo en el momento en el que si esta diciendo algo: cual de los dos campos
   estas escribiendo. */
.woocommerce .pep-acceso__panel form .pep-campo:focus-within::after {
	background-color: var(--wp--preset--color--accent);
}

.pep-campo--correo::after {
	content: "";
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4.5' width='19' height='15' rx='2.5'/%3E%3Cpath d='m3.2 6.6 7.4 5.3a2.4 2.4 0 0 0 2.8 0l7.4-5.3'/%3E%3C/svg%3E");
}

.pep-campo--clave::after {
	content: "";
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='10' width='16' height='10.5' rx='2.5'/%3E%3Cpath d='M8 10V7a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E");
}

.pep-campo--persona::after {
	content: "";
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='3.6'/%3E%3Cpath d='M4.6 20.4a7.4 7.4 0 0 1 14.8 0'/%3E%3C/svg%3E");
}

.pep-campo--celular::after {
	content: "";
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='6.5' y='2.5' width='11' height='19' rx='2.5'/%3E%3Cpath d='M10.5 18.5h3'/%3E%3C/svg%3E");
}

/* Y el campo deja sitio al icono. */
.woocommerce .pep-acceso__panel form .pep-campo input.input-text {
	min-block-size: var(--pep-campo-alto);
	padding-inline-start: calc( var(--wp--preset--spacing--30) + 1.75rem );
}


/* El boton de enviar, a ancho completo. `border-box` porque combina ancho y
   relleno, y en este tema NO hay `box-sizing` global: sin declararlo, el relleno
   se suma al cien por ciento y la caja desborda su contenedor. Ya paso en el
   boton del carrito.

   neutral-900 sobre brand: 9.07:1. */
.pep-acceso__fila-boton .button {
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: center;
	inline-size: 100%;
	min-block-size: 3rem;
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--40);
	border-radius: var(--wp--custom--radio--pastilla);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
}

/* El aviso de privacidad que WooCommerce engancha en su propio hook. */
.woocommerce-privacy-policy-text {
	margin-block: var(--wp--preset--spacing--30) 0;
	font-size: var(--wp--preset--font-size--micro);
	line-height: 1.5;
	color: var(--wp--preset--color--neutral-600);
}

.woocommerce-privacy-policy-text p {
	margin: 0;
}

/* --------------------------------------------------------------------------
   EL OJO DE VER LA CONTRASENA

   No esta en el HTML: lo construye jQuery de WooCommerce envolviendo cada
   `input[type=password]` que lleve la clase `woocommerce-Input`. Por eso esa
   clase no se puede quitar de la plantilla.

   Y su icono es un SVG metido en un `background-image`, con el color QUEMADO
   dentro del propio SVG en negro casi puro. Sobre este fondo era invisible: un
   boton que existe, se puede pulsar y no se ve.

   Se invierte con un filtro en vez de escribir un color: `invert(1)` sobre un
   negro da un blanco, asi que el color sigue derivandose y no hay un
   hexadecimal nuevo en la hoja. Cambiar la imagen entera obligaria a escribir
   uno.
   -------------------------------------------------------------------------- */

.woocommerce .password-input {
	position: relative;
	display: block;
}

.woocommerce .show-password-input {
	display: flex;
	align-items: center;
	justify-content: center;
	inline-size: 2.75rem;
	block-size: 2.75rem;
	padding: 0;
	border: 0;
	border-radius: var(--pep-radio);
	background-color: transparent;
	cursor: pointer;
}

.woocommerce .show-password-input::before {
	filter: invert(1);
	opacity: 0.65;
	transition: opacity var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.woocommerce .show-password-input:hover::before,
.woocommerce .show-password-input:focus-visible::before,
.woocommerce .show-password-input.display-password::before {
	opacity: 1;
}

/* --------------------------------------------------------------------------
   Datos de pago y comprobante

   Estos bloques aparecen en la pantalla de gracias, en el correo y en el
   detalle del pedido. Son datos que la gente copia a mano hacia su app del
   banco, asi que la legibilidad de las cifras manda sobre lo demas.
   -------------------------------------------------------------------------- */

.pep-pago,
.pep-comprobante {
	border: var(--pep-borde);
	border-radius: var(--pep-radio);
	background-color: var(--wp--preset--color--neutral-050);
	padding: var(--wp--preset--spacing--40);
	margin-block: var(--wp--preset--spacing--40);
}

.pep-pago__titulo,
.pep-comprobante__titulo {
	font-size: var(--wp--preset--font-size--lg);
	margin-block: 0 var(--wp--preset--spacing--20);
}

.pep-pago__intro,
.pep-comprobante__intro,
.pep-comprobante__ayuda {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
	margin-block: 0 var(--wp--preset--spacing--30);
}

.pep-pago__datos {
	width: 100%;
	border-collapse: collapse;
	margin-block: var(--wp--preset--spacing--30);
}

.pep-pago__datos th,
.pep-pago__datos td {
	padding: var(--wp--preset--spacing--20) 0;
	text-align: left;
	vertical-align: top;
	border-bottom: 1px solid var(--wp--preset--color--neutral-200);
}

.pep-pago__datos tr:last-child th,
.pep-pago__datos tr:last-child td {
	border-bottom: 0;
}

.pep-pago__datos th {
	width: 40%;
	font-weight: 500;
	color: var(--wp--preset--color--neutral-600);
	font-size: var(--wp--preset--font-size--sm);
}

/* La CLABE, la referencia y el importe se teclean en la app del banco.
   Monoespaciada y cifras de ancho fijo reducen los errores al copiarlas. */
.pep-pago__datos td {
	font-family: var(--wp--preset--font-family--mono);
	font-variant-numeric: tabular-nums;
	font-weight: 600;
	color: var(--wp--preset--color--neutral-900);
	overflow-wrap: anywhere;
}

.pep-pago__nota,
.pep-comprobante__estado {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
	margin-block: var(--wp--preset--spacing--20) 0;
}

.pep-comprobante__estado {
	color: var(--wp--preset--color--success);
	font-weight: 500;
}

.pep-comprobante__form {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
}

.pep-comprobante__campo input[type="file"] {
	font-size: var(--wp--preset--font-size--sm);
	max-width: 100%;
}

.pep-comprobante__ayuda {
	flex-basis: 100%;
	margin-block: 0;
}

/* --------------------------------------------------------------------------
   ENTREGA COORDINADA
   Aparece en la pantalla de gracias y en el detalle del pedido. Aqui no hay
   cifras que teclear: lo que importa es que se lea como una promesa clara de
   que alguien va a escribir. Por eso el bloque usa el color de marca y no el
   gris de los bloques de pago.
   -------------------------------------------------------------------------- */

.pep-entrega {
	border: var(--pep-borde);
	border-left: 3px solid var(--wp--preset--color--accent);
	border-radius: var(--pep-radio);
	background-color: var(--wp--preset--color--neutral-100);
	padding: var(--wp--preset--spacing--40);
	margin-block: var(--wp--preset--spacing--40);
}

.pep-entrega__titulo {
	font-size: var(--wp--preset--font-size--lg);
	margin-block: 0 var(--wp--preset--spacing--20);
}

.pep-entrega__intro {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-800);
	margin-block: 0;
}

/* Etiqueta y valor en dos columnas, pero solo cuando hay ancho para ello:
   en telefono se apilan, que es como se leen los datos cortos. */
.pep-entrega__datos {
	display: grid;
	grid-template-columns: max-content 1fr;
	gap: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
	margin-block: var(--wp--preset--spacing--30) 0;
	font-size: var(--wp--preset--font-size--sm);
}

.pep-entrega__datos dt {
	font-weight: 500;
	color: var(--wp--preset--color--neutral-600);
}

.pep-entrega__datos dd {
	margin: 0;
	color: var(--wp--preset--color--neutral-900);
	font-weight: 500;
	overflow-wrap: anywhere;
}

.pep-entrega__accion {
	margin-block: var(--wp--preset--spacing--30) 0;
}

/* `neutral-050` es el mas OSCURO de esta paleta, no el mas claro.
   Los nombres van de 050 a 900 como en cualquier escala, pero la paleta es
   oscura: 050 es #0A0F1A, casi negro, y 900 es #E6F1FF, casi blanco. Aqui se
   uso como si fuera texto claro sobre el azul de marca y daba 1.85:1 —el mismo
   error, con el mismo nombre de color, en tres reglas—. Sobre un fondo de marca
   el texto va en el extremo claro. */
.pep-entrega__enlace {
	display: inline-block;
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--40);
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	text-decoration: none;
}

.pep-entrega__enlace:hover,
.pep-entrega__enlace:focus-visible {
	background-color: var(--wp--preset--color--brand-dark);
	color: var(--wp--preset--color--neutral-900);
}

@media (max-width: 30rem) {
	.pep-entrega__datos {
		grid-template-columns: 1fr;
		gap: 0;
	}

	.pep-entrega__datos dd {
		margin-block: 0 var(--wp--preset--spacing--20);
	}
}

/* --------------------------------------------------------------------------
   COMPRAR DE NUEVO
   Vive en Mi cuenta. El HTML lo pinta peptidos-recompra —para que cambiar de
   tema no cueste funcionalidad— y aqui solo se viste con los tokens.
   La lectura que manda es "cuando suelo pedir esto", asi que el distintivo de
   tiempo pesa mas que el precio.
   -------------------------------------------------------------------------- */

.pep-recompra__intro {
	color: var(--wp--preset--color--neutral-600);
	margin-block: 0 var(--wp--preset--spacing--40);
}

.pep-recompra__lista {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: var(--wp--preset--spacing--30);
}

.pep-recompra__item {
	display: flex;
	gap: var(--wp--preset--spacing--40);
	align-items: flex-start;
	border: var(--pep-borde);
	border-radius: var(--pep-radio);
	background-color: var(--wp--preset--color--neutral-050);
	padding: var(--wp--preset--spacing--30);
}

.pep-recompra__imagen {
	flex: 0 0 auto;
	width: 5rem;
	line-height: 0;
}

.pep-recompra__imagen img {
	width: 100%;
	height: auto;
	border-radius: var(--pep-radio);
}

.pep-recompra__datos {
	flex: 1 1 auto;
	min-width: 0;
}

.pep-recompra__nombre {
	font-size: var(--wp--preset--font-size--base);
	margin-block: 0 var(--wp--preset--spacing--20);
}

.pep-recompra__nombre a {
	text-decoration: none;
	color: var(--wp--preset--color--neutral-900);
}

.pep-recompra__nombre a:hover,
.pep-recompra__nombre a:focus-visible {
	color: var(--wp--preset--color--accent-dark);
}

.pep-recompra__cuando {
	margin-block: 0 var(--wp--preset--spacing--20);
}

.pep-recompra__distintivo {
	display: inline-block;
	padding: 0.15em 0.6em;
	border-radius: var(--wp--custom--radio--pastilla);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 600;
	background-color: var(--wp--preset--color--neutral-200);
	color: var(--wp--preset--color--neutral-800);
}

/* Lo que ya toca se distingue de un vistazo: es la unica linea de la pantalla
   que pide una decision. */
.pep-recompra__distintivo--toca {
	background-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-050);
}

.pep-recompra__detalle {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
	margin-block: 0 var(--wp--preset--spacing--30);
}

.pep-recompra__accion .button {
	font-size: var(--wp--preset--font-size--sm);
}

.pep-recompra__aviso {
	border-left: 3px solid var(--wp--preset--color--accent);
	background-color: var(--wp--preset--color--neutral-100);
	border-radius: var(--pep-radio);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	margin-block: var(--wp--preset--spacing--30);
}

@media (max-width: 30rem) {
	.pep-recompra__item {
		gap: var(--wp--preset--spacing--30);
	}

	.pep-recompra__imagen {
		width: 3.5rem;
	}
}

/* --------------------------------------------------------------------------
   MOVIMIENTO
   El vocabulario de animacion del tema. Regla de la casa: nada se mueve mas de
   lo que tarda un parpadeo, y nada se mueve sin motivo. El movimiento sirve
   para dos cosas —senalar que algo llego, y confirmar que algo respondio—, no
   para decorar.

   Hay dos formas de pedirlo, y las dos hacen falta:

   - `data-revelar` en HTML escrito a mano (patrones y plantillas).
   - la clase `pep-revelar`, que SI se puede poner desde el editor de bloques.
     Sin ella, el dueno no podria animar nada de lo que arme el mismo.

   El estado oculto cuelga de `.pep-js`, que pone un guion en linea en el head.
   Sin JavaScript esta regla no aplica nunca y la pagina se ve entera: el
   movimiento es un extra encima, no un requisito para leer.
   -------------------------------------------------------------------------- */

.pep-js [data-revelar],
.pep-js .pep-revelar,
.pep-js .pep-escalonado > * {
	opacity: 0;
	transform: translateY(18px);
	transition:
		opacity var(--wp--custom--movimiento--lento) var(--wp--custom--curva--salida),
		transform var(--wp--custom--movimiento--lento) var(--wp--custom--curva--salida);
	transition-delay: var(--pep-retardo, 0ms);
	will-change: opacity, transform;
}

/* Solo aparece, sin desplazarse. Para lo que ya esta en su sitio: una cifra
   grande, una imagen que no debe moverse. */
.pep-js [data-revelar='aparecer'],
.pep-js .pep-revelar--aparecer {
	transform: none;
}

/* Entra desde el margen. El movimiento lateral refuerza que el dato viene a
   senalar algo. */
.pep-js [data-revelar='lateral'],
.pep-js .pep-revelar--lateral {
	transform: translateX(-24px);
}

.pep-js [data-revelar].pep-visible,
.pep-js .pep-revelar.pep-visible,
.pep-js .pep-escalonado.pep-visible > * {
	opacity: 1;
	transform: none;
	will-change: auto;
}

/* Escalonado. El hijo n entra 70 ms despues del anterior; a partir del sexto se
   deja de sumar, porque una rejilla de doce tarjetas tardaria casi un segundo
   en terminar de aparecer y eso ya no se lee como elegancia sino como lentitud.

   Se observa el CONTENEDOR, no cada hijo: asi funciona igual en una rejilla que
   pinta el servidor —las tarjetas del catalogo— donde no hay forma de ponerle
   un atributo a cada tarjeta. */
.pep-escalonado > *:nth-child(1) { --pep-retardo: 0ms; }
.pep-escalonado > *:nth-child(2) { --pep-retardo: 70ms; }
.pep-escalonado > *:nth-child(3) { --pep-retardo: 140ms; }
.pep-escalonado > *:nth-child(4) { --pep-retardo: 210ms; }
.pep-escalonado > *:nth-child(5) { --pep-retardo: 280ms; }
.pep-escalonado > *:nth-child(n + 6) { --pep-retardo: 350ms; }

/* --------------------------------------------------------------------------
   FICHA DE PRODUCTO
   La tesis de la tienda, puesta en composicion: el producto es polvo blanco en
   un vial de vidrio y por COFEPRIS no puede haber foto de uso, asi que la
   fotografia nunca va a salvar esta pagina. El dato es el heroe.

   De ahi las tres decisiones de abajo: la columna de datos pesa mas que la de
   imagen, la pureza se lee antes que el precio, y la imagen vive en un marco
   que se ve intencional aunque lo que llegue a contener sea flojo.
   -------------------------------------------------------------------------- */

/* La lamina: el marco de la imagen.

   Esta pensado para recibir bien lo que sea. Mientras no lleguen las fotos del
   cliente hay un vial de ejemplo dibujado por codigo; cuando lleguen, el mismo
   marco las encuadra sin tocar nada. Un marco con aire y una linea fina hace
   que una imagen mediocre se lea como una lamina de catalogo, y que una buena
   se luzca. */
.pep-lamina {
	/* Defensivo, y hace falta: el carrusel de WooCommerce escribe el ancho de la
	   imagen EN LINEA al cargar, y a veces lo calcula con una medida anterior a
	   la definitiva. Cuando se pasa, desbordaba por encima de la columna del
	   precio y cortaba el nombre del producto. Recortar no cambia ninguna
	   medida, asi que no lo hace recalcular ni entra en el bucle que colgaba la
	   pagina. */
	min-width: 0;
	overflow: hidden;
}

.pep-lamina .woocommerce-product-gallery {
	/* LA PLACA VA MAS OSCURA QUE SU BANDA, Y ANTES IBA DEL MISMO COLOR.

	   Aqui habia `neutral-100` con un filo de `neutral-200`, copiado de la
	   tarjeta del catalogo sin mirar donde caia. En el catalogo funciona porque
	   la relacion es pozo `neutral-100` sobre tarjeta `neutral-050`: el pozo se
	   ve. En la ficha, la banda que contiene esto —`.pep-ficha-cabecera`— ya es
	   `neutral-100`, asi que la placa quedaba del MISMO color que su fondo y lo
	   unico que se veia era la linea del filo: un recuadro alrededor de nada.

	   Medido en la pagina servida antes de tocarlo: banda rgb(17,24,39), placa
	   rgb(17,24,39), filo rgb(43,58,87). Tres cifras que lo dicen todo y que no
	   se podian ver leyendo el CSS, porque las dos reglas viven a cuatro mil
	   lineas de distancia.

	   Se invierte la relacion en vez de quitar la pieza: la placa baja a
	   `neutral-050` —mas oscura que la banda, igual que en el catalogo es mas
	   clara que la tarjeta— y el filo sobra, porque ahora el contraste lo hace
	   el color. `composer test:vistas` compara las dos y falla si vuelven a
	   coincidir. */
	background-color: var(--wp--preset--color--neutral-050);
	border-radius: var(--wp--custom--radio--base);
	padding: var(--wp--preset--spacing--50);

	/* LA IMAGEN NO ESPERA A QUE CORRA UN JAVASCRIPT AJENO.

	   WooCommerce sirve esta galeria con `style="opacity: 0; transition: opacity
	   .25s"` escrito EN LINEA en su plantilla
	   (`templates/single-product/product-image.php`), y lo unico que la vuelve a
	   encender es `assets/js/frontend/single-product.js`, en tres lineas. No hay
	   una sola regla de CSS que lo haga: ni en la hoja de WooCommerce ni en esta.

	   O sea que el vial llega en el HTML desde el primer byte y se queda
	   invisible hasta que bajan jQuery y ese guion, se analizan y se ejecutan. Si
	   cualquiera de los tres falla —y en un alojamiento compartido fallan—, la
	   ficha se queda con un pozo vacio para siempre, sin ningun error. Es la
	   regla 30 otra vez: algo que al no estar mata lo que adorna no es un adorno,
	   es una dependencia.

	   `!important` porque pelea contra un estilo en linea, que es la unica
	   situacion en que este proyecto lo admite — la misma razon por la que lo
	   lleva el `object-fit` de la imagen, unas lineas mas abajo. */
	opacity: 1 !important;
}

/* El marco es UNO. WooCommerce pinta ademas su propia caja alrededor de la
   imagen, y las dos juntas daban un doble borde que se veia como un error de
   maquetacion. Se apaga la de dentro y se conserva la de fuera, que es la que
   lleva el aire. */
.pep-lamina .woocommerce-product-gallery__wrapper,
.pep-lamina .woocommerce-product-gallery__image {
	background: none;
	border: 0;
	box-shadow: none;
	margin: 0;
	padding: 0;
}

/* Aqui NO se le pone `max-width` ni `height` a la imagen de la galeria, y hay
   que decir por que para que nadie lo "arregle" luego: FlexSlider mide la
   imagen al cargar y le escribe un ancho en linea. Una regla que le cambie el
   tamano lo hace recalcular, y recalcular vuelve a disparar la regla. Ese bucle
   cuelga el navegador: la ficha dejaba de pintarse por completo. El
   desbordamiento que se queria evitar se resuelve apilando las columnas antes
   de llegar a ese ancho, mas abajo. */
.pep-lamina img {
	display: block;
	margin-inline: auto;

	/* Aqui iba `mix-blend-mode: multiply`, que servia cuando la lamina era
	   clara: fundia el fondo blanco de una foto con el del marco. Sobre fondo
	   OSCURO multiplicar deja la imagen en negro, y el vial se convirtio en una
	   silueta. Fuera.

	   Si algun dia llegan fotos con fondo blanco recortado, la solucion en un
	   tema oscuro no es mezclar sino pedirlas con fondo transparente. */
}

/* La familia, como cintillo sobre el nombre. Da contexto sin gastar una linea
   de titulo, y de paso el visitante entiende que el catalogo esta organizado. */
.pep-ficha-familia {
	text-transform: uppercase;
	letter-spacing: 0.16em;
	color: var(--wp--preset--color--neutral-600);
	margin-block: 0 var(--wp--preset--spacing--20);
}

.pep-ficha-familia a {
	color: inherit;
	text-decoration: none;
}

.pep-ficha-familia a:hover,
.pep-ficha-familia a:focus-visible {
	color: var(--wp--preset--color--accent);
	text-decoration: underline;
}

/* LA PUREZA.
   Es el unico numero que distingue a un proveedor que analiza sus lotes de uno
   que dice que lo hace, asi que se lee antes que el precio.

   Es tambien el unico sitio de toda la ficha donde aparece el verde menta. Esa
   contencion es deliberada: un color que aparece una sola vez se lee como una
   senal; el mismo color repartido por la pagina se lee como decoracion. */
.pep-compra .pep-pureza {
	display: block;
	margin-block: var(--wp--preset--spacing--40);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--senal-fondo);
	border-inline-start: 3px solid var(--wp--preset--color--senal);
	border-radius: 0 var(--wp--custom--radio--base) var(--wp--custom--radio--base) 0;
}

.pep-compra .pep-pureza__cifra {
	display: block;

	/* Aqui NO va la monoespaciada, aunque sea la fuente de los datos. En una
	   mono el punto ocupa el ancho completo de un digito, y a este tamano
	   «99 . 2 %» se lee como un fallo de maquetacion en vez de como una cifra.
	   La mono se queda en la tabla y en los distintivos, que es donde su razon
	   de ser —que las columnas de numeros alineen— de verdad aplica. */
	font-family: var(--wp--preset--font-family--sans);
	font-variant-numeric: lining-nums;
	font-size: var(--wp--preset--font-size--xxl);
	font-weight: 700;
	line-height: 1;
	letter-spacing: -0.03em;
	color: var(--wp--preset--color--accent);
}

.pep-compra .pep-pureza__etiqueta {
	display: block;
	margin-block-start: var(--wp--preset--spacing--20);
	font-size: var(--wp--preset--font-size--micro);
	text-transform: uppercase;
	letter-spacing: 0.14em;
	color: var(--wp--preset--color--neutral-600);
}

/* El precio, en la misma familia que la pureza: los dos son cifras y se
   comparan entre productos. Que compartan tipografia dice que son del mismo
   tipo de dato. */
.pep-compra .wc-block-components-product-price,
.pep-compra .price {
	display: block;
	font-family: var(--wp--preset--font-family--mono);
	font-weight: 500;
	color: var(--wp--preset--color--neutral-900);
	margin-block: 0 var(--wp--preset--spacing--30);
}

/* El aviso legal cierra la columna. Va DESPUES del boton a proposito: es el
   ultimo texto que alguien lee antes de agregar al carrito, y esa posicion es
   media razon de que exista. Ver docs/DECISION.md 7.2. */
.pep-compra .pep-aviso--ruo {
	margin-block-start: var(--wp--preset--spacing--40);
}

/* En telefono la lamina va primero y estrecha: la imagen orienta, pero no debe
   ocupar la primera pantalla entera y empujar el precio fuera de vista. */
@media (max-width: 46rem) {

	.pep-lamina .woocommerce-product-gallery,
	.pep-lamina .wp-block-woocommerce-product-image-gallery {
		padding: var(--wp--preset--spacing--40);
	}

	.pep-lamina img {
		max-width: 60%;
	}
}

/* --------------------------------------------------------------------------
   CATALOGO
   Cabecera con aire, un riel para navegar por familia, una barra de servicio
   discreta y una rejilla de fichas.

   La tarjeta lleva clave, pureza y certificado porque sin esos tres datos una
   rejilla de peptidos son nueve fotos identicas de polvo blanco con nombres
   distintos, y entonces lo unico comparable entre productos acaba siendo el
   precio: justo la comparacion que esta tienda no quiere ganar.
   -------------------------------------------------------------------------- */

.pep-catalogo-cabecera .wp-block-woocommerce-breadcrumbs {
	color: var(--wp--preset--color--neutral-600);
	text-transform: uppercase;
	letter-spacing: 0.12em;
}

/* --------------------------------------------------------------------------
   La tira de datos de la vista

   Va bajo el titulo y dice lo que esa pagina concreta tiene: nueve productos en
   la tienda, dos en Secretagogos. Antes ahi habia una frase fija que se repetia
   igual en las ocho paginas que comparten esta plantilla.

   Es el idioma de `.pep-cifra` en miniatura: dato en cian, separadores de un
   pixel. Mismo vocabulario, otro tamano, otro trabajo — aquella abre una
   seccion, esta es un renglon de referencia.
   -------------------------------------------------------------------------- */

.pep-datos-vista {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: var(--wp--preset--spacing--30);
	margin-block: var(--wp--preset--spacing--30) 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--wp--preset--color--neutral-600);
	font-variant-numeric: lining-nums;
}

/* El filo separa un dato del siguiente. Al primero se le quita: una linea antes
   del primer dato no separa nada. Cuando la tira envuelve, el filo de la que
   abre renglon queda suelto a la izquierda —es el precio de resolverlo con
   `flex-wrap` en vez de con una rejilla, y a este tamano no se nota. */
.pep-dato-vista + .pep-dato-vista {
	padding-inline-start: var(--wp--preset--spacing--30);
	border-inline-start: 1px solid var(--wp--preset--color--neutral-200);
}

/* --------------------------------------------------------------------------
   EL RIEL DE FAMILIAS

   Era el hueco funcional mas grande de la tienda: desde el catalogo no habia
   forma de llegar a una familia.

   Va horizontal y no en barra lateral, y eso se decidio midiendo. Una columna
   de 16rem se lleva 256 px mas 32 de canal; quedan 928 para la rejilla y tres
   columnas de tarjeta necesitan 912. Entra por dieciseis pixeles, y cualquier
   ajuste posterior de relleno la parte en dos columnas.

   Aqui decia que el riel «cuesta 44 px de alto y no le quita un solo pixel a la
   rejilla». Lo segundo es cierto —va encima, no al lado— y lo primero era falso
   ya el dia que se escribio: con las siete pastillas de hoy son DOS filas, unos
   88 px. Envuelve, no se desliza. Con veinticinco familias serian cinco filas y
   la primera fila de productos quedaria bajo el pliegue, asi que el bloque se
   recorta a la rama en la que estas cuando el catalogo pasa de diez familias.
   Ver `FamiliasRiel::las_que_caben()`.

   Ademas una barra lateral es el mueble de las FACETAS, y aqui no hay ninguna:
   no existen atributos de producto, no hay etiquetas y todo esta en existencia.
   Una barra lateral con una sola lista de seis enlaces anuncia un sistema de
   filtrado que no existe.
   -------------------------------------------------------------------------- */

.pep-riel {
	margin-block-start: var(--wp--preset--spacing--40);
}

.pep-riel__carril {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
}

/* La etiqueta de grupo. Convierte seis pastillas sueltas en cuatro bajo
   «Peptidos» y dos bajo «Insumos», que se barre de un vistazo. Es un enlace
   porque la raiz TAMBIEN es una pagina con sus productos: un texto que parece
   titulo y no lleva a ningun sitio, teniendo adonde llevar, es una oportunidad
   tirada. */
.pep-riel__grupo {
	display: inline-flex;
	align-items: center;
	padding-inline: var(--wp--preset--spacing--20);
	margin-inline-start: var(--wp--preset--spacing--20);
	border-inline-start: 1px solid var(--wp--preset--color--neutral-200);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.1em;
	text-transform: uppercase;

	/* `neutral-600` y no `neutral-400`. La etiqueta de grupo se penso como un
	   rotulo en voz baja, pero acabo siendo un ENLACE —la raiz tambien es una
	   pagina con productos—, y en `neutral-400` daba 4.23:1 sobre la banda:
	   por debajo del minimo para texto pequeno. Lo que la mantiene en segundo
	   plano no es el contraste sino el tamano, la monoespaciada, las
	   mayusculas y el tracking abierto, que ya la separan de las pastillas de
	   sobra. */
	color: var(--wp--preset--color--neutral-600);
	text-decoration: none;
	transition: color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-riel__grupo:first-child {
	margin-inline-start: 0;
	border-inline-start: 0;
	padding-inline-start: 0;
}

.pep-riel__grupo:hover,
.pep-riel__grupo:focus-visible,
.pep-riel__grupo.is-activa {
	color: var(--wp--preset--color--accent);
}

/* Sobre el filo de la pastilla en reposo, que da 1.56:1 contra la banda y va a
   saltar en cualquier revision automatica: la pastilla NO se identifica por su
   borde. Es un enlace con texto a 7.08:1, dentro de un `<nav>`, y su estado lo
   dan el fondo y `aria-current`, no la linea. El borde es acabado, no
   informacion, y por eso no le aplica el minimo de 3:1 de los controles.
   Subirlo pondria siete recuadros a gritar encima del titulo. */
.pep-riel__pastilla {
	display: inline-flex;
	align-items: center;
	gap: 0.6ch;
	min-block-size: 2.5rem;
	padding-inline: var(--wp--preset--spacing--30);
	border: 1px solid var(--wp--preset--color--neutral-200);

	/* Radio minimo y no capsula: la geometria del sitio es recta —tarjetas de
	   4px, botones de 2—. Una pildora de 999px seria de otro sistema. */
	border-radius: var(--wp--custom--radio--pastilla);
	font-size: var(--wp--preset--font-size--tiny);
	color: var(--wp--preset--color--neutral-600);
	text-decoration: none;
	white-space: nowrap;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		background-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-riel__pastilla:hover,
.pep-riel__pastilla:focus-visible {
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-900);
}

/* La activa en navy con el texto claro: 9.07:1. En el primer intento el texto
   iba en `neutral-050` —casi negro sobre navy, 1.85:1— y era el mismo error que
   habia en el distintivo de oferta y en el menu de Mi cuenta. */
.pep-riel__pastilla.is-activa {
	background-color: var(--wp--preset--color--brand);
	border-color: var(--wp--preset--color--brand-light);
	color: var(--wp--preset--color--neutral-900);
}

/* La cuenta contesta «hay algo aqui» antes del clic, y es dato verdadero: por
   eso puede ir en cian. */
.pep-riel__cuenta {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	color: var(--wp--preset--color--senal);
	font-variant-numeric: lining-nums;
}

/* En pantalla tactil el objetivo sube a 44 px, que es el minimo para un dedo. */
@media (hover: none) {

	.pep-riel__pastilla {
		min-block-size: 2.75rem;
	}
}

/* En movil el riel no envuelve: se desliza. Envolver siete pastillas a 360 px
   son tres renglones de mueble antes del primer producto.

   El desvanecido del borde derecho es lo que avisa de que hay mas a la derecha;
   sin el, un carril cortado a ras parece que se acabo. */
@media (max-width: 46rem) {

	.pep-riel__carril {
		flex-wrap: nowrap;
		overflow-x: auto;
		scroll-snap-type: inline mandatory;
		scroll-padding-inline-start: var(--wp--preset--spacing--40);
		padding-block-end: var(--wp--preset--spacing--20);

		/* Sin barra visible: en un carril de pastillas la barra pesa mas que lo
		   que informa, y el desvanecido ya avisa. */
		scrollbar-width: none;
		-webkit-mask-image: linear-gradient(to right, #000 88%, transparent 100%);
		mask-image: linear-gradient(to right, #000 88%, transparent 100%);
	}

	.pep-riel__carril::-webkit-scrollbar {
		display: none;
	}

	.pep-riel__pastilla,
	.pep-riel__grupo {
		scroll-snap-align: start;
		flex: 0 0 auto;
	}
}

/* --------------------------------------------------------------------------
   LA TARJETA DE FAMILIA

   Vivia en el catalogo, dentro de una seccion que agrupaba las catorce por sus
   tres ramas. Esa seccion se fue a la portada —medida, ocupaba el 49 % del alto
   del catalogo y empujaba el primer producto hasta los 3 981 px—, y con ella se
   fueron `.pep-rama*`, que eran los titulos de rama y su rejilla. La division en
   ramas no se pierde: ahora la lleva la columna izquierda del panel de filtros,
   que es donde sirve de verdad porque ademas filtra.

   Del componente de galeria que inspiro esto se toma el LENGUAJE, no el codigo:
   gris en reposo y color al enfocar, la imagen que escala despacio, el titulo
   que se destaca. Todo eso son tres `transition`; la libreria original traia
   React y GSAP para interpolar lo que el navegador ya interpola.
   -------------------------------------------------------------------------- */

/* La tarjeta se llama «puerta» y no «familia» porque `.pep-familia` ya existe:
   es la tarjeta sin imagen que se usa al pie de una pagina de familia. Son dos
   piezas distintas con dos trabajos distintos, y darles el mismo nombre habria
   hecho que una heredara los estilos de la otra sin que nadie lo pidiera. */
.pep-puerta {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	background-color: var(--wp--preset--color--neutral-050);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--tarjeta);
	text-decoration: none;
	color: inherit;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-puerta:hover,
.pep-puerta:focus-visible {
	border-color: var(--wp--preset--color--accent);
	transform: translateY(-2px);
}

/* --------------------------------------------------------------------------
   EL HUECO DE LA IMAGEN

   Se pinta SIEMPRE, con o sin fotografia dentro, y con su proporcion reservada.
   Hoy no hay ninguna: sin el hueco, una tarjeta con foto y otra sin ella
   tendrian altos distintos y la rejilla se veria rota — que es peor que verse
   incompleta. Con el, el dia que aparezcan las imagenes no se mueve nada mas.
   -------------------------------------------------------------------------- */
.pep-puerta__imagen {
	display: block;
	aspect-ratio: 16 / 10;
	overflow: hidden;
	background-color: var(--wp--preset--color--neutral-100);
	border-block-end: 1px solid var(--wp--preset--color--neutral-200);
}

/* Gris en reposo, color al enfocar. Es el gesto de la galeria que inspiro esto,
   y hace un trabajo: en una rejilla de catorce tarjetas, catorce fotografias a
   todo color compiten entre ellas y ninguna gana. En gris, la que el raton toca
   es la unica que tiene color. */
.pep-puerta__img {
	display: block;
	inline-size: 100%;
	block-size: 100%;
	object-fit: cover;
	filter: grayscale(1);
	transition:
		filter var(--wp--custom--movimiento--base) var(--wp--custom--curva--suave),
		scale var(--wp--custom--movimiento--base) var(--wp--custom--curva--suave);
}

.pep-puerta:hover .pep-puerta__img,
.pep-puerta:focus-visible .pep-puerta__img {
	filter: grayscale(0);
	scale: 1.04;
}

.pep-puerta__cuerpo {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
	padding: var(--wp--preset--spacing--40);
}

.pep-puerta__cuenta {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--senal);
	font-variant-numeric: lining-nums;
}

.pep-puerta__nombre {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 700;
	line-height: 1.15;
	color: var(--wp--preset--color--neutral-900);
	text-wrap: balance;
}

.pep-puerta__que {
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.5;
	color: var(--wp--preset--color--neutral-600);
}

/* Los compuestos, en monoespaciada y al fondo de la tarjeta. Son nombres de
   catalogo, no prosa. Van separados por un filo para que todas las tarjetas de
   la fila alineen esa linea aunque sus descripciones midan distinto. */
.pep-puerta__ejemplos {
	margin-block-start: auto;
	padding-block-start: var(--wp--preset--spacing--20);
	border-block-start: 1px solid var(--wp--preset--color--neutral-200);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	line-height: 1.7;
	color: var(--wp--preset--color--neutral-400);
}

/* En telefono la imagen se achata: una proporcion 16/10 a ancho completo se
   come media pantalla antes de llegar al nombre. */
@media (max-width: 46rem) {

	.pep-puerta__imagen {
		aspect-ratio: 21 / 9;
	}
}

/* --------------------------------------------------------------------------
   La barra de servicio: cuantos hay y en que orden

   Es servicio, no contenido: se pone al ras de una linea fina para que se lea
   como parte del mueble y no compita con las fichas.
   -------------------------------------------------------------------------- */

/* `center` y no `baseline`. Con `baseline` el conteo se alineaba con la linea
   de texto de DENTRO del desplegable, que esta unos 25 px por debajo de su
   borde superior por el relleno del campo: el conteo quedaba visiblemente mas
   abajo que su etiqueta. Cuando un lado de la barra es texto suelto y el otro
   es una caja, lo que hay que alinear son los centros. */
.pep-catalogo-barra {
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	padding-block-end: var(--wp--preset--spacing--20);
	border-block-end: 1px solid var(--wp--preset--color--neutral-200);
	color: var(--wp--preset--color--neutral-600);
}

.pep-catalogo-barra .woocommerce-result-count,
.pep-catalogo-barra p {
	margin: 0;
}

/* Cuando la busqueda no devuelve nada, WooCommerce no pinta ni el conteo ni la
   ordenacion —con cero resultados no hay nada que contar ni que ordenar—, y la
   barra se quedaba como una raya horizontal suelta encima del panel de «no
   encontramos nada». Una linea que no separa dos cosas no es una linea, es
   basura.

   `:empty` no sirve aqui porque el contenedor conserva el espacio en blanco
   entre bloques; `:has(*)` pregunta lo que de verdad importa: si quedo algun
   elemento dentro. */
.pep-catalogo-barra:not(:has(*)) {
	display: none;
}

.pep-catalogo-barra .woocommerce-result-count {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	color: var(--wp--preset--color--neutral-400);

	/* `lining-nums` y no `tabular-nums`: ya esta anotado mas arriba que la
	   fuente le da al punto decimal el ancho de un digito en la familia
	   tabular. */
	font-variant-numeric: lining-nums;
}

/* --------------------------------------------------------------------------
   CONTROLES DE FORMULARIO

   Una vez, para todo el sitio. El desplegable de ordenacion salia con el
   control del sistema operativo —fondo claro, tipografia del sistema— sobre el
   fondo oscuro, y el campo de busqueda del 404 con el gris de fabrica del
   navegador. Los dos son el mismo agujero: nunca se vistio el control base.

   `color-scheme: dark` es la pieza que no se puede sustituir con colores: es lo
   que hace que la LISTA desplegada, que la pinta el sistema operativo y no la
   pagina, salga oscura en vez de blanca.
   -------------------------------------------------------------------------- */

select,
input[type="text"],
input[type="search"],
input[type="email"],
input[type="tel"],
input[type="url"],
input[type="number"],
input[type="password"],
textarea {
	color-scheme: dark;
	background-color: var(--wp--preset--color--neutral-100);
	color: var(--wp--preset--color--neutral-900);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--tarjeta);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--xs);
	padding: 0.55rem 0.75rem;
	transition: border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

select:hover,
input[type="text"]:hover,
input[type="search"]:hover,
input[type="email"]:hover,
textarea:hover {
	border-color: var(--wp--preset--color--neutral-400);
}

::placeholder {
	color: var(--wp--preset--color--neutral-400);
	opacity: 1;
}

/* --------------------------------------------------------------------------
   LA LISTA DESPLEGADA DE UN `select`, QUE NO LA PINTA LA PAGINA

   «Elige una opcion» abria una lista blanca con el texto casi blanco: las tres
   presentaciones estaban ahi y no se veian. Medido sobre la ficha servida:

       select  color-scheme = dark
       select  background-color = rgba(0, 0, 0, 0)
       option  background-color = rgba(0, 0, 0, 0)   color = rgb(230, 241, 255)

   Son dos fallos distintos que se juntaron en el mismo sitio.

   EL PRIMERO: el fondo del control. WooCommerce declara
   `.woocommerce div.product form.cart .variations select { background: url(...) }`
   con la ABREVIATURA, y una abreviatura no anade, reemplaza: al poner solo la
   imagen del chevron deja el `background-color` en `transparent` y se lleva por
   delante el `neutral-100` que le pone la regla general de controles. Su
   selector pesa (0,3,3) y el nuestro, un `select` pelado, (0,0,1).

   EL SEGUNDO, y es el que no se ve: el `option` hereda el color del texto
   —`neutral-900`, casi blanco, que es el correcto sobre el control oscuro— y no
   tiene fondo propio. Quien pinta esa lista es el SISTEMA OPERATIVO, no la
   pagina, y `color-scheme: dark` es una peticion, no una garantia: segun el
   sistema y el navegador la superficie sale blanca igual. Entonces queda texto
   casi blanco sobre blanco.

   Por eso no basta con arreglar el control: hay que darle al `option` su fondo y
   su color explicitos, que es lo unico que no depende de quien pinte. Y se
   arreglan los dos a la vez en todo el sitio, no solo en la ficha: el mismo
   `select` esta en la ordenacion del catalogo y en los campos del checkout.
   -------------------------------------------------------------------------- */

/* La clase repetida gana el desempate sin `!important`: con una sola, el
   selector pesa lo mismo que el de WooCommerce y decide la hoja que cargue
   despues, que no es cosa sobre la que apostar. Se toca SOLO el color: la
   imagen del chevron que trae su abreviatura se queda donde esta. */
.woocommerce.woocommerce div.product form.cart .variations select {
	background-color: var(--wp--preset--color--neutral-100);
}

option {
	background-color: var(--wp--preset--color--neutral-100);
	color: var(--wp--preset--color--neutral-900);
}

/* La ordenacion, como instrumento etiquetado.

   La flecha se dibuja con los mismos dos gradientes que la cruz de las
   preguntas frecuentes, girados 45 grados. Va en el `::after` del formulario y
   no del `select`, porque un `select` no admite pseudoelementos. Cero marcado
   nuevo, y el chevron pertenece al sistema en vez de al sistema operativo. */
.woocommerce-ordering {
	position: relative;
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	max-width: 100%;
}

.woocommerce-ordering label {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--wp--preset--color--neutral-400);
	white-space: nowrap;
}

.woocommerce-ordering select {
	appearance: none;
	-webkit-appearance: none;
	max-width: 100%;
	padding-inline-end: 2.25rem;
	cursor: pointer;
}

.woocommerce-ordering::after {
	content: "";
	position: absolute;
	inset-inline-end: 0.85rem;
	inset-block-start: calc(50% - 0.2rem);
	inline-size: 0.45rem;
	block-size: 0.45rem;
	border-inline-end: 1.5px solid var(--wp--preset--color--accent);
	border-block-end: 1.5px solid var(--wp--preset--color--accent);
	transform: rotate(45deg);
	pointer-events: none;
}

.woocommerce-ordering select:hover {
	border-color: var(--wp--preset--color--accent);
}

/* --------------------------------------------------------------------------
   LA PAGINACION

   No existia: salia con los enlaces de fabrica, o sea una hilera de numeros
   azules subrayados por la regla global de enlaces. En este sistema eso es un
   cuerpo extrano.

   Se compone como el pie de un expediente y no como un widget centrado: filo
   arriba, anterior a la izquierda, numeros al centro, siguiente a la derecha.
   Un widget centrado flota; anclado a los bordes cierra el bloque de
   resultados.

   Dos trampas que costaron medirlas: la pagina ACTUAL es un `<span>` y no un
   `<a>`, asi que cualquier regla escrita sobre `a.page-numbers` no le llega; y
   «anterior» y «siguiente» simplemente NO se pintan cuando no aplican, no son
   elementos deshabilitados que se puedan estilar.
   -------------------------------------------------------------------------- */

.pep-paginacion {
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	padding-block-start: var(--wp--preset--spacing--40);
	border-block-start: 1px solid var(--wp--preset--color--neutral-200);
}

.wp-block-query-pagination-previous,
.wp-block-query-pagination-next {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
	text-decoration: none;
	transition: color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.wp-block-query-pagination-previous:hover,
.wp-block-query-pagination-next:hover,
.wp-block-query-pagination-previous:focus-visible,
.wp-block-query-pagination-next:focus-visible {
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
}

/* La flecha avanza al pasar por encima: es el mismo gesto de la flecha de las
   tarjetas de familia, y repetirlo une el sitio. */
.wp-block-query-pagination-previous::before,
.wp-block-query-pagination-next::after {
	display: inline-block;
	color: var(--wp--preset--color--accent);
	transition: transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.wp-block-query-pagination-previous::before {
	content: "\2190";
	margin-inline-end: 0.5ch;
}

.wp-block-query-pagination-next::after {
	content: "\2192";
	margin-inline-start: 0.5ch;
}

.wp-block-query-pagination-previous:hover::before {
	transform: translateX(-4px);
}

.wp-block-query-pagination-next:hover::after {
	transform: translateX(4px);
}

/* `flex` y no el flujo en linea que trae de fabrica: los numeros vienen
   separados por saltos de linea en el HTML, y en `inline-block` esos espacios
   en blanco se convierten en huecos que no se pueden controlar. */
.wp-block-query-pagination-numbers {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
}

.wp-block-query-pagination-numbers .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	/* 2.75rem son 44 px: el objetivo tactil minimo. Un numero de pagina es de
	   las cosas mas faciles de fallar con el pulgar. */
	min-inline-size: 2.75rem;
	min-block-size: 2.75rem;
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--pastilla);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	font-variant-numeric: lining-nums;
	color: var(--wp--preset--color--neutral-600);
	text-decoration: none;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.wp-block-query-pagination-numbers a.page-numbers:hover,
.wp-block-query-pagination-numbers a.page-numbers:focus-visible {
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-900);
}

/* La pagina en la que estas es el unico dato de la fila, y por eso va en cian:
   la misma regla que el lote de un certificado o la cuenta de una familia. */
.wp-block-query-pagination-numbers .page-numbers.current {
	background-color: var(--wp--preset--color--senal-fondo);
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--accent);
}

.wp-block-query-pagination-numbers .page-numbers.dots {
	border-color: transparent;
	min-inline-size: 1.5rem;
	color: var(--wp--preset--color--neutral-400);
}

/* En telefono los numeros del medio sobran: lo que hace falta es saber donde
   estas y poder avanzar. */
@media (max-width: 30rem) {

	.wp-block-query-pagination-numbers .page-numbers:not(.current) {
		display: none;
	}
}

/* --------------------------------------------------------------------------
   EL ESTADO VACIO

   Casi siempre es una busqueda fallida —una familia vacia no se pinta y la
   tienda nunca esta a cero—, asi que la copia puede hablar de busqueda sin
   disimulo.

   Los tres ejemplos son enlaces de busqueda de VERDAD y los tres devuelven el
   mismo producto. No es decoracion: demuestra en un clic que el buscador
   entiende nombre, clave y numero CAS, justo en el momento en que a alguien le
   acaba de fallar una busqueda.
   -------------------------------------------------------------------------- */

.pep-sin-resultados {
	max-width: 52rem;
	padding: var(--wp--preset--spacing--50);
	background-color: var(--wp--preset--color--neutral-100);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--base);
}

.pep-sin-resultados__ejemplos {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: var(--wp--preset--spacing--30);
	margin-block: var(--wp--preset--spacing--30) 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
}

.pep-sin-resultados__ejemplos a {
	color: var(--wp--preset--color--senal);
	text-decoration: none;
	border-block-end: 1px solid transparent;
	transition: border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-sin-resultados__ejemplos a:hover,
.pep-sin-resultados__ejemplos a:focus-visible {
	border-block-end-color: var(--wp--preset--color--accent);
}

.pep-sin-resultados__ejemplos a + a {
	padding-inline-start: var(--wp--preset--spacing--30);
	border-inline-start: 1px solid var(--wp--preset--color--neutral-200);
}

/* El campo hereda el centrado que el layout «constrained» de WordPress le pone
   a cada hijo, y salia a media caja mientras todo el panel se lee desde el
   margen izquierdo. Es la tercera vez que aparece esta trampa en el proyecto. */
.pep-sin-resultados__buscador {
	max-width: 24rem;
	margin-inline-start: 0 !important;
	margin-inline-end: auto !important;
}

@media (max-width: 46rem) {

	.pep-sin-resultados {
		padding: var(--wp--preset--spacing--40);
	}

	.pep-sin-resultados__buscador {
		max-width: none;
	}
}

/* --------------------------------------------------------------------------
   EL CIERRE DEL CATALOGO
   -------------------------------------------------------------------------- */

.pep-seccion-hermanas {
	padding-block-start: var(--wp--preset--spacing--50);
	border-block-start: 1px solid var(--wp--preset--color--neutral-200);
	margin-block-end: var(--wp--preset--spacing--50);
}

.pep-seccion-hermanas .pep-cintillo {
	color: var(--wp--preset--color--senal);
	font-size: var(--wp--preset--font-size--micro);
	margin-block-end: var(--wp--preset--spacing--40);
}

/* Las tarjetas de familia aqui viven sobre el suelo, no sobre la superficie
   —que es al reves que en la portada—, asi que se pintan con el neutro
   contrario. Es la misma regla de siempre: la tarjeta usa el neutro opuesto al
   de su banda. */
.pep-seccion-hermanas .pep-familia {
	background-color: var(--wp--preset--color--neutral-100);
}

/* La nota de analisis, en voz baja y una sola vez. Antes estaba arriba y decia
   lo mismo en las ocho paginas que comparten esta plantilla.

   El margen es el mismo truco que `.pep-prosa`, y cayo en la misma trampa: el
   layout «constrained» de WordPress le pone `margin-left/right: auto` a cada
   hijo, o sea que lo CENTRA. Con `max-width` puesto, la nota salia centrada en
   medio de una pagina que se lee toda desde el margen izquierdo. */
.pep-catalogo-nota {
	max-width: var(--wp--custom--medida--prosa);
	padding-block-start: var(--wp--preset--spacing--30);
	border-block-start: 1px solid var(--wp--preset--color--neutral-200);
	margin-block: 0;
	margin-inline-start: 0 !important;
	margin-inline-end: auto !important;
}

/* --------------------------------------------------------------------------
   PORTADA
   -------------------------------------------------------------------------- */

/* EL HERO.

   Es un bloque de PORTADA de WordPress, no un grupo con fondo de color, para que
   el dueno pueda subir o cambiar la fotografia desde el editor sin tocar codigo.
   Hoy no hay imagen y se ve el campo oscuro de la marca; el dia que la haya, el
   degradado ya esta puesto para que el titular siga leyendose encima. */
.pep-hero {
	position: relative;
	overflow: hidden;

	/* Alto suficiente para que la primera pantalla sea del hero y no del
	   siguiente bloque, pero con techo: en un monitor muy alto un hero de 90vh
	   obliga a desplazarse para descubrir que hay una tienda debajo. */
	min-height: clamp(28rem, 66vh, 46rem);
}

/* Aqui vivia una reticula de papel milimetrado sobre todo el hero, y se va por
   peticion expresa: lo cuadriculado le quitaba al fondo cualquier posibilidad de
   verse caro. El motivo no se pierde del sitio —sigue en las laminas del
   catalogo sin foto, a 2.5rem, y en las miniaturas del carrito, a 0.75rem— pero
   deja de competir con la primera pantalla. */

/* El contenido va por encima de la reticula. */
.pep-hero > .wp-block-cover__inner-container {
	position: relative;
	z-index: 2;
}

/* El cintillo va en la monoespaciada de los datos, y no es un capricho: es la
   misma letra con la que esta impresa la etiqueta del vial que aparece al lado
   —NVRA-01, ADVANCED PEPTIDE PLATFORM, RESEARCH USE ONLY—. Puesto asi deja de
   leerse como un adorno y pasa a leerse como la etiqueta de un especimen, que es
   exactamente lo que la marca dice ser.

   El tracking baja de 0.22em a 0.08em. En una proporcional muy abierta separa las
   letras para que la palabra respire; en una monoespaciada cada glifo ya trae su
   propio aire, asi que 0.22em solo lo volvia un anuncio de perfume de 2010. */
.pep-hero__cintillo {
	text-transform: uppercase;
	font-weight: 500;
	letter-spacing: 0.08em;
	margin-block: 0;
}

/* El titular ocupa a lo ancho lo que necesite, pero no mas de lo que el ojo
   abarca de un vistazo: un titular de este tamano a 76rem obligaria a mover la
   cabeza para leerlo.

   LA MEDIDA NO PUEDE IR EN `ch`. Aqui habia `16ch`, y un `ch` es el avance del
   glifo cero de la fuente activa: en cuanto se toca el ancho de la familia
   —justo lo que hace la linea de abajo— la caja se encoge o se estira sola y el
   titular se reparte en otro numero de lineas sin que nadie haya tocado la
   medida. En `rem` la caja mide lo que dice que mide.

   `font-stretch` es el eje de ANCHURA de Archivo, declarado en theme.json como
   `62% 125%` y hasta ahora sin usar en ninguna parte. Un poco expandida hace eco
   del logotipo, que es geometrico y de tracking abierto; el tracking negativo
   vuelve a cerrar el conjunto. Letra ancha con espaciado cerrado: la silueta es
   densa y el detalle sigue abierto. */
.pep-hero__titular {
	max-inline-size: 34rem;
	font-weight: 800;
	font-stretch: 108%;
	letter-spacing: -0.03em;
	text-wrap: balance;
}

/* Titular a dos tonos: la primera mitad en el texto claro y la segunda en cian.
   Es un gesto barato y muy eficaz —da jerarquia DENTRO de una sola frase, sin
   partirla en dos lineas de tamanos distintos— y es lo que hace el mockup del
   manual de marca. */
.pep-hero__acento {
	color: var(--wp--preset--color--accent);
}

/* La medida del cuerpo del hero, en `rem` y no en `ch` por el mismo motivo que
   el titular: un `ch` se mide sobre el glifo cero de la fuente activa, y este
   parrafo cambio de familia. Con 32rem la linea ronda los 55 caracteres, dentro
   del tramo donde el ojo no pierde el renglon, y queda visiblemente mas corta
   que el titular: el bloque tiene silueta en vez de ser un rectangulo. */
.pep-hero__entrada {
	max-inline-size: 32rem;
	margin-block: 0;
}

/* Dos botones y no uno: uno para quien ya sabe que quiere y otro para quien
   viene a mirar. El segundo va en linea para que no compita con el primero. */
.pep-hero__acciones {
	align-items: center;
}

/* El estilo «contorno» de WordPress pone `background-color: transparent` con
   !important y deja el color heredado, asi que hay que ganarle en especificidad
   para fijar el filo y el texto. Dos clases y el hijo directo bastan. */
.wp-block-button.pep-boton--linea > .wp-block-button__link {
	border: 1px solid var(--wp--preset--color--neutral-200);
	background-color: transparent !important;
	color: var(--wp--preset--color--neutral-900);
}

.wp-block-button.pep-boton--linea > .wp-block-button__link:hover,
.wp-block-button.pep-boton--linea > .wp-block-button__link:focus-visible {
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--accent);
	box-shadow: none;
}

/* Aqui vestia el aviso RUO de la portada, y ya no esta. No se perdio: se quito
   del hero a proposito.

   `docs/DECISION.md` nombra los tres sitios donde es obligatorio —la ficha, el
   pie y los correos— y la portada no es ninguno de ellos. Ahi seguia siendo la
   novena copia del mismo parrafo, en la primera pantalla, debajo del boton de
   comprar. Sigue vivo en el pie de TODAS las paginas, en la ficha justo despues
   del boton, en el cajon, en la confirmacion, en la cuenta y en los correos; y en
   la propia portada hay una pregunta frecuente que explica por que dice lo que
   dice. `composer test:vistas` comprueba que los obligatorios sigan puestos. */

/* --------------------------------------------------------------------------
   LA PRIMERA PANTALLA

   Dos piezas alrededor del texto, y cada una tiene un trabajo:

     - el VIAL a la derecha, que es el producto y no una foto de ambiente;
     - el FONDO DE LUZ que pinta `assets/js/fondo.js`, acotado a su mitad.

   Aqui se describian tambien un sello vertical con la marca girada y un codigo
   de serie gigante de fondo. Los dos se quitaron a peticion expresa cuando la
   portada paso al diseno flotante, y el comentario se quedo describiendolos: son
   las dos unicas piezas que este archivo mencionaba y que nadie podia encontrar.

   Detras del texto no hay fotografia, y eso no es una preferencia: el contraste
   de esta pantalla se calcula contra el color plano de la marca, y una imagen
   —o el propio fondo de luz si se saliera de su mitad— dejaria ese calculo sin
   base. Por eso el lienzo se queda a la derecha y se desvanece antes de llegar.
   -------------------------------------------------------------------------- */
.pep-hero > .wp-block-cover__inner-container {
	position: relative;
}

/* El texto no cruza por debajo del vial. Sin este tope, el titular sigue
   creciendo hasta chocar con el cristal y las dos cosas se estorban. */
.pep-hero__texto {
	position: relative;
	z-index: 3;
	max-inline-size: 36rem;
}

/* --------------------------------------------------------------------------
   EL VIAL

   Va absoluto y no en una columna de rejilla a proposito: asi puede sangrar por
   el borde y por abajo sin empujar al texto ni alargar el hero. El recorte del
   propio bloque de portada lo corta limpio.

   `pointer-events: none` porque es una imagen, no un control: no debe robar el
   raton a nada que quede debajo.
   -------------------------------------------------------------------------- */
.pep-hero__vial {
	position: absolute;

	/* Cero, y de verdad es el borde de la ventana.

	   Antes esto no funcionaba, y el motivo no era el numero sino DONDE colgaba
	   el vial: estaba dentro del contenedor de contenido, y un elemento absoluto
	   se mide contra su antepasado posicionado, no contra la ventana. Su
	   «derecha» era el filo de una columna centrada, a mitad de camino.

	   Intente corregirlo con una cuenta —restar la distancia de un filo al
	   otro— y eso era tratar el sintoma: seguia dependiendo de adivinar cuanto
	   mide el contenedor. El vial ahora cuelga del hero, que va de borde a borde,
	   y entonces cero es cero.

	   Y desde ese cero se separa un poco. En `vw` y no en `rem`: asi el aire del
	   canto crece con la pantalla en vez de quedarse fijo, que es lo que hace que
	   la composicion aguante igual en un portatil y en un monitor grande. */
	inset-inline-end: 7vw;

	/* EL VIAL SE MIDE CONTRA EL HERO, NO CONTRA LA VENTANA. Es lo unico que hay
	   que entender de este bloque, y antes no era asi.

	   Aqui vivia `inset-block-start: 50%` con un `translate` que lo centraba y
	   lo bajaba 48 px, y la imagen se dimensionaba aparte con
	   `clamp(30rem, 96vh, 58rem)`. Dos reglas que no se hablaban: la altura del
	   vial seguia a la VENTANA y la del hero la decide su TEXTO, que es
	   practicamente constante —medido en cuatro tamanos de pantalla: 628, 627,
	   631 y 641 px—. En una portatil cuadraba de casualidad; en un monitor de
	   1080 el vial media 928 px contra 641 de banda util y sobraban 287, o sea
	   que se le cortaba la tapa por arriba y la base por abajo. Y los 48 px de
	   mas lo empujaban justo hacia el filo que peor se ve, que es el de abajo.

	   Con los dos insets, la envoltura mide exactamente lo que mida el hero y la
	   imagen la llena al 100 %. Deja de haber una cuenta que cuadre por suerte:
	   crezca el hero lo que crezca, el vial crece con el y nunca se sale. El
	   `-spacing--20` de arriba es el unico desahogo que queda, y es a proposito:
	   la tapa roza el filo superior, que es donde la cabecera ya tapa.

	   `composer test:vistas` falla si alguien devuelve un `vh` a la altura de la
	   imagen, porque eso es volver al fallo, no cambiar un numero. */
	inset-block: calc(-1 * var(--wp--preset--spacing--20)) 0;

	/* A cero y declarado, no ausente: la propiedad la usaba el centrado de antes
	   y dejarla puesta en cero dice que esta libre a proposito. La entrada desde
	   la derecha usa `transform`, que es otra. */
	translate: 0;
	z-index: 2;
	pointer-events: none;
}

.pep-hero__vial-img {
	display: block;

	/* Todo el alto de su envoltura, que es todo el alto del hero. Grande de
	   verdad —el vial es el producto, no un adorno al margen— pero con un techo
	   que ya no hay que adivinar: lo pone el contenedor. El ancho lo decide la
	   proporcion de la fotografia. */
	block-size: 100%;
	inline-size: auto;
	max-inline-size: none;

	/* --------------------------------------------------------------------
	   FLOTANDO, CON DOS MOVIMIENTOS QUE SE SUMAN

	   La deriva va en `transform` y el parallax del raton en `translate`. Tienen
	   que ir en propiedades DISTINTAS porque se acumulan; en la misma, la segunda
	   pisaria a la primera.

	   Y van sobre la IMAGEN y no sobre su envoltura porque la envoltura ya tiene
	   las dos ocupadas: `translate` para centrarla en el hero y `transform` para
	   su entrada desde la derecha.

	   El parallax lee una variable que publica `assets/js/fondo.js` — el MISMO
	   puntero suavizado con el que mueve la luz, no una escucha nueva. Un solo
	   raton moviendo las dos cosas es lo que hace que se lean como una sola.
	   Sin JavaScript, sin WebGL o con movimiento reducido la variable no existe,
	   el `var()` cae a cero y el vial se queda quieto en su sitio: el estado sin
	   guion es el bueno. */
	animation: pep-vial-flota 9s var(--wp--custom--curva--suave) infinite;
	translate:
		calc(var(--pep-raton-x, 0) * 0.75rem)
		calc(var(--pep-raton-y, 0) * 0.75rem);
}

/* La deriva. Nueve segundos por ciclo y un centimetro escaso de recorrido: a esta
   escala el vial mide media pantalla, asi que un movimiento mayor se leeria como
   un rebote y no como flotar. */
@keyframes pep-vial-flota {

	from,
	to {
		transform: translateY(-0.5rem);
	}

	50% {
		transform: translateY(0.5rem);
	}
}

/* El interruptor general de movimiento reducido de este archivo NO apaga las
   animaciones: les pone 1 ms de duracion y una sola repeticion. Para algo que se
   repite sin fin eso no lo deja en reposo, lo CONGELA en su ultimo fotograma —o
   sea, medio centimetro desplazado y para siempre. Hay que apagarla a mano, igual
   que hace la seccion de accesos. */
@media (prefers-reduced-motion: reduce) {

	.pep-hero__vial-img {
		animation: none;
		translate: none;
	}
}

/* La entrada desde la derecha.

   Es una variante mas del revelado que ya usa todo el sitio, no un mecanismo
   nuevo: el mismo observador, la misma duracion, la misma curva, y el mismo
   interruptor de movimiento reducido. Se declara con `data-revelar` y no con una
   clase `pep-revelar--derecha` por un motivo concreto: el observador busca
   `[data-revelar]` con CUALQUIER valor, mientras que `.pep-revelar--derecha` NO
   coincide con `.pep-revelar` —son nombres distintos— y el vial se habria
   quedado invisible para siempre. */
.pep-js [data-revelar='derecha'] {
	transform: translateX(48px);
}

/* --------------------------------------------------------------------------
   EL FONDO DE LUZ LIQUIDA

   Un lienzo de WebGL detras del vial. El shader vive en `assets/js/fondo.js`,
   con su atribucion; aqui solo se le da sitio y forma.

   Va en la mitad derecha y se desvanece hacia la izquierda con una mascara, y
   eso no es solo estetica: mantiene el titular sobre negro limpio. Las cuentas
   de contraste del sitio dan por hecho que el texto no cae sobre una zona
   luminosa, y esta mascara es lo que hace que eso siga siendo cierto sin tener
   que aflojar ningun umbral.

   `z-index: 0` lo deja por encima del velo del bloque de portada —que tambien
   esta en cero pero es el primer hijo— y por debajo del sello, del texto y del
   vial. Se apila por orden de arbol, sin pelear con nadie.
   -------------------------------------------------------------------------- */
.pep-hero__fondo {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
}

/* --------------------------------------------------------------------------
   EL VELO DEL HERO, Y POR QUE NO ES DECORACION

   Aqui el lienzo estaba recortado a la mitad derecha —`inline-size: 62%` con una
   mascara que lo desvanecia antes del texto— y era una solucion tosca: resolvia
   el contraste apagando el efecto justo donde mas se mira.

   Ahora el lienzo cubre el hero entero y lo que protege al texto es este velo:
   un degradado opaco del lado del titular que se desvanece antes del vial. Es la
   MISMA tecnica que usa la cabecera, y por el mismo motivo escrito alli: sin
   velo, «el titular se lee sobre el shader» seria un deseo; con el, es una
   cuenta.

   LOS DOS PRIMEROS TRAMOS VALEN LO MISMO A PROPOSITO. El velo es plano al 88 %
   sobre toda la columna de texto y solo despues empieza a abrirse. Asi el tramo
   mas debil que cae bajo el texto es el PRIMERO, que es justo el que lee la
   prueba — y la cuenta que hace la prueba es la misma que ve el ojo. Con un
   degradado que se aclarara ya dentro de la columna, la prueba mediria el punto
   bueno y el ojo veria el malo.

   El 12 % que deja pasar no es residual: sobre negro, las vetas del shader se
   leen como reflejos tenues detras del titular. Que es exactamente lo que se
   pidio — que la luz se vea tambien a la izquierda.
   -------------------------------------------------------------------------- */
.pep-hero__fondo::after {
	content: "";
	position: absolute;
	inset: 0;
	pointer-events: none;
	background-image: linear-gradient(
		to right,
		color-mix(in srgb, var(--wp--preset--color--brand-dark) 88%, transparent) 0%,
		color-mix(in srgb, var(--wp--preset--color--brand-dark) 88%, transparent) 52%,
		color-mix(in srgb, var(--wp--preset--color--brand-dark) 40%, transparent) 70%,
		transparent 88%
	);
}

.pep-hero__fondo canvas {
	display: block;
	inline-size: 100%;
	block-size: 100%;
}

/* Aqui vivian el sello vertical del costado y la maquina de estados que lo
   intercambiaba con el logotipo de la barra al desplazarse. Se van los dos: el
   logotipo esta arriba desde el primer momento, asi que ya no hay dos sitios que
   coordinar.

   Eran noventa lineas, dos animaciones y un carril rotado para decir una cosa
   que ahora se dice sola. */


/* En telefono el vial se va detras del texto y baja de tamano: a ese ancho el
   titular necesita la pantalla entera, y el producto pasa a ser fondo. */
@media (max-width: 46rem) {

	.pep-hero__vial {
		inset-inline-end: -20%;
		opacity: 0.35;

		/* Se le devuelve el centrado. Arriba la envoltura va estirada de filo a
		   filo del hero porque la imagen la llena entera; aqui la imagen tiene
		   su propia altura —mas chica, que para eso pasa a ser fondo— y dentro
		   de una envoltura estirada se quedaria pegada al borde de arriba. */
		inset-block: auto;
		inset-block-start: 50%;
		translate: 0 -50%;
	}

	.pep-hero__vial-img {
		block-size: clamp(16rem, 40vh, 24rem);
	}

	.pep-hero__texto {
		max-inline-size: none;
	}

	.pep-hero {
		min-height: clamp(24rem, 60vh, 34rem);
	}
}

/* --------------------------------------------------------------------------
   EL CINTILLO DE SECCION
   La linea corta en mayusculas y cian que va encima de cada titulo. No es
   adorno: dice de que trata la seccion en dos palabras antes de que el ojo
   llegue al titular, y al repetirse identica en todas las secciones convierte
   la portada en un documento con partes, no en una sucesion de bloques.
   -------------------------------------------------------------------------- */

.pep-cintillo {
	text-transform: uppercase;
	letter-spacing: 0.22em;
	font-weight: 600;
	margin-block: 0;
}

/* --------------------------------------------------------------------------
   LOS ACCESOS, Y COMO SE COMEN EL HERO

   Seis puertas: dos grandes con imagen y cuatro cortas con icono. Sustituyen a
   la franja de cifras y a la lista larga de familias, que decian lo mismo
   ocupando tres pantallas.

   LO QUE HACE EL GESTO es el margen negativo de aqui abajo. La seccion sube por
   encima del hero y le tapa el ultimo tramo, con las dos esquinas de arriba
   redondeadas, de modo que el hero asoma por detras como una lamina debajo de
   otra. Al bajar se lee como si la seccion nueva se comiera la anterior.

   Y funciona sin JavaScript y sin animaciones ligadas al desplazamiento: es
   geometria estatica. Lo unico progresivo es el aplanado de las esquinas, mas
   abajo, y ese va con el estado de reposo puesto en el bueno.

   POR QUE NO LO RECORTA EL HERO. El hero lleva `overflow: hidden` —lo necesita,
   porque el vial mide mas que el— y da la impresion de que impediria esto. No lo
   hace: `overflow` recorta a los DESCENDIENTES, y esta seccion es HERMANA del
   hero dentro de `<main>`, no hija suya. Conviene saberlo antes de intentar
   "arreglarlo" quitandole el recorte al hero y descuadrando el vial.
   -------------------------------------------------------------------------- */

.pep-accesos {
	position: relative;

	/* Por encima del hero. Los dos son `position: relative`, asi que sin esto
	   decidiria el orden del arbol —que ya favorece a esta— pero declararlo lo
	   deja dicho y protege de que alguien le ponga z-index al hero. */
	z-index: 1;

	/* Sube justo su propia esquina. Atarlo al radio y no a un numero suelto es
	   lo que mantiene el gesto proporcionado si manana la esquina cambia: una
	   seccion que sube 64 px con una esquina de 12 no se lee como que monta, se
	   lee como un error de alineacion. */
	margin-block-start: calc(-1 * var(--wp--custom--radio--banda));

	border-start-start-radius: var(--wp--custom--radio--banda);
	border-start-end-radius: var(--wp--custom--radio--banda);
	background-color: var(--wp--preset--color--neutral-100);
	padding-block: var(--wp--preset--spacing--60);
}

/* Las dos filas, separadas entre si. */
.pep-accesos > * + * {
	margin-block-start: var(--wp--preset--spacing--30);
}

/* --------------------------------------------------------------------------
   LA FILA DE ARRIBA: DOS TARJETAS GRANDES
   -------------------------------------------------------------------------- */

.pep-accesos__grandes {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: var(--wp--preset--spacing--30);
}

.pep-accesos__chicas {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: var(--wp--preset--spacing--30);
}

/* La tarjeta se pinta en el FONDO, no en la superficie, porque la banda en la
   que vive es la superficie. Es la regla en toda la portada: la tarjeta usa el
   neutro contrario al de su banda.

   `overflow: hidden` para que la imagen pueda sangrar hasta el filo sin salirse
   de la esquina redondeada. Y el radio es `panel`, un escalon por debajo del de
   la banda que las contiene: una esquina de dentro nunca mas redonda que la de
   fuera. */
.pep-acceso {
	position: relative;
	overflow: hidden;
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 0.85fr);
	align-items: stretch;
	min-block-size: 15rem;
	background-color: var(--wp--preset--color--neutral-050);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--panel);
	text-decoration: none;
	color: inherit;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-acceso:hover,
.pep-acceso:focus-visible {
	border-color: var(--wp--preset--color--accent);
	transform: translateY(-2px);
}

.pep-acceso__texto {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
	padding: var(--wp--preset--spacing--40);
}

.pep-acceso__cintillo {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	font-weight: 500;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--wp--preset--color--senal);
}

/* Titular a dos tonos, igual que el del hero: la primera mitad en el texto claro
   y el dato en cian. Da jerarquia dentro de una sola frase sin partirla en dos
   tamanos distintos. */
.pep-acceso__titulo {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--xl);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--wp--preset--color--neutral-900);
	text-wrap: balance;
}

.pep-acceso__dato {
	display: block;
	color: var(--wp--preset--color--accent);
}

/* El pie va al fondo de la tarjeta, no debajo del titulo: asi las dos tarjetas
   de la fila alinean su llamada aunque sus titulares midan distinto. */
.pep-acceso__pie {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	margin-block-start: auto;
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	color: var(--wp--preset--color--neutral-900);
}

.pep-acceso__ir,
.pep-acceso-corto__ir {
	color: var(--wp--preset--color--neutral-400);
	transition:
		color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-acceso:hover .pep-acceso__ir,
.pep-acceso:focus-visible .pep-acceso__ir,
.pep-acceso-corto:hover .pep-acceso-corto__ir,
.pep-acceso-corto:focus-visible .pep-acceso-corto__ir {
	color: var(--wp--preset--color--accent);
	transform: translateX(4px);
}

/* --------------------------------------------------------------------------
   EL HUECO DE LA IMAGEN

   Se pinta SIEMPRE, con o sin fotografia dentro. Es lo que permite entregar la
   seccion terminada antes de tener las imagenes: sin el hueco reservado, una
   tarjeta con foto y otra sin ella tendrian anchos de texto distintos y la fila
   se veria rota, que es peor que verse incompleta.
   -------------------------------------------------------------------------- */

.pep-acceso__imagen {
	position: relative;
	display: block;
	align-self: stretch;
	overflow: hidden;
	background-color: var(--wp--preset--color--neutral-100);
}

/* `cover` y no `contain`: la imagen llena su mitad y se recorta por donde haga
   falta. Una imagen de producto centrada con franjas a los lados dentro de una
   tarjeta oscura se ve como un error de montaje. */
.pep-acceso__img {
	display: block;
	inline-size: 100%;
	block-size: 100%;
	object-fit: cover;
	object-position: center;
}

/* UN RECORTE DE PERSONA NO SE TRATA COMO UNA FOTOGRAFIA DE AMBIENTE.

   La de trazabilidad es un recorte con fondo transparente, y eso cambia dos
   cosas respecto de la regla de arriba.

   La primera es el encuadre. `cover` centrado escala la figura hasta llenar el
   hueco y recorta lo que sobra por arriba y por abajo — o sea, lo primero que
   se pierde es la cabeza. Anclada arriba se recorta por los pies, que es por
   donde no importa.

   La segunda es el fondo. Al no traer el suyo, la figura se quedaba sobre el
   rectangulo plano del hueco, un escalon mas claro que la tarjeta: se leia como
   un hueco sin terminar con alguien encima. El degradado le da suelo y ata la
   foto a la marca, con los mismos tonos del fondo del hero. */
.pep-acceso__imagen--retrato {
	background-image:
		radial-gradient(18rem 15rem at 72% 6%, color-mix(in srgb, var(--wp--preset--color--brand) 52%, transparent) 0%, transparent 70%),
		radial-gradient(22rem 16rem at 38% 104%, color-mix(in srgb, var(--wp--preset--color--senal-fondo) 65%, transparent) 0%, transparent 74%);
}

.pep-acceso__imagen--retrato .pep-acceso__img {
	object-position: top center;
}

/* UN BODEGON DE PRODUCTO TAMPOCO ES UNA FOTOGRAFIA DE AMBIENTE, y falla por los
   mismos dos sitios que el retrato.

   La fotografia de los tres viales es un recorte sin fondo y APAISADA —1486 x
   1058— dentro de un hueco que es una columna alta. Con el `cover` de la regla
   general, lo que entra es la franja central: los viales de los lados se van
   por el filo y queda uno y medio. Eso no es recortar, es tirar dos tercios del
   sujeto, asi que para esta variante manda `contain`.

   Y en cuanto se usa `contain`, la placa plana de la regla general —`neutral-100`,
   un escalon mas clara que la tarjeta— se ve entera alrededor del cristal y la
   figura se lee como un hueco sin terminar con algo encima. El degradado es el
   mismo recurso que el retrato y con los mismos tokens, de modo que las dos
   tarjetas grandes de la fila se leen como una pareja y no como dos ensayos.

   El encuadre va un poco por debajo del centro porque el peso optico de la
   imagen esta en las tapas: centrada de verdad, la composicion queda alta. */
.pep-acceso__imagen--viales {
	background-color: transparent;
	background-image:
		radial-gradient(18rem 14rem at 50% 10%, color-mix(in srgb, var(--wp--preset--color--brand) 42%, transparent) 0%, transparent 74%),
		radial-gradient(22rem 17rem at 50% 104%, color-mix(in srgb, var(--wp--preset--color--senal-fondo) 68%, transparent) 0%, transparent 80%);
}

.pep-acceso__imagen--viales .pep-acceso__img {
	object-fit: contain;
	object-position: center 64%;
	padding: var(--wp--preset--spacing--20);
}

/* --------------------------------------------------------------------------
   LA FILA DE ABAJO: CUATRO TARJETAS CORTAS
   -------------------------------------------------------------------------- */

.pep-acceso-corto {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	align-items: center;
	gap: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--neutral-050);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--panel);
	text-decoration: none;
	color: inherit;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-acceso-corto:hover,
.pep-acceso-corto:focus-visible {
	border-color: var(--wp--preset--color--accent);
	transform: translateY(-2px);
}

.pep-acceso-corto__que {
	grid-column: 1;
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--base);
	font-weight: 700;
	line-height: 1.2;
	color: var(--wp--preset--color--neutral-900);
}

.pep-acceso-corto__dato {
	grid-column: 1;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--senal);
}

/* EL ICONO VA EN UNA PASTILLA, y no es adorno: es lo que lo convierte en una
   pieza de la tarjeta en vez de un trazo suelto en una esquina.

   Antes eran 22 px de linea de 1,375 px flotando sobre el fondo de la tarjeta.
   A ese grosor y a ese tamano, sin nada que lo sostenga, un icono no se lee como
   elegido sino como puesto. La pastilla le da masa sin subir el grosor del trazo,
   que es lo que lo habria vuelto pesado.

   Es la misma pieza que el numero de los pasos de /empezar/ —cuadro de 2.5rem,
   radio minimo, fondo `senal-fondo`, filo de acento tenue—, asi que no inventa
   lenguaje: lo reusa. Y el filo se enciende con el de la tarjeta al pasar el
   raton, de modo que la tarjeta reacciona entera y no por partes. */
.pep-acceso-corto__icono {
	grid-column: 2;
	grid-row: 1;
	display: grid;
	place-items: center;
	inline-size: 2.5rem;
	block-size: 2.5rem;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--accent) 30%, transparent);
	border-radius: var(--wp--custom--radio--minimo);
	background-color: var(--wp--preset--color--senal-fondo);
	color: var(--wp--preset--color--accent);
	transition: border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-acceso-corto:hover .pep-acceso-corto__icono,
.pep-acceso-corto:focus-visible .pep-acceso-corto__icono {
	border-color: var(--wp--preset--color--accent);
}

.pep-acceso-corto__ir {
	grid-column: 2;
	grid-row: 2;
	justify-self: end;
}

/* --------------------------------------------------------------------------
   EL APLANADO DE LAS ESQUINAS

   Extra, no requisito. Las esquinas se van cerrando conforme la seccion termina
   de subir: arriba del todo asoma redonda —el gesto de que se come al hero— y
   una vez ocupa la pantalla se aplana, que es como se comporta una lamina que ya
   esta encima.

   EL ESTADO DE REPOSO ES EL REDONDEADO, y eso importa. Quien no traiga
   animaciones ligadas al desplazamiento no entra en este `@supports` y se queda
   con la esquina puesta, que es el diseno. Escrito al reves —reposo plano,
   animacion que redondea— ese navegador perderia el gesto entero y nadie se
   enteraria. Es la misma leccion que `movimiento.js` explica en su cabecera.

   `1ms` de duracion porque con una linea de tiempo de desplazamiento el avance
   lo marca el scroll, pero Firefox exige una duracion distinta de cero para
   arrancar la animacion.
   -------------------------------------------------------------------------- */

@supports (animation-timeline: view()) {

	@keyframes pep-accesos-aplana {

		from {
			border-start-start-radius: var(--wp--custom--radio--banda);
			border-start-end-radius: var(--wp--custom--radio--banda);
		}

		to {
			border-start-start-radius: 0;
			border-start-end-radius: 0;
		}
	}

	.pep-accesos {
		animation: pep-accesos-aplana 1ms linear both;
		animation-timeline: view();
		animation-range: entry 0% entry 85%;
	}
}

/* Quien pide menos movimiento se queda con la esquina quieta. No es movimiento
   vestibular, pero la regla de la casa es que nada cambie solo si se pidio que
   no cambiara. */
@media (prefers-reduced-motion: reduce) {

	.pep-accesos {
		animation: none;
	}
}

/* --------------------------------------------------------------------------
   ANCHOS INTERMEDIOS Y TELEFONO
   -------------------------------------------------------------------------- */

/* Cuatro tarjetas cortas no caben en una tableta sin que el texto se parta por
   la mitad. Pasan a dos por fila, que sigue siendo una rejilla y no una lista. */
@media (max-width: 64rem) {

	.pep-accesos__chicas {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 46rem) {

	/* Las grandes se apilan, y la imagen pasa a ser una banda superior: en
	   vertical, media tarjeta de imagen a lo alto dejaria el texto en una columna
	   de ocho caracteres. */
	.pep-accesos__grandes,
	.pep-accesos__chicas {
		grid-template-columns: 1fr;
	}

	.pep-acceso {
		grid-template-columns: 1fr;
		min-block-size: 0;
	}

	.pep-acceso__imagen {
		grid-row: 1;
		aspect-ratio: 16 / 9;
	}

	/* La esquina que monta se hace mas pequena con la pantalla: 44 px sobre un
	   movil de 360 se come un tercio del ancho de la banda. */
	.pep-accesos {
		border-start-start-radius: var(--wp--custom--radio--panel);
		border-start-end-radius: var(--wp--custom--radio--panel);
		margin-block-start: calc(-1 * var(--wp--custom--radio--panel));
	}
}

/* --------------------------------------------------------------------------
   LA FRANJA DE CIFRAS
   Va pegada debajo del hero y sin titulo propio, porque no es un tema aparte:
   son las pruebas del enunciado de arriba. Tres numeros que salen del catalogo
   real —cuantos compuestos hay, cuantos lotes tienen certificado, entre que
   valores esta la pureza medida— y que crecen solos cuando el cliente cargue
   producto.

   En cian porque es la misma voz que el resto de la senal del sitio: aqui hay
   un dato comprobable. Un adjetivo no se pinta de cian; un numero si.
   -------------------------------------------------------------------------- */

/* Una sola fila, siempre, hasta que se apilan del todo.

   Con `auto-fit` esto se partia en dos columnas a anchos intermedios y el
   tercer dato caia en una fila nueva arrastrando su linea vertical: una raya a
   la izquierda de nada. Un separador solo tiene sentido entre dos cosas que
   estan una al lado de la otra, asi que la manera de arreglarlo no es tocar la
   raya sino no dejar que la fila se parta. */
.pep-cifras {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: 1fr;
	gap: var(--wp--preset--spacing--40);
}

.pep-cifra {
	display: flex;
	flex-direction: column;
	/* `spacing--20` y no `--10`: el token `--10` NO EXISTE. La escala de este tema
	   empieza en `--20`, asi que esta declaracion era invalida y el navegador la
	   descartaba entera: la cifra y su etiqueta salian pegadas, con separacion
	   cero, que no es lo que nadie escribio. */
	gap: var(--wp--preset--spacing--20);
	padding-inline: var(--wp--preset--spacing--40);

	/* El filo separa un dato del siguiente sin dibujar tres cajas. Al primero
	   se le quita: una linea antes del primer dato no separa nada. */
	border-inline-start: 1px solid var(--wp--preset--color--neutral-200);
}

.pep-cifra:first-child {
	border-inline-start: 0;
	padding-inline-start: 0;
}

.pep-cifra__valor {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--xxl);
	font-weight: 700;
	line-height: 1.05;
	color: var(--wp--preset--color--senal);

	/* `lining-nums` y no `tabular-nums`: la fuente mete el punto decimal en la
	   familia tabular y le da el ancho de un digito, asi que 98.5 salia con un
	   hueco en medio. Aqui ademas hay un guion largo en el rango. */
	font-variant-numeric: lining-nums;
}

.pep-cifra__que {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);

	/* Con 22ch la etiqueta larga partia una palabra sola a la segunda linea.
	   Se le da sitio y se equilibra: dos lineas parejas se leen de un golpe,
	   una linea larga con una viuda debajo no. */
	max-width: 30ch;
	text-wrap: balance;
}

/* Entre tableta y escritorio los tres datos siguen en fila pero la columna se
   estrecha, y el numero grande ya no cabe. Baja un escalon de la escala: sigue
   siendo lo primero que se ve sin desbordar su columna. */
@media (max-width: 64rem) {

	.pep-cifra__valor {
		font-size: var(--wp--preset--font-size--xl);
	}
}

/* En telefono los datos se apilan, y entonces la linea que separa tiene que
   ser horizontal: una vertical entre dos filas apiladas no separa nada. Y el
   numero recupera su tamano, porque apilado tiene todo el ancho para el. */
@media (max-width: 46rem) {

	.pep-cifras {
		grid-auto-flow: row;
		grid-auto-columns: auto;
	}

	.pep-cifra__valor {
		font-size: var(--wp--preset--font-size--xxl);
	}

	.pep-cifra {
		padding-inline: 0;
		padding-block-start: var(--wp--preset--spacing--30);
		border-inline-start: 0;
		border-block-start: 1px solid var(--wp--preset--color--neutral-200);
	}

	.pep-cifra:first-child {
		padding-block-start: 0;
		border-block-start: 0;
	}
}

/* --------------------------------------------------------------------------
   LAS FAMILIAS
   Antes esto era un indice con linea de puntos: compacto, elegante y mudo.
   Decia el nombre y la cuenta, y nada mas.

   Ahora cada familia es una tarjeta que ademas dice QUE compuestos contiene.
   Es la pregunta con la que llega un comprador tecnico -tienen lo que busco- y
   contestarla en la portada le ahorra entrar a mirar familia por familia. Los
   nombres salen del catalogo, asi que la seccion se mantiene sola.
   -------------------------------------------------------------------------- */

.pep-familias {
	display: grid;
	/* 20rem y no 17: con 17 caben cuatro por fila y las dos que sobran dejan
	   media fila vacia. Con 20 caben tres, la tarjeta respira y los nombres de
	   compuesto no se parten.

	   `auto-fill` y no `auto-fit`, y esto se vio al reutilizar estas tarjetas
	   al pie de la pagina de familia: `auto-fit` colapsa los carriles vacios,
	   asi que en «Disolventes» —donde solo hay una familia vecina— la unica
	   tarjeta se estiraba a los 1216 px del contenido. Una tarjeta de ancho
	   completo con tres palabras dentro. En la portada las dos se comportan
	   igual porque siempre hay seis. */
	grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
	gap: var(--wp--preset--spacing--30);
}

/* La tarjeta se pinta en el FONDO, no en la superficie, porque la banda en la
   que vive es la superficie. Es la regla en toda la portada: la tarjeta usa el
   neutro contrario al de su banda. Si algun dia esta seccion cambia de banda,
   este color cambia con ella. */
.pep-familia {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
	padding: var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--neutral-050);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--base);
	text-decoration: none;
	color: inherit;
	position: relative;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-familia:hover,
.pep-familia:focus-visible {
	border-color: var(--wp--preset--color--accent);
	transform: translateY(-2px);
}

.pep-familia__cuenta {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--senal);
	font-variant-numeric: lining-nums;
}

/* El nombre lleva reserva a la derecha para no meterse debajo de la flecha. */
.pep-familia__nombre {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 700;
	line-height: 1.15;
	color: var(--wp--preset--color--neutral-900);
	text-wrap: balance;
	padding-inline-end: var(--wp--preset--spacing--40);
}

.pep-familia__que-es {
	margin-block: 0;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
}

/* Los compuestos, en monoespaciada. Son nombres de catalogo -codigos, no
   prosa- y la monoespaciada los lee como tales. Van al fondo de la tarjeta,
   separados por un filo, para que todas las tarjetas de la fila alineen esa
   linea aunque las descripciones midan distinto. */
.pep-familia__ejemplos {
	margin-block: auto 0;
	padding-block-start: var(--wp--preset--spacing--20);
	border-block-start: 1px solid var(--wp--preset--color--neutral-200);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	line-height: 1.7;
	color: var(--wp--preset--color--neutral-400);
}

/* La flecha se queda en la esquina y avanza al pasar por encima. Es la unica
   pieza decorativa de la tarjeta y hace un trabajo: decir que se puede entrar. */
.pep-familia__ir {
	position: absolute;
	inset-block-start: var(--wp--preset--spacing--40);
	inset-inline-end: var(--wp--preset--spacing--40);
	color: var(--wp--preset--color--neutral-400);
	transition:
		color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-familia:hover .pep-familia__ir,
.pep-familia:focus-visible .pep-familia__ir {
	color: var(--wp--preset--color--accent);
	transform: translateX(4px);
}

/* El enlace que aparece cuando hay mas familias de las que caben. Va suelto
   bajo la rejilla y en voz baja: es una salida, no una tarjeta mas. */
.pep-familias__mas {
	margin-block: var(--wp--preset--spacing--30) 0;
	font-size: var(--wp--preset--font-size--sm);
}

.pep-familias__mas a {
	color: var(--wp--preset--color--senal);
	text-decoration: none;
	border-block-end: 1px solid transparent;
	transition: border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-familias__mas a:hover,
.pep-familias__mas a:focus-visible {
	border-block-end-color: var(--wp--preset--color--accent);
}

/* --------------------------------------------------------------------------
   LOS CERTIFICADOS RECIENTES
   El certificado de analisis es lo que separa a un proveedor que analiza sus
   lotes de uno que solo lo dice, y hasta ahora estaba enterrado dentro de cada
   ficha. Sacarlo a la portada -con lote, producto y fecha, descargable- es
   poner el argumento donde se toma la decision.

   Se pintan como filas de un expediente y no como tarjetas: un documento con
   numero de lote y fecha se lee en renglon, igual que en el papel del que
   viene.
   -------------------------------------------------------------------------- */

/* El filo entre filas es el hueco de 1px de este contenedor, que se ve porque
   el contenedor esta pintado del color del filo. Asi no hay bordes que se sumen
   de dos en dos ni una ultima fila con una linea sobrante debajo. */
.pep-coa-recientes {
	display: flex;
	flex-direction: column;
	gap: 1px;
	background-color: var(--wp--preset--color--neutral-200);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--base);
	overflow: hidden;
}

.pep-coa-reciente {
	display: grid;
	grid-template-columns: minmax(7rem, auto) 1fr auto auto;
	align-items: baseline;
	gap: var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--neutral-100);
	text-decoration: none;
	color: inherit;
	transition: background-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-coa-reciente:hover,
.pep-coa-reciente:focus-visible {
	background-color: var(--wp--preset--color--senal-fondo);
}

.pep-coa-reciente__lote {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--senal);
	font-variant-numeric: lining-nums;
}

.pep-coa-reciente__producto {
	color: var(--wp--preset--color--neutral-900);
	font-weight: 600;
}

.pep-coa-reciente__fecha {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--neutral-600);
	font-variant-numeric: lining-nums;
	white-space: nowrap;
}

.pep-coa-reciente__accion {
	font-size: var(--wp--preset--font-size--micro);
	text-transform: uppercase;
	letter-spacing: 0.1em;

	/* En neutral-400 se leia como un boton apagado. Es un enlace vivo: tiene
	   que verse como tal aunque sea la pieza mas discreta de la fila. */
	color: var(--wp--preset--color--neutral-600);
	white-space: nowrap;
	transition: color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-coa-reciente:hover .pep-coa-reciente__accion,
.pep-coa-reciente:focus-visible .pep-coa-reciente__accion {
	color: var(--wp--preset--color--accent);
}

/* En pantalla estrecha las cuatro columnas no caben en un renglon. Se reordena
   como ficha: lote arriba, nombre debajo, y fecha y accion en la misma linea
   -que es como se leeria en papel si el papel fuera angosto-. */
@media (max-width: 46rem) {

	.pep-coa-reciente {
		grid-template-columns: 1fr auto;
		/* Mismo caso que arriba: `--10` no existe en esta escala. */
		gap: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
	}

	.pep-coa-reciente__lote,
	.pep-coa-reciente__producto {
		grid-column: 1 / -1;
	}
}

/* --------------------------------------------------------------------------
   PREGUNTAS FRECUENTES
   Con `core/details`, que es el acordeon nativo del navegador: sin dependencia,
   sin JavaScript propio, y con el teclado y el lector de pantalla funcionando
   de fabrica. Lo unico que hacemos es quitarle el triangulo del sistema y
   dibujar el nuestro, que gira al abrir.
   -------------------------------------------------------------------------- */

.pep-pregunta {
	border-block-end: 1px solid var(--wp--preset--color--neutral-200);
}

.pep-pregunta:first-of-type {
	border-block-start: 1px solid var(--wp--preset--color--neutral-200);
}

.pep-pregunta > summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
	padding-block: var(--wp--preset--spacing--30);
	cursor: pointer;
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	color: var(--wp--preset--color--neutral-900);
	list-style: none;
	transition: color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

/* Los dos selectores hacen falta: `::marker` es el estandar y
   `::-webkit-details-marker` es lo que sigue usando Safari. */
.pep-pregunta > summary::marker,
.pep-pregunta > summary::-webkit-details-marker {
	display: none;
	content: "";
}

.pep-pregunta > summary:hover {
	color: var(--wp--preset--color--accent);
}

.pep-pregunta > summary:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 4px;
}

/* La cruz. Se dibuja con dos trazos en gradiente y no con un caracter, para que
   al abrir gire hasta convertirse en un guion sin cambiar de tamano ni saltar
   de linea base. */
.pep-pregunta > summary::after {
	content: "";
	flex: 0 0 auto;
	inline-size: 0.75rem;
	block-size: 0.75rem;
	background-image:
		linear-gradient(var(--wp--preset--color--accent), var(--wp--preset--color--accent)),
		linear-gradient(var(--wp--preset--color--accent), var(--wp--preset--color--accent));
	background-size: 100% 1.5px, 1.5px 100%;
	background-position: center, center;
	background-repeat: no-repeat;
	transition:
		transform var(--wp--custom--movimiento--base) var(--wp--custom--curva--salida),
		background-size var(--wp--custom--movimiento--base) var(--wp--custom--curva--salida);
}

/* Media vuelta, y el trazo vertical se encoge a cero: la cruz se convierte en
   un menos girando, no desapareciendo de golpe. */
.pep-pregunta[open] > summary::after {
	transform: rotate(90deg);
	background-size: 100% 1.5px, 1.5px 0;
}

.pep-pregunta > p {
	margin-block: 0 var(--wp--preset--spacing--40);
	max-width: var(--wp--custom--medida--prosa);
	color: var(--wp--preset--color--neutral-600);
}

/* --------------------------------------------------------------------------
   CABECERA

   Una pastilla que flota sobre el contenido, no una barra pegada al techo.

   Se queda arriba al bajar. En un catalogo largo, tener siempre a mano el
   buscador y el carrito ahorra el viaje de vuelta al inicio, y sigue siendo
   puro CSS: ni un byte de JavaScript, ni siquiera para los dos estados.

   El `<header>` ya no lleva fondo: es solo el carril donde la pastilla se
   apoya. Asi el contenido de la pagina —y, en la portada, la fotografia del
   hero— pasa por DEBAJO de la barra de borde a borde, que es lo que hace que la
   pastilla se lea como pieza flotante y no como una franja recortada.
   -------------------------------------------------------------------------- */
.wp-site-blocks > header {
	position: sticky;
	top: 0;
	z-index: 20;

	/* Ocho pixeles eran pocos para algo que flota: la barra vivia pegada al
	   canto y se leia como una franja recortada, no como piezas sueltas. El
	   limite de cuanto puede crecer no es estetico — el titular del hero tiene
	   que seguir viendose en el tercio alto de la pantalla, y hay una prueba que
	   lo mide. */
	padding-block: var(--wp--preset--spacing--40);
	pointer-events: none;
}

/* La pastilla si recibe el raton; el carril de alrededor no, para que se pueda
   pulsar lo que quede debajo a los lados. */
.pep-cabecera {
	pointer-events: auto;
}

/* --------------------------------------------------------------------------
   LA PORTADA ARRANCA DEBAJO DE LA BARRA

   Sin esto la barra flota sobre nada: quedaban ciento dieciocho pixeles de fondo
   —el alto de la cabecera mas el hueco que WordPress mete entre los hijos de
   `.wp-site-blocks`— antes de que empezara el hero, y arriba del todo, con la
   pastilla sin caja, parecia que no habia barra.

   Se tira del `<main>` hacia arriba justo esa cantidad y el hero le devuelve el
   espacio como relleno, para que el titular no quede por debajo de la barra. El
   resultado es el de la referencia: la imagen llega al borde superior de la
   ventana y la barra se apoya encima.

   Va acotado a la portada con `body.home` porque es la unica plantilla con hero.
   En el catalogo o en una ficha, tirar del contenido hacia arriba meteria las
   migas de pan debajo de la barra.

   ESTE PAR DE REGLAS ESTUVO ROTO, y conviene saber como para no repetirlo. El
   patron del hero declaraba TAMBIEN el relleno de arriba como atributo del
   bloque, y WordPress emite eso como estilo en linea. Un estilo en linea gana a
   cualquier selector sin `!important`, asi que de los 208 px que pedia esta
   regla se aplicaban 96: el bloque de texto se pintaba 112 px mas arriba de lo
   disenado, con la primera letra del cintillo a UN pixel del borde inferior del
   logotipo. Por eso parecia parte de la barra en vez de la entrada del hero.

   La compensacion vive aqui y solo aqui, porque solo aqui puede leer el mismo
   `--pep-cabecera` del que tira la regla de arriba: son dos mitades de una resta
   y separarlas es lo que permite que dejen de cuadrar. El patron ya no declara
   relleno superior, y `composer test:vistas` falla si alguien se lo devuelve. */
body.home > .wp-site-blocks > main {
	margin-block-start: calc(-1 * (var(--pep-cabecera) + var(--wp--preset--spacing--40)));
}

body.home .pep-hero {
	padding-block-start: calc(var(--pep-cabecera) + var(--wp--preset--spacing--50));
}

/* --------------------------------------------------------------------------
   EL VELO, Y POR QUE NO ES DECORACION

   Este es el problema de verdad de una barra transparente sobre una fotografia,
   y no es de gusto: sobre una zona clara de la imagen, un texto claro
   desaparece. Y no se puede acotar leyendo esta hoja, porque la fotografia la
   elige el dueno de la tienda, no el tema.

   El velo lo acota. Un degradado de arriba abajo, de casi opaco a nada, que
   oscurece SOLO la franja donde vive la barra y se desvanece antes de que se
   note como una banda. Con el puesto, el peor caso deja de ser «lo que salga en
   la foto» y pasa a ser un color que se puede calcular — y por eso la prueba lo
   lee y compone el primer tramo sobre blanco puro para medir cada texto de la
   barra contra el.

   Sin velo, «se lee sobre cualquier imagen» seria un deseo. Con el, es una
   cuenta.
   -------------------------------------------------------------------------- */
.wp-site-blocks > header::before {
	content: "";
	position: absolute;
	inset-block-start: 0;
	inset-inline: 0;
	block-size: 220%;
	z-index: -1;
	pointer-events: none;
	background-image: linear-gradient(
		to bottom,
		color-mix(in srgb, var(--wp--preset--color--brand-dark) 82%, transparent) 0%,
		color-mix(in srgb, var(--wp--preset--color--brand-dark) 46%, transparent) 42%,
		transparent 100%
	);
}

/* --------------------------------------------------------------------------
   LA PASTILLA

   Este es el estado BASE, y es el de cristal a proposito: es el que ve quien no
   soporte animaciones ligadas al desplazamiento. Si el base fuera el
   transparente, ese navegador tendria la barra sin caja SIEMPRE —tambien sobre
   el catalogo, donde por debajo pasa texto— y el resultado seria texto sobre
   texto. El estado seguro es el que tapa.
   -------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------
   SIN BARRA: CADA PIEZA FLOTANDO

   Aqui vivia una pastilla de cristal —filo, fondo translucido, desenfoque y
   sombra— que ademas se materializaba al bajar. Se va entera por peticion: el
   logotipo, los enlaces y los iconos flotan directamente sobre el fondo, y el
   `<header>` se queda como el carril que los coloca, sin verse.

   CON ESO, LO UNICO QUE SEPARA EL MENU DEL CONTENIDO ES EL VELO.

   Eso hay que decirlo claro porque cambia quien sostiene la legibilidad. La
   pastilla no era decoracion: su cristal era lo que ponia una superficie entre
   los enlaces y lo que pasa por debajo al desplazarse. Sin ella, esa garantia
   recae entera en el degradado del `::before` de la cabecera — que sigue medido
   contra blanco puro, el peor caso posible, y da 8.42:1 en los enlaces.

   Por eso el velo dejo de desvanecerse al bajar. Tenia una animacion que lo
   apagaba porque la pastilla tomaba el relevo; sin pastilla, apagarlo habria
   dejado el menu sin nada encima justo cuando empieza a pasarle contenido por
   debajo.

   Y `border: 0` se DECLARA, no se borra: el presupuesto vertical lee esa
   propiedad, y si desaparece cae a su respaldo de 1 px y mide un filo que ya no
   existe.
   -------------------------------------------------------------------------- */
.pep-cabecera {
	max-inline-size: var(--wp--style--global--content-size);
	margin-inline: auto;
	border: 0;
}


/* --------------------------------------------------------------------------
   LA LUPA QUE DESPLIEGA EL BUSCADOR

   Antes el campo estaba siempre abierto y se llevaba el centro de la barra: en
   una cabecera que ahora flota sobre una fotografia, un rectangulo de treinta
   caracteres es la pieza que la rompe. Pasa a ser una lupa que, al pulsarla,
   abre el campo hacia la izquierda.

   El estado vive en una casilla oculta, no en JavaScript. Es el mismo mecanismo
   que el selector de entrar/crear cuenta, y por las mismas razones: funciona con
   el guion apagado, se alcanza con el tabulador, se abre con la barra
   espaciadora y el lector de pantalla lo anuncia como una casilla. Un boton con
   un `onclick` no habria dado nada de eso a cambio.

   La casilla se esconde con `clip-path` y NUNCA con `display: none`: lo que no
   se pinta tampoco se enfoca, y entonces el buscador dejaria de existir para
   quien navega con teclado.

   Y esta explicacion vive aqui y no en `parts/header.html` por una razon
   practica: WordPress solo consume los comentarios de BLOQUE. Un comentario de
   HTML corriente en una plantilla se envia tal cual al navegador en cada carga,
   y este pesa setecientos bytes.

   La apertura se anima con `grid-template-columns` de `0fr` a `1fr`, que es la
   unica forma de llevar una caja de «nada» a «lo que ocupe su contenido» sin
   escribir un ancho a mano. Un `inline-size` fijo obligaria a adivinar cuanto
   mide el campo, y a que dejara de cuadrar en cuanto cambie el marcador de
   posicion.
   -------------------------------------------------------------------------- */
.pep-busca__interruptor {
	position: absolute;
	inline-size: 1px;
	block-size: 1px;
	margin: 0;
	padding: 0;
	border: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

.pep-busca {
	display: grid;
	grid-template-columns: 0fr auto;
	align-items: center;
	transition: grid-template-columns var(--wp--custom--movimiento--base) var(--wp--custom--curva--salida);
}

/* La lupa va DESPUES del campo en la rejilla —columna `auto`— pero antes en el
   marcado, para que al abrirse el foco caiga en el campo que acaba de aparecer
   y no haya que retroceder con el tabulador. */
.pep-busca__lupa {
	order: 2;
}

/* El anillo de foco viaja de la casilla escondida a su etiqueta. Sin esto,
   quien navega con teclado no ve donde esta. */
.pep-busca__interruptor:focus-visible ~ .pep-busca .pep-busca__lupa {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 2px;
}

/* El campo, cerrado. `overflow: hidden` recorta lo que la columna de cero no
   deja ver, y `visibility` lo saca del recorrido del tabulador: un campo que no
   se ve pero se puede enfocar es una trampa para quien navega con teclado. */
.pep-busca .pep-buscador {
	order: 1;
	overflow: hidden;
	visibility: hidden;
	min-width: 0;
	max-width: none;
	transition: visibility var(--wp--custom--movimiento--base);
}

.pep-busca__interruptor:checked ~ .pep-busca {
	grid-template-columns: 1fr auto;
}

.pep-busca__interruptor:checked ~ .pep-busca .pep-buscador {
	visibility: visible;
}

/* Abierto, el campo no puede empujar al carrito fuera de la barra: se queda con
   lo que sobre y no mas. */
.pep-cabecera__acciones {
	min-inline-size: 0;
}

.pep-busca {
	min-inline-size: 0;
	max-inline-size: 26rem;
}

/* En telefono el campo abierto ocupa el renglon entero. Es la busqueda por
   clave o CAS: quien llega con una anotada la escribe completa, y media pantalla
   lo hace incomodo. */
@media (max-width: 46rem) {

	.pep-busca__interruptor:checked ~ .pep-busca {
		position: absolute;
		inset-inline: var(--wp--preset--spacing--30);
		inset-block-start: 100%;
		max-inline-size: none;
	}
}


/* WordPress le pone `is-layout-flow` a cualquier grupo, y con ello un
   `margin-block-start` entre sus hijos. Dentro de una rejilla de dos columnas
   eso empuja el campo por debajo de la lupa. */
.pep-busca > * {
	margin-block: 0;
}

/* --------------------------------------------------------------------------
   EL MENU EN TELEFONO

   Hasta ahora esta pantalla no tenia NI UNA regla del tema: salia con los
   estilos de fabrica de WordPress, que estan pensados para tema claro. En un
   sitio oscuro eso es una hoja blanca a pantalla completa, con el texto del
   tema encima, en el dispositivo donde compra la mayoria. No era una decision:
   era un hueco.

   Se viste con el mismo cristal que el resto del cromo. El marcado y el
   comportamiento los pone el bloque de navegacion del nucleo con su
   Interactivity API, y no se tocan: aqui solo se le da color y forma.
   -------------------------------------------------------------------------- */
.wp-block-navigation__responsive-container-open,
.wp-block-navigation__responsive-container-close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: var(--pep-campo-alto);
	block-size: var(--pep-campo-alto);
	border-radius: var(--wp--custom--radio--pastilla);
	color: var(--wp--preset--color--neutral-900);
	transition:
		background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.wp-block-navigation__responsive-container-open:hover,
.wp-block-navigation__responsive-container-close:hover {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 12%, transparent);
	color: var(--wp--preset--color--accent);
}

/* La hoja abierta. `brand-dark` y no `neutral-050`: es la unica superficie del
   sitio que tapa TODO, y conviene que se lea como un plano distinto y no como
   la misma pagina con otra cosa encima. */
.wp-block-navigation__responsive-container.is-menu-open {
	padding: var(--wp--preset--spacing--40);
	background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 88%, transparent);
	color: var(--wp--preset--color--neutral-900);
}

@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {

	.wp-block-navigation__responsive-container.is-menu-open {
		-webkit-backdrop-filter: blur(24px) saturate(150%);
		backdrop-filter: blur(24px) saturate(150%);
	}
}

@media (prefers-reduced-transparency: reduce) {

	.wp-block-navigation__responsive-container.is-menu-open {
		background-color: var(--wp--preset--color--brand-dark);
		-webkit-backdrop-filter: none;
		backdrop-filter: none;
	}
}

/* Los enlaces, del tamano de algo que se toca: en una hoja a pantalla completa
   caben holgados, y en telefono un enlace de una linea es un blanco dificil. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
	display: flex;
	align-items: center;
	min-block-size: var(--pep-campo-alto);
	padding-inline: var(--wp--preset--spacing--20);
	border-radius: var(--wp--custom--radio--tarjeta);
	font-size: var(--wp--preset--font-size--lg);
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
}

.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover,
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:focus-visible {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 10%, transparent);
	color: var(--wp--preset--color--accent);
}

/* --------------------------------------------------------------------------
   GARANTIAS DE LA PORTADA
   Tres afirmaciones comprobables —no promesas—: hay certificado, hay pureza
   medida, hay entrega acordada. Cada una se puede verificar en el sitio, que es
   la unica clase de argumento que este negocio puede usar.

   Sin numerar. La numeracion dice "esto es una secuencia" y estas tres cosas no
   ocurren una despues de otra: poner 01/02/03 seria decorar con una estructura
   que no existe.
   -------------------------------------------------------------------------- */

.pep-garantias .wp-block-column {
	padding-block-start: var(--wp--preset--spacing--30);

	/* La linea sobre cada columna es lo que las convierte en tres piezas de un
	   mismo sistema en vez de tres parrafos sueltos. */
	border-block-start: 2px solid var(--wp--preset--color--accent);
}

/* El icono hereda el cian por `currentColor`, asi que vestir otra marca sigue
   siendo editar theme.json. Va en `block` para que no arrastre la linea base
   del texto y deje un hueco raro debajo. */
.pep-garantias__icono {
	display: block;
	color: var(--wp--preset--color--accent);
	margin-block-end: var(--wp--preset--spacing--30);
}

.pep-garantias h3 {
	margin-block: 0 var(--wp--preset--spacing--20);
}

.pep-garantias p {
	margin-block: 0;
}

/* --------------------------------------------------------------------------
   Distintivo de oferta
   -------------------------------------------------------------------------- */

/* En navy y no en un recuadro blanco: sobre la imagen clara de la tarjeta, el
   blanco desaparecia y el distintivo dejaba de avisar de nada.

   El texto va en `neutral-900` y no en `neutral-050`, y esto se midio tarde:
   casi negro sobre navy daba 1.85:1 —ilegible— y la propia pastilla contra el
   pozo daba 1.71:1, o sea que ni la forma se separaba del fondo. Un distintivo
   que no se lee no avisa de nada, y estaba en tres de las nueve tarjetas.
   Ahora el texto da 9.07:1 y el filo separa la forma a 3.19:1.

   Y NO va en cian, aunque el cian resolveria el contraste de sobra: en este
   sitio el cian significa «dato comprobable» —pureza, lote, cuenta— y un
   descuento comercial no lo es. El cian solo vale mientras signifique una cosa. */
.pep-rejilla .wc-block-components-product-sale-badge,
.woocommerce span.onsale {
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
	border: 1px solid var(--wp--preset--color--brand-light);
	border-radius: var(--wp--custom--radio--minimo);
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--micro);
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	padding: 0.25rem 0.5rem;
}

/* --------------------------------------------------------------------------
   CARRITO, CHECKOUT Y CONFIRMACION
   Estas tres pantallas se VISTEN, no se reescriben. Los bloques de WooCommerce
   siguen siendo los suyos y la logica de cobro no se toca: un checkout bonito
   que cobra mal no sirve de nada, y aqui vive toda la complejidad de PCI.
   -------------------------------------------------------------------------- */

/* La cabecera del checkout es minima a proposito: ni buscador, ni menu, ni
   carrito. En el paso de pagar, cada enlace es una salida. Lo que si se queda
   es la marca —para que nadie dude de en que sitio esta metiendo sus datos— y
   la nota de que la compra es para investigacion. */
.pep-checkout-cabecera__nota {
	margin-block: 0;
	text-transform: uppercase;
	letter-spacing: 0.1em;
}

/* La confirmacion abre en navy, igual que la portada. Es el unico momento del
   recorrido en que conviene que la tienda se ponga solemne: acaban de pagarle
   a un proveedor que no conocen. */
.pep-gracias-cabecera .wc-block-order-confirmation-status,
.pep-gracias-cabecera .wc-block-order-confirmation-summary {
	color: inherit;
}

.pep-gracias-cabecera .wc-block-order-confirmation-summary {
	border: 1px solid currentColor;
	border-radius: var(--wp--custom--radio--base);
	background: none;
}

.pep-gracias-cabecera .wc-block-order-confirmation-summary li {
	color: inherit;
}

/* Los datos del pedido en la confirmacion: cifras en la monoespaciada, que es
   donde de verdad sirve porque van en columna. */
.pep-gracias .wc-block-order-confirmation-totals td,
.pep-gracias .wc-block-order-confirmation-totals th {
	font-variant-numeric: tabular-nums;
}

.pep-gracias .wc-block-order-confirmation-address-wrapper {
	margin-block-start: var(--wp--preset--spacing--50);
}

/* --------------------------------------------------------------------------
   Formularios del carrito y del checkout
   -------------------------------------------------------------------------- */

/* WooCommerce trae sus propios colores por omision. Se los pasamos a los
   nuestros por variable y no reescribiendo sus reglas: asi el dia que cambie la
   marca, el checkout cambia con ella, y el dia que WooCommerce cambie su hoja
   de estilos, no hay que perseguir sus selectores.

   EL CAJON LATERAL ESTABA FUERA, y eso explica casi todo lo que se veia mal en
   el. Estas ocho variables colgaban solo de `.wp-block-woocommerce-cart` y
   `.wp-block-woocommerce-checkout`, pero el cajon del mini-carrito no se pinta
   dentro de ninguno de los dos: es un panel colgado del `<body>`, hermano de la
   pagina, bajo `.wc-block-mini-cart__drawer`. No heredaba ni un color.

   Los dos ultimos no son colores sino un remiendo de escala. La hoja de
   WooCommerce pide `--wp--preset--font-size--small` y `--x-small`, y este tema
   no los define: su escala es `micro/tiny/xs/sm/...`. Sin ellos, cada texto del
   carrito caia al valor de respaldo que WooCommerce lleva escrito, 14 pixeles
   fijos, fuera de la escala fluida del resto del sitio. Definirlos aqui hace que
   sea la PROPIA hoja de WooCommerce la que use nuestra tipografia. */
.wp-block-woocommerce-cart,
.wp-block-woocommerce-checkout,
.wc-block-mini-cart__drawer,
.wp-block-woocommerce-mini-cart-contents {
	--wc-green: var(--wp--preset--color--success);
	--wc-red: var(--wp--preset--color--danger);
	--wc-primary: var(--wp--preset--color--brand);
	--wc-primary-text: var(--wp--preset--color--neutral-900);
	--wc-highlight: var(--wp--preset--color--accent);
	--wc-highlight-text: var(--wp--preset--color--neutral-050);
	--wc-content-bg: var(--wp--preset--color--neutral-100);
	--wc-subtext: var(--wp--preset--color--neutral-600);
	--wp--preset--font-size--small: var(--wp--preset--font-size--xs);
	--wp--preset--font-size--x-small: var(--wp--preset--font-size--micro);
}

.wc-block-components-title,
.wc-block-cart__submit-container .wc-block-components-button,
.wc-block-checkout__actions .wc-block-components-button {
	font-family: var(--wp--preset--font-family--sans);
}

.wc-block-components-totals-item__value,
.wc-block-components-product-price,
.wc-block-components-formatted-money-amount {
	font-variant-numeric: lining-nums;
}

/* --------------------------------------------------------------------------
   EL CAJON DEL CARRITO

   El cajon es la unica pantalla de la tienda que aparece ENCIMA de otra, y la
   unica que casi todo el mundo va a ver mas de una vez por sesion. Hasta ahora
   no tenia una sola regla del tema: lo que se veia era WooCommerce de fabrica
   sobre un fondo oscuro que no esperaba.

   Se viste con borde y no con sombra. Las tres sombras del `theme.json` estan
   calculadas con un navy translucido pensado para fondo claro; sobre
   `neutral-050` una sombra oscura al seis por ciento no se ve. Un filo si.
   -------------------------------------------------------------------------- */

/* El velo. `color-mix` en vez de un rgba literal: asi el velo tambien es de la
   marca y cambia con ella. */
.wc-block-components-drawer__screen-overlay {
	background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 78%, transparent);
}

.wc-block-mini-cart__drawer .wc-block-components-drawer {
	background-color: var(--wp--preset--color--neutral-050);
	border-inline-start: var(--pep-borde);
	color: var(--wp--preset--color--neutral-900);
}

/* Y por que estos cuatro textos subieron de `neutral-400` a `neutral-600`.

   Porque el cajon se volvio de cristal, y con eso cambia el peor caso. Detras
   del panel de la cuenta hay una aurora que escribimos nosotros: se puede
   componer y acotar. Detras del cajon hay la TIENDA, y en la tienda hay fotos de
   producto — o sea que el peor caso no es un navy oscuro, es blanco puro.

   Compuesto contra blanco, a traves del velo y del cristal, `neutral-400` daba
   3.55:1 y hace falta 4.5. `neutral-600` da 5.95. Uno de los cuatro era el
   enlace «Quitar», que es una accion destructiva: el peor sitio posible para un
   texto que se pierde sobre una foto clara.

   No se veia porque hoy no hay fotos cargadas. Se habria visto el dia que las
   suba el cliente, que es exactamente cuando nadie mira el contraste. */

/* --------------------------------------------------------------------------
   EL CAJON, DE CHAPA A CRISTAL

   De todas las superficies del sitio, esta es la unica que flota sobre la
   pagina ENTERA: vive en un portal sobre `<body>`, en `z-index: 9999`, y detras
   tiene siempre contenido de verdad —el hero con su reticula, las franjas, la
   rejilla de laminas—. Es exactamente la condicion que el panel de la cuenta no
   tenia y hubo que fabricarle con una aurora. Aqui ya estaba, y el cajon la
   desperdiciaba tapandola con chapa opaca.

   El velo se aclara al mismo tiempo. Con el cajon opaco tenia que oscurecer
   mucho —78 %— porque era lo unico que separaba una cosa de la otra; con el
   cajon de cristal, parte de esa separacion la hace el desenfoque, y dejar ver
   algo mas de la tienda por detras es justo el efecto que se busca.

   El pie tambien: llevaba su propio `neutral-050` opaco, y una sola pieza opaca
   dentro de una superficie de cristal la parte por la mitad. Se queda con un
   tinte, que es lo que le da peso sin taparla.
   -------------------------------------------------------------------------- */
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {

	/* EL DESENFOQUE VA EN EL VELO, NO EN EL CAJON. Y esto no es un detalle.

	   `woocommerce.css` abre el cajon animando la OPACIDAD de este velo:
	   `transition: opacity .3s`, de cero a uno. Y cualquier ancestro con la
	   opacidad por debajo de uno forma un «backdrop root»: a partir de ahi, el
	   `backdrop-filter` de un descendiente deja de ver la pagina y solo ve lo que
	   se pinta DENTRO de ese ancestro.

	   Traducido: con el desenfoque puesto en el cajon, durante los trescientos
	   milisegundos de apertura se veria un color plano, y al acabar la animacion
	   saltaria de golpe a la tienda desenfocada. En cada apertura, varias veces
	   por sesion. Lo tenia asi escrito y habria pasado desapercibido hasta que
	   alguien lo abriera y sintiera el tiron sin saber nombrarlo.

	   Puesto en el velo no pasa: el velo resuelve su propio filtro contra la
	   pagina —el es quien se desvanece, no algo de dentro—, y todo el conjunto
	   aparece fundido. El cajon se queda con su tinte encima, que es lo que le da
	   su tono propio, y no necesita filtro suyo.

	   Y de paso sale mejor: se desenfoca la tienda ENTERA por detras, no solo la
	   franja que tapa el cajon. Es lo que hace cualquier hoja de sistema. */
	.wc-block-components-drawer__screen-overlay {
		background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 62%, transparent);
		-webkit-backdrop-filter: blur(28px) saturate(160%);
		backdrop-filter: blur(28px) saturate(160%);
	}

	.wc-block-mini-cart__drawer .wc-block-components-drawer {
		background-color: color-mix(in srgb, var(--wp--preset--color--neutral-050) 72%, transparent);
		border-inline-start-color: color-mix(in srgb, var(--wp--preset--color--neutral-900) 14%, transparent);
		border-start-start-radius: var(--wp--custom--radio--panel);
		border-end-start-radius: var(--wp--custom--radio--panel);
		box-shadow: var(--wp--custom--sombra--apoyada);
	}

	.wc-block-mini-cart__footer {
		background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 35%, transparent);
	}
}

/* Y el respaldo, que aqui importa mas que en la cuenta: el cajon tapa la tienda
   entera, y si el navegador no aplica el desenfoque, un cajon translucido sobre
   el catalogo es texto sobre texto. */
@media (prefers-reduced-transparency: reduce) {

	.wc-block-components-drawer__screen-overlay {
		background-color: color-mix(in srgb, var(--wp--preset--color--brand-dark) 78%, transparent);
		-webkit-backdrop-filter: none;
		backdrop-filter: none;
	}

	.wc-block-mini-cart__drawer .wc-block-components-drawer {
		background-color: var(--wp--preset--color--neutral-050);
		border-inline-start-color: var(--wp--preset--color--neutral-200);
	}

	.wc-block-mini-cart__footer {
		background-color: var(--wp--preset--color--neutral-050);
	}
}

/* El cierre: de aspa suelta a boton circular con superficie propia.

   Hay tres cosas de la hoja de WooCommerce que hay que deshacer, y las tres
   estan escritas con `!important`, asi que no basta con llegar despues:

     `padding: 1em !important`  y  `margin: -1em`  se cancelan entre si para
     agrandar el area pulsable sin mover el aspa. El truco funciona, pero deja un
     elemento cuya caja visible no coincide con su caja real: cualquier fondo o
     filo que se le ponga sale desplazado un cuarto de centimetro hacia fuera.

     `opacity: .6` sobre `currentColor`, que sobre fondo oscuro lo deja a media
     voz. Es el mismo problema que tenian los signos del selector de cantidad.

   Se sustituye la geometria entera por una caja normal de 44 px. */
.wc-block-components-button.wc-block-components-drawer__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: 2.75rem;
	block-size: 2.75rem;
	margin: 0;
	padding: 0 !important;
	opacity: 1;
	border-radius: 50%;
	background-color: var(--wp--preset--color--neutral-100) !important;
	color: var(--wp--preset--color--neutral-600) !important;
	transition: color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave), background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.wc-block-components-button.wc-block-components-drawer__close:hover,
.wc-block-components-button.wc-block-components-drawer__close:focus-visible {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 16%, var(--wp--preset--color--neutral-100)) !important;
	color: var(--wp--preset--color--neutral-900) !important;
}

.wc-block-components-drawer__close:hover,
.wc-block-components-drawer__close:focus-visible {
	color: var(--wp--preset--color--neutral-900);
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 12%, transparent);
}

/* El titulo de la rama llena, en la voz de la marca.

   Se le rehace la geometria completa porque la que trae es de fiar poco. Su
   regla en la hoja de WooCommerce dice:

     margin: 16px 16px -32px;
     padding-bottom: 32;            <- sin unidad: el navegador la descarta
     mask-image: linear-gradient(#000 calc(100% - 24px), transparent);

   El margen inferior negativo de 32 px estaba compensando un relleno de 32 px
   que nunca se aplica, asi que el titulo se monta encima de la primera fila. Y
   la mascara desvanece el texto por abajo, que sirve cuando la lista pasa por
   debajo del titulo al desplazarse, pero aqui solo lo deja a medio pintar.

   Se anula el margen negativo, se pone el relleno con unidad y se quita la
   mascara. El tamano tambien: venia en `2em`, que en un cajon de 480 px es un
   titulo mas grande que el de la portada. */
.wc-block-mini-cart__title {
	margin: 0 0 var(--wp--preset--spacing--30);
	padding-block-end: var(--wp--preset--spacing--30);
	padding-inline-end: 3rem;
	border-block-end: var(--pep-borde);
	mask-image: none;
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--base);
	font-weight: 700;
	letter-spacing: -0.02em;
	line-height: 1.2;
	color: var(--wp--preset--color--neutral-900);
}

/* --------------------------------------------------------------------------
   LA FILA DE PRODUCTO
   Las mismas reglas sirven en el cajon y en la pagina del carrito: son los
   mismos componentes. Lo que cambia entre las dos esta al final.
   -------------------------------------------------------------------------- */

/* La miniatura: una placa con la misma trama de papel milimetrado que la lamina
   del catalogo, para que un producto sin foto se vea igual en los dos sitios.

   La trama va SIEMPRE, y la imagen se pinta encima. Cuando hay foto de verdad,
   la foto tapa la trama y nadie la ve; cuando no la hay, la imagen que
   WooCommerce mete es su placeholder gris claro —un recuadro palido en medio de
   una pantalla oscura, lo mas llamativo del cajon siendo lo que menos dice— y
   entonces se esconde y queda la trama.

   Se resuelve aqui y no en PHP a proposito. La lamina del catalogo es HTML con
   `<span>`, y el carrito se pinta en el navegador pidiendo una URL a la Store
   API: son formatos incompatibles, y el hueco no se puede tapar con el filtro
   que ya existe. Ademas asi se arregla solo el dia que lleguen las fotos: la
   regla deja de encontrar el placeholder y no hace nada. */
.wc-block-cart-item__image,
.wc-block-cart-item__image > a {
	background-color: var(--wp--preset--color--neutral-100);
	background-image:
		linear-gradient(to right, color-mix(in srgb, var(--wp--preset--color--accent) 14%, transparent) 1px, transparent 1px),
		linear-gradient(to bottom, color-mix(in srgb, var(--wp--preset--color--accent) 14%, transparent) 1px, transparent 1px);
	background-size: 0.75rem 0.75rem;
	background-position: center;
	border-radius: var(--pep-radio);
	overflow: hidden;
}

.wc-block-cart-item__image img[src*="woocommerce/assets/images/placeholder"] {
	visibility: hidden;
}

/* El nombre manda en la fila. Venia con el subrayado y el cian de la regla
   global de enlaces, que en una lista de compra convierte cada renglon en un
   enlace gritado; el cian se guarda para el estado de foco, que es donde de
   verdad hace falta distinguir. */
.wc-block-components-product-name {
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 600;
	line-height: 1.35;
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
	transition: color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.wc-block-components-product-name:hover {
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}

/* La presentacion, en el lenguaje de dato del sitio.

   Quien compra un reactivo comprueba dos cosas antes de pagar: que sea el
   compuesto correcto y que sea el vial correcto. El nombre trae la primera; esta
   linea trae la segunda, y sin ella la fila dice «BPC-157» sin decir si son
   cinco miligramos o veinte. */
.wc-block-components-product-metadata,
.wc-block-components-product-metadata__variation-data {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--wp--preset--color--neutral-400);
}

.wc-block-cart-item__wrap .wc-block-components-product-price,
.wc-block-cart-item__total .wc-block-components-product-price {
	font-variant-numeric: tabular-nums lining-nums;
}

/* --------------------------------------------------------------------------
   EL SELECTOR DE CANTIDAD

   Es el control que mas se toca de toda la tienda y el que peor se veia. Tres
   cosas lo explicaban, y las tres vienen de la hoja de WooCommerce:

     - `opacity: .6` sobre los signos, que en un tema oscuro los deja a media voz.
     - `min-width: 30px` y sin alto: por debajo de los 44 px de toque que este
       mismo tema ya exige en el riel de familias.
     - un filo de `neutral-200` sobre `neutral-050`, que da 1.68:1 de contraste
       cuando el minimo para el borde de un control es 3:1. Por eso se leia como
       un rectangulo flotando en vez de como un instrumento.

   Se rehace como una sola pieza de tres celdas, con divisores, en el mismo
   lenguaje con el que ya se trata el desplegable de ordenacion.
   -------------------------------------------------------------------------- */

.wc-block-components-quantity-selector {
	inline-size: auto;
	display: inline-flex;
	align-items: stretch;
	border: 1px solid var(--wp--preset--color--neutral-400);
	border-radius: var(--wp--custom--radio--pastilla);
	overflow: hidden;
	background-color: transparent;
}

/* El cero de WooCommerce: su `:after` dibuja un filo propio que se suma al
   nuestro y deja una linea doble. */
.wc-block-components-quantity-selector::after {
	display: none;
}

.wc-block-components-quantity-selector .wc-block-components-quantity-selector__button {
	min-inline-size: 2.75rem;
	min-block-size: 2.75rem;
	padding: 0;
	opacity: 1;
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	line-height: 1;
	color: var(--wp--preset--color--neutral-600);
	background-color: transparent;
	transition: color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave), background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.wc-block-components-quantity-selector .wc-block-components-quantity-selector__button:hover {
	color: var(--wp--preset--color--neutral-900);
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 12%, transparent);
}

/* WooCommerce apaga el `outline` y pone un `box-shadow` interior de un pixel,
   que sobre fondo oscuro no se ve. Se devuelve el anillo del sitio, hacia
   adentro porque el boton toca el borde del control. */
.wc-block-components-quantity-selector .wc-block-components-quantity-selector__button:focus,
.wc-block-components-quantity-selector .wc-block-components-quantity-selector__button:focus-visible {
	box-shadow: none;
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: -2px;
}

/* Inhabilitado tiene que leerse como inhabilitado, no como tenue. En cantidad 1
   el `menos` no hace nada, y si se ve igual que el `mas` la gente lo pulsa.

   Su contraste queda en 1.68:1 a proposito. Es la unica excepcion de toda esta
   seccion, y esta contemplada: un control inhabilitado esta fuera del requisito
   de contraste justamente porque su falta de contraste ES la senal. */
.wc-block-components-quantity-selector .wc-block-components-quantity-selector__button:disabled {
	opacity: 1;
	color: var(--wp--preset--color--neutral-200);
	background-color: transparent;
	cursor: not-allowed;
}

.wc-block-components-quantity-selector > .wc-block-components-quantity-selector__button--minus {
	border-radius: 0;
	border-inline-end: 1px solid var(--wp--preset--color--neutral-400);
}

.wc-block-components-quantity-selector > .wc-block-components-quantity-selector__button--plus {
	border-radius: 0;
	border-inline-start: 1px solid var(--wp--preset--color--neutral-400);
}

/* La cifra. Aqui se apaga la regla global de `input[type="number"]`, que le
   daba fondo, filo y relleno propios: dentro de un control compuesto eso pinta
   una caja dentro de otra caja, y era lo que empujaba el `+` contra el borde. */
.wc-block-components-quantity-selector input.wc-block-components-quantity-selector__input {
	min-inline-size: 2.5rem;
	padding: 0;
	border: 0;
	background-color: transparent;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	font-variant-numeric: tabular-nums lining-nums;
	color: var(--wp--preset--color--neutral-900);
}

.wc-block-components-quantity-selector input.wc-block-components-quantity-selector__input:focus,
.wc-block-components-quantity-selector input.wc-block-components-quantity-selector__input:focus-visible {
	box-shadow: none;
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: -2px;
}

/* --------------------------------------------------------------------------
   QUITAR, LEJOS DE RESTAR

   Venia pegado al `+`, sin tamano propio y sin area de toque. Es la peor
   vecindad posible: se baja cantidad pulsando repetidamente, se falla el toque
   una vez, y en lugar de quitar una unidad se borra la linea entera. Separarlo
   no es estetica, es evitar un error caro y frecuente.
   -------------------------------------------------------------------------- */

.wc-block-cart-item__quantity {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
	flex-wrap: wrap;
}

.wc-block-cart-item__remove-link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-inline-size: 2.75rem;
	min-block-size: 2.75rem;
	margin-inline-start: auto;
	border-radius: var(--wp--custom--radio--pastilla);
	color: var(--wp--preset--color--neutral-600);
	text-decoration: none;
	transition: color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave), background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.wc-block-cart-item__remove-link:hover,
.wc-block-cart-item__remove-link:focus-visible {
	color: var(--wp--preset--color--danger);
	background-color: color-mix(in srgb, var(--wp--preset--color--danger) 12%, transparent);
	text-decoration: none;
}

/* --------------------------------------------------------------------------
   EL PIE DEL CAJON
   -------------------------------------------------------------------------- */

.wc-block-mini-cart__footer {
	border-block-start: var(--pep-borde);
	background-color: var(--wp--preset--color--neutral-050);
}

.wc-block-mini-cart__footer .wc-block-mini-cart__footer-subtotal {
	font-size: var(--wp--preset--font-size--base);
	font-variant-numeric: tabular-nums lining-nums;
	color: var(--wp--preset--color--neutral-900);
}

/* Uno manda y el otro acompana. Venian los dos del mismo tamano y el mismo
   peso, compitiendo: en un cajon, la accion siguiente tiene que ser evidente
   sin leer. El orden lo decide `parts/mini-cart.html`, no un `column-reverse`,
   para que el recorrido con teclado coincida con lo que se ve. */
.wc-block-mini-cart__footer .wc-block-mini-cart__footer-actions {
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
}

.wp-block-woocommerce-mini-cart-cart-button-block .wc-block-components-button {
	background-color: transparent;
	border: 1px solid var(--wp--preset--color--neutral-400);
	color: var(--wp--preset--color--neutral-900);
}

.wp-block-woocommerce-mini-cart-cart-button-block .wc-block-components-button:hover {
	border-color: var(--wp--preset--color--accent);
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 10%, transparent);
}

/* El aviso de uso en investigacion dentro del cajon: discreto, y en el ultimo
   sitio donde se lee antes de ir a pagar. No es decoracion, es la consistencia
   del encuadre que sostiene poder vender sin registro sanitario. */
.wp-block-woocommerce-filled-mini-cart-contents-block .pep-aviso--ruo {
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	border-block-start: var(--pep-borde);
	font-size: var(--wp--preset--font-size--micro);
	line-height: 1.5;
	color: var(--wp--preset--color--neutral-600);
}

/* --------------------------------------------------------------------------
   EL CAJON VACIO

   Es la pantalla que mas se abre por curiosidad. Se rediseno tomando como base
   la de un competidor —marco, punto focal, jerarquia, una linea de cierre— y
   subiendo cada pieza.

   DOS COSAS QUE SE APRENDIERON A GOLPES, y por eso estan escritas:

   1. `align-items: center` en esta columna encogia CADA hijo a su contenido. El
      boton «Ver el catalogo» vive dentro de un `div.wp-block-button` que emite
      WooCommerce, asi que ese div quedaba del ancho del texto y el
      `inline-size: 100%` del enlace se resolvia contra una caja ya encogida.
      Resultado: un boton que ni ocupaba el ancho ni quedaba centrado. Aqui los
      hijos se estiran y lo que se centra es el TEXTO.

   2. En una columna flex el ALTO es el eje principal, y ahi manda `flex-shrink`,
      que vale 1 por omision. Una placa con `block-size: 5.5rem` no mide 5.5rem:
      mide lo que le deje el reparto. Salio un rectangulo aplastado. Cualquier
      cosa con altura propia aqui dentro necesita `flex-shrink: 0`.

   Todos los contrastes de esta seccion estan medidos y anotados.
   -------------------------------------------------------------------------- */

.wp-block-woocommerce-empty-mini-cart-contents-block {
	/* El contenido empieza arriba y respira, en vez de centrarse en el vacio:
	   WooCommerce lo centra con `justify-content: center` sobre una columna de
	   la altura de la pantalla, que es lo correcto para el parrafo suelto que
	   pone por omision y deja de serlo en cuanto hay una composicion. */
	justify-content: flex-start;
	padding: 0;
}

.wp-block-woocommerce-empty-mini-cart-contents-block .wc-block-mini-cart__empty-cart-wrapper {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--40);
	text-align: center;
}

/* Los hijos ocupan el ancho y no se dejan encoger de alto. Las dos mitades del
   parrafo de arriba, en dos declaraciones. */
.wc-block-mini-cart__empty-cart-wrapper > * {
	align-self: stretch;
	flex-shrink: 0;
}

/* El marco. El bloque de titulo de WooCommerce no se puede colocar en la rama
   vacia —su `block.json` lo restringe a la llena— asi que este va escrito a mano
   en la plantilla. Se alinea a la izquierda y a la altura del aspa de cierre,
   que WooCommerce fija en `top: 12px`.

   neutral-900 sobre neutral-050: 16.78:1. */
.pep-cajon__marco {
	margin-block: 0 var(--wp--preset--spacing--30);
	padding-block-end: var(--wp--preset--spacing--30);
	padding-inline-end: 3rem;
	border-block-end: var(--pep-borde);
	font-family: var(--wp--preset--font-family--display);
	font-weight: 700;
	letter-spacing: -0.02em;
	line-height: 1.2;
	text-align: start;
	color: var(--wp--preset--color--neutral-900);
}

/* --------------------------------------------------------------------------
   LA MARCA

   El vial va solo. La version anterior lo encajonaba en una placa de 88 px con
   la trama de papel milimetrado del catalogo, y estaba mal por dos razones
   distintas: la trama funciona a tamano de miniatura y aqui era ruido, y el
   cuadro se aplastaba por lo que dice el punto 2 de arriba.

   Detras queda un halo radial que se desvanece a cero. Da profundidad sin
   introducir un solo borde duro, que es lo que separa una marca de un boton.
   -------------------------------------------------------------------------- */

.pep-cajon-vacio__marca {
	display: flex;
	align-items: center;
	justify-content: center;
	block-size: 6rem;
	margin-block-start: var(--wp--preset--spacing--50);
	background-image: radial-gradient(
		circle at center,
		color-mix(in srgb, var(--wp--preset--color--accent) 10%, transparent) 0%,
		transparent 62%
	);
}

/* El icono hereda el cian por `currentColor`, igual que los tres de la portada,
   asi que vestir otra marca sigue siendo editar theme.json.
   accent sobre neutral-050: 10.82:1. */
.pep-cajon-vacio__icono {
	display: block;
	inline-size: 3rem;
	block-size: 3rem;
	color: var(--wp--preset--color--accent);
}

/* neutral-900 sobre neutral-050: 16.78:1. */
.pep-cajon-vacio__titulo {
	margin-block: 0;
	font-family: var(--wp--preset--font-family--display);
	font-weight: 700;
	letter-spacing: -0.02em;
	line-height: 1.2;
	color: var(--wp--preset--color--neutral-900);
}

/* Una linea, no un parrafo, y con las palabras que el sitio ya usa en la
   portada. neutral-600 sobre neutral-050: 7.65:1. */
.pep-cajon-vacio__linea {
	max-width: 30ch;
	margin-block: 0;
	margin-inline: auto;
	line-height: 1.5;
}

/* El boton de «Ver el catalogo».

   El selector lleva la clase EN el enlace y no en un descendiente. Es un
   arreglo: la version anterior escribia `.wc-block-mini-cart__shopping-button a`
   copiando el selector de la hoja de WooCommerce, y ninguno de los dos encaja
   con nada, porque esa clase va sobre el propio `<a>`. El boton llevaba desde el
   principio sin una sola de las reglas que creiamos haberle dado.

   El envoltorio que emite WooCommerce tambien se estira: sin eso, el 100% del
   enlace se mide contra una caja del ancho del texto.

   neutral-900 sobre brand: 9.07:1. */
.wc-block-mini-cart__empty-cart-wrapper > .wp-block-button {
	display: block;
}

a.wc-block-mini-cart__shopping-button {
	/* `border-box`, y aqui esta la razon de que este boton saliera torcido.

	   EN TODO EL TEMA NO HAY UNA SOLA DECLARACION DE `box-sizing`. Lo comprobe:
	   cero en `main.css`, cero en `style.css`, cero en `theme.json`. El sitio
	   entero se escribio evitando combinar ancho y relleno en la misma caja, que
	   es lo que hace que eso no se note.

	   Aqui si se combinaban: `inline-size: 100%` mas `padding-inline` de 24 px
	   por lado da una caja de borde 48 px mas ancha que su contenedor, y ese
	   desbordamiento se derrama hacia la derecha. Los 24 px de descentrado que se
	   veian en pantalla son exactamente la mitad de esos 48.

	   Se declara aqui y no en un `*` global: el resto de la hoja lleva cuatro mil
	   lineas escritas bajo `content-box`, y cambiarlo de golpe moveria cajas que
	   hoy estan bien y que yo no puedo ver.

	   El `inline-size` sale sobrando: un contenedor flex de nivel bloque ya ocupa
	   el ancho de su padre, y con `width: auto` el relleno se descuenta solo. */
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: center;
	min-block-size: 3rem;
	margin-block-start: var(--wp--preset--spacing--20);
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--40);
	border: 0;
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	letter-spacing: 0.01em;
	text-decoration: none;
	transition: background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

a.wc-block-mini-cart__shopping-button:hover,
a.wc-block-mini-cart__shopping-button:focus-visible {
	background-color: var(--wp--preset--color--brand-light);
	color: var(--wp--preset--color--neutral-900);
}

/* --------------------------------------------------------------------------
   LOS ATAJOS POR FAMILIA

   Es lo que separa este cajon del de cualquier otra tienda. Un carrito vacio
   suele ofrecer un boton que devuelve al catalogo completo, o sea al punto de
   partida. Con ciento diecisiete compuestos eso es una lista larga; seis
   familias con su cuenta real son seis decisiones ya tomadas, y cubren 85 de los
   117.

   Van como FILAS y no como cajas. La primera version las puso en una rejilla de
   dos por dos con borde, y ocho bordes dentro de un cajon que ya tenia dos
   lineas de separacion se leen como una tabla de tablero, no como una tienda.
   Una fila con una linea de pelo debajo pesa una decima parte y admite mas
   elementos.
   -------------------------------------------------------------------------- */

.pep-atajos {
	margin-block-start: var(--wp--preset--spacing--30);
	text-align: start;
}

/* `.pep-cintillo` no define tamano —en el resto del sitio siempre se acompana
   de uno— y aqui heredaba el `1rem` del cajon: mayusculas a cuerpo de texto con
   0.22em de interletrado, gritando por encima del titulo. A `micro`, y con el
   interletrado a la mitad, vuelve a ser una etiqueta.

   neutral-400 sobre neutral-050: 4.57:1. */
.pep-atajos .pep-cintillo {
	margin-block: 0 var(--wp--preset--spacing--20);
	letter-spacing: 0.12em;
	color: var(--wp--preset--color--neutral-600);
}

.pep-atajos__lista {
	margin: 0;
	padding: 0;
	list-style: none;
}

.pep-atajo {
	border-block-end: var(--pep-borde);
}

/* Toda la fila es el objetivo, no solo el nombre: 44 px de alto y de borde a
   borde. Cuatro enlaces de texto juntos en un cajon estrecho son cuatro
   oportunidades de tocar el equivocado. */
.pep-atajo__ir {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
	min-block-size: 2.75rem;
	padding-inline: var(--wp--preset--spacing--20);
	text-decoration: none;
	transition: background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.pep-atajo__ir:hover,
.pep-atajo__ir:focus-visible {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 8%, transparent);
	text-decoration: none;
}

/* neutral-900 sobre neutral-050: 16.78:1. */
.pep-atajo__nombre {
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 500;
	line-height: 1.3;
	color: var(--wp--preset--color--neutral-900);
}

/* neutral-400 sobre neutral-050: 4.57:1. */
.pep-atajo__cuenta {
	flex-shrink: 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	font-variant-numeric: tabular-nums lining-nums;
	color: var(--wp--preset--color--neutral-600);
}

/* La ultima fila no es una familia: es la salida a las demas. Sin linea debajo,
   porque cierra la lista, y con el nombre en la voz secundaria para que no
   compita con las familias de verdad. */
.pep-atajo--todas {
	border-block-end: 0;
}

.pep-atajo--todas .pep-atajo__nombre {
	font-weight: 400;
	color: var(--wp--preset--color--neutral-600);
}

.pep-atajo--todas .pep-atajo__cuenta {
	color: var(--wp--preset--color--accent);
}

/* La linea de cierre. La competencia pone aqui «Envio $200 · Gratis desde
   $2,000». Esta tienda no usa paqueteria, y la gratuidad no se puede afirmar
   desde el codigo: el costo, si lo hay, vive en la configuracion de zonas de
   WooCommerce. Lo que si esta probado —y lo dice la barra de utilidades en todas
   las paginas— es que la entrega es en mano y se coordina por mensaje.

   neutral-400 sobre neutral-050: 4.57:1. */
.pep-cajon-vacio__cierre {
	margin-block: var(--wp--preset--spacing--30) 0;
	line-height: 1.5;
}

/* --------------------------------------------------------------------------
   LA ENTRADA

   El cajon ya se desliza: WooCommerce lo anima 300 ms al abrir. Encima de eso,
   las piezas del estado vacio entran escalonadas.

   Va colgado de `--with-slide-in`, la clase que WooCommerce pone al abrir, y no
   de `IntersectionObserver` como el resto del sitio. Dentro de un cajon que se
   muestra y se esconde con el atributo `hidden`, un observador de interseccion
   es fragil: no dispara de forma fiable cuando el elemento pasa de `display:
   none` a visible. Una animacion CSS anclada a la clase que ya existe no tiene
   ese problema y no necesita una linea de JavaScript.

   El interruptor general de `prefers-reduced-motion` de este mismo archivo lo
   apaga, y WooCommerce ademas apaga el suyo por su cuenta.
   -------------------------------------------------------------------------- */

@keyframes pep-cajon-entra {

	from {
		opacity: 0;
		transform: translateY(10px);
	}

	to {
		opacity: 1;
		transform: none;
	}
}

.wc-block-components-drawer__screen-overlay--with-slide-in .wc-block-mini-cart__empty-cart-wrapper > * {
	animation: pep-cajon-entra var(--wp--custom--movimiento--base) var(--wp--custom--curva--salida) both;
	animation-delay: var(--pep-retardo, 0ms);
}

.wc-block-mini-cart__empty-cart-wrapper > *:nth-child(2) { --pep-retardo: 60ms; }
.wc-block-mini-cart__empty-cart-wrapper > *:nth-child(3) { --pep-retardo: 110ms; }
.wc-block-mini-cart__empty-cart-wrapper > *:nth-child(4) { --pep-retardo: 160ms; }
.wc-block-mini-cart__empty-cart-wrapper > *:nth-child(5) { --pep-retardo: 210ms; }
.wc-block-mini-cart__empty-cart-wrapper > *:nth-child(n + 6) { --pep-retardo: 260ms; }

/* Los bloques que WooCommerce deja montados y vacios cuando no tienen nada que
   ofrecer: el pago exprés sin un procesador conectado, y los iconos de tarjetas
   aceptadas sin una sola tarjeta. Vacios no se ven, pero SI ocupan: dejan un
   hueco con borde superior en medio del pie del carrito que se lee como una
   seccion que no cargo.

   Se esconden con `:empty` y no borrando el bloque del marcado, para que el dia
   que el procesador entre vuelvan solos. */
.wp-block-woocommerce-cart-express-payment-block:empty,
.wp-block-woocommerce-cart-accepted-payment-methods-block:empty,
.wc-block-mini-cart__footer .wc-block-components-payment-method-icons:empty {
	display: none;
}

/* --------------------------------------------------------------------------
   EL DISPARADOR EN LA CABECERA
   -------------------------------------------------------------------------- */

/* El carrito es el tercer icono, y se viste como los otros dos. Se le repite el
   tratamiento en vez de anadirle la clase porque el marcado lo pone WooCommerce
   y no lo controlamos: la clase `pep-icono` no se le puede poner desde una
   plantilla de bloques. */
.wc-block-mini-cart__button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: var(--pep-campo-alto);
	min-block-size: var(--pep-campo-alto);
	padding-inline: 0;
	border-radius: var(--wp--custom--radio--pastilla);
	color: var(--wp--preset--color--neutral-900);
	transition:
		background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.wc-block-mini-cart__button:hover,
.wc-block-mini-cart__button:focus-visible {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 10%, transparent);
	color: var(--wp--preset--color--accent);
}

.wc-block-mini-cart__badge {
	background-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-050);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	font-variant-numeric: tabular-nums lining-nums;
}

/* --------------------------------------------------------------------------
   LO QUE SOLO PASA EN EL CAJON

   En el cajon el precio salia DOS VECES en la misma fila: el unitario debajo del
   nombre y el total a la derecha. Con una unidad son el mismo numero, y dos
   veces el mismo numero en una fila se lee como un error, no como informacion.
   Se deja el total, que es el que el cliente esta a punto de pagar. En la pagina
   del carrito sobra sitio y ahi si valen los dos, etiquetados.
   -------------------------------------------------------------------------- */

.wc-block-mini-cart__products-table .wc-block-cart-item__prices {
	display: none;
}

.wc-block-mini-cart__products-table .wc-block-cart-items__row {
	padding-block: var(--wp--preset--spacing--30);
	border-block-end: var(--pep-borde);
}

/* --------------------------------------------------------------------------
   Correcciones a la hoja de WooCommerce
   -------------------------------------------------------------------------- */

/* WooCommerce le pone `max-width: 1000px` al titulo y al contenido de carrito,
   checkout y Mi cuenta. Como el layout de WordPress centra a los hijos, ese
   ancho magico dejaba el titulo mas de cien pixeles a la derecha de su propio
   parrafo: se veia como un error de maquetacion, y lo era.

   No se le quita el limite, se le cambia por el nuestro. Un titulo pegado al
   borde en un monitor ancho tampoco se lee bien; la diferencia es que ahora el
   ancho sale del mismo token que gobierna el resto del sitio, en vez de un
   numero que decidio otra persona para otra tienda. */
body.woocommerce-cart .wp-block-post-title,
body.woocommerce-checkout .wp-block-post-title,
body.woocommerce-account .wp-block-post-title,
body.woocommerce-cart main .woocommerce,
body.woocommerce-checkout main .woocommerce,
body.woocommerce-account main .woocommerce {
	max-width: var(--wp--style--global--content-size);
}

/* Los bloques que WooCommerce mete cuando el carrito esta vacio vienen
   centrados. Todo el sitio lee de izquierda a derecha desde el mismo margen;
   una seccion centrada en medio del recorrido se ve como si fuera de otra
   tienda. */
body.woocommerce-cart .wp-block-woocommerce-empty-cart-block .wp-block-heading,
body.woocommerce-cart .wc-block-cart__empty-cart__title ~ * .wp-block-heading {
	text-align: left;
}

/* La ficha apila sus dos columnas antes de lo que WordPress apila por omision
   (781 px). Son 1024, y hay dos razones.

   La practica: el carrusel de WooCommerce calcula el ancho de la imagen EN
   LINEA al cargar, y un ancho en linea le gana a cualquier hoja de estilos. En
   el rango de una tableta la columna de la imagen se montaba encima de la del
   precio y cortaba el nombre del producto. No se puede quitar el carrusel:
   WooCommerce lo declara por su cuenta en todo tema de bloques, y apagarlo por
   filtro rompe su guion de galeria. Asi que se evita el rango.

   La de diseno: a ese ancho, dos columnas dejan la cifra de pureza y el precio
   en una tira estrecha donde ya no se leen como el dato principal. Apiladas,
   la imagen orienta y los datos mandan, que es el orden correcto. */
@media (max-width: 64rem) {

	/* WordPress fuerza `flex-wrap: nowrap !important` por encima de 782 px, asi
	   que para apilar antes hay que ganarle: tres clases pesan mas que una, y
	   con `!important` la regla posterior manda. No es un capricho de
	   especificidad, es la unica forma de mover ese umbral sin tocar el nucleo. */
	.pep-ficha-cabecera .wp-block-columns.is-layout-flex {
		flex-wrap: wrap !important;
	}

	.pep-ficha-cabecera .wp-block-columns.is-layout-flex > .wp-block-column {
		flex-basis: 100% !important;
	}

	/* Apilada, la lamina no debe comerse la primera pantalla: la imagen orienta,
	   pero el precio tiene que verse sin desplazarse. */
	.pep-ficha-cabecera .pep-lamina {
		max-width: 26rem;
	}
}

/* --------------------------------------------------------------------------
   CABECERA: TRES ZONAS

   Antes era una fila con `space-between`, y eso reparte el sobrante entre las
   piezas: el menu no quedaba centrado, quedaba «donde tocara» segun lo que
   midieran la marca y las acciones. Por eso todo se veia apelotonado a la
   derecha.

   Una rejilla de `1fr auto 1fr` es lo unico que centra de verdad: las dos
   columnas de los extremos valen lo mismo pase lo que pase dentro, asi que el
   menu del medio cae en el eje de la barra aunque el logo crezca o el carrito
   cambie de ancho al llenarse.
   -------------------------------------------------------------------------- */
.pep-cabecera__fila {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
}

/* EL RESETEO QUE FALTABA, Y QUE SE VEIA SIN SABER NOMBRARLO.

   WordPress le pone `is-layout-flow` a cualquier grupo de bloque, y con esa
   clase viene `margin-block-start: 24px` entre sus hijos — con la excepcion del
   primero, que se libra.

   Aqui el primero es el logotipo. Los enlaces y los iconos recibian esos 24 px y
   bajaban: por eso el logotipo se veia mas arriba que todo lo demas. No era un
   problema de diseno, era esto.

   Y es la SEGUNDA vez que este mismo margen muerde en este archivo: el buscador
   ya lo tiene resuelto unas lineas mas abajo, con su comentario. Por eso ahora
   hay una prueba que cruza las dos listas —los grupos que WordPress sirve con
   `is-layout-flow` y los que este CSS convierte en rejilla— y falla nombrando al
   que le falte el reseteo. */
.pep-cabecera__fila > * {
	margin-block: 0;
}

.pep-cabecera__marca {
	justify-self: start;
	min-inline-size: 0;
}

.pep-cabecera__acciones {
	justify-self: end;
	min-inline-size: 0;
	gap: 0.25rem;
}

/* --------------------------------------------------------------------------
   EL LOGO

   Veintiocho pixeles de alto. La imagen tiene 713 px de alto de origen, asi que
   se pinta a menos de la mitad de un cuarto de su tamano: por eso se importa a
   la biblioteca de medios en `configurar.php` y no se apunta al archivo del
   tema, para que WordPress genere sus tamanos y sirva el que toque.

   Y el titulo de texto se aparta CUANDO HAY LOGO, no siempre. El logotipo lleva
   la palabra NUVORA dentro, asi que tenerlo dos veces es ruido; pero si algun
   dia el logo no estuviera —una instalacion nueva sin sembrar, un adjunto
   borrado— la marca en texto vuelve sola. La clase la pone WordPress en el
   `<body>`, o sea que nadie tiene que acordarse de nada.
   -------------------------------------------------------------------------- */
.pep-cabecera__marca .custom-logo {
	display: block;

	/* Veintiocho pixeles era el tamano de cuando la marca se repartia entre este
	   logotipo y el sello vertical del costado. Sin sello, este es el unico sitio
	   donde la marca aparece, y tiene que pesar como tal. */
	block-size: 2.25rem;
	inline-size: auto;
	max-inline-size: none;
}

body.wp-custom-logo .pep-cabecera__marca .wp-block-site-title {
	display: none;
}

/* --------------------------------------------------------------------------
   LOS TRES ICONOS, UN SOLO TRATAMIENTO

   Buscar, cuenta y carrito son la misma clase de cosa —una accion sin texto— y
   hasta ahora cada uno se vestia por su cuenta: la lupa tenia sus reglas, el
   carrito las suyas, y «Mi cuenta» ni siquiera era un icono, era un enlace de
   texto perdido en el menu. En una tienda la cuenta se busca con el ojo donde
   esta el carrito, no entre las secciones.

   Los 44 px no son decorativos: es el minimo tactil que el resto del sitio le
   da a cualquier cosa que se pulsa, leido del mismo token.
   -------------------------------------------------------------------------- */
.pep-icono {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	inline-size: var(--pep-campo-alto);
	block-size: var(--pep-campo-alto);
	border-radius: var(--wp--custom--radio--pastilla);
	cursor: pointer;
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
	transition:
		background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

.pep-icono:hover,
.pep-icono:focus-visible {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 10%, transparent);
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}

/* --------------------------------------------------------------------------
   LOS ENLACES DEL MENU, SIN SUBRAYADO

   Aqui habia `text-decoration: underline` al pasar el raton, y no era un gesto
   del sitio: en cinco mil lineas de hoja el subrayado aparece tres veces, y las
   otras dos son enlaces de texto suelto dentro de una frase, donde si tiene
   sentido. En el cromo no lo usa nadie.

   Lo que si es el idioma de la casa —y ya se usa en el riel de familias, los
   atajos del carrito, el menu movil y los tres iconos de al lado— es cambiar el
   texto a cian y encender un fondo teñido muy diluido. Se adopta aqui, y con eso
   la barra entera pasa a hablar el mismo idioma por primera vez.
   -------------------------------------------------------------------------- */
.wp-site-blocks > header .wp-block-navigation a {
	position: relative;
	display: flex;
	align-items: center;
	min-block-size: var(--pep-campo-alto);
	padding-inline: var(--wp--preset--spacing--20);
	border-radius: var(--wp--custom--radio--pastilla);
	color: var(--wp--preset--color--neutral-800);
	text-decoration: none;
	white-space: nowrap;

	/* Un pelo de tracking. A este tamano y sobre fondo oscuro, las letras se
	   aprietan y el menu se lee como un bloque en vez de como cuatro destinos.
	   Es el mismo gesto que ya usan el cintillo y el riel de familias. */
	letter-spacing: 0.01em;
	transition:
		background-color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--instante) var(--wp--custom--curva--suave);
}

/* DONDE ESTAS.

   Los cuatro enlaces pesaban lo mismo estuvieras donde estuvieras, asi que el
   menu no informaba de nada: solo llevaba. Se marca el actual con el mismo cian
   del resto del sitio y un punto debajo — no con un subrayado, que es el gesto
   que quitamos por viejo.

   `aria-current` lo pone WordPress solo, asi que esto no anade marcado: se viste
   lo que ya esta ahi, y quien navega con lector de pantalla ya lo oia antes de
   que se viera. */
.wp-site-blocks > header .wp-block-navigation a[aria-current] {
	color: var(--wp--preset--color--neutral-900);
}

.wp-site-blocks > header .wp-block-navigation a[aria-current]::after {
	content: "";
	position: absolute;
	inset-block-end: 0.5rem;
	inset-inline-start: 50%;
	inline-size: 3px;
	block-size: 3px;
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: var(--wp--preset--color--accent);
	translate: -50% 0;
}

.wp-site-blocks > header .wp-block-navigation a:hover,
.wp-site-blocks > header .wp-block-navigation a:focus-visible {
	background-color: color-mix(in srgb, var(--wp--preset--color--accent) 10%, transparent);
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}

.pep-menu {
	gap: 0.125rem;
}

/* ==========================================================================
   LA TARJETA DE PRODUCTO
   Es el atomo del sitio: sale en la portada, en el catalogo, en la busqueda y
   en relacionados. Estaba repartida en cinco secciones distintas del archivo,
   contradiciendose entre ellas; aqui esta entera y una sola vez.

   El orden de lectura de una compra tecnica es: que es, que tan puro, si hay
   papel, cuanto cuesta. La tarjeta se compone en ese orden y solo dos cosas
   pesan de verdad —el nombre y la pureza—; el resto acompana.
   ========================================================================== */

/* --------------------------------------------------------------------------
   La rejilla que las contiene
   -------------------------------------------------------------------------- */

/* WooCommerce fija las columnas con `.wc-block-product-template__responsive.columns-3`,
   que pesa lo mismo que un selector de dos clases. Se le gana encadenando la
   clase del contenedor: tres clases pesan mas, sin recurrir a !important.

   El numero de columnas sale del ancho disponible, no de un ajuste fijo. El
   minimo son 18rem y no menos porque por debajo de eso el nombre de un producto
   se parte en dos renglones y los distintivos se apilan: la rejilla deja de
   poder barrerse de un vistazo, que es para lo que sirve un catalogo. */
.wp-block-woocommerce-product-collection .wc-block-product-template.wp-block-woocommerce-product-template,
.wp-block-woocommerce-product-template {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 18rem), 1fr));
	gap: var(--wp--preset--spacing--40);
	list-style: none;
	margin: 0;
	padding: 0;
}

.wp-block-woocommerce-product-collection .wc-block-product-template > li {
	width: auto;
	max-width: 100%;
	margin: 0;
}

/* Y EL MISMO RESETEO PARA LA RAMA VIEJA DE WOOCOMMERCE, QUE ES LA DE FABRICA.

   El bloque de coleccion tiene dos modos. Con `shrinkColumns: true` emite
   `__responsive` y se comporta; con `false` —que es el DEFAULT y lo que pedia el
   patron de relacionados de WooCommerce— emite `is-flex-container columns-N` y
   le clava a cada tarjeta `width: calc(20% - 1em)`.

   Eso, dentro de la rejilla de arriba, da un resultado absurdo: un porcentaje en
   un hijo de rejilla se resuelve contra SU PISTA, no contra el contenedor, asi
   que cada tarjeta pedia el 20% de sus propios ~350 px y quedaba en 44-70 px,
   con el nombre cayendo una letra por renglon. Paso en «Productos relacionados»
   de la ficha, y se vio en produccion antes que aqui.

   LA CLASE VA REPETIDA TRES VECES A PROPOSITO, y no se puede «limpiar»:
   WooCommerce blinda su ancho con `.wc-block-product-template.is-flex-container
   .is-flex-container.columns-5 > li`, que son cuatro clases y un elemento. Un
   empate no basta —ganaria la hoja que cargue despues, que no controlamos— asi
   que aqui hay cinco clases. Es eso o `!important`, que es peor. */
.wp-block-woocommerce-product-collection .wc-block-product-template.wc-block-product-template.wc-block-product-template.is-flex-container > li {
	width: auto;
	max-width: 100%;
}

/* --------------------------------------------------------------------------
   La tarjeta
   -------------------------------------------------------------------------- */

.wc-block-product-template .wc-block-product,
.woocommerce ul.products li.product {
	/* Contenedor de consulta. Es el cambio que de verdad importa: la tarjeta se
	   adapta a SU ancho, no al de la ventana. Asi la misma tarjeta funciona en
	   una rejilla de cuatro, en una de tres y en un carril de dos sin escribir
	   una regla por cada sitio donde se use. */
	container-type: inline-size;
	container-name: tarjeta;

	display: flex;
	flex-direction: column;
	align-items: stretch;
	text-align: left;

	/* Sin relleno propio: lo lleva cada hijo. Asi la imagen llega a los bordes
	   y el resto respira. */
	padding: 0;
	overflow: hidden;

	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--base);
	background-color: var(--wp--preset--color--neutral-050);

	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		box-shadow var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		transform var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

/* Todo lo que no es la imagen lleva el relleno lateral. */
.wc-block-product-template .wc-block-product > *:not(.wc-block-components-product-image),
.woocommerce ul.products li.product > *:not(a:has( img )):not(img) {
	padding-inline: var(--wp--preset--spacing--30);
	max-width: 100%;
}

.wc-block-product-template .wc-block-product > *:last-child {
	padding-block-end: var(--wp--preset--spacing--30);
}

/* --------------------------------------------------------------------------
   El pozo de la imagen

   Va sobre navy y no sobre gris claro, y esto se decidio midiendo: el vial de
   ejemplo es #D1DBDA y contra el gris que habia daba 1.25:1 de contraste. Una
   forma necesita 3:1 para que el ojo la separe del fondo, asi que las tarjetas
   no tenian una imagen floja, no tenian imagen: se leian como rotas.

   Sobre navy ese mismo vial da 10.89:1. Ademas es la convencion del rubro —la
   competencia tambien pone sus viales sobre fondo oscuro— y le da al producto
   aire de objeto sobre pedestal.

   Si algun dia las fotos llegan con fondo blanco, esto se cambia en una linea.
   -------------------------------------------------------------------------- */

/* EL POZO ES 4/3, EN TODOS LOS ANCHOS.

   Antes era cuadrado, y habia una consulta de contenedor mas abajo que decia
   achatarlo «sobre todo en telefono». No lo hacia nunca: esa consulta pide
   30rem = 480 px DE TARJETA, y en un telefono de 390 px la tarjeta mide 342.
   Solo vivia entre unos 520 y 600 px de ventana. El comentario decia lo
   contrario de lo que pasaba.

   Con 4/3 y la tarjeta de escritorio a 389 px, el pozo baja de 389 a 292 px y
   la tarjeta entera de 614 a 517 (−16 %): entra una fila mas por pantalla y el
   precio del telefono sube por encima del pliegue, que era el objetivo
   declarado desde el principio.

   4/3 es el suelo y no una preferencia. El vial es un objeto vertical y
   `contain` no recorta, encoge: a 16/10 mediria 195 px de alto y unos 78 de
   ancho dentro de un pozo de 341, o sea el 23 % del ancho. Se leeria como
   perdido en vez de como puesto sobre un pedestal. */
.wc-block-product-template .wc-block-product .wc-block-components-product-image,
.woocommerce ul.products li.product > a:has( img ) {
	position: relative;
	display: block;
	margin: 0;
	padding: var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--neutral-100);
	overflow: hidden;
	aspect-ratio: 4 / 3;

	/* El filo separa la lamina del cuerpo de la ficha: el pozo se lee como una
	   placa y no como el fondo de la tarjeta. */
	border-block-end: 1px solid var(--wp--preset--color--neutral-200);
}

/* El enlace que envuelve la imagen es `inline` de fabrica, asi que el
   `width: 100%` de la imagen no tenia contra que resolverse y la caja se
   quedaba en nada: el pozo salia navy y vacio, sin vial. */
.wc-block-product-template .wc-block-product .wc-block-components-product-image > a,
.wc-block-product-template .wc-block-product .wc-block-components-product-image__inner-container {
	display: block;
	width: 100%;
	height: 100%;
}

.wc-block-product-template .wc-block-product .wc-block-components-product-image img,
.woocommerce ul.products li.product img {
	display: block;
	width: 100%;
	height: 100%;

	/* `contain` para que el vial se vea entero dentro del pozo achatado. Va con
	   !important porque WooCommerce escribe `object-fit: cover` como estilo EN
	   LINEA, y contra un estilo en linea no hay otra forma. */
	object-fit: contain !important;

	/* Aqui NO se declara `mix-blend-mode`, ni siquiera `normal`. Declararlo
	   obliga al navegador a componer la imagen en su propia capa, y `normal` es
	   el valor por omision: se pagaba una capa por nada.

	   Se descubrio persiguiendo un fantasma que vale la pena dejar anotado. En
	   las capturas automaticas el pozo salia navy y vacio, y parecia que la
	   imagen no cargaba. Cargaba: un contorno de diagnostico aparecia rodeando
	   la nada. Lo que pasa es que una captura sin interfaz no siempre recoge lo
	   que hay dentro de una capa compuesta, y el revelado de entrada crea otra.
	   En un navegador de verdad se veia siempre bien.

	   De ahi la regla de trabajo: las capturas del catalogo se toman con
	   `--force-prefers-reduced-motion`, que apaga el revelado y devuelve una
	   imagen fiel. */
	transition: transform var(--wp--custom--movimiento--lento) var(--wp--custom--curva--salida);
}

/* EL FILETE BLANCO ALREDEDOR DEL VIAL, Y POR QUE NO ES UN DESCUIDO NUESTRO.

   WooCommerce trae esta regla en su paquete de bloques:

       .wc-block-components-product-image img[alt=""] { border: 1px solid #f2f2f2 }

   O sea que le dibuja un recuadro a toda imagen de producto cuyo texto
   alternativo este VACIO. Es su forma de senalar «a esta imagen le falta el
   alt», y sobre el blanco de una tienda normal es un gris que casi no se ve.
   Sobre este fondo oscuro es una raya blanca rodeando cada vial, y se veia en
   las ciento diecisiete tarjetas del catalogo, en las de familia y en el
   carrito.

   AQUI EL ALTERNATIVO VACIO ES LO CORRECTO, no un olvido. La imagen es el vial
   generico de la marca sustituyendo a una fotografia que todavia no existe:
   `Modules\DatosQueFaltan` se lo pone vacio a proposito —«no es la foto de ESTE
   producto; describirla le diria a quien no ve la pantalla que el compuesto
   tiene fotografia, que es justo lo que todavia no pasa»— y el nombre del
   producto va al lado. Una imagen decorativa con `alt=""` es exactamente lo que
   pide la accesibilidad; WooCommerce esta penalizando el marcado bueno.

   Se repite la clase para ganar el desempate: el selector de WooCommerce pesa
   lo mismo que este sin repetirla, y en un empate manda la hoja que cargue
   despues, que no es una cosa sobre la que convenga apostar. Sin `!important`,
   que no hace falta.

   `composer test:vistas` empareja las dos: mientras WooCommerce siga trayendo
   su filete, esta regla tiene que seguir aqui. */
.wc-block-components-product-image.wc-block-components-product-image img[alt=""] {
	border: 0;
}

/* --------------------------------------------------------------------------
   El cuerpo: nombre, clave, distintivos, precio y accion
   -------------------------------------------------------------------------- */

/* El nombre es lo primero que se lee y va en la serif de la marca. */
.wc-block-product-template .wp-block-post-title,
.woocommerce ul.products li.product .woocommerce-loop-product__title {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 500;
	line-height: 1.2;
	letter-spacing: -0.012em;
	text-align: left;
	margin-block: var(--wp--preset--spacing--30) 0;
}

.wc-block-product-template .wp-block-post-title a,
.woocommerce ul.products li.product .woocommerce-loop-product__title a {
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
}

/* La clave, en monoespaciada y en voz baja. Quien compra por catalogo suele
   venir con ella anotada; verla sin entrar a la ficha ahorra un clic por
   producto, pero no compite con el nombre. */
.pep-clave {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	color: var(--wp--preset--color--neutral-400);
	letter-spacing: 0.06em;
	margin-block: var(--wp--preset--spacing--20) 0;
}

.pep-tarjeta__datos {
	margin-block: 0;
}

.pep-distintivos {
	display: flex;
	flex-wrap: wrap;
	gap: 0.375rem;
	margin-block: var(--wp--preset--spacing--20) 0;
}

.pep-distintivo {
	display: inline-flex;
	align-items: baseline;
	gap: 0.4ch;
	font-size: var(--wp--preset--font-size--micro);
	font-weight: 500;
	padding: 0.2rem 0.5rem;
	border-radius: var(--wp--custom--radio--minimo);
	white-space: nowrap;
}

/* La pureza manda sobre el certificado, y por eso una va rellena y la otra
   perfilada. La pureza es un dato que CAMBIA entre productos —es lo que se
   compara—; «con certificado» es un si o un no y solo acompana. Dos pastillas
   con el mismo peso obligarian a leer las dos para descubrir cual importa. */
.pep-distintivo--pureza {
	background-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-050);
	font-family: var(--wp--preset--font-family--mono);
	font-variant-numeric: tabular-nums;
}

.pep-distintivo--coa {
	background-color: transparent;
	color: var(--wp--preset--color--neutral-600);
	border: 1px solid var(--wp--preset--color--neutral-200);
}

/* El precio, en monoespaciada como el resto de las cifras del sitio: asi una
   columna de precios se lee de arriba abajo sin que los digitos bailen. */
.wc-block-product-template .wc-block-components-product-price,
.woocommerce ul.products li.product .price {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	font-variant-numeric: lining-nums;
	color: var(--wp--preset--color--neutral-900);
	text-align: left;
	padding-block-start: var(--wp--preset--spacing--30);
}

/* El precio empuja el boton al fondo, para que todas las tarjetas de una fila
   terminen alineadas aunque los nombres midan distinto.

   El margen automatico va en el ENVOLTORIO del bloque y no en el precio, y esa
   distincion es todo el arreglo. WooCommerce pinta dos divs anidados: el hijo
   flex del <li> es `.wp-block-woocommerce-product-price` y el precio vive
   dentro. Un `margin-block: auto` en el de dentro esta en flujo normal, donde
   `auto` vertical resuelve a CERO: la regla no hacia absolutamente nada.

   No se notaba porque siete de las nueve tarjetas tienen exactamente el mismo
   contenido y quedaban alineadas por casualidad. Las dos sin pastillas —agua
   bacteriostatica y jeringas— se quedaban unos 40 px arriba, que es justo lo
   que mide la fila de distintivos que les falta.

   En la ruta clasica (`ul.products li.product .price`) el precio SI es hijo
   directo, y ahi el margen automatico sigue puesto mas abajo. */
.wc-block-product-template .wc-block-product > .wp-block-woocommerce-product-price {
	margin-block: auto 0;
}

.woocommerce ul.products li.product .price {
	margin-block: auto 0;
}

.wc-block-product-template .wc-block-components-product-price del,
.woocommerce ul.products li.product .price del {
	color: var(--wp--preset--color--neutral-400);
	font-weight: 400;
	margin-inline-end: 0.5ch;
}

.wc-block-product-template .wc-block-components-product-price ins,
.woocommerce ul.products li.product .price ins {
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
	font-weight: 600;
}

/* El boton ocupa el ancho: en una tarjeta, un boton corto y suelto se lee como
   un enlace mas y no como la accion de esa tarjeta. */
.wc-block-product-template .wp-block-woocommerce-product-button {
	margin-block-start: var(--wp--preset--spacing--30);
}

.wc-block-product-template .wp-block-woocommerce-product-button .wp-block-button__link,
.wc-block-product-template .wp-block-woocommerce-product-button .wc-block-components-product-button__button {
	display: block;
	width: 100%;
	text-align: center;
}

/* --------------------------------------------------------------------------
   Estados

   `:focus-within` acompana a `:hover` en todas las reglas a proposito: quien
   recorre el catalogo con el teclado tiene que ver lo mismo que quien lo
   recorre con el raton, no una version de segunda.
   -------------------------------------------------------------------------- */

.wc-block-product-template .wc-block-product:hover,
.wc-block-product-template .wc-block-product:focus-within,
.woocommerce ul.products li.product:hover {
	border-color: var(--wp--preset--color--brand-light);
	box-shadow: var(--wp--custom--sombra--elevada);
	transform: translateY(-2px);
}

.wc-block-product-template .wc-block-product:hover .wc-block-components-product-image img,
.wc-block-product-template .wc-block-product:focus-within .wc-block-components-product-image img {
	transform: scale(1.04);
}

.wc-block-product-template .wc-block-product:hover .wp-block-post-title a,
.wc-block-product-template .wc-block-product:focus-within .wp-block-post-title a {
	color: var(--wp--preset--color--accent);
}

/* En pantalla tactil no hay raton que pase por encima, asi que el hover se
   quedaria pegado despues de tocar: la tarjeta se levanta y ya no baja. Se
   apaga todo el movimiento donde no hay puntero fino. */
@media (hover: none) {

	.wc-block-product-template .wc-block-product:hover,
	.wc-block-product-template .wc-block-product:focus-within,
	.woocommerce ul.products li.product:hover {
		transform: none;
		box-shadow: none;
	}

	.wc-block-product-template .wc-block-product:hover .wc-block-components-product-image img,
	.wc-block-product-template .wc-block-product:focus-within .wc-block-components-product-image img {
		transform: none;
	}
}

/* --------------------------------------------------------------------------
   La tarjeta segun SU ancho, no el de la ventana

   Estas dos consultas son de contenedor. Es lo que permite que la misma
   tarjeta viva en una rejilla de cuatro columnas, en una de dos y en un carril
   angosto sin una sola regla por sitio.
   -------------------------------------------------------------------------- */

/* Estrecha: la clave estorba mas de lo que aporta —el nombre ya identifica el
   producto— y los distintivos se aprietan. */
@container tarjeta (max-width: 15rem) {

	.pep-clave {
		display: none;
	}

	.wc-block-product-template .wc-block-product .wc-block-components-product-image {
		padding: var(--wp--preset--spacing--30);
	}

	.pep-distintivo {
		padding-inline: 0.4rem;
	}
}

/* Ancha: una tarjeta que ocupa mucho puede permitirse mas voz.

   Aqui vivia el achatado del pozo, y se quito porque no se disparaba nunca
   donde decia. 30rem son 480 px DE TARJETA: en un telefono de 390 px la
   tarjeta mide 342 y esta regla no llegaba a aplicar. El pozo achatado es
   ahora la forma por omision, mas arriba, en todos los anchos.

   Lo que queda si depende del ancho de la tarjeta: cuando de verdad es grande
   —un carril de dos, una tarjeta suelta— el nombre y el precio suben un
   escalon de la escala. */
@container tarjeta (min-width: 30rem) {

	.wc-block-product-template .wp-block-post-title {
		font-size: var(--wp--preset--font-size--xl);
	}

	.wc-block-product-template .wc-block-product .wc-block-components-product-image {
		padding: var(--wp--preset--spacing--50);
	}

	.wc-block-product-template .wc-block-components-product-price {
		font-size: var(--wp--preset--font-size--base);
	}
}

/* ==========================================================================
   TEMA OSCURO: lo que un fondo negro necesita y uno blanco no

   Invertir los colores no hace un tema oscuro. Lo que sigue es la diferencia
   entre un sitio disenado en oscuro y uno al que le dieron la vuelta.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Profundidad sin sombras

   Sobre negro una sombra no existe: no hay luz que bloquear. Lo que separa un
   plano de otro es que la superficie sea MAS CLARA que el fondo, y un filo de
   un pixel que remate el borde. Por eso los tokens de sombra se redefinen como
   halos muy tenues, para que las reglas que ya los usan no queden en nada.
   -------------------------------------------------------------------------- */

:root {
	--wp--custom--sombra--apoyada: 0 1px 0 rgba(255, 255, 255, 0.04) inset;
	--wp--custom--sombra--elevada:
		0 1px 0 rgba(255, 255, 255, 0.06) inset,
		0 12px 32px rgba(0, 0, 0, 0.5);
	--wp--custom--sombra--flotante:
		0 1px 0 rgba(255, 255, 255, 0.08) inset,
		0 24px 60px rgba(0, 0, 0, 0.65);
}

/* --------------------------------------------------------------------------
   Grano

   Una superficie oscura y perfectamente plana se ve barata: el ojo la lee como
   ausencia de imagen, no como material. Una capa de ruido al 2 % le devuelve
   textura sin que nadie sepa por que se ve mejor.

   Va en un SVG en linea y no en un archivo: son 300 bytes, no cuesta una
   peticion y no hay imagen que se pueda perder al desplegar.
   -------------------------------------------------------------------------- */

body::before {
	content: "";
	position: fixed;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	opacity: 0.025;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='r'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23r)'/%3E%3C/svg%3E");
}

/* El contenido va por encima del grano. */
.wp-site-blocks {
	position: relative;
	z-index: 1;
}

/* --------------------------------------------------------------------------
   El halo de lo interactivo

   Un boton oscuro sobre fondo oscuro necesita algo mas que un cambio de tono
   para decir "esto responde". El cian de la marca, muy diluido, hace de luz.
   -------------------------------------------------------------------------- */

.wp-element-button:hover,
.wc-block-components-button:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover {
	box-shadow: 0 0 0 1px rgba(0, 212, 255, 0.35), 0 8px 24px rgba(0, 212, 255, 0.12);
}

/* --------------------------------------------------------------------------
   El buscador de la cabecera

   El campo tenia borde y fondo pensados para un tema claro y se veia como un
   recuadro blanco pegado encima del negro.
   -------------------------------------------------------------------------- */

/* El borde blanquecino que se veia no es del campo: WordPress se lo pone al
   ENVOLTORIO cuando el boton va por dentro. Se apaga ahi y el filo lo lleva el
   campo, que es donde se puede controlar el color. */
.pep-buscador .wp-block-search__inside-wrapper {
	border: 0;
	padding: 0;
	background: none;
}

.pep-buscador .wp-block-search__input {
	border: 1px solid var(--wp--preset--color--neutral-200);
	background-color: var(--wp--preset--color--neutral-100);
	color: var(--wp--preset--color--neutral-900);
}

.pep-buscador .wp-block-search__input::placeholder {
	color: var(--wp--preset--color--neutral-400);
}

.pep-buscador .wp-block-search__input:focus {
	border-color: var(--wp--preset--color--accent);
	background-color: var(--wp--preset--color--neutral-050);
	box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.18);
	outline: none;
}

/* Los menus desplegables se visten en CONTROLES DE FORMULARIO, mas arriba, con
   el resto de los campos.

   Aqui habia una copia de esas reglas, y estaba haciendo dano justamente por
   estar aqui: al venir DESPUES en el archivo, su `padding: 0.5rem 0.75rem`
   ganaba —misma especificidad, mas abajo— al hueco que el desplegable de
   ordenacion reserva para su flecha, y la flecha se montaba encima del texto.
   Es el tipo de choque que solo aparece cuando dos secciones distintas visten
   la misma cosa. Se viste en un solo sitio. */

/* Esto le dice al navegador que las barras de desplazamiento y los controles
   de fecha tambien van en oscuro. */
:root {
	color-scheme: dark;
}

/* --------------------------------------------------------------------------
   DOS PASTILLAS MAS EN LA TARJETA
   Van al final del archivo, junto a las otras dos, no en una seccion nueva:
   son variantes del mismo componente.
   -------------------------------------------------------------------------- */

/* «Insumo de laboratorio». El agua bacteriostatica y las jeringas no tienen
   pureza ni certificado porque no son compuestos, y sin esta pastilla su
   tarjeta se quedaba con un hueco donde las demas llevan dos sellos. Un hueco
   en el sitio de un dato se lee como dato faltante.

   En gris y perfilada, no en cian: es una aclaracion, no una credencial. */
.pep-distintivo--insumo {
	background-color: transparent;
	color: var(--wp--preset--color--neutral-400);
	border: 1px solid var(--wp--preset--color--neutral-200);
}

/* Existencias bajas. En ambar sobre el fondo da 10.19:1, y perfilada y no
   rellena a proposito: la pureza es el dato que se compara y tiene que seguir
   siendo el unico sello relleno de la tarjeta. */
.pep-distintivo--pocas {
	background-color: transparent;
	color: var(--wp--preset--color--warning);
	border: 1px solid var(--wp--preset--color--warning);
	font-family: var(--wp--preset--font-family--mono);
	font-variant-numeric: lining-nums;
}

/* --------------------------------------------------------------------------
   LA DESCRIPCION LARGA DE LA FICHA

   Esta seccion no existia, y eso era un agujero serio: la plantilla de producto
   pintaba el resumen corto, la ficha tecnica y los certificados, pero NUNCA la
   descripcion larga. Ni `wp:post-content` ni `woocommerce/product-details` en
   ninguna parte del sitio salvo carrito, checkout y paginas sueltas.

   O sea que todo lo que el dueno escribiera en el editor de producto —el campo
   grande, el principal— no lo leia nadie: ni un visitante ni un buscador. Se
   descubrio justo antes de encargar ciento diecisiete textos largos, que habrian
   sido ciento diecisiete textos invisibles.

   Va DESPUES de la ficha tecnica y de los certificados a proposito. Quien compra
   por catalogo viene a comparar datos: la tabla y el papel primero, la lectura
   despues. Y el aviso RUO no se mueve de donde estaba —justo tras el boton de
   compra—, que es la regla de contenido del proyecto.
   -------------------------------------------------------------------------- */

.pep-ficha-texto .pep-cintillo {
	margin-block-end: var(--wp--preset--spacing--40);
}

/* La prosa a medida legible. `.pep-prosa` ya resuelve el ancho y el margen
   —incluida la trampa del layout «constrained», que centra a sus hijos— asi que
   aqui solo se afina lo de dentro. */
.pep-ficha-texto .entry-content > * {
	max-width: var(--wp--custom--medida--prosa);
}

.pep-ficha-texto .entry-content > * + * {
	margin-block-start: var(--wp--preset--spacing--30);
}

.pep-ficha-texto .entry-content h2,
.pep-ficha-texto .entry-content h3 {
	font-size: var(--wp--preset--font-size--lg);
	margin-block-start: var(--wp--preset--spacing--50);
}

.pep-ficha-texto .entry-content strong {
	color: var(--wp--preset--color--neutral-900);
}

/* Un producto sin descripcion no deja un cintillo y un titulo flotando sobre
   nada. Es la misma regla que el resto del sitio —si no hay dato, no hay
   seccion— resuelta con `:has()` porque el contenido lo pinta el core y no
   podemos preguntarle antes. */
.pep-ficha-texto:not(:has(.entry-content > *)) {
	display: none;
}

/* --------------------------------------------------------------------------
   LA LAMINA DE UN PRODUCTO SIN FOTO

   El catalogo real entro sin fotografias, y WooCommerce rellena cada hueco con
   su marcador: un cuadro BLANCO con el dibujo de una montana. Ciento diecisiete
   de esos sobre el fondo oscuro no se leen como «falta la foto», se leen como
   que el sitio esta roto.

   Aqui el pozo pinta la formula molecular. Es dato que si tenemos, encaja con
   una tienda cuyo argumento son los datos, y hace que cada tarjeta se distinga
   de la de al lado. Cuando llegue la foto de un producto, esta lamina desaparece
   sola para ese producto.
   -------------------------------------------------------------------------- */

.pep-lamina {
	display: flex;
	align-items: center;
	justify-content: center;
	inline-size: 100%;
	block-size: 100%;
	padding: var(--wp--preset--spacing--30);
	text-align: center;
}

.pep-lamina__formula {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: center;
	gap: 0 0.15em;
	font-family: var(--wp--preset--font-family--mono);

	/* Grande: en esta tarjeta la formula NO acompana a una foto, la sustituye.
	   A tamano de pie de foto quedaba flotando en medio de una placa vacia y la
	   rejilla se leia como sparse; a este tamano es el sujeto de la tarjeta. */
	font-size: var(--wp--preset--font-size--xl);
	font-variant-numeric: lining-nums;
	line-height: 1.3;

	/* En `neutral-600` y no en cian: el cian de esta tienda significa «dato
	   comprobado» —pureza medida, numero de lote— y una formula molecular es
	   identidad del compuesto, no una medicion de este lote. Ademas, ciento
	   diecisiete laminas en cian encendido convertirian la rejilla en un letrero. */
	color: var(--wp--preset--color--neutral-600);
	letter-spacing: 0.02em;
}

/* Cada elemento con su numero va en su propia pieza, para que el renglon rompa
   entre elementos y nunca por la mitad de uno. */
.pep-lamina__parte {
	white-space: nowrap;
}

/* CON LA FOTOGRAFIA DE MUESTRA, EL VIAL MANDA Y LA FORMULA BAJA A ETIQUETA.

   El cliente pidio que el catalogo se viera como una tienda mientras llegan las
   fotos de cada compuesto, y una tienda ensena producto. La formula no se tira
   por eso: se va a una esquina en pequeno, porque si no, la rejilla serian
   ciento diecisiete veces la misma imagen y ninguna tarjeta diria nada propio.

   El vial llega con el fondo transparente, asi que se recorta solo contra el
   navy del pozo y no hace falta ponerle ninguna placa detras. */
.pep-lamina--muestra {
	position: relative;
	display: block;
	padding: 0;
}

.pep-lamina--muestra .pep-lamina__vial {
	inline-size: 100%;
	block-size: auto;
	object-fit: contain;
}

.pep-lamina--muestra .pep-lamina__formula {
	position: absolute;
	inset-block-end: var(--wp--preset--spacing--20);
	inset-inline-start: var(--wp--preset--spacing--20);

	/* En pastilla tenue y no suelta sobre la imagen: el vial tiene reflejos
	   claros y zonas oscuras, y un texto sin fondo se pierde en unos y se come
	   a los otros segun donde caiga. */
	padding-block: calc(var(--wp--preset--spacing--20) / 2);
	padding-inline: var(--wp--preset--spacing--20);
	border-radius: var(--wp--custom--radio--pastilla);
	background-color: color-mix(in srgb, var(--wp--preset--color--neutral-050) 78%, transparent);

	/* Chica: aqui acompana a la foto, no la sustituye. Es la misma razon por la
	   que arriba es grande cuando va sola. */
	font-size: var(--wp--preset--font-size--micro);
	color: var(--wp--preset--color--neutral-600);
}

/* Sin formula —las mezclas de dos compuestos, los insumos— la placa lleva la
   misma reticula tenue que el hero, como el papel milimetrado de un cuaderno de
   laboratorio.

   Es lo unico honesto que se puede poner ahi: no afirma nada del producto, y
   llena el hueco con textura de la marca en vez de con vacio. Tres placas negras
   seguidas en una fila se leen como error; tres placas con trama, como
   material que todavia no tiene foto. */
.pep-lamina--muda {
	display: block;
	inline-size: 100%;
	block-size: 100%;
	background-image:
		linear-gradient(to right, var(--wp--preset--color--accent) 1px, transparent 1px),
		linear-gradient(to bottom, var(--wp--preset--color--accent) 1px, transparent 1px);
	background-size: 2.5rem 2.5rem;
	background-position: center;
	opacity: 0.07;
}

/* El precio que todavia no esta. En voz baja y sin caja: es una nota de estado,
   no un dato del producto, y no debe competir con el precio de verdad el dia que
   el dueno lo capture. */
.pep-precio-pendiente {
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 400;
	font-style: italic;
	color: var(--wp--preset--color--neutral-400);
}

/* En la ficha de producto el pozo es mucho mayor, y la formula puede crecer. */
.pep-lamina .wp-block-woocommerce-product-image-gallery,
.woocommerce-product-gallery .pep-lamina__formula {
	font-size: var(--wp--preset--font-size--xl);
}

/* --------------------------------------------------------------------------
   LA GUIA DE /empezar/

   Tres piezas propias: el riel de saltos del hero, las tres escalas de la
   cadena y los pasos numerados que se usan en dos secciones.

   Se escriben aqui en vez de tomarse prestadas, y eso es deliberado. El riel
   del catalogo —`.pep-riel__pastilla`— se ve casi igual, y reusarlo habria
   dejado una clase nombrando dos componentes distintos: el dia que el riel del
   catalogo cambie, esta pagina cambiaria con el sin que nadie lo pidiera. Ese
   atajo ya esta cobrado en este archivo con `.pep-acceso`, que es a la vez la
   tarjeta de la portada y la pantalla de entrar, y hoy se salvan solo por el
   orden en que estan escritas.

   NINGUN RELLENO NI MARGEN DE SECCION SE DECLARA AQUI. Las seis secciones
   emiten su `padding` y sus titulares su `margin` como atributos de bloque, o
   sea en linea, y un valor en linea gana a cualquier selector de esta hoja. Que
   el mismo valor estuviera escrito en los dos sitios es la regla 23, y costo que
   el hero de la portada se pintara 112 px mas arriba de lo disenado.
   -------------------------------------------------------------------------- */

/* LA BANDA DEL HERO TIENE QUE LEERSE COMO UNA BANDA, y por si sola no lo hace:
   `brand-dark` y `neutral-050` —el fondo de la pagina— son dos negros a cinco
   puntos de distancia, asi que el borde entre los dos no se ve. En la portada no
   importa porque encima va el shader; aqui la primera pantalla quedaria sin
   figura.

   Se resuelve con lo que el sitio ya usa en el hueco de los productos sin foto:
   la reticula tenue de un cuaderno de laboratorio. Es textura de la marca, no
   afirma nada, y el filo de abajo cierra la banda con el token que existe
   justamente para eso.

   Va como `background-image` y el color plano sigue viniendo de la clase de
   preajuste que emite WordPress. Son dos propiedades distintas, asi que no hay
   un mismo valor declarado en dos sitios. */
.pep-empezar-hero {
	background-image:
		linear-gradient(to right, color-mix(in srgb, var(--wp--preset--color--accent) 7%, transparent) 1px, transparent 1px),
		linear-gradient(to bottom, color-mix(in srgb, var(--wp--preset--color--accent) 7%, transparent) 1px, transparent 1px);
	background-size: 2.5rem 2.5rem;
	border-block-end: 1px solid var(--wp--preset--color--neutral-200);
}

/* La medida del titular en `rem` y no en `ch`, por lo mismo que el de la
   portada: un `ch` se mide sobre el glifo cero de la fuente activa, y esta
   familia ya cambio una vez. */
.pep-empezar-hero__titular {
	max-inline-size: 34rem;
}

/* La segunda palabra en cian. Es la misma figura que el titular de la portada y
   conviene que se lea como la misma marca, no como otra pagina. */
.pep-empezar-hero__acento {
	color: var(--wp--preset--color--accent);
}

/* --------------------------------------------------------------------------
   El riel de saltos

   Quien llega a esta pagina no viene a leerla entera: viene con una duda y el
   riel es lo unico que le lleva a ella sin recorrer cinco secciones. Por eso va
   arriba, antes de los botones.
   -------------------------------------------------------------------------- */

.pep-empezar__saltos {
	display: flex;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--20);
	margin-block-start: var(--wp--preset--spacing--50);
}

.pep-empezar__salto {
	display: inline-flex;
	align-items: center;
	min-block-size: 2.5rem;
	padding-inline: var(--wp--preset--spacing--30);
	border: 1px solid var(--wp--preset--color--neutral-200);

	/* Radio minimo y no capsula: la geometria del sitio es recta —tarjetas y
	   botones—, y una pildora seria de otro sistema. */
	border-radius: var(--wp--custom--radio--minimo);
	font-size: var(--wp--preset--font-size--tiny);
	color: var(--wp--preset--color--neutral-800);
	text-decoration: none;
	white-space: nowrap;
	transition:
		border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave),
		color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-empezar__salto:hover,
.pep-empezar__salto:focus-visible {
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--neutral-900);
}

/* En pantalla tactil el objetivo sube a 44 px, que es el minimo para un dedo. */
@media (hover: none) {

	.pep-empezar__salto {
		min-block-size: 2.75rem;
	}
}

/* En telefono el riel no envuelve: se desliza. Cinco pastillas a 360 px son dos
   renglones de mueble antes de la primera seccion.

   El desvanecido del filo derecho es lo que avisa de que hay mas a la derecha.
   El negro de la mascara no es un color de marca y por eso no lo alcanza la
   regla 3: en una mascara lo unico que se lee de un color es su canal alfa, y
   «opaco» no tiene token. Es la misma tecnica del riel del catalogo. */
@media (max-width: 46rem) {

	.pep-empezar__saltos {
		flex-wrap: nowrap;
		overflow-x: auto;
		scroll-snap-type: inline mandatory;
		padding-block-end: var(--wp--preset--spacing--20);
		scrollbar-width: none;
		-webkit-mask-image: linear-gradient(to right, #000 88%, transparent 100%);
		mask-image: linear-gradient(to right, #000 88%, transparent 100%);
	}

	.pep-empezar__saltos::-webkit-scrollbar {
		display: none;
	}

	.pep-empezar__salto {
		scroll-snap-align: start;
		flex: 0 0 auto;
	}
}

/* --------------------------------------------------------------------------
   Las tres escalas de la cadena

   Aminoacido, peptido y proteina son la misma quimica a tres tamanos, y verlas
   juntas es lo que contesta la pregunta. La linea superior sobre cada pieza es
   la misma que llevan las garantias de la portada: las convierte en tres partes
   de un sistema en vez de tres parrafos sueltos.
   -------------------------------------------------------------------------- */

.pep-empezar-contraste {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
	gap: var(--wp--preset--spacing--40);
	margin-block: var(--wp--preset--spacing--50) 0;
	padding: 0;
	list-style: none;
}

.pep-empezar-contraste__pieza {
	display: grid;
	gap: var(--wp--preset--spacing--20);
	padding-block-start: var(--wp--preset--spacing--30);
	border-block-start: 2px solid var(--wp--preset--color--accent);
}

/* La magnitud en monoespaciada y en cian: es dato, y en este sitio el dato
   siempre se viste igual —la ficha tecnica, las cifras, los lotes—. */
.pep-empezar-contraste__escala {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	letter-spacing: 0.08em;
	color: var(--wp--preset--color--senal);
}

.pep-empezar-contraste__que {
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	line-height: 1.25;
	color: var(--wp--preset--color--neutral-900);
}

.pep-empezar-contraste__detalle {
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.55;
	color: var(--wp--preset--color--neutral-600);
}

/* --------------------------------------------------------------------------
   Los pasos numerados

   Van numerados y las garantias de la portada no, y la diferencia no es de
   gusto: estos SI son una secuencia —se lee la identidad antes que el
   certificado, se crea la cuenta antes de pagar— y el numero informa. Cuando no
   hay orden, numerar es decorar con una estructura que no existe.

   El numero se pinta con un `span` oculto a los lectores y no con el marcador
   nativo de la lista porque tiene que caer a la izquierda de dos renglones de
   texto. El elemento sigue siendo un `ol`, asi que el orden lo anuncia el lector
   de pantalla por la etiqueta y no por el adorno.
   -------------------------------------------------------------------------- */

.pep-empezar-pasos {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
	gap: var(--wp--preset--spacing--50);
	margin-block: var(--wp--preset--spacing--50) 0;
	padding: 0;
	list-style: none;
}

/* Dos columnas y dos renglones: el numero ocupa los dos de la izquierda, y a su
   derecha el que y el detalle. Asi el detalle queda alineado con su titulo y no
   debajo del numero. Es la misma reticula que `.pep-ventaja`. */
.pep-empezar-paso {
	display: grid;
	grid-template-columns: auto 1fr;
	grid-template-rows: auto auto;
	column-gap: var(--wp--preset--spacing--30);
	row-gap: var(--wp--preset--spacing--20);
	align-items: start;
}

.pep-empezar-paso__numero {
	grid-row: 1 / 3;
	display: grid;
	place-items: center;
	inline-size: 2.25rem;
	block-size: 2.25rem;
	border: 1px solid var(--wp--preset--color--accent);
	border-radius: var(--wp--custom--radio--minimo);
	background-color: var(--wp--preset--color--senal-fondo);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-variant-numeric: lining-nums tabular-nums;
	color: var(--wp--preset--color--senal);
}

.pep-empezar-paso__que {
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 600;
	line-height: 1.25;
	color: var(--wp--preset--color--neutral-900);
}

.pep-empezar-paso__detalle {
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.6;
	color: var(--wp--preset--color--neutral-600);
}

/* --------------------------------------------------------------------------
   LA BARRA DE FILTROS DEL CATALOGO

   Aqui habia un riel de quince pastillas en tres renglones y, debajo, una
   seccion de 3 301 px con catorce tarjetas cuyo hueco de fotografia estaba
   vacio en las catorce. Medido sobre la pagina servida: el catalogo entero
   media 6 684 px y el primer producto aparecia en y = 3 981, seis pantallas de
   arrastre. Las tarjetas se fueron a la portada y aqui quedo lo que una tienda
   necesita en su catalogo, que es encontrar: un campo de busqueda y un panel
   que solo aparece cuando lo pides.

   SE ABRE SIN JAVASCRIPT. El interruptor es un `<input type="checkbox">` oculto
   y el boton es su `<label>`, que es exactamente el mecanismo con el que la
   cabecera despliega su buscador. Dos consecuencias que conviene tener escritas:
   el `<input>` tiene que ir ANTES del panel en el marcado —el combinador `~`
   solo mira hacia adelante— y el estado no sobrevive a un cambio de pagina, que
   aqui da igual porque los filtros son ENLACES y no casillas de formulario: al
   pulsar uno se navega, no se acumula una seleccion.
   -------------------------------------------------------------------------- */

.pep-filtros {
	margin-block-start: var(--wp--preset--spacing--40);
}

/* Oculto pero NO `display: none`: un control que no existe en la maquetacion no
   recibe foco, y entonces el panel solo se abre con raton. Asi se puede llegar
   con el tabulador y abrirlo con la barra espaciadora. */
.pep-filtros__interruptor {
	position: absolute;
	inline-size: 1px;
	block-size: 1px;
	opacity: 0;
	pointer-events: none;
}

.pep-filtros__barra {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: var(--wp--preset--spacing--30);
	align-items: stretch;
}

/* El buscador es el bloque `core/search`, el mismo de la cabecera, para que la
   busqueda del sitio siga siendo UNA. Lo unico que cambia aqui es la talla: en
   la barra del catalogo ocupa todo el ancho que le sobra al boton. */
.pep-filtros__busca {
	margin-block: 0;
}

.pep-filtros__busca .wp-block-search__inside-wrapper {
	border: 0;
	padding: 0;
	background: none;
}

.pep-filtros__busca .wp-block-search__input {
	min-block-size: var(--pep-campo-alto);
	padding-inline: var(--wp--preset--spacing--30);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--minimo);
	background-color: var(--wp--preset--color--neutral-050);
	color: var(--wp--preset--color--neutral-900);
}

.pep-filtros__busca .wp-block-search__input::placeholder {
	color: var(--wp--preset--color--neutral-400);
}

.pep-filtros__busca .wp-block-search__input:focus {
	border-color: var(--wp--preset--color--accent);
	outline: none;
}

/* El boton no es un `<button>` sino el `<label>` del interruptor, asi que se
   viste a mano con la misma geometria que el campo de al lado: misma altura,
   mismo radio, mismo filo. Si los dos no coinciden, la barra se lee como dos
   piezas pegadas en vez de una. */
.pep-filtros__boton {
	display: inline-flex;
	align-items: center;
	gap: 0.7ch;
	padding-inline: var(--wp--preset--spacing--40);
	min-block-size: var(--pep-campo-alto);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--minimo);
	background-color: var(--wp--preset--color--neutral-050);
	color: var(--wp--preset--color--neutral-900);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	white-space: nowrap;
	cursor: pointer;
	user-select: none;
	transition: border-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-filtros__boton:hover {
	border-color: var(--wp--preset--color--accent);
}

/* El foco se dibuja sobre el rotulo, que es lo que se ve: el `<input>` real
   mide un pixel y su anillo no se leeria. */
.pep-filtros__interruptor:focus-visible + .pep-filtros__barra .pep-filtros__boton {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 2px;
}

.pep-filtros__interruptor:checked + .pep-filtros__barra .pep-filtros__boton {
	border-color: var(--wp--preset--color--accent);
}

.pep-filtros__cuantos {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	color: var(--wp--preset--color--senal);
	font-variant-numeric: lining-nums tabular-nums;
}

.pep-filtros__panel {
	display: none;
	grid-template-columns: minmax(0, 16rem) minmax(0, 1fr);
	gap: var(--wp--preset--spacing--50);
	margin-block-start: var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--40);
	border: 1px solid var(--wp--preset--color--neutral-200);
	border-radius: var(--wp--custom--radio--base);
	background-color: var(--wp--preset--color--neutral-050);
}

.pep-filtros__interruptor:checked ~ .pep-filtros__panel {
	display: grid;
}

/* --------------------------------------------------------------------------
   La columna de ramas, que es la que no se puede quitar

   El catalogo tiene tres grupos y no uno: peptidos de investigacion, compuestos
   no peptidicos e insumos. Esa division es una decision escrita —«un SARM no es
   un peptido, y una tienda que se llama a si misma de peptidos no puede meterlos
   en el mismo saco sin decirlo»— y esta columna es el unico sitio de la pantalla
   donde se sigue viendo. Antes lo decia un rotulo diminuto entre las pastillas.
   -------------------------------------------------------------------------- */

.pep-filtros__ramas {
	display: grid;
	align-content: start;
	gap: 2px;
}

.pep-filtros__rama,
.pep-filtro {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
	border-radius: var(--wp--custom--radio--minimo);
	color: var(--wp--preset--color--neutral-800);
	font-size: var(--wp--preset--font-size--sm);
	text-decoration: none;
	transition: background-color var(--wp--custom--movimiento--rapido) var(--wp--custom--curva--suave);
}

.pep-filtros__rama:hover,
.pep-filtros__rama:focus-visible,
.pep-filtro:hover,
.pep-filtro:focus-visible {
	background-color: var(--wp--preset--color--neutral-100);
	color: var(--wp--preset--color--neutral-900);
}

/* La activa en navy con el texto claro, igual que la pastilla activa del riel
   que habia antes: 9.07:1. El cian sobre navy para la cuenta aguanta igual. */
.pep-filtros__rama.is-activa,
.pep-filtro.is-activa {
	background-color: var(--wp--preset--color--brand);
	color: var(--wp--preset--color--neutral-900);
	font-weight: 600;
}

.pep-filtros__cuenta {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--micro);
	color: var(--wp--preset--color--senal);
	font-variant-numeric: lining-nums tabular-nums;
}

.pep-filtros__titulo {
	margin-block: 0 var(--wp--preset--spacing--30);
}

.pep-filtros__rejilla {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
	gap: 2px var(--wp--preset--spacing--30);
}

/* En tableta y en telefono las dos columnas se apilan: con el panel a 360 px,
   la rejilla de familias a la derecha de la lista de ramas deja seis caracteres
   por renglon. */
@media (max-width: 64rem) {

	.pep-filtros__panel {
		grid-template-columns: 1fr;
	}
}

@media (max-width: 46rem) {

	.pep-filtros__barra {
		grid-template-columns: 1fr;
	}

	.pep-filtros__boton {
		justify-content: center;
	}
}

/* --------------------------------------------------------------------------
   EL CARRIL DE FAMILIAS DE LA PORTADA

   Catorce tarjetas con fotografia. Apiladas en rejilla son cinco renglones y
   media portada; en un carril son una fila con la ultima asomando por el filo,
   que es lo que dice «hay mas» sin escribirlo.

   NO REUSA EL RIEL DEL CATALOGO, aunque lo parezca. `.pep-riel__carril` envuelve
   en su regla base y solo se vuelve deslizante por debajo de 46 rem; esto se
   desliza siempre. Son dos piezas con dos comportamientos, y mezclarlas habria
   dejado una clase haciendo dos cosas segun el ancho.
   -------------------------------------------------------------------------- */

.pep-carrusel-seccion__cabeza,
.pep-carrusel-seccion__pie {
	max-inline-size: var(--wp--style--global--content-size);
	margin-inline: auto;
	padding-inline: var(--wp--preset--spacing--40);
}

.pep-carrusel-seccion__todas {
	color: var(--wp--preset--color--neutral-900);
	text-decoration: none;
}

.pep-carrusel-seccion__todas:hover,
.pep-carrusel-seccion__todas:focus-visible {
	color: var(--wp--preset--color--accent);
}

/* El relleno lateral iguala al de la columna de contenido, de modo que la
   primera tarjeta arranca alineada con el titulo y las demas se van hacia el
   borde de la ventana. `max()` con el relleno de pagina para que en pantallas
   mas angostas que la columna no quede en cero y las tarjetas no toquen el
   canto. */
.pep-carrusel {
	--pep-carril-aire: max(
		var(--wp--preset--spacing--40),
		calc((100% - var(--wp--style--global--content-size)) / 2)
	);

	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: minmax(15rem, 17rem);
	gap: var(--wp--preset--spacing--30);
	margin-block: var(--wp--preset--spacing--50);
	padding-inline: var(--pep-carril-aire);
	padding-block-end: var(--wp--preset--spacing--20);
	overflow-x: auto;
	scroll-snap-type: inline mandatory;
	scroll-padding-inline-start: var(--pep-carril-aire);

	/* Sin barra visible: en un carril de tarjetas pesa mas que lo que informa, y
	   el desvanecido del filo ya avisa de que hay mas a la derecha.

	   El negro de la mascara no es un color de marca y por eso no lo alcanza la
	   regla 3: en una mascara lo unico que se lee de un color es su canal alfa, y
	   «opaco» no tiene token. Es la misma tecnica del riel del catalogo. */
	scrollbar-width: none;
	-webkit-mask-image: linear-gradient(to right, #000 94%, transparent 100%);
	mask-image: linear-gradient(to right, #000 94%, transparent 100%);
}

.pep-carrusel::-webkit-scrollbar {
	display: none;
}

.pep-carrusel > .pep-puerta {
	scroll-snap-align: start;

	/* Todas con el mismo alto aunque sus descripciones midan distinto: en una
	   fila que se desliza, una tarjeta mas baja que su vecina se lee como un
	   fallo de carga. */
	block-size: 100%;
}

/* El foco del propio carril tiene que verse: es un contenedor que se recorre
   con el teclado, y sin anillo no hay forma de saber que lo tienes. */
.pep-carrusel:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 4px;
}
