/* HoloPlaza TCG — capa de aplicacion del design system.
 *
 * Los tokens (ds/colors.css, typography.css, spacing.css, effects.css,
 * games.css) vienen tal cual del paquete de diseno y NO se tocan: son la
 * fuente. Este archivo es lo unico que se escribe a mano, y su trabajo es
 * traducir esos tokens a las clases que de verdad existen en la web
 * (GeneratePress, WooCommerce, Elementor y los plugins propios).
 *
 * Por que una capa de traduccion y no reescribir el tema hijo:
 * el style.css del hijo son 900 lineas con 31 literales #FF8C42 y 11 #051518
 * repartidos, mas el kit de Elementor 627 y el layout post-265, que se
 * regeneran solos desde el panel y machacarian cualquier edicion. Tocando
 * unicamente las variables de las que cuelgan (--contrast, --base-3,
 * --e-global-color-*) el tema entero cambia de una pieza y sigue siendo
 * reversible.
 *
 * TEMA: arranca en el tema de marca del sistema (:root = claro, carmesi
 * #BB1823). El oscuro sigue disponible con <html data-theme="dark">; ahi los
 * tokens devuelven el naranja #FF8C42 y los fondos oscuros de siempre.
 */

/* ================================================================== */
/*  1. Chasis: fondo, texto y tipografia                              */
/* ================================================================== */

/* GeneratePress usa sus variables al reves de lo habitual: --contrast (que por
   nombre es el color de texto) se pinta como FONDO del body, y --base-3 (el
   claro) como color de texto. Asi es como la web acabo siendo oscura. No se
   redefinen esas dos variables globalmente porque se usan en mas sitios con su
   significado original; se sobrescribe el body, que es donde importa. */
/* html body y no body a secas: GeneratePress imprime su regla en un <style>
   inline cuyo orden respecto a esta hoja no esta garantizado. Con un selector
   mas especifico gana siempre, venga antes o despues. */
html body {
	background-color: var(--page-bg);
	color: var(--text-body);
	font-family: var(--font-sans);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

h1, h2, h3, h4, h5, h6,
.elementor-heading-title {
	font-family: var(--font-sans);
	color: var(--text-heading);
	font-weight: var(--fw-bold);
	line-height: var(--lh-heading);
}

a {
	color: var(--link);
}

a:hover,
a:focus {
	color: var(--link-hover);
}

/* La portada de Elementor pide Roboto y Roboto Slab mientras el resto del sitio
   va en Montserrat: dos tipografias distintas en la misma pagina. El sistema
   dice Montserrat en todo.
*/
/* DONDE se declaran importa mas que la especificidad. El kit de Elementor no
   define sus variables en :root sino en .elementor-kit-627, que es una CLASE
   DEL <body>. Una variable declarada en el body gana para todo lo que cuelga
   de el por muy especifico que sea el selector con que se declare en <html>:
   no compiten entre si, gana la declaracion mas cercana en el arbol.
   Redefinirlas en html:root, como estaba antes, NO SURTIA NINGUN EFECTO — de
   ahi que la portada siguiera en naranja, con los rotulos dorados y en Roboto.
   Van en el propio body. */
body[class*="elementor-kit-"] {
	--e-global-typography-primary-font-family: "Montserrat";
	--e-global-typography-secondary-font-family: "Montserrat";
	--e-global-typography-text-font-family: "Montserrat";
	--e-global-typography-accent-font-family: "Montserrat";
}

/* ================================================================== */
/*  2. Remapeo de las variables globales del kit de Elementor (627)   */
/* ================================================================== */

/* Estas cinco gobiernan toda la portada. Colgandolas de los tokens, la pagina
   sigue al tema en vez de llevar los hexadecimales cosidos.
   Su uso real en post-265.css, comprobado antes de remapear:
     primary   -> 3x color, 2x fill   = color de TEXTO, no de fondo
     accent    -> bordes y color      = decorativo (el oro)
     dd8b130   -> 1x background-image = cola del degradado del CTA
     text      -> el naranja de marca = el acento
     secondary -> el blanco           = texto sobre superficies oscuras */
body[class*="elementor-kit-"] {
	--e-global-color-primary: var(--text-heading);
	--e-global-color-secondary: var(--text-heading);
	--e-global-color-text: var(--accent);
	--e-global-color-accent: var(--hp-gold);
	--e-global-color-dd8b130: var(--hp-blush);
}

html[data-theme="dark"] body[class*="elementor-kit-"] {
	/* En oscuro, "secondary" vuelve a ser el blanco literal que era: ahi si
	   se pinta sobre superficies oscuras. */
	--e-global-color-secondary: var(--hp-white);
	--e-global-color-dd8b130: var(--hp-cream);
}

/* --e-global-color-primary tiene DOS usos incompatibles y por eso hace falta
   esta excepcion. En la portada (post-265) es color de TEXTO — se comprobo — y
   por eso arriba cuelga de --text-heading, que en el tema de marca es tinta
   oscura. Pero en la pagina del calendario (post-4046) la MISMA variable pinta
   el background-color de dos contenedores, asi que el calendario se quedaba
   con fondo casi negro sobre una web blanca.
   Una variable no puede ser tinta y fondo a la vez. Comprobado que solo hay
   cinco CSS de pagina de Elementor y que el choque se da unicamente aqui, se
   corrige en los dos contenedores concretos en vez de tocar la variable. */
html body .elementor-4046 .elementor-element.elementor-element-0f29758:not(.elementor-motion-effects-element-type-background),
html body .elementor-4046 .elementor-element.elementor-element-b675347:not(.elementor-motion-effects-element-type-background) {
	background-color: var(--surface-sunken);
}

/* ================================================================== */
/*  3. Botones                                                        */
/* ================================================================== */

/* Valores calcados de components/core/Button.jsx (variantes primary y shop).
   Regla del sistema: sobre relleno de acento el texto va --accent-contrast
   (blanco en claro), nunca tinta oscura. */
.wp-block-button__link,
.wc-block-components-button,
button.button,
a.button,
.woocommerce #respond input#submit,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.elementor-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--space-3);
	padding: var(--space-7) 28px;
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	background: var(--accent);
	color: var(--accent-contrast);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-bold);
	line-height: 1.4;
	text-decoration: none;
	white-space: nowrap;
	cursor: pointer;
	transition: all .2s ease;
}

.wp-block-button__link:hover,
.wc-block-components-button:hover,
button.button:hover,
a.button:hover,
.woocommerce #respond input#submit:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.elementor-button:hover,
.elementor-button:focus {
	background: var(--accent-light);
	border-color: var(--accent-light);
	color: var(--accent-contrast);
}

/* Los botones de Elementor se pintan con el id del widget
   (.elementor-265 .elementor-element.elementor-element-0078a1a .elementor-button,
   cuatro clases) y llevan un degradado propio mas
   color: var(--e-global-color-primary), que es tinta oscura.
   Con el tema de marca ese degradado arranca en el carmesi #BB1823, y el
   propio paquete lo advierte: NUNCA tinta oscura sobre --gradient-cta, no
   llega a contraste. Se fuerza el texto a --accent-contrast. Mismo motivo que
   en los rotulos de los paneles para usar !important: el selector lleva un id
   distinto por boton y no se puede igualar de forma estable. */
.elementor-button,
.elementor-button .elementor-button-text,
.elementor-button:hover,
.elementor-button:hover .elementor-button-text {
	color: var(--accent-contrast) !important;
}

.elementor-button .elementor-button-icon svg,
.elementor-button svg {
	fill: var(--accent-contrast);
}

/* El boton pequeno del sistema (SIZES.sm) para las acciones secundarias
   de las tarjetas del catalogo. */
.woocommerce ul.products li.product .button,
.elementor-size-sm {
	padding: var(--space-5) var(--space-8);
	font-size: var(--fs-ui-sm);
}

/* Variante "outline": el add-to-cart ya anadido y los botones secundarios. */
.woocommerce a.button.added,
.woocommerce .cart .button[name="update_cart"],
button.button.alt.disabled {
	background: transparent;
	color: var(--text-body);
	border-color: var(--border-default);
}

.woocommerce a.button.added:hover,
.woocommerce .cart .button[name="update_cart"]:hover {
	border-color: var(--accent);
	color: var(--accent);
	background: transparent;
}

/* ================================================================== */
/*  4. Tarjetas de producto (catalogo y bucles)                       */
/* ================================================================== */

/* components/commerce/ProductCard: la foto va SIEMPRE sobre plancha blanca
   (--plate) en los dos temas, porque el arte de las cartas se recorta contra
   blanco. Esa es una de las excepciones legitimas del sistema: no cambiarla
   por --surface-card. */
.woocommerce ul.products li.product {
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius-lg);
	overflow: hidden;
	transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
}

.woocommerce ul.products li.product:hover {
	border-color: var(--accent);
	transform: translateY(-2px);
	box-shadow: var(--shadow-card-accent);
}

.woocommerce ul.products li.product .wc-product-image,
.woocommerce ul.products li.product img {
	background: var(--plate);
}

.woocommerce ul.products li.product .woocommerce-loop-product__title {
	color: var(--text-heading);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-semibold);
	line-height: var(--lh-tight);
	padding: var(--space-8) var(--space-8) var(--space-4);
}

/* ================================================================== */
/*  5. Precios                                                        */
/* ================================================================== */

/* components/commerce/Price: el precio vigente en acento y peso fuerte; el
   tachado en texto secundario, nunca en rojo (el rojo es el acento del tema
   claro y competiria con el precio de verdad). */
/* GeneratePress pinta el precio con color:#222222 desde su CSS inline y con la
   misma especificidad que la regla de abajo. Se le antepone html body para
   ganar sin depender de cual de las dos hojas se imprima antes. */
html body .woocommerce .price,
html body .woocommerce ul.products li.product .price,
html body .woocommerce ul.products li.product .price .amount,
html body .woocommerce div.product p.price,
html body .woocommerce div.product p.price .amount,
html body .woocommerce div.product span.price {
	color: var(--accent);
	font-size: var(--fs-ui-lg);
	font-weight: var(--fw-bold);
}

.woocommerce .price del,
.woocommerce div.product p.price del {
	color: var(--text-secondary);
	font-weight: var(--fw-regular);
	opacity: 1;
}

.woocommerce .price ins {
	text-decoration: none;
	color: var(--accent);
}

/* ================================================================== */
/*  6. Aviso de stock                                                 */
/* ================================================================== */

/* components/commerce/StockNotice. --stock-in es un verde oscurecido a
   proposito: el #66b520 de marca no llegaba a 4.5:1 sobre el relleno al 12%. */
.woocommerce div.product .stock,
.woocommerce .in-stock {
	color: var(--stock-in);
	background: var(--success-fill);
	border: 1px solid var(--success-border);
	border-radius: var(--radius-sm);
	padding: var(--space-3) var(--space-6);
	display: inline-block;
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-medium);
}

.woocommerce div.product .stock.out-of-stock,
.woocommerce .out-of-stock {
	color: var(--stock-out);
	background: var(--danger-fill);
	border-color: var(--danger-border);
}

/* ================================================================== */
/*  7. Formularios                                                    */
/* ================================================================== */

/* components/core/Input y Select. */
input[type="text"], input[type="email"], input[type="url"], input[type="password"],
input[type="search"], input[type="number"], input[type="tel"], input[type="date"],
select, textarea,
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select {
	background: var(--surface-sunken);
	color: var(--text-body);
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
	padding: var(--space-5) var(--space-6);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
}

input::placeholder,
textarea::placeholder {
	color: var(--placeholder);
}

input:focus, select:focus, textarea:focus {
	outline: 2px solid var(--focus-ring);
	outline-offset: 1px;
	border-color: var(--accent);
}

label,
.woocommerce form .form-row label {
	color: var(--text-body);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-medium);
}

/* ================================================================== */
/*  8. Tablas: carrito, pedidos, monedero                             */
/* ================================================================== */

.woocommerce table.shop_table,
.woocommerce table.shop_attributes {
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius-lg);
	color: var(--text-body);
}

.woocommerce table.shop_table th {
	color: var(--text-heading);
	font-weight: var(--fw-bold);
	font-size: var(--fs-ui-sm);
}

.woocommerce table.shop_table td,
.woocommerce table.shop_table tbody th {
	border-top: 1px solid var(--border-hairline);
	color: var(--text-body);
}

.woocommerce table.shop_table tbody tr:nth-child(even) {
	background: var(--surface-sunken);
}

.woocommerce .cart_totals,
.woocommerce-checkout #order_review,
.woocommerce .woocommerce-info,
.woocommerce .woocommerce-message {
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius-lg);
	color: var(--text-body);
}

.woocommerce .woocommerce-message,
.woocommerce .woocommerce-info {
	border-top: 3px solid var(--accent);
}

.woocommerce .woocommerce-error {
	background: var(--danger-fill);
	border: 1px solid var(--danger-border);
	border-top-width: 3px;
	border-radius: var(--radius-lg);
	color: var(--text-body);
}

/* ================================================================== */
/*  9. Mi cuenta                                                      */
/* ================================================================== */

/* ui_kits/mi-cuenta/AccountLayout.jsx: titulo a 50px, columna de navegacion de
   280px, calle de 40px y contenido flexible. La navegacion NO es una tarjeta:
   son filas separadas por una linea, con la activa en acento y negrita. */

.woocommerce-account .woocommerce-MyAccount-navigation {
	flex: 0 1 280px;
}

.woocommerce-account .woocommerce-MyAccount-navigation ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

.woocommerce-account .woocommerce-MyAccount-navigation li {
	border-bottom: 1px solid var(--border-default);
}

.woocommerce-account .woocommerce-MyAccount-navigation li a {
	display: block;
	padding: var(--space-6) var(--space-2);
	color: var(--text-body);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-regular);
	text-decoration: none;
}

.woocommerce-account .woocommerce-MyAccount-navigation li a:hover {
	color: var(--accent);
}

.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
	color: var(--accent);
	font-weight: var(--fw-bold);
}

.woocommerce-account .woocommerce-MyAccount-content {
	flex: 1 1 620px;
	min-width: 0;
	color: var(--text-body);
}

.woocommerce-account .woocommerce-MyAccount-content h2,
.woocommerce-account .woocommerce-MyAccount-content h3 {
	color: var(--text-heading);
}

.woocommerce-account .entry-content > .woocommerce,
.woocommerce-account .woocommerce {
	display: flex;
	gap: var(--space-14);
	align-items: flex-start;
	flex-wrap: wrap;
}

.woocommerce-account h1.entry-title,
.woocommerce-account .page-title {
	font-size: var(--fs-h2);
	line-height: var(--lh-heading);
	color: var(--text-heading);
	margin: 0 0 var(--space-10);
}

@media (max-width: 767px) {
	.woocommerce-account .entry-content > .woocommerce,
	.woocommerce-account .woocommerce {
		gap: var(--space-9);
	}

	.woocommerce-account h1.entry-title,
	.woocommerce-account .page-title {
		font-size: var(--fs-h2-sm);
	}
}

/* ================================================================== */
/* 10. Texto blanco heredado del tema oscuro                          */
/* ================================================================== */

/* El style.css del hijo tiene siete reglas que fijan color:#fff SIN darse un
   fondo propio. Con el fondo oscuro de siempre eran correctas; sobre el blanco
   del tema de marca serian texto invisible — exactamente lo que le paso a los
   eventos de la portada cuando se les puso fondo claro.
   Se reescriben aqui contra tokens, igualando o superando la especificidad de
   la regla original (por eso los selectores repiten body.woocommerce y demas:
   no es redundancia, es lo que hace falta para ganar). */

.woocommerce ul.products li.product .price ins,
body.woocommerce div.product .summary .price,
body.woocommerce div.product .summary .price .amount,
body.woocommerce div.product .summary .price ins,
body.woocommerce div.product .summary .price ins .amount {
	color: var(--accent);
}

body.woocommerce div.product .summary .price del,
body.woocommerce div.product .summary .price del .amount {
	color: var(--text-secondary);
}

ul.billing_edit,
ul.billing_edit h3,
.table_back h5,
.viewlables1 {
	color: var(--text-body);
}

.hpm-listing-card .hpm-listing-title {
	color: var(--text-heading);
}

/* Pestanas de la ficha: la activa lleva el acento, las demas texto normal. */
body.woocommerce div.product .woocommerce-tabs ul.tabs li a {
	color: var(--text-body);
}

body.woocommerce div.product .woocommerce-tabs ul.tabs li.active a {
	color: var(--accent);
}

/* YITH Points quedo desactivado en el cutover de julio, pero la regla sigue en
   el CSS: si algun dia se reactiva, que no nazca invisible. */
.ywpar_tabs_header ul li.active {
	color: var(--accent);
}

/* ================================================================== */
/* 11. Cabecera                                                       */
/* ================================================================== */

/* components/chrome/SiteHeader: la cabecera va sobre --page-bg con los rotulos
   en --text-heading. Hoy header.css (holoplaza-plantillas) lleva #051518 cosido
   en cuatro sitios y los textos en #fff; con el tema de marca eso seria una
   banda oscura suelta encima de una pagina blanca, y el menu en blanco sobre
   blanco en cuanto la banda se aclarase.
   Los selectores llevan "html" delante para sumar un punto de especificidad y
   no depender de que esta hoja se imprima detras de header.css. */

html .hplt-lh,
html .hplt-lh__bar1,
html .hplt-lh__bar2 {
	background: var(--page-bg);
	color: var(--text-heading);
}

html .hplt-lh__bar2 {
	border-top: 1px solid var(--border-hairline);
	border-bottom: 1px solid var(--border-hairline);
}

html .hplt-lh__title,
html .hplt-lh__icon,
html .hplt-lh__toggle,
html .hplt-lh__menu > li > a {
	color: var(--text-heading);
}

html .hplt-lh__menu > li > a:hover,
html .hplt-lh__menu > li > a:focus {
	color: var(--accent);
}

/* La pildora del buscador: --surface-field ya esta pensada para esto — blanca
   sobre cromo oscuro, gris muy claro sobre cromo blanco (si fuese blanca sobre
   blanco desapareceria el campo). */
html .hplt-lh__search {
	background: var(--surface-field);
	border: 1px solid var(--border-default);
}

html .hplt-lh__search-input {
	color: var(--text-body);
}

html .hplt-lh__search-input::placeholder {
	color: var(--placeholder);
}

html .hplt-lh__search-btn {
	color: var(--text-secondary);
}

/* Contador del carrito: relleno de acento, glifo en --accent-contrast. */
html .hplt-lh__count {
	background: var(--accent);
	color: var(--accent-contrast);
}

/* Desplegables del menu. */
html .hplt-lh__menu .sub-menu {
	background: var(--surface-raised);
	border: 1px solid var(--border-hairline);
	box-shadow: var(--shadow-dropdown);
}

html .hplt-lh__menu .sub-menu li a {
	color: var(--text-body);
}

html .hplt-lh__menu .sub-menu li a:hover,
html .hplt-lh__menu .sub-menu li a:focus {
	background: var(--accent-fill);
	color: var(--accent);
}

/* ================================================================== */
/* 12. Mi album                                                       */
/* ================================================================== */

/* holoplaza-album tiene 15 reglas de texto blanco sin fondo propio, todas
   dentro de Mi cuenta. Estos son los selectores REALES sacados de
   assets/css/frontend.css, no una aproximacion: cada uno se repite tal cual
   para igualar la especificidad de la regla original (por eso vuelve a
   aparecer .woocommerce-MyAccount-content delante donde el original lo lleva). */
.woocommerce-MyAccount-content .hpa-collection-card h4,
.woocommerce-MyAccount-content .hpa-card-details strong,
.woocommerce-MyAccount-content .hpa-search-result .card-name,
.woocommerce-MyAccount-content .hpa-public-deck h3,
.woocommerce-MyAccount-content .hpa-collections-header h3,
.woocommerce-MyAccount-content .hpa-add-card-section h4,
.woocommerce-MyAccount-content .hpa-catalog-card-name,
.woocommerce-MyAccount-content .hpa-grid-card-name,
.woocommerce-MyAccount-content .hpa-barcode-result-info h3,
.hpa-share-modal h4,
.hpa-shared-deck-header .hpa-deck-title,
.hpa-stats-toggle,
.hpa-valuable-card strong,
.hpa-comments-section h4,
.hpa-comment-header strong {
	color: var(--text-heading);
}

/* ------------------------------------------------------------------ */
/*  Avisos de precio y restock (holoplaza-alerts)                     */
/* ------------------------------------------------------------------ */

/* Tres superficies con #051518 cosido. Sobre pagina clara eran manchas
   oscuras sueltas; van a las superficies del tema. */
.hpal-input,
.hpal-select {
	background: var(--surface-sunken);
	color: var(--text-body);
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
}

.hpal-table thead tr {
	background: var(--surface-sunken);
	color: var(--text-heading);
}

.hpal-channel-info code {
	background: var(--surface-alt);
	color: var(--text-body);
	border: 1px solid var(--border-hairline);
	border-radius: var(--radius-xs);
}

/* ------------------------------------------------------------------ */
/*  Mi mercado (holoplaza-marketplace) y pullrates                    */
/* ------------------------------------------------------------------ */

/* .hpm-game-badge NO se toca: su texto blanco va sobre el color saturado del
   juego, que es el mismo en los dos temas. Es la segunda excepcion que
   enumera el sistema, junto con los rotulos de los paneles. */

.hpr-version-badge {
	background: var(--surface-alt);
	color: var(--text-secondary);
	border: 1px solid var(--border-hairline);
}

/* ================================================================== */
/* 13. Portada: paneles de lanzamientos (.product-box)                */
/* ================================================================== */

/* components/commerce/FeatureTile. Los seis paneles de la portada son
   <a class="product-box"> de Elementor.
   OJO con el color del titulo: va #fff LITERAL en los dos temas, y es
   correcto. Es una de las excepciones que el sistema enumera — el rotulo no
   flota sobre la pagina sino sobre el velo negro al 44% que cubre la foto, y
   ese velo es el mismo en claro y en oscuro. Cambiarlo por --text-heading lo
   volveria tinta oscura sobre arte oscuro. */

.product-box {
	position: relative;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	min-height: 480px;
	padding: 25px;
	border-radius: var(--radius);
	text-decoration: none;
	background-position: bottom center;
	background-size: cover;
	background-repeat: no-repeat;
	/* El marco del hover se dibuja como sombra interior y no como borde: un
	   borde cambia la caja de contenido y el panel entero pega un salto. */
	box-shadow: inset 0 0 0 10px transparent;
	transition: box-shadow .3s;
	box-sizing: border-box;
}

.product-box:hover,
.product-box:focus-visible {
	box-shadow: inset 0 0 0 10px var(--hp-gold);
}

/* NO se dibuja aqui el velo: Elementor ya define su propio ::before sobre
   estos mismos elementos (.elementor-element-ec758a8::before y companeros, con
   el overlay al 44%). Anadir otro lo oscurecia dos veces, y el z-index forzado
   sobre los hijos peleaba con el suyo. */

/* Los rotulos van BLANCOS en los dos temas y tienen que ganar si o si.
   Elementor los pinta con .elementor-265 .elementor-element.elementor-element-XXXX
   .elementor-heading-title — cuatro clases — y ademas con --e-global-color-accent
   (oro) o --e-global-color-primary (tinta), que sobre la foto del panel dan
   dorado-sobre-rojo y negro-sobre-oliva: ilegible.
   Aqui !important esta justificado y es la unica salida limpia: el selector de
   Elementor lleva el id del widget, distinto en cada panel, asi que no hay
   forma de igualarlo sin enumerarlos uno a uno y volver a romperlo en cuanto
   se anada un panel nuevo desde el editor. */
.product-box .elementor-heading-title,
.product-box h2,
.product-box h3 {
	margin: 0;
	font-size: var(--fs-h4);
	line-height: var(--lh-heading);
	font-weight: var(--fw-bold);
	color: #fff !important;
	text-shadow: 0 1px 3px rgba(0, 0, 0, .45);
}

@media (max-width: 767px) {
	.product-box {
		min-height: 320px;
	}

	.product-box .elementor-heading-title,
	.product-box h2,
	.product-box h3 {
		font-size: var(--fs-h4-sm);
	}
}

/* ================================================================== */
/* 14. Portada: hero y agenda de eventos                              */
/* ================================================================== */

/* ui_kits/tienda/Home.jsx. El hero manda el h1 a 60px con la entradilla a 25px,
   y la agenda vive sobre --surface-sunken separada por una linea. Los eventos
   en si son productos WooCommerce normales, asi que ya los visten las reglas
   de tarjeta y precio de arriba. */

.home h1,
.page-id-265 h1,
.elementor-widget-heading h1.elementor-heading-title {
	font-size: var(--fs-h1);
	line-height: var(--lh-heading);
	color: var(--text-heading);
}

/* El maquetado pinta "TCG" en el color de marca dentro del titular. El
   <span> YA existe en el titulo de Elementor ("Compra tus <span>TCG</span>
   favoritos..."), asi que basta con darle color: no hace falta tocar la base
   de datos para esto. */
.home h1 span,
.page-id-265 h1 span,
.elementor-widget-heading h1.elementor-heading-title span {
	color: var(--accent);
}

@media (max-width: 1024px) {
	.home h1,
	.page-id-265 h1,
	.elementor-widget-heading h1.elementor-heading-title {
		font-size: var(--fs-h1-lg);
	}
}

@media (max-width: 767px) {
	.home h1,
	.page-id-265 h1,
	.elementor-widget-heading h1.elementor-heading-title {
		font-size: var(--fs-h1-sm);
	}
}

/* ================================================================== */
/* 15. Catalogo (archivos de categoria)                               */
/* ================================================================== */

/* ui_kits/tienda/Catalog.jsx: rejilla de cuatro columnas con calle de 50px,
   titulo a 50px, contador de resultados en texto secundario y el desplegable
   de orden a 260px. */

.woocommerce .woocommerce-products-header__title,
.woocommerce-page h1.page-title,
.woocommerce-products-header h1 {
	font-size: var(--fs-h2);
	line-height: 1.2em;
	font-weight: var(--fw-bold);
	color: var(--text-heading);
	margin: 0 0 var(--space-6);
}

@media (max-width: 767px) {
	.woocommerce .woocommerce-products-header__title,
	.woocommerce-page h1.page-title,
	.woocommerce-products-header h1 {
		font-size: var(--fs-h2-sm);
	}
}

.woocommerce .term-description,
.woocommerce-products-header .taxonomy-description {
	font-size: var(--fs-body);
	color: var(--text-body);
	max-width: 900px;
	line-height: var(--lh-body);
}

.woocommerce .woocommerce-result-count {
	font-size: var(--fs-ui-md);
	color: var(--text-secondary);
	margin: 0;
}

.woocommerce .woocommerce-ordering select {
	width: 260px;
	max-width: 100%;
}

/* Cuatro columnas con calle de 50px. WooCommerce reparte con float y anchos en
   porcentaje; se pasa a rejilla para que la calle sea la del sistema y las
   tarjetas compartan altura. */
.woocommerce ul.products.columns-3,
.woocommerce ul.products.columns-4,
.woocommerce ul.products.columns-5 {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: var(--space-16);
	margin: 0;
	padding: 0;
}

.woocommerce ul.products.columns-3 li.product,
.woocommerce ul.products.columns-4 li.product,
.woocommerce ul.products.columns-5 li.product {
	width: auto;
	margin: 0;
	float: none;
	display: flex;
	flex-direction: column;
}

@media (max-width: 1024px) {
	.woocommerce ul.products.columns-3,
	.woocommerce ul.products.columns-4,
	.woocommerce ul.products.columns-5 {
		grid-template-columns: repeat(3, 1fr);
		gap: var(--space-12);
	}
}

@media (max-width: 767px) {
	.woocommerce ul.products.columns-3,
	.woocommerce ul.products.columns-4,
	.woocommerce ul.products.columns-5 {
		grid-template-columns: repeat(2, 1fr);
		gap: var(--space-9);
	}
}

/* Los botones de la tarjeta se alinean abajo aunque los titulos midan distinto. */
.woocommerce ul.products li.product .button {
	margin-top: auto;
}

/* Distintivo de oferta / agotado sobre la foto. */
.woocommerce ul.products li.product .onsale,
.woocommerce span.onsale {
	background: var(--accent);
	color: var(--accent-contrast);
	border-radius: var(--radius-round);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-bold);
	text-transform: uppercase;
	letter-spacing: var(--ls-badge);
	padding: var(--space-2) var(--space-6);
	min-height: 0;
	min-width: 0;
	line-height: 1.6;
}

/* ==================================================================
   16. Ficha de producto  — BORRADA (17-ago-2026)
   ==================================================================
   La sustituye por completo la seccion 27, escrita contra el marcado nuevo de
   la caja de compra (.hlz-buybox). Aqui habia titulo, galeria, descripcion
   corta y pestanas: todo repetido y peor.
   La unica pieza que la 27 no cubria eran los rotulos de .related > h2 y
   .upsells > h2; estan recogidos en la seccion de tienda del final.
   La regla que hubo que mirar dos veces antes de borrar fue
   `.woocommerce .quantity input.qty`, que NO estaba acotada a la ficha:
   comprobado que el carrito lo cubre la seccion 28 y la ficha la 27.
   ================================================================== */

/* ================================================================== */
/* 17. Finalizar compra                                               */
/* ================================================================== */

.woocommerce-checkout h3,
.woocommerce-checkout #order_review_heading {
	font-size: var(--fs-h5);
	color: var(--text-heading);
	font-weight: var(--fw-bold);
}

.woocommerce-checkout #payment {
	background: var(--surface-sunken);
	border: 1px solid var(--border-default);
	border-radius: var(--radius-lg);
}

.woocommerce-checkout #payment ul.payment_methods {
	border-bottom: 1px solid var(--border-hairline);
}

.woocommerce-checkout #payment div.payment_box {
	background: var(--surface-raised);
	color: var(--text-body);
	border-radius: var(--radius);
}

.woocommerce-checkout #payment div.payment_box::before {
	border-bottom-color: var(--surface-raised);
}

.woocommerce-checkout #payment .place-order .button {
	width: 100%;
	font-size: var(--fs-ui-md);
}

/* Cupon y aviso de cupon del carrito. */
.woocommerce .cart .coupon input.input-text {
	min-width: 200px;
}


/* ================================================================== */
/* 19. Migas, paginacion y buscador                                   */
/* ================================================================== */

.woocommerce .woocommerce-breadcrumb,
.woocommerce-breadcrumb {
	font-size: var(--fs-ui-sm);
	color: var(--text-secondary);
}

.woocommerce .woocommerce-breadcrumb a {
	color: var(--text-secondary);
}

.woocommerce .woocommerce-breadcrumb a:hover {
	color: var(--accent);
}

/* La tienda NO envuelve la paginacion en <nav class="woocommerce-pagination">:
   sale como <ul class="page-numbers"> suelto (lo comprobado en /tienda/), asi
   que hay que cubrir las dos formas o los numeros se quedan sin estilo. */
.woocommerce nav.woocommerce-pagination ul,
ul.page-numbers {
	border: 0;
	display: flex;
	gap: var(--space-4);
	justify-content: center;
	list-style: none;
	margin: var(--space-12) 0 0;
	padding: 0;
}

.woocommerce nav.woocommerce-pagination ul li,
ul.page-numbers li {
	border: 0;
	margin: 0;
}

.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span,
ul.page-numbers li a.page-numbers,
ul.page-numbers li span.page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 38px;
	height: 38px;
	padding: 0 var(--space-5);
	border: 1px solid var(--border-default);
	border-radius: var(--radius-sm);
	background: var(--surface-card);
	color: var(--text-body);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-medium);
}

.woocommerce nav.woocommerce-pagination ul li span.current,
.woocommerce nav.woocommerce-pagination ul li a:hover,
ul.page-numbers li span.page-numbers.current,
ul.page-numbers li a.page-numbers:hover {
	background: var(--accent);
	border-color: var(--accent);
	color: var(--accent-contrast);
}

/* ------------------------------------------------------------------ */
/*  Selector de idioma (holoplaza-plantillas)                         */
/* ------------------------------------------------------------------ */

/* Su CSS va inline en la pagina con el naranja cosido, y el separador es
   blanco translucido: sobre cromo claro desaparece. El boton en si usa
   color:inherit, asi que ese ya sigue a la cabecera y no hay que tocarlo. */

.hpt-lang-btn:hover {
	border-color: var(--accent);
	background: var(--accent-fill-faint);
}

.hpt-lang-btn.active {
	border-color: var(--accent);
	background: var(--accent-fill-strong);
}

.hpt-divider {
	color: var(--border-strong);
}

/* ================================================================== */
/* 20. Pie de pagina                                                  */
/* ================================================================== */

/* El pie vive en bloques de widget guardados en la base de datos, no en el
   repo, asi que solo se le pasan las superficies del tema. */
.site-footer,
.site-info,
.footer-widgets {
	background: var(--surface-sunken);
	color: var(--text-body);
	border-top: 1px solid var(--border-default);
}

.site-footer h5,
.footer-widgets h5,
.footer-widgets .widget-title {
	color: var(--text-heading);
	font-size: var(--fs-h5-sm);
	font-weight: var(--fw-bold);
	letter-spacing: var(--ls-badge);
}

.site-footer a,
.footer-widgets a {
	color: var(--text-body);
}

.site-footer a:hover,
.footer-widgets a:hover {
	color: var(--accent);
}

/* ================================================================== */
/* 21. Holo Premium                                                   */
/* ================================================================== */

/* El front.css del plugin se escribio contra el tema oscuro: banner con el
   degradado naranja->crema y tinta #051518 encima, y el CTA al reves (fondo
   tinta, texto blanco).
   AVISO EXPRESO DEL SISTEMA, y aqui aplica entero: nunca tinta oscura sobre
   --gradient-cta. En el tema de marca el degradado arranca en el carmesi
   #BB1823 y el texto oscuro NO llega a contraste. La receta del sistema es
   acento plano + --accent-contrast, y es lo que se hace. */

.hprm-banner {
	background: var(--accent);
	color: var(--accent-contrast);
}

.hprm-banner__cta {
	background: var(--accent-contrast);
	color: var(--accent) !important;
	border-radius: var(--radius);
}

.hprm-banner__cta:hover {
	background: var(--surface-card-hover);
	color: var(--accent-hover) !important;
}

.hprm-banner__cerrar {
	color: var(--accent-contrast);
}

/* Aviso en la ficha ("Socios Holo Premium: -5 % al finalizar la compra"),
   bonus del mercado y caja de estado en Mi cuenta. */
.hprm-product-notice,
.hprm-reserva-aviso {
	background: var(--accent-fill);
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	color: var(--text-body);
	padding: var(--space-6) var(--space-8);
	font-size: var(--fs-ui-sm);
}

.hprm-buylist-bonus {
	color: var(--accent);
	font-weight: var(--fw-bold);
}

.hprm-buylist-bonus--promo {
	color: var(--text-muted);
	font-weight: var(--fw-regular);
}

.hprm-cuenta-caja {
	background: var(--surface-card);
	border: 1px solid var(--accent);
	border-radius: var(--radius-lg);
	padding: var(--space-10);
	color: var(--text-body);
}

.hprm-cuenta-caja--inactiva {
	border-color: var(--border-default);
}

.hprm-cuenta-estado {
	color: var(--accent);
	font-weight: var(--fw-bold);
}

.hprm-cart-badge {
	background: var(--accent);
	color: var(--accent-contrast);
	border-radius: var(--radius-round);
	padding: var(--space-1) var(--space-5);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-bold);
	text-transform: uppercase;
	letter-spacing: var(--ls-badge);
}

/* ================================================================== */
/* 22. Contenedor                                                     */
/* ================================================================== */

/* El sistema fija el contenedor en 1400px, siempre. */
.site-content .container,
.grid-container,
.elementor-section.elementor-section-boxed > .elementor-container {
	max-width: var(--container-max);
}

/* ================================================================== */
/* 23. Portada: paneles de lanzamientos y agenda (componentes nuevos) */
/* ================================================================== */

/* Marcado generado por mu-plugins/holoplaza-ds-portada.php. Estos paneles no
   son los .product-box de Elementor: llevan antetitulo, titulo, fecha y la
   foto del producto recortada, que es lo que pide el maquetado y no cabe en el
   marcado de Elementor (un enlace con UN titulo y una foto de fondo). Una hoja
   de estilos no puede inventarse elementos que no estan en el HTML. */

.hlzds-lanzamientos {
	max-width: var(--container-max);
	margin: 0 auto;
	padding: var(--space-16) var(--space-16) var(--space-20);
	box-sizing: border-box;
}

.hlzds-lanzamientos__titulo {
	margin: 0 0 var(--space-10);
	font-size: var(--fs-h2);
	line-height: 1.2em;
	font-weight: var(--fw-bold);
	color: var(--text-heading);
}

.hlzds-lanzamientos__fila {
	display: flex;
	gap: var(--space-9);
	margin-bottom: var(--space-9);
	align-items: stretch;
}

/* Los anchos son distintos a proposito (47/51 arriba, 34/32/30 abajo): siguen
   la longitud del titulo, y es lo que evita que la rejilla parezca una tabla. */
.hlzds-tile {
	position: relative;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	flex: 0 0 var(--tile-w, 33%);
	min-height: var(--tile-h, 600px);
	padding: var(--space-12);
	border-radius: var(--radius-lg);
	text-decoration: none;
	background: var(--tile-bg, var(--surface-card));
	box-sizing: border-box;
	/* El marco del hover como sombra interior y no como borde: un borde cambia
	   la caja de contenido y el panel pega un salto al pasar por encima. */
	box-shadow: inset 0 0 0 0 transparent;
	transition: box-shadow .3s ease, transform .3s ease;
}

.hlzds-tile:hover,
.hlzds-tile:focus-visible {
	box-shadow: inset 0 0 0 6px var(--tile-accent, var(--hp-gold));
	transform: translateY(-3px);
}

/* Texto SIEMPRE blanco: va sobre el degradado saturado del panel, que es el
   mismo en los dos temas. Es la excepcion que enumera el sistema; no cambiar
   por --text-heading. */
.hlzds-tile__eyebrow {
	position: relative;
	z-index: 2;
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-bold);
	text-transform: uppercase;
	letter-spacing: var(--ls-badge);
	color: #fff;
	opacity: .85;
	margin-bottom: var(--space-4);
}

.hlzds-tile__titulo {
	position: relative;
	z-index: 2;
	margin: 0;
	font-size: var(--fs-h4);
	line-height: 1.2;
	font-weight: var(--fw-bold);
	color: #fff;
}

.hlzds-tile__meta {
	position: relative;
	z-index: 2;
	margin-top: var(--space-5);
	font-size: var(--fs-ui-sm);
	color: #fff;
	opacity: .9;
}

/* flex 1 1 0 y no auto: con auto la linea flex cuenta la altura INTRINSECA de
   la imagen, el panel crece por encima de su minimo segun los pixeles que
   tenga el archivo, y los paneles hermanos dejan de compartir el borde
   inferior. Con base 0 la foto ocupa solo el hueco sobrante. */
.hlzds-tile__img {
	position: relative;
	z-index: 2;
	flex: 1 1 0;
	min-height: 0;
	width: 100%;
	margin-top: var(--space-9);
	object-fit: contain;
	object-position: center bottom;
}

@media (max-width: 1024px) {
	.hlzds-lanzamientos__fila {
		flex-wrap: wrap;
	}

	.hlzds-tile {
		flex: 1 1 calc(50% - var(--space-9));
		min-height: 420px;
	}
}

@media (max-width: 767px) {
	.hlzds-lanzamientos {
		padding: var(--space-10) var(--space-9) var(--space-14);
	}

	.hlzds-tile {
		flex: 1 1 100%;
		min-height: 360px;
		padding: var(--space-9);
	}

	.hlzds-tile__titulo {
		font-size: var(--fs-h4-sm);
	}
}

/* ------------------------------------------------------------------ */
/*  Agenda de eventos                                                  */
/* ------------------------------------------------------------------ */

.hlzds-agenda {
	background: var(--surface-sunken);
	border-top: 1px solid var(--border-default);
	padding: var(--space-20) var(--space-16) var(--space-24);
}

.hlzds-agenda__cab {
	max-width: 1000px;
	margin: 0 auto var(--space-12);
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: var(--space-9);
	flex-wrap: wrap;
}

.hlzds-agenda__titulo {
	margin: 0;
	font-size: var(--fs-h2);
	line-height: 1.2em;
	font-weight: var(--fw-bold);
	color: var(--text-heading);
}

.hlzds-agenda__sub {
	margin: var(--space-4) 0 0;
	font-size: var(--fs-ui-md);
	color: var(--text-secondary);
}

.hlzds-agenda__todos {
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-semibold);
	color: var(--text-heading);
	text-decoration: underline;
}

.hlzds-agenda__todos:hover {
	color: var(--accent);
}

.hlzds-agenda__lista {
	max-width: 1000px;
	margin: 0 auto;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: var(--space-6);
}

.hlzds-evento {
	display: flex;
	align-items: center;
	gap: var(--space-10);
	padding: var(--space-8) var(--space-10);
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	transition: border-color .15s ease, box-shadow .15s ease;
}

.hlzds-evento:hover {
	border-color: var(--accent);
	box-shadow: var(--shadow-card);
}

.hlzds-evento__fecha {
	flex: 0 0 auto;
	min-width: 88px;
	text-align: center;
	padding-right: var(--space-10);
	border-right: 1px solid var(--border-default);
}

.hlzds-evento__dia {
	display: block;
	font-size: 32px;
	font-weight: var(--fw-bold);
	color: var(--text-heading);
	line-height: 1;
}

.hlzds-evento__dow {
	display: block;
	margin-top: var(--space-2);
	font-size: var(--fs-ui-3xs);
	font-weight: var(--fw-bold);
	letter-spacing: var(--ls-badge);
	text-transform: uppercase;
	color: var(--text-secondary);
	white-space: nowrap;
}

.hlzds-evento__cuerpo {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: var(--space-3);
	align-items: flex-start;
}

/* Chip del juego: blanco sobre el color saturado del juego. Segunda excepcion
   del sistema — el relleno es el mismo en ambos temas. */
.hlzds-evento__juego {
	padding: var(--space-1) var(--space-5);
	border-radius: var(--radius-round);
	font-size: var(--fs-ui-3xs);
	font-weight: var(--fw-bold);
	text-transform: uppercase;
	letter-spacing: var(--ls-badge);
	color: #fff;
	background: var(--game-otros);
}

.hlzds-juego--pokemon      { background: var(--game-pokemon); }
.hlzds-juego--onepiece     { background: var(--game-onepiece); }
.hlzds-juego--magic        { background: var(--game-magic); }
.hlzds-juego--yugioh       { background: var(--game-yugioh); }
.hlzds-juego--riftbound    { background: var(--game-riftbound); }
.hlzds-juego--finalfantasy { background: var(--game-finalfantasy); }

.hlzds-evento__titulo {
	font-size: var(--fs-ui-lg);
	font-weight: var(--fw-semibold);
	color: var(--text-heading);
	line-height: var(--lh-tight);
	text-decoration: none;
}

.hlzds-evento__titulo:hover {
	color: var(--accent);
}

.hlzds-evento__accion {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	gap: var(--space-8);
}

.hlzds-evento__precio {
	font-size: var(--fs-ui-lg);
	font-weight: var(--fw-bold);
	color: var(--accent);
	white-space: nowrap;
}

.hlzds-evento__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: var(--space-5) var(--space-8);
	border-radius: var(--radius);
	background: var(--accent);
	color: var(--accent-contrast);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-bold);
	text-decoration: none;
	white-space: nowrap;
}

.hlzds-evento__btn:hover {
	background: var(--accent-hover);
	color: var(--accent-contrast);
}

.hlzds-evento__btn--agotado {
	background: var(--surface-alt);
	color: var(--text-muted);
	cursor: default;
}

@media (max-width: 767px) {
	.hlzds-agenda {
		padding: var(--space-14) var(--space-9) var(--space-16);
	}

	.hlzds-evento {
		flex-wrap: wrap;
		gap: var(--space-6);
	}

	.hlzds-evento__fecha {
		min-width: 64px;
		padding-right: var(--space-6);
	}

	.hlzds-evento__accion {
		width: 100%;
		justify-content: space-between;
	}
}

/* ================================================================== */
/* 24. Cabecera: piezas nuevas del maquetado                          */
/* ================================================================== */

/* components/chrome/SiteHeader: el maquetado suma al cromo un interruptor de
   tema, un separador, la medalla de socio junto a la cuenta y el total del
   carrito en euros. El marcado lo pinta
   holoplaza-plantillas/includes/class-hplt-live-header.php. */

html .hplt-lh__actions {
	display: flex;
	align-items: center;
	gap: 18px;
}

html .hplt-lh__sep {
	width: 1px;
	height: 22px;
	background: var(--border-default);
	flex: 0 0 auto;
}

html .hplt-lh__theme {
	border: 0;
	background: none;
	cursor: pointer;
	padding: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--text-heading);
}

html .hplt-lh__theme:hover {
	color: var(--accent);
}

/* Se ve la luna cuando estas en claro (para irte a oscuro) y el sol cuando
   estas en oscuro. Nunca los dos. */
html .hplt-lh__ico-sol {
	display: none;
}

html[data-theme="dark"] .hplt-lh__ico-luna {
	display: none;
}

html[data-theme="dark"] .hplt-lh__ico-sol {
	display: inline-block;
}

html .hplt-lh__cuenta-grupo {
	display: inline-flex;
	align-items: center;
	gap: 7px;
}

html .hplt-lh__medalla {
	width: 26px;
	height: 26px;
	display: block;
	flex: 0 0 auto;
}

html .hplt-lh__cart-total {
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-bold);
	color: var(--text-heading);
	white-space: nowrap;
}

/* El menu del maquetado es una barra centrada con los enlaces en 15px/600 y
   una altura minima de 52px. */
html .hplt-lh__menu {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 2px 8px;
	min-height: 52px;
	margin: 0;
	padding: 0;
	list-style: none;
}

html .hplt-lh__menu > li > a {
	display: inline-flex;
	align-items: center;
	gap: var(--space-3);
	padding: var(--space-7) var(--space-8);
	font-size: var(--fs-ui);
	font-weight: var(--fw-semibold);
	white-space: nowrap;
	transition: color .15s;
}

@media (max-width: 900px) {
	html .hplt-lh__cart-total,
	html .hplt-lh__sep {
		display: none;
	}
}

/* ================================================================== */
/* 25. Barra de menu: que quepa en una linea                          */
/* ================================================================== */

/* Con nueve entradas de primer nivel la barra se partia en dos lineas y
   «Otros TCG» caia sola debajo, centrada, pareciendo un error. El maquetado la
   quiere en UNA sola linea.
   Se reduce el hueco entre entradas y se recorta el relleno lateral segun el
   ancho disponible, en vez de bajar el tamano de letra: el sistema fija los
   enlaces del menu en 15px/600 y encogerlos rompe la jerarquia tipografica. */

html .hplt-lh__menu {
	flex-wrap: nowrap;
	justify-content: center;
	gap: 0;
}

@media (max-width: 1400px) {
	html .hplt-lh__menu > li > a {
		padding-left: var(--space-6);
		padding-right: var(--space-6);
	}
}

@media (max-width: 1200px) {
	html .hplt-lh__menu > li > a {
		padding-left: var(--space-4);
		padding-right: var(--space-4);
	}
}

/* Por debajo de esto no cabe de ninguna manera: se permite el salto de linea
   otra vez, que es preferible a un menu recortado o con desplazamiento
   horizontal escondido. */
@media (max-width: 1080px) {
	html .hplt-lh__menu {
		flex-wrap: wrap;
	}
}

/* Los submenus pueden ser muy largos (One Piece tiene catorce entradas). Se
   limita su alto y se les deja desplazamiento propio para que no se salgan de
   la pantalla. */
html .hplt-lh__menu .sub-menu {
	max-height: min(70vh, 560px);
	overflow-y: auto;
	overscroll-behavior: contain;
}


/* ==================================================================
   26. Catalogo  — BORRADA (17-ago-2026): NO PINTABA NADA
   ==================================================================
   585 lineas y 67 selectores que casaban con CERO elementos. Todos empezaban
   por `html body .woocommerce ...` — con espacio —, y eso exige un elemento
   con clase `woocommerce` DENTRO del body. En archivo de categoria y en ficha
   ese elemento no existe: la clase la lleva el propio <body>. Verificado con
   un selector CSS sobre el HTML de produccion: `body .woocommerce` devuelve 0
   en /categoria/..., /tienda/ y /producto/....
   (En el carrito SI existe, porque lo abre el shortcode, y por eso la seccion
   28 si se veia. De ahi que el fallo pasara desapercibido.)
   La sustituye la seccion de tienda del final, con `html body[class*="woocommerce"]`,
   que ademas casa con woocommerce-page y woocommerce-cart.
   ================================================================== */

/* ==================================================================
   27. Ficha
   ================================================================== */
/* ==================================================================
   HoloPlaza TCG — FICHA DE PRODUCTO (single-product)
   Referencia: ui_kits/tienda/Product.jsx + commerce/{Price,StockNotice,
   QuantityStepper}.jsx. Solo tokens de ds/{colors,typography,spacing,
   effects}.css.

   POR QUE TANTOS SELECTORES LARGOS
   La ficha es la pagina mas disputada del sitio: compiten tres capas que
   cargan ANTES que este archivo y que en muchos casos llevan !important
   con valores del tema oscuro viejo escritos a pelo:

     1. woocommerce.css (nucleo)
     2. gp-premium/woocommerce/.../woocommerce.min.css  (columnas al 50%,
        stepper de 50x50 con borde rgba(0,0,0,.1))
     3. generatepress_child/style.css  (#051518 de fondo en los campos,
        #FF8C42 !important en el CTA, #fff en el precio y en las pestanas)

   Por eso casi todo va prefijado con `html body`: sube la especificidad
   por encima de esas reglas sin recurrir a !important salvo donde la capa
   3 ya lo usa (CTA, avisos de stock, flash de oferta). Cada !important de
   este archivo esta ahi para tumbar otro !important, no por comodidad.
   ================================================================== */


/* ==================================================================
   1. Rejilla de la ficha: galeria | panel de compra
   ================================================================== */

/* Product.jsx monta dos columnas que terminan a la vez
   (minmax(320px,1.1fr) / minmax(340px,1fr), hueco de 50px). En vivo eso
   son floats: GP le da 50% a div.images y deja .summary con
   overflow:hidden haciendo de BFC. Con floats las dos columnas no se
   alinean por arriba ni comparten altura, asi que se pasa a grid. */
html body.single-product div.product {
	display: grid;
	grid-template-columns: minmax(320px, 1.1fr) minmax(340px, 1fr);
	gap: var(--grid-gap-lg);
	align-items: start;
	max-width: var(--container-max);
	margin-inline: auto;
}

/* Todo lo que no sea galeria o panel (pestanas, relacionados, upsells y
   lo que inyecte cualquier plugin) ocupa el ancho entero. Se escribe en
   negativo a proposito: asi no hay que ir anadiendo selectores cada vez
   que un plugin mete una seccion nueva bajo div.product.
   span.onsale queda fuera: es hijo absoluto de div.product (no de la
   galeria), asi que la rejilla SI decide su area; con 1/-1 el `right`
   lo mandaba al borde derecho de la ficha, encima del panel de compra. */
html body.single-product div.product > *:not(.images):not(.summary):not(.onsale) {
	grid-column: 1 / -1;
}

html body.single-product div.product div.images {
	width: 100%;
	float: none;
	margin: 0;
}

html body.single-product div.product div.summary {
	width: 100%;
	float: none;
	/* GP pone overflow:hidden para el BFC del float; ya no hace falta y
	   recortaba el anillo de foco de los controles del panel. */
	overflow: visible;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: var(--space-9);
	margin: 0;
}

/* El gap manda el ritmo vertical; los margenes sueltos de WooCommerce
   (p.price, form.cart, .product_meta) lo descuadraban. */
html body.single-product div.product div.summary > * {
	margin-block: 0;
}

@media (max-width: 900px) {
	html body.single-product div.product {
		grid-template-columns: 1fr;
		gap: var(--space-12);
	}
}


/* ==================================================================
   2. Galeria sobre plancha blanca
   ================================================================== */

/* EXCEPCION DEL SISTEMA: --plate es blanco en los dos temas. El arte de
   las cartas y las cajas viene recortado sobre blanco; sobre el fondo
   oscuro se les veria el halo del recorte. */
html body.single-product div.product div.images,
html body.single-product div.product .woocommerce-product-gallery {
	background: var(--plate);
	border: var(--border-w) solid var(--border-default);
	border-radius: var(--radius);
	padding: var(--space-10);
	box-sizing: border-box;
	position: relative;
}

html body.single-product div.product .woocommerce-product-gallery__wrapper img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--radius-xs);
}

/* Miniaturas: las pinta flexslider cuando arranca el JS. */
html body.single-product div.product .flex-control-thumbs {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-4);
	margin: var(--space-8) 0 0;
	padding: 0;
	list-style: none;
}

html body.single-product div.product .flex-control-thumbs li {
	width: auto;
	margin: 0;
	float: none;
}

html body.single-product div.product .flex-control-thumbs img {
	width: 64px;
	height: 64px;
	object-fit: contain;
	border: var(--border-w) solid var(--border-default);
	border-radius: var(--radius-xs);
	opacity: 1;
	cursor: pointer;
	transition: border-color var(--dur) var(--ease);
}

html body.single-product div.product .flex-control-thumbs img:hover,
html body.single-product div.product .flex-control-thumbs img.flex-active {
	border-color: var(--accent);
}

/* Flash de oferta: el tema hijo lo fija con background-color:#a00
   !important, que es justo el valor de --hp-sale. Se reescribe con el
   token (mismo pixel, ya dentro del sistema) y hace falta !important
   para ganarle. */
html body.single-product div.product span.onsale {
	position: absolute;
	/* Se ancla al area de la galeria (columna 1, fila 1) para que el
	   `right` mida contra la plancha y no contra la ficha entera. */
	grid-column: 1;
	grid-row: 1;
	top: var(--space-6);
	right: var(--space-6);
	left: auto;
	margin: 0;
	min-height: 0;
	min-width: 0;
	padding: var(--space-2) var(--space-5) !important;
	border-radius: var(--radius-sm) !important;
	background: var(--hp-sale) !important;
	color: var(--hp-white);
	font-size: var(--fs-ui-3xs);
	font-weight: var(--fw-bold);
	line-height: 1.6;
	text-transform: uppercase;
	letter-spacing: var(--ls-badge);
	z-index: 2;
}


/* ==================================================================
   3. Antetitulo (expansion), titulo y badges de estado
   ================================================================== */

/* El antetitulo, el h1 y los badges son UN bloque: con el hueco de 20px
   de .summary se separaban tanto entre si como del panel de compra, y
   dejaban de leerse como una unidad. El PHP los envuelve en
   .hlz-encabezado para poder darles su propio ritmo (10px) sin margenes
   negativos. */
html body.single-product div.product .summary .hlz-encabezado {
	display: flex;
	flex-direction: column;
	gap: var(--space-5);
}

/* Antetitulo en carmesi y mayusculas. --accent es carmesi en el tema
   claro (#BB1823, el rojo del logo) y naranja en el oscuro: el papel
   —«la etiqueta de la expansion lleva el color de marca»— es el mismo en
   los dos, que es lo que define el token. */
html body.single-product div.product .summary .hlz-eyebrow {
	margin: 0;
	color: var(--accent);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-bold);
	line-height: 1.4;
	text-transform: uppercase;
	letter-spacing: var(--ls-label);
}

html body.single-product div.product .summary .hlz-eyebrow a {
	color: inherit;
	text-decoration: none;
}

html body.single-product div.product .summary .hlz-eyebrow a:hover {
	text-decoration: underline;
}

html body.single-product div.product .summary h1.product_title {
	margin: 0;
	color: var(--text-heading);
	font-size: var(--fs-h3);
	font-weight: var(--fw-bold);
	line-height: var(--lh-tight);
}

@media (max-width: 767px) {
	html body.single-product div.product .summary h1.product_title {
		font-size: var(--fs-h3-sm);
	}
}

html body.single-product div.product .summary .hlz-badges {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-4);
	margin: 0;
}

html body.single-product div.product .summary .hlz-badge {
	display: inline-flex;
	align-items: center;
	padding: var(--space-2) var(--space-5);
	border-radius: var(--radius-sm);
	font-size: var(--fs-ui-3xs);
	font-weight: var(--fw-bold);
	line-height: 1.6;
	text-transform: uppercase;
	letter-spacing: var(--ls-badge);
}

/* NUEVO en verde. El kit usa --hp-success-4 (#27ae60) con texto blanco,
   pero ese par se queda en 2,9:1 y esto es texto de 11px: no pasa. Se usa
   --stock-in (el verde que el sistema ya oscurecio para aguantar 4,5:1)
   con --page-bg de tinta, o sea el fondo de la pagina «recortado» sobre
   el verde. Da 5,5:1 en claro y 7,5:1 en oscuro, y sigue siendo el verde
   de stock del sistema en los dos temas. */
html body.single-product div.product .summary .hlz-badge.is-nuevo {
	background: var(--stock-in);
	color: var(--page-bg);
}

html body.single-product div.product .summary .hlz-badge.is-agotado {
	background: var(--hp-black);
	color: var(--hp-white);
}

html body.single-product div.product .summary .hlz-badge.is-reserva {
	background: var(--hp-info-strong);
	color: var(--hp-white);
}


/* ==================================================================
   4. Caja de compra
   ================================================================== */

/* Product.jsx: el precio, el aviso de stock, la variacion, el contador y
   el CTA viven DENTRO de una caja con borde. Antes el CTA flotaba en
   medio del hueco con media pantalla vacia; la caja es lo que hace que
   la columna derecha termine a la vez que la galeria. */
html body.single-product div.product .summary .hlz-buybox {
	display: flex;
	flex-direction: column;
	gap: var(--space-8);
	padding: var(--space-10);
	background: var(--surface-card);
	border: var(--border-w) solid var(--border-default);
	border-radius: var(--radius);
	box-sizing: border-box;
}

html body.single-product div.product .summary .hlz-buybox > * {
	margin-block: 0;
}

/* El aviso de Holo Premium («−5% al finalizar la compra») lo mete el
   plugin holoplaza-premium justo detras del precio, o sea dentro de la
   caja. Se le quita el margen y se le baja el tono para que no compita
   con el importe. */
html body.single-product div.product .summary .hlz-buybox .hprm-product-notice {
	margin: 0;
	color: var(--text-secondary);
	font-size: var(--fs-ui-xs);
	line-height: 1.5;
}


/* ==================================================================
   5. Precio
   ================================================================== */

/* Price.jsx: importe y tachado en la misma linea de base, con 8px de
   hueco. El COLOR no se toca aqui a proposito: el acento del precio ya
   lo fija holoplaza-ds.css y es el mismo criterio que en la parrilla del
   catalogo; cambiarlo solo en la ficha rompe la lectura de la tienda. */
html body.single-product div.product .summary .hlz-buybox p.price {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: var(--space-4);
	margin: 0;
	font-size: var(--fs-h5);
	font-weight: var(--fw-bold);
	line-height: 1.2;
}

html body.single-product div.product .summary .hlz-buybox p.price del,
html body.single-product div.product .summary .hlz-buybox p.price del .amount {
	color: var(--text-secondary);
	/* WooCommerce baja el tachado al 50% de opacidad: sobre blanco se
	   queda en un gris que no se lee. */
	opacity: 1;
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-regular);
	text-decoration: line-through;
}

html body.single-product div.product .summary .hlz-buybox p.price ins {
	text-decoration: none;
}

/* Precio de la variacion elegida: mismo tamano que el de arriba para que
   no «salte» al elegir idioma. */
html body.single-product div.product .woocommerce-variation-price .price {
	font-size: var(--fs-h5);
	font-weight: var(--fw-bold);
}


/* ==================================================================
   6. Aviso de stock
   ================================================================== */

/* StockNotice.jsx: panel tintado, 8px de radio, centrado. Aplica a los
   tres sitios donde puede salir un aviso: el estatico que pinta el PHP
   de esta tanda, el que WooCommerce inyecta al elegir variacion y el de
   los productos simples.
   Los !important son obligados: style.css del hijo trae
   `background: rgba(...) !important; color: #66b520 !important` en
   .woocommerce-variation-availability p.stock, y ese verde claro sobre
   el fondo tintado no llega a 4,5:1 en el tema claro (por eso el sistema
   tiene --stock-in). */
html body.single-product div.product .summary .hlz-stock,
html body.single-product div.product .woocommerce-variation-availability p.stock,
html body.single-product div.product .summary p.stock {
	display: block;
	margin: 0;
	padding: var(--space-4) var(--space-6);
	border-radius: var(--radius);
	background: var(--success-fill) !important;
	border: var(--border-w) solid var(--success-border);
	color: var(--stock-in) !important;
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
	line-height: 1.5;
	text-align: center;
}

html body.single-product div.product .summary .hlz-stock.is-out,
html body.single-product div.product .woocommerce-variation-availability p.stock.out-of-stock,
html body.single-product div.product .summary p.stock.out-of-stock {
	padding: var(--space-5);
	background: var(--danger-fill) !important;
	border-color: var(--danger-border);
	color: var(--stock-out) !important;
	font-weight: var(--fw-bold);
}

/* El aviso estatico desaparece en cuanto WooCommerce pinta el de la
   variacion elegida: si no, salen dos avisos que ademas pueden decir
   cosas distintas (el padre «en stock», la variacion «puede reservarse»)
   y manda el de la variacion, que es el que corresponde a lo que se
   compra. Sin :has() se verian los dos; es feo, pero no miente. */
html body.single-product div.product .summary:has(.woocommerce-variation-availability p.stock) .hlz-stock {
	display: none;
}


/* ==================================================================
   7. Selector de variacion
   ================================================================== */

html body.single-product div.product form.cart {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-8);
	margin: 0;
}

html body.single-product div.product form.cart table.variations {
	display: block;
	width: 100%;
	margin: 0;
	border: 0;
}

html body.single-product div.product form.cart table.variations tbody,
html body.single-product div.product form.cart table.variations tr {
	display: block;
	width: 100%;
	border: 0;
}

html body.single-product div.product form.cart table.variations th.label,
html body.single-product div.product form.cart table.variations td.value {
	display: block;
	width: 100%;
	padding: 0;
	border: 0;
	text-align: left;
	background: transparent;
}

html body.single-product div.product form.cart table.variations th.label label {
	display: block;
	margin: 0 0 var(--space-3);
	color: var(--text-secondary);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-bold);
	text-transform: uppercase;
	letter-spacing: var(--ls-label);
}

/* El campo: el tema hijo lo pinta en #051518 con borde blanco (herencia
   del Elementor oscuro). Sobre el fondo claro es una mancha negra. */
html body.single-product div.product form.cart table.variations td.value select,
html body.single-product div.product form.cart .variations select {
	width: 100%;
	max-width: 100%;
	min-height: var(--control-h);
	padding: var(--space-5) var(--space-7);
	background-color: var(--surface-sunken);
	color: var(--text-heading);
	border: var(--border-w) solid var(--field-border);
	border-radius: var(--radius-sm);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	transition: var(--transition-color);
}

html body.single-product div.product form.cart .variations select:hover {
	border-color: var(--accent);
}

html body.single-product div.product form.cart .variations select:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

html body.single-product div.product form.cart a.reset_variations {
	display: inline-block;
	margin-top: var(--space-3);
	color: var(--text-secondary);
	font-size: var(--fs-ui-xs);
	text-decoration: underline;
}

html body.single-product div.product form.cart a.reset_variations:hover {
	color: var(--accent);
}

/* Panel de la variacion elegida: el tema hijo lo centraba con flex; aqui
   los hijos (precio y aviso) tienen que ocupar el ancho de la caja. */
html body.single-product div.product .woocommerce-variation.single_variation {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-6);
	margin: 0 0 var(--space-8);
	padding: 0;
	background: transparent;
}


/* ==================================================================
   8. Stepper de cantidad  (−  1  +)
   ================================================================== */

/* QuantityStepper.jsx: 40x44 / 56x44 / 40x44, fondo hundido, radios solo
   en los extremos, hover naranja-o-carmesi en glifo y borde.
   Los −/+ salen de dos sitios distintos y hay que vestir los dos o se ve
   un salto al cargar:
     · <a class="minus"> / <a class="plus"> que inyecta GP Premium con
       jQuery (quantityButtons esta a "1" en produccion);
     · ::before/::after de GP sobre .quantity:not(.buttons-added), que es
       lo que se ve MIENTRAS el JS no ha corrido. */
html body.single-product div.product form.cart .woocommerce-variation-add-to-cart,
html body.single-product div.product form.cart .single_variation_wrap {
	display: flex;
	flex-direction: column;
	align-items: stretch;
	gap: var(--space-8);
	width: 100%;
	margin: 0;
}

html body.single-product div.product form.cart div.quantity,
html body.single-product div.product form.cart div.quantity.buttons-added {
	display: inline-flex;
	align-items: center;
	align-self: flex-start;
	width: auto;
	max-width: none;
	margin: 0;
	float: none;
}

html body.single-product div.product form.cart div.quantity .minus,
html body.single-product div.product form.cart div.quantity .plus,
html body.single-product div.product form.cart div.quantity:not(.buttons-added):not(.hidden)::before,
html body.single-product div.product form.cart div.quantity:not(.buttons-added):not(.hidden)::after {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: var(--stepper-w);
	min-width: var(--stepper-w);
	height: var(--control-h);
	min-height: var(--control-h);
	padding: 0;
	background: var(--surface-sunken);
	color: var(--text-body);
	border: var(--border-w) solid var(--field-border);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-lg);
	line-height: 1;
	text-align: center;
	text-decoration: none;
	cursor: pointer;
	-webkit-user-select: none;
	user-select: none;
	transition: var(--transition-color);
}

html body.single-product div.product form.cart div.quantity .minus,
html body.single-product div.product form.cart div.quantity:not(.buttons-added):not(.hidden)::before {
	border-right: 0;
	border-radius: var(--radius-sm) 0 0 var(--radius-sm);
}

html body.single-product div.product form.cart div.quantity .plus,
html body.single-product div.product form.cart div.quantity:not(.buttons-added):not(.hidden)::after {
	border-left: 0;
	border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}

html body.single-product div.product form.cart div.quantity .minus:hover,
html body.single-product div.product form.cart div.quantity .plus:hover {
	color: var(--accent);
	border-color: var(--accent);
	background: var(--accent-fill);
}

html body.single-product div.product form.cart div.quantity .minus:focus-visible,
html body.single-product div.product form.cart div.quantity .plus:focus-visible {
	outline: var(--focus-outline);
	outline-offset: calc(var(--focus-outline-offset) * -1);
}

html body.single-product div.product form.cart div.quantity input.qty {
	box-sizing: border-box;
	width: 56px;
	min-width: 56px;
	height: var(--control-h);
	min-height: var(--control-h);
	padding: 0 var(--space-2);
	background-color: var(--surface-sunken);
	color: var(--text-heading);
	border: var(--border-w) solid var(--field-border);
	border-radius: 0;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
	text-align: center;
	-moz-appearance: textfield;
	appearance: textfield;
}

html body.single-product div.product form.cart div.quantity input.qty::-webkit-outer-spin-button,
html body.single-product div.product form.cart div.quantity input.qty::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

html body.single-product div.product form.cart div.quantity input.qty:focus-visible {
	outline: var(--focus-outline);
	outline-offset: calc(var(--focus-outline-offset) * -1);
}

/* Productos vendidos de uno en uno: WooCommerce marca .hidden y no debe
   quedar ni el hueco ni los pseudo −/+. */
html body.single-product div.product form.cart div.quantity.hidden {
	display: none;
}


/* ==================================================================
   9. Boton de compra a ancho completo
   ================================================================== */

/* El tema hijo lo fija en #FF8C42 con texto #051518 y ambos con
   !important; en el tema claro el acento es carmesi, asi que hay que
   tumbarlo. El texto SOBRE el acento es --accent-contrast por norma del
   sistema (blanco en claro, tinta en oscuro). */
html body.single-product div.product form.cart .single_add_to_cart_button,
html body.single-product div.product form.cart .single_add_to_cart_button.button,
html body.single-product div.product form.cart .single_add_to_cart_button.alt {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: var(--control-h);
	margin: 0;
	padding: var(--space-7) var(--space-10);
	background-color: var(--accent) !important;
	background-image: none !important;
	color: var(--accent-contrast) !important;
	border: 0;
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-bold);
	line-height: 1.2;
	text-align: center;
	transition: background-color var(--dur) var(--ease);
}

html body.single-product div.product form.cart .single_add_to_cart_button:hover,
html body.single-product div.product form.cart .single_add_to_cart_button.button:hover,
html body.single-product div.product form.cart .single_add_to_cart_button.alt:hover {
	background-color: var(--accent-hover) !important;
	color: var(--accent-contrast) !important;
}

html body.single-product div.product form.cart .single_add_to_cart_button:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* «Elige una variacion»: WooCommerce lo deja al 50% de opacidad y quedaba
   un carmesi lavado que parecia un fallo de pintado. Se mantiene el color
   entero y solo cambia el cursor, que es lo que informa de verdad. */
html body.single-product div.product form.cart .single_add_to_cart_button.disabled,
html body.single-product div.product form.cart .single_add_to_cart_button.wc-variation-selection-needed,
html body.single-product div.product form.cart .single_add_to_cart_button[disabled] {
	background-color: var(--accent) !important;
	color: var(--accent-contrast) !important;
	opacity: .92 !important;
	cursor: not-allowed;
}


/* ==================================================================
   10. Linea de envio
   ================================================================== */

html body.single-product div.product .summary .hlz-envio {
	margin: 0;
	color: var(--text-secondary);
	font-size: var(--fs-ui-xs);
	line-height: 1.5;
}


/* ==================================================================
   11. Tabla de atributos
   ================================================================== */

/* InfoRow de Product.jsx: etiqueta a la izquierda en gris, valor a la
   derecha en tinta, filas separadas por una linea. Sustituye al
   .product_meta del nucleo (que ya traia SKU y categorias sueltos con
   otra tipografia); las etiquetas se conservan como ultima fila para no
   perder los enlaces de navegacion. */
html body.single-product div.product .summary .hlz-atributos {
	width: 100%;
	margin: 0;
	border: 0;
	border-collapse: collapse;
	font-size: var(--fs-ui-sm);
}

html body.single-product div.product .summary .hlz-atributos tr {
	border: 0;
}

html body.single-product div.product .summary .hlz-atributos th,
html body.single-product div.product .summary .hlz-atributos td {
	padding: var(--space-5) 0;
	border: 0;
	border-bottom: var(--border-w) solid var(--border-default);
	background: transparent;
	line-height: 1.5;
	vertical-align: top;
}

html body.single-product div.product .summary .hlz-atributos th {
	width: 40%;
	color: var(--text-secondary);
	font-weight: var(--fw-regular);
	text-align: left;
}

html body.single-product div.product .summary .hlz-atributos td {
	color: var(--text-heading);
	text-align: right;
}

html body.single-product div.product .summary .hlz-atributos td a {
	color: inherit;
	text-decoration: none;
}

html body.single-product div.product .summary .hlz-atributos td a:hover {
	color: var(--accent);
	text-decoration: underline;
}


/* ==================================================================
   12. Descripcion corta reubicada
   ================================================================== */

/* El PHP la baja del sitio 20 al 50 porque, donde WooCommerce la pone,
   parte la caja de compra en dos. Aqui abajo va como cierre del panel,
   separada por una linea. */
html body.single-product div.product .summary .woocommerce-product-details__short-description {
	margin: 0;
	color: var(--text-body);
	font-size: var(--fs-ui-md);
	line-height: var(--lh-body);
}

html body.single-product div.product .summary .woocommerce-product-details__short-description p {
	margin: 0 0 var(--space-6);
}

html body.single-product div.product .summary .woocommerce-product-details__short-description p:last-child {
	margin-bottom: 0;
}


/* ==================================================================
   13. Pestanas
   ================================================================== */

/* La activa se subraya en carmesi. En vivo hay DOS subrayados posibles:
   holoplaza-ds.css lo pone en el <a> (como el kit) y style.css del hijo
   en el <li> y en naranja. Se apaga el del li y se deja solo el del
   enlace, que es el que acompana al texto. */
html body.single-product div.product .woocommerce-tabs {
	margin-top: var(--space-16);
}

html body.single-product div.product .woocommerce-tabs ul.tabs {
	display: flex;
	flex-wrap: wrap;
	gap: var(--space-10);
	margin: 0 0 var(--space-10);
	padding: 0;
	border-bottom: var(--border-w) solid var(--border-default);
	list-style: none;
}

html body.single-product div.product .woocommerce-tabs ul.tabs::before,
html body.single-product div.product .woocommerce-tabs ul.tabs li::before,
html body.single-product div.product .woocommerce-tabs ul.tabs li::after {
	display: none;
	border: 0;
}

html body.single-product div.product .woocommerce-tabs ul.tabs li,
html body.single-product div.product .woocommerce-tabs ul.tabs li.active {
	margin: 0;
	padding: 0;
	background: transparent;
	border: 0;
	border-radius: 0;
	box-shadow: none;
}

html body.single-product div.product .woocommerce-tabs ul.tabs li a {
	display: block;
	padding: var(--space-6) 0;
	color: var(--text-heading);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-semibold);
	text-decoration: none;
	border-bottom: var(--border-w-focus) solid transparent;
	transition: var(--transition-color);
}

html body.single-product div.product .woocommerce-tabs ul.tabs li a:hover,
html body.single-product div.product .woocommerce-tabs ul.tabs li.active a {
	color: var(--accent);
	border-bottom-color: var(--accent);
}

html body.single-product div.product .woocommerce-Tabs-panel {
	max-width: 900px;
	color: var(--text-body);
	font-size: var(--fs-body);
	line-height: var(--lh-body);
}

/* El h2 de cada panel repite el rotulo de la pestana que ya esta
   subrayada justo encima. */
html body.single-product div.product .woocommerce-Tabs-panel > h2:first-child {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
}

html body.single-product div.product .woocommerce-Tabs-panel table.shop_attributes {
	width: 100%;
	border: 0;
	border-collapse: collapse;
	font-size: var(--fs-ui-sm);
}

html body.single-product div.product .woocommerce-Tabs-panel table.shop_attributes th,
html body.single-product div.product .woocommerce-Tabs-panel table.shop_attributes td {
	padding: var(--space-5) 0;
	border: 0;
	border-bottom: var(--border-w) solid var(--border-default);
	background: transparent;
	font-style: normal;
}

html body.single-product div.product .woocommerce-Tabs-panel table.shop_attributes th {
	color: var(--text-secondary);
	font-weight: var(--fw-regular);
	text-align: left;
}

html body.single-product div.product .woocommerce-Tabs-panel table.shop_attributes td,
html body.single-product div.product .woocommerce-Tabs-panel table.shop_attributes td p {
	margin: 0;
	color: var(--text-heading);
}


/* ==================================================================
   14. Migas
   ================================================================== */

html body.single-product .woocommerce-breadcrumb {
	margin: 0 0 var(--space-9);
	color: var(--text-secondary);
	font-size: var(--fs-ui-sm);
	line-height: 1.5;
}

html body.single-product .woocommerce-breadcrumb a {
	color: var(--text-secondary);
	text-decoration: none;
}

html body.single-product .woocommerce-breadcrumb a:hover {
	color: var(--accent);
	text-decoration: underline;
}


/* ==================================================================
   28. Carrito
   ================================================================== */
/* =====================================================================
   HoloPlaza TCG — CARRITO (pagina /carrito/)
   Traduce ui_kits/tienda/Cart.jsx + components/commerce/QuantityStepper.jsx
   a las clases reales de WooCommerce 10.9, GeneratePress 3.6 y GP Premium.

   Se carga DESPUES de ds/holoplaza-ds.css. Solo tokens del sistema
   (ds/colors.css, typography.css, spacing.css, effects.css); no hay ni un
   hex suelto.

   CONTEXTO REAL DE LA PAGINA (comprobado sobre el HTML de produccion con el
   carrito lleno, no sobre la plantilla):
     body.woocommerce-cart
       article.do-quantity-buttons            <- GP Premium: quantityButtons=1
         .elementor-widget-container          <- la pagina 9 es de Elementor y
           div.woocommerce                       solo contiene el shortcode
             .woocommerce-notices-wrapper
             form.woocommerce-cart-form
               table.shop_table.cart.woocommerce-cart-form__contents
             .cart-collaterals
               .cart_totals

   El h1 «Carrito», el texto «Quitar», el rotulo «Total del carrito» y la nota
   de pago NO existen en el HTML: los pone agente-carrito.php. Todo lo demas
   (las dos columnas incluidas) es CSS puro.
   ===================================================================== */


/* =====================================================================
   1. LAS DOS COLUMNAS — sin marcado nuevo
   =====================================================================
   El maquetado pide tabla a la izquierda y caja de totales a la derecha.
   WooCommerce las apila porque form.woocommerce-cart-form y .cart-collaterals
   son dos bloques hermanos dentro de div.woocommerce.

   COMO SE CONSIGUE: se convierte ese div.woocommerce (el unico elemento con
   esa clase exacta en la pagina) en un contenedor flex con wrap. Es el mismo
   recurso que usa Cart.jsx —flex + flexWrap + alignItems:flex-start—, asi que
   el resultado responde igual que el maquetado.

   Por que flex y no grid: dentro de div.woocommerce pueden aparecer bloques
   que no controlamos —los avisos de WooCommerce, y el aviso de combos
   incompletos que holoplaza-combos engancha en woocommerce_before_cart—. Con
   flex basta con dar a TODO hijo `flex: 0 0 100%` (ocupa la fila entera y
   empuja) y luego reasignar solo a los dos que nos interesan; con grid habria
   que fijar filas explicitas y cualquier bloque nuevo desbarataria el
   emparejamiento. Asi el layout no depende de cuantos hermanos haya ni de en
   que orden lleguen.

   Debajo de 900px vuelve a apilarse solo (el wrap hace el trabajo). */

html body.woocommerce-cart .woocommerce {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	column-gap: var(--space-14);
	row-gap: var(--space-10);
}

/* Regla base: cualquier hijo desconocido ocupa el ancho completo. */
html body.woocommerce-cart .woocommerce > * {
	flex: 0 0 100%;
	min-width: 0;
}

/* Columna izquierda: la tabla. 560px de base como en Cart.jsx. */
html body.woocommerce-cart .woocommerce > form.woocommerce-cart-form {
	flex: 1 1 560px;
	margin-bottom: 0;
}

/* Columna derecha: la caja de totales. */
html body.woocommerce-cart .woocommerce > .cart-collaterals {
	flex: 0 1 340px;
	width: auto;
	/* WooCommerce le pone width:100% en woocommerce-layout.css. */
	max-width: 100%;
	/* stretch para que la caja pegajosa de mas abajo tenga recorrido: con
	   align-items:flex-start el item mide lo que su contenido y position:sticky
	   no tendria por donde moverse. */
	align-self: stretch;
}

html body.woocommerce-cart .woocommerce > .cart-collaterals::before,
html body.woocommerce-cart .woocommerce > .cart-collaterals::after {
	content: none; /* mata el clearfix de WooCommerce, sobra en flex */
}


/* =====================================================================
   2. TITULO DE PAGINA
   ===================================================================== */

html body.woocommerce-cart .woocommerce .hlz-cart__title {
	margin: 0 0 var(--space-10);
	font-family: var(--font-sans);
	font-size: var(--fs-h1-lg);   /* 50px, el mismo que Cart.jsx */
	line-height: var(--lh-heading);
	font-weight: var(--fw-bold);
	color: var(--text-heading);
}

@media (max-width: 768px) {
	html body.woocommerce-cart .woocommerce .hlz-cart__title {
		font-size: var(--fs-h1-sm);
	}
}


/* =====================================================================
   3. LA TABLA DEL CARRITO
   =====================================================================
   WooCommerce imprime SEIS celdas por fila y en este orden:
     product-remove | product-thumbnail | product-name | product-price |
     product-quantity | product-subtotal
   El maquetado quiere la miniatura pegada al nombre y el enlace de quitar al
   FINAL de la fila. Reordenar celdas de una <table> es imposible con
   display:table, asi que la fila pasa a display:grid y se coloca cada celda
   con `order`. Es la unica forma de llegar al orden del maquetado sin tocar
   la plantilla cart.php de WooCommerce.

   Contrapartida: display:grid sobre <tr> le quita a la tabla su semantica
   para lectores de pantalla. Se restituye con roles ARIA desde
   agente-carrito.php — sin ese fichero esta seccion degrada la
   accesibilidad, no la desplegueis suelta.

   Solo a partir de 769px: por debajo manda woocommerce-smallscreen.css, que
   apila las celdas con su etiqueta data-title, y eso ya es la version movil
   del maquetado. */

@media (min-width: 769px) {

	html body.woocommerce-cart table.shop_table.cart,
	html body.woocommerce-cart table.shop_table.cart thead,
	html body.woocommerce-cart table.shop_table.cart tbody {
		display: block;
		width: 100%;
		border: 0;
		border-radius: 0;
	}

	html body.woocommerce-cart table.shop_table.cart tr {
		display: grid;
		/* miniatura | nombre (elastico) | precio | cantidad | subtotal | quitar */
		grid-template-columns:
			calc(var(--stepper-w) * 2)
			minmax(0, 1fr)
			auto
			auto
			auto
			auto;
		align-items: center;
		column-gap: var(--space-7);
		border-bottom: 1px solid var(--border-default);
	}

	/* Cabecera: la columna de quitar y la de la miniatura no llevan rotulo, y
	   «Producto» se estira sobre la miniatura + el nombre, como en el kit. */
	html body.woocommerce-cart table.shop_table.cart thead th {
		padding: var(--space-6) 0;
		font-family: var(--font-sans);
		font-size: var(--fs-ui-sm);
		font-weight: var(--fw-semibold);
		line-height: var(--lh-tight);
		color: var(--text-secondary);
		text-align: left;
		background: none;
		border: 0;
	}

	html body.woocommerce-cart table.shop_table.cart thead th.product-remove,
	html body.woocommerce-cart table.shop_table.cart thead th.product-thumbnail {
		display: none;
	}

	html body.woocommerce-cart table.shop_table.cart thead th.product-name     { grid-column: 1 / 3; }
	html body.woocommerce-cart table.shop_table.cart thead th.product-price    { grid-column: 3; }
	html body.woocommerce-cart table.shop_table.cart thead th.product-quantity { grid-column: 4; }
	html body.woocommerce-cart table.shop_table.cart thead th.product-subtotal { grid-column: 5; }

	/* Cuerpo: el orden visual del maquetado. La celda de quitar sale la ultima
	   aunque en el HTML sea la primera. */
	html body.woocommerce-cart table.shop_table.cart tr.cart_item td.product-thumbnail { order: 1; }
	html body.woocommerce-cart table.shop_table.cart tr.cart_item td.product-name      { order: 2; }
	html body.woocommerce-cart table.shop_table.cart tr.cart_item td.product-price     { order: 3; }
	html body.woocommerce-cart table.shop_table.cart tr.cart_item td.product-quantity  { order: 4; }
	html body.woocommerce-cart table.shop_table.cart tr.cart_item td.product-subtotal  { order: 5; }
	html body.woocommerce-cart table.shop_table.cart tr.cart_item td.product-remove    { order: 6; }

	html body.woocommerce-cart table.shop_table.cart td {
		padding: var(--space-7) 0;
		border: 0;
		font-family: var(--font-sans);
		font-size: var(--fs-ui-md);
		color: var(--text-heading);
	}

	/* La fila de acciones (cupon + actualizar) ocupa el ancho completo. */
	html body.woocommerce-cart table.shop_table.cart td.actions {
		grid-column: 1 / -1;
		padding: var(--space-9) 0 0;
	}

	html body.woocommerce-cart table.shop_table.cart tr:last-child {
		border-bottom: 0;
	}
}

/* La capa DS pinta cebra en todas las shop_table. En el carrito el maquetado
   es limpio: filas separadas solo por la linea inferior. */
html body.woocommerce-cart table.shop_table.cart tbody tr,
html body.woocommerce-cart table.shop_table.cart tbody tr:nth-child(even) {
	background: transparent;
}

/* --- Miniatura: plancha blanca, igual que en el kit ------------------- */
/* --plate es blanco en los DOS temas a proposito: el arte de las cartas va
   recortado sobre blanco. Es una de las excepciones declaradas del sistema. */
html body.woocommerce-cart td.product-thumbnail > a,
html body.woocommerce-cart td.product-thumbnail > img {
	display: block;
	width: 100%;
	background: var(--plate);
	padding: var(--space-4);
	border: 1px solid var(--border-hairline);
	border-radius: var(--radius);
	box-sizing: border-box;
}

html body.woocommerce-cart td.product-thumbnail img {
	display: block;
	width: 100%;
	height: auto;
	max-width: none;
	border-radius: 0;
	box-shadow: none;
}

/* --- Nombre del producto --------------------------------------------- */
html body.woocommerce-cart td.product-name a {
	color: var(--text-heading);
	font-size: var(--fs-ui-md);
	line-height: var(--lh-tight);
	font-weight: var(--fw-semibold);
	text-decoration: none;
	transition: var(--transition-color);
}

html body.woocommerce-cart td.product-name a:hover,
html body.woocommerce-cart td.product-name a:focus-visible {
	color: var(--accent);
}

html body.woocommerce-cart td.product-name .variation,
html body.woocommerce-cart td.product-name dl.variation {
	margin: var(--space-2) 0 0;
	font-size: var(--fs-ui-2xs);
	color: var(--text-muted);
}

/* --- Precio y subtotal ------------------------------------------------ */
html body.woocommerce-cart td.product-price,
html body.woocommerce-cart td.product-subtotal {
	white-space: nowrap;
	font-size: var(--fs-ui-md);
	color: var(--text-heading);
}

html body.woocommerce-cart td.product-subtotal {
	font-weight: var(--fw-semibold);
}

/* --- «Quitar» --------------------------------------------------------- */
/* WooCommerce pinta un aspa roja circular y ademas fija color con !important
   (.woocommerce a.remove { color: red !important }), asi que aqui hay que
   responder con !important: no es capricho de especificidad.
   El texto «Quitar» lo pone el filtro de agente-carrito.php. Si ese fichero
   no se despliega, descomentar el bloque de abajo para hacerlo solo con CSS. */
html body.woocommerce-cart td.product-remove a.remove {
	display: inline-block;
	width: auto;
	height: auto;
	line-height: var(--lh-tight);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-regular);
	border-radius: 0;
	background: none;
	color: var(--accent) !important;
	text-decoration: none;
	transition: var(--transition-color);
}

html body.woocommerce-cart td.product-remove a.remove:hover,
html body.woocommerce-cart td.product-remove a.remove:focus-visible {
	background: none;
	color: var(--accent-hover) !important;
	text-decoration: underline;
}

html body.woocommerce-cart td.product-remove a.remove:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* Alternativa sin PHP (el aspa se apaga y el texto lo pone el pseudo):
html body.woocommerce-cart td.product-remove a.remove { font-size: 0; }
html body.woocommerce-cart td.product-remove a.remove::after {
	content: "Quitar"; font-size: var(--fs-ui-sm);
}
   Se prefiere el filtro PHP porque deja texto real en el DOM (seleccionable,
   traducible) en vez de contenido generado. */


/* =====================================================================
   4. STEPPER DE CANTIDAD  −  1  +
   =====================================================================
   No hace falta JS: GP Premium ya trae quantityButtons=1 y su
   woocommerce.min.js convierte cada div.quantity del carrito en

     <div class="quantity buttons-added">
       <a class="minus">-</a> <label class="screen-reader-text">…</label><br>
       <input class="input-text qty text"> <a class="plus">+</a>
     </div>

   Aqui solo se le da la forma de components/commerce/QuantityStepper.jsx:
   40x44 / 56x44 / 40x44, fondo hundido, radios solo en los extremos y el
   hover tinendo glifo y borde de acento.

   Ojo con el <br> que WooCommerce imprime tras la etiqueta: dentro de un
   flex se convierte en un item y descuadra el grupo. Se apaga. */

html body.woocommerce-cart .woocommerce div.quantity,
html body.woocommerce-cart .woocommerce div.quantity.buttons-added {
	display: inline-flex;
	align-items: center;
	width: auto;
	max-width: none;
	margin: 0;
	float: none;
}

html body.woocommerce-cart .woocommerce div.quantity br {
	display: none;
}

/* Los dos botones. */
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus,
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.plus {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	box-sizing: border-box;
	width: var(--stepper-w);
	height: var(--control-h);
	min-height: var(--control-h);
	padding: 0;
	margin: 0;
	background: var(--surface-sunken);
	border: 1px solid var(--field-border);
	color: var(--text-body);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-lg);
	font-weight: var(--fw-regular);
	line-height: 1;
	text-decoration: none;
	user-select: none;
	transition: var(--transition-color);
}

html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus {
	border-right: 0;
	border-radius: var(--radius-sm) 0 0 var(--radius-sm);
}

html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.plus {
	border-left: 0;
	border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}

/* GP escribe un guion normal «-»; el kit usa el signo menos «−». Se sustituye
   el glifo sin tocar el JS del plugin. */
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus {
	font-size: 0;
}

html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus::before {
	content: "\2212";
	font-size: var(--fs-ui-lg);
	line-height: 1;
}

html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus:hover,
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.plus:hover,
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus:focus-visible,
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.plus:focus-visible {
	color: var(--accent);
	border-color: var(--accent);
	background: var(--surface-sunken);
}

html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.minus:focus-visible,
html body.woocommerce-cart .woocommerce div.quantity.buttons-added a.plus:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* El campo del medio. Ancho 56px = --stepper-w + --space-8, para no meter una
   medida suelta que no este en spacing.css. */
html body.woocommerce-cart .woocommerce div.quantity input.qty {
	box-sizing: border-box;
	flex: 0 0 auto;
	width: calc(var(--stepper-w) + var(--space-8));
	max-width: none;
	height: var(--control-h);
	min-height: var(--control-h);
	padding: 0;
	margin: 0;
	background: var(--surface-sunken);
	color: var(--text-heading);
	border: 1px solid var(--field-border);
	border-radius: 0;   /* la capa DS le pone --radius; en el stepper estorba */
	text-align: center;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
	-moz-appearance: textfield;
	appearance: textfield;
}

html body.woocommerce-cart .woocommerce div.quantity input.qty::-webkit-outer-spin-button,
html body.woocommerce-cart .woocommerce div.quantity input.qty::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

html body.woocommerce-cart .woocommerce div.quantity input.qty:focus {
	border-color: var(--accent);
	outline: none;
	box-shadow: var(--glow-active);
	position: relative;
	z-index: 1;   /* el foco tiene que verse por encima de los botones vecinos */
}


/* =====================================================================
   5. CUPON + ACTUALIZAR CARRITO (fila de acciones, bajo la tabla)
   =====================================================================
   El maquetado solo dibuja «Codigo de cupon» + «Aplicar cupon». El boton
   «Actualizar carrito» NO se borra: sin AJAX es lo unico que confirma los
   cambios del stepper, y quitarlo dejaria el carrito sin forma de guardar la
   cantidad. Se manda al extremo derecho y se pinta discreto (WooCommerce ya
   lo deja deshabilitado hasta que algo cambia). */

html body.woocommerce-cart td.actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--space-6);
	background: none;
}

html body.woocommerce-cart td.actions > p {
	margin: 0;
}

html body.woocommerce-cart td.actions .coupon {
	display: flex;
	align-items: center;
	gap: var(--space-6);
	flex: 1 1 auto;
	max-width: 460px;   /* el mismo tope que el kit */
	float: none;
	padding: 0;
}

html body.woocommerce-cart td.actions .coupon input.input-text#coupon_code {
	flex: 1 1 auto;
	box-sizing: border-box;
	width: auto;
	min-width: 0;
	height: var(--control-h);
	padding: 0 var(--space-7);
	margin: 0;
	background: var(--surface-sunken);
	color: var(--text-heading);
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	line-height: var(--control-h);
}

html body.woocommerce-cart td.actions .coupon input.input-text#coupon_code::placeholder {
	color: var(--placeholder);
}

html body.woocommerce-cart td.actions .coupon input.input-text#coupon_code:focus {
	border-color: var(--accent);
	outline: none;
	box-shadow: var(--glow-active);
}

/* «Aplicar cupon»: variante outline del sistema (Button variant="outline"). */
html body.woocommerce-cart td.actions button.button[name="apply_coupon"] {
	flex: 0 0 auto;
	height: var(--control-h);
	padding: 0 var(--space-9);
	background: transparent;
	color: var(--text-body);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-bold);
	white-space: nowrap;
	transition: var(--transition-color);
}

html body.woocommerce-cart td.actions button.button[name="apply_coupon"]:hover {
	background: var(--accent-fill);
	border-color: var(--accent);
	color: var(--accent);
}

/* «Actualizar carrito»: presencia minima, no compite con la CTA. */
html body.woocommerce-cart td.actions button.button[name="update_cart"] {
	height: var(--control-h);
	padding: 0 var(--space-9);
	background: transparent;
	color: var(--text-secondary);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
	transition: var(--transition-color);
}

html body.woocommerce-cart td.actions button.button[name="update_cart"]:hover:not([disabled]) {
	border-color: var(--accent);
	color: var(--accent);
	background: transparent;
}

html body.woocommerce-cart td.actions button.button[name="update_cart"][disabled] {
	opacity: .45;
	cursor: default;
}

/* El cupon ya aplicado sale como fila .cart-discount en los totales. */
html body.woocommerce-cart .cart_totals tr.cart-discount th {
	color: var(--accent);
}


/* =====================================================================
   6. CAJA LATERAL «TOTAL DEL CARRITO»
   =====================================================================
   El rotulo que imprime WooCommerce es «Totales del carrito»; el filtro
   gettext de agente-carrito.php lo deja en «Total del carrito» como el kit.
   La capa DS ya le da fondo, borde y radio: aqui van el relleno, la
   tipografia y el paso de tabla a filas etiqueta/valor. */

html body.woocommerce-cart .cart-collaterals .cart_totals {
	position: sticky;
	top: var(--space-10);
	width: auto;
	float: none;
	padding: var(--space-10);
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	box-shadow: var(--shadow-card);
	box-sizing: border-box;
}

html body.woocommerce-cart .cart-collaterals .cart_totals > h2 {
	margin: 0 0 var(--space-8);
	font-family: var(--font-sans);
	font-size: var(--fs-h5);          /* 25px, el del kit */
	line-height: var(--lh-tight);
	font-weight: var(--fw-bold);
	color: var(--text-heading);
	text-transform: none;
}

/* La tabla de totales pasa a filas «etiqueta ....... valor». */
html body.woocommerce-cart .cart_totals table.shop_table,
html body.woocommerce-cart .cart_totals table.shop_table tbody {
	display: block;
	width: 100%;
	margin: 0;
	border: 0;
	border-radius: 0;
	background: none;
}

html body.woocommerce-cart .cart_totals table.shop_table tr {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--space-6);
	padding: var(--space-4) 0;
	background: none;
	border: 0;
}

/* El `width: 35%` que WooCommerce le clava al th de los totales convierte la
   etiqueta en una columna estrecha en cuanto la fila pasa a flex; se anula. */
html body.woocommerce-cart .cart_totals table.shop_table th,
html body.woocommerce-cart .cart_totals table.shop_table td {
	width: auto;
	flex: 0 1 auto;
	padding: 0;
	border: 0;
	background: none;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-regular);
	color: var(--text-body);
	text-align: left;
}

html body.woocommerce-cart .cart_totals table.shop_table td {
	text-align: right;
}

/* Fila TOTAL: separador arriba, 18px y negrita, como en el kit. */
html body.woocommerce-cart .cart_totals table.shop_table tr.order-total {
	margin-top: var(--space-4);
	padding-top: var(--space-6);
	border-top: 1px solid var(--border-default);
}

html body.woocommerce-cart .cart_totals table.shop_table tr.order-total th,
html body.woocommerce-cart .cart_totals table.shop_table tr.order-total td,
html body.woocommerce-cart .cart_totals table.shop_table tr.order-total strong {
	font-size: var(--fs-ui-lg);
	font-weight: var(--fw-bold);
	color: var(--text-heading);
}

/* El «(incluye X € IVA 21%)» que cuelga del total. */
html body.woocommerce-cart .cart_totals table.shop_table tr.order-total small.includes_tax {
	display: block;
	margin-top: var(--space-2);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-regular);
	color: var(--text-muted);
}

/* --- Envio ------------------------------------------------------------
   El kit dibuja «Envio ......... Correos 3,95 €» porque es un mock. En vivo
   hay una lista de radios (recogida local / GLS) mas el calculador de
   direccion, y eso no cabe en una linea: la fila de envio se apila. */
html body.woocommerce-cart .cart_totals table.shop_table tr.woocommerce-shipping-totals {
	display: block;
	padding: var(--space-6) 0;
}

html body.woocommerce-cart .cart_totals tr.woocommerce-shipping-totals > th {
	display: block;
	margin-bottom: var(--space-4);
	color: var(--text-body);
}

html body.woocommerce-cart .cart_totals tr.woocommerce-shipping-totals > td {
	display: block;
	text-align: left;
}

html body.woocommerce-cart .cart_totals ul#shipping_method {
	margin: 0;
	padding: 0;
	list-style: none;
}

html body.woocommerce-cart .cart_totals ul#shipping_method li {
	display: flex;
	align-items: flex-start;
	gap: var(--space-4);
	margin: 0 0 var(--space-4);
	padding: 0;
	font-size: var(--fs-ui-sm);
	line-height: var(--lh-tight);
	color: var(--text-body);
}

html body.woocommerce-cart .cart_totals ul#shipping_method li input.shipping_method {
	flex: 0 0 auto;
	margin: var(--space-1) 0 0;
	accent-color: var(--accent);
}

html body.woocommerce-cart .cart_totals ul#shipping_method li label {
	flex: 1 1 auto;
	margin: 0;
	font-size: var(--fs-ui-sm);
	line-height: var(--lh-tight);
	color: var(--text-body);
	cursor: pointer;
}

html body.woocommerce-cart .cart_totals p.woocommerce-shipping-destination {
	margin: var(--space-4) 0 0;
	font-size: var(--fs-ui-xs);
	color: var(--text-muted);
}

html body.woocommerce-cart .cart_totals .shipping-calculator-button {
	display: inline-block;
	margin-top: var(--space-3);
	font-size: var(--fs-ui-xs);
	color: var(--accent);
	text-decoration: underline;
}

html body.woocommerce-cart .cart_totals .shipping-calculator-form {
	margin-top: var(--space-6);
}

html body.woocommerce-cart .cart_totals .shipping-calculator-form input.input-text,
html body.woocommerce-cart .cart_totals .shipping-calculator-form select {
	box-sizing: border-box;
	width: 100%;
	height: var(--control-h);
	padding: 0 var(--space-6);
	background: var(--surface-sunken);
	color: var(--text-heading);
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
}

html body.woocommerce-cart .cart_totals .shipping-calculator-form label {
	display: block;
	margin-bottom: var(--space-2);
	font-size: var(--fs-ui-xs);
	color: var(--text-secondary);
}


/* =====================================================================
   7. «FINALIZAR COMPRA» + NOTA DE PAGO
   =====================================================================
   Ancho completo y degradado de marca. El texto va SIEMPRE en
   --accent-contrast: el paquete lo advierte expresamente y la capa DS ya
   hace lo mismo con los botones de Elementor. Nunca tinta oscura encima de
   --gradient-cta. */

html body.woocommerce-cart .cart_totals .wc-proceed-to-checkout {
	margin: var(--space-9) 0 0;
	padding: 0;
}

html body.woocommerce-cart .cart_totals .wc-proceed-to-checkout > p {
	margin: 0;
}

html body.woocommerce-cart .cart_totals a.checkout-button,
html body.woocommerce-cart .cart_totals a.checkout-button.button.alt {
	display: block;
	box-sizing: border-box;
	width: 100%;
	margin: 0;
	padding: var(--space-7) var(--space-9);
	background: var(--gradient-cta);
	background-color: var(--accent);   /* respaldo si el degradado no pinta */
	color: var(--accent-contrast);
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-bold);
	line-height: var(--lh-tight);
	text-align: center;
	text-decoration: none;
	box-shadow: var(--shadow-card-accent);
	transition: box-shadow var(--dur) var(--ease), filter var(--dur) var(--ease);
}

html body.woocommerce-cart .cart_totals a.checkout-button:hover,
html body.woocommerce-cart .cart_totals a.checkout-button:focus-visible {
	background: var(--gradient-cta);
	color: var(--accent-contrast);
	filter: brightness(1.06);
	box-shadow: var(--shadow-float);
}

html body.woocommerce-cart .cart_totals a.checkout-button:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* WooCommerce cuelga una flecha «→» de .wc-forward; el kit no la lleva. */
html body.woocommerce-cart .cart_totals a.checkout-button.wc-forward::after {
	content: none;
}

/* Nota bajo la CTA (la imprime agente-carrito.php). */
html body.woocommerce-cart .cart_totals .hlz-cart__pay-note {
	margin: var(--space-6) 0 0;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-xs);
	line-height: var(--lh-body);
	color: var(--text-secondary);
}


/* =====================================================================
   8. AVISOS Y CARRITO VACIO
   ===================================================================== */

html body.woocommerce-cart .woocommerce .woocommerce-notices-wrapper:empty {
	display: none;
}

html body.woocommerce-cart .wc-empty-cart-message,
html body.woocommerce-cart p.return-to-shop {
	flex: 0 0 100%;
}

html body.woocommerce-cart .cart-empty.woocommerce-info {
	margin: 0 0 var(--space-9);
	font-size: var(--fs-ui-md);
	color: var(--text-body);
}

html body.woocommerce-cart p.return-to-shop a.button {
	display: inline-block;
	padding: var(--space-7) var(--space-10);
	background: var(--gradient-cta);
	background-color: var(--accent);
	color: var(--accent-contrast);
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-bold);
	text-decoration: none;
}

html body.woocommerce-cart p.return-to-shop a.button.wc-backward::before {
	content: none;
}


/* =====================================================================
   9. MOVIL (< 769px)
   =====================================================================
   Aqui manda woocommerce-smallscreen.css: apila cada celda y le antepone su
   data-title. Solo se retoca lo que el maquetado necesita. */

@media (max-width: 768px) {

	html body.woocommerce-cart .woocommerce {
		column-gap: 0;
		row-gap: var(--space-10);
	}

	html body.woocommerce-cart .woocommerce > form.woocommerce-cart-form,
	html body.woocommerce-cart .woocommerce > .cart-collaterals {
		flex: 0 0 100%;
	}

	html body.woocommerce-cart .cart-collaterals .cart_totals {
		position: static;
		padding: var(--space-9);
	}

	html body.woocommerce-cart table.shop_table.cart tbody tr.cart_item {
		display: block;
		margin-bottom: var(--space-9);
		padding-bottom: var(--space-9);
		border-bottom: 1px solid var(--border-default);
	}

	/* La miniatura, centrada y acotada; sin esto ocupa toda la fila. */
	html body.woocommerce-cart td.product-thumbnail > a,
	html body.woocommerce-cart td.product-thumbnail > img {
		width: calc(var(--stepper-w) * 3);
		margin: 0 auto var(--space-6);
	}

	html body.woocommerce-cart td.actions {
		flex-direction: column;
		align-items: stretch;
	}

	html body.woocommerce-cart td.actions .coupon {
		max-width: none;
		flex-wrap: wrap;
	}
}


/* ==================================================================
   29. Pie y banner
   ================================================================== */
/* HoloPlaza TCG - pie de pagina y banner de suscripcion.
 *
 * Capa de aplicacion, misma naturaleza que ds/holoplaza-ds.css: solo traduce
 * tokens ya existentes (ds/colors.css, typography.css, spacing.css,
 * effects.css) a las clases que de verdad existen en la web. No inventa
 * valores ni redefine tokens.
 *
 * Va DESPUES de ds/holoplaza-ds.css. Ese archivo ya reviste el banner en su
 * seccion 21 y el pie en la 20; aqui solo esta lo que falta o lo que el
 * maquetado corrige. Si esto se integra, lo natural es fundirlo dentro de
 * esas dos secciones en lugar de dejarlo como hoja aparte.
 *
 * IMPORTANTE - lo que esta hoja NO puede hacer, y esta explicado en
 * agente-pie.md: el texto del banner ("HOLO PREMIUM" en vez de "HOLO") y las
 * dos columnas que faltan en el pie (Menu y Contactanos) son contenido, no
 * estilo. Salen de PHP y de widgets de la base de datos.
 */

/* ==================================================================
 * A. Banner de suscripcion (plugin holoplaza-premium)
 * ================================================================== */

/* El plugin trae su propio assets/front.css escrito contra el tema oscuro con
   colores cosidos (#FF8C42, #051518, #fff, 1200px, 8px, 24px...). La hoja del
   sistema carga la ultima (prioridad 9999 en el functions.php del hijo), asi
   que basta con la misma especificidad de una clase para ganarle. La unica
   excepcion es el color del CTA, que el plugin marca !important. */

/* El fondo ya era 100 % ancho; lo que no cuadraba es el interior, capado a
   1200px mientras el resto del sitio va a 1400. Con el contenedor del sistema
   el banner se alinea con la cabecera y con el pie en vez de quedar metido
   hacia dentro. */
.hprm-banner__inner {
	max-width: var(--container-max);
	padding: var(--space-5) var(--container-pad);
	gap: var(--space-8);
}

/* "★ HOLO 5,00 €/año" en una sola voz. El maquetado lo pide en negrita entera:
   el plugin bajaba el precio a opacity .85, y rebajar opacidad de texto encima
   del acento se come contraste sin ganar jerarquia. Se quita. */
.hprm-banner__titulo {
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-bold);
	letter-spacing: var(--ls-label);
	text-transform: uppercase;
}

.hprm-banner__precio {
	font-weight: var(--fw-bold);
	opacity: 1;
	/* El precio lleva simbolo y minusculas ("5,00 €/año"): no se versaliza. */
	text-transform: none;
}

.hprm-banner__texto {
	font-size: var(--fs-ui-sm);
	line-height: var(--lh-tight);
	/* flex-basis en un token de columna estrecha: por debajo de ~220px el
	   parrafo cae a su propia linea en vez de estrangularse. */
	flex: 1 1 var(--card-min-sm);
	min-width: 0;
}

/* BOTON NEGRO. Es deliberado y por eso usa tokens crudos --hp-ink/--hp-white
   en lugar de un alias semantico: el boton tiene que seguir siendo oscuro en
   LOS DOS temas, y todos los alias giran con el tema. En claro
   --accent-contrast es blanco y en oscuro es tinta, asi que la regla actual de
   la seccion 21 pinta el boton blanco en el tema de marca, que no es el
   maquetado. --text-heading y --medal-ground tienen el mismo problema al
   reves. Negro fijo sobre carmesi (tema claro) y sobre naranja (tema oscuro):
   blanco sobre #0d0d0f da 19:1 en ambos casos.
   Es el mismo criterio que el componente de referencia PremiumBanner.jsx. */
.hprm-banner__cta {
	background: var(--hp-ink);
	color: var(--hp-white) !important; /* el plugin pone color:#fff !important */
	border-radius: var(--radius);
	padding: var(--space-5) var(--space-9);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-bold);
	transition: var(--transition-color);
}

/* Oro de marca al pasar por encima, como en el maquetado. #DCC754 con tinta
   encima da 11,3:1. */
.hprm-banner__cta:hover,
.hprm-banner__cta:focus-visible {
	background: var(--hp-gold);
	color: var(--hp-ink) !important;
}

/* La aspa. El plugin la pinta a 24px y opacity .55; a ese tamano compite con
   el CTA y a esa opacidad no llega a contraste sobre el acento. */
.hprm-banner__cerrar {
	color: var(--accent-contrast);
	font-size: var(--fs-ui-md);
	line-height: 1;
	padding: var(--space-2);
	opacity: .7;
}

.hprm-banner__cerrar:hover,
.hprm-banner__cerrar:focus-visible {
	opacity: 1;
}

/* Foco visible: el banner es lo primero que pisa el tabulador tras el menu y
   sobre el acento el anillo por defecto del navegador se pierde. */
.hprm-banner__cta:focus-visible,
.hprm-banner__cerrar:focus-visible {
	outline: var(--border-w-focus) solid var(--accent-contrast);
	outline-offset: var(--focus-outline-offset);
}

/* ==================================================================
 * B. Pie de pagina
 * ================================================================== */

/* El pie son bloques de widget guardados en la base de datos y montados por
   GeneratePress. Esta hoja pone la rejilla, la tipografia y el ritmo; el
   contenido que falta (logo, columna "Menu", columna "Contactanos") no se
   puede fabricar desde CSS. */

.footer-widgets-container {
	max-width: var(--container-max);
	padding: var(--space-16) var(--container-pad);
}

/* GeneratePress monta las columnas con flex y un margin-left:-40px de canaleta
   que compensa con padding en cada hija. Se sustituye por una rejilla: con
   auto-fit las columnas se reparten igual sean 3 (lo que hay hoy) o 4 (lo que
   pide el maquetado) sin tocar nada mas, y por debajo del ancho minimo bajan
   solas en vez de estrangularse. El -40px hay que anularlo o la primera
   columna se sale por la izquierda. */
/* OJO CON LA ESPECIFICIDAD, que aqui costo un fallo visible: sin el `html body`
   delante, esta regla vale 0-2-0, igual que la de GeneratePress, y como la suya
   se sirve despues ganaba ella. Ni con `html body` bastaba: la suya usa TRES
   clases (.site-footer .footer-widgets-container .inside-footer-widgets, 0-3-0)
   y un `html body .footer-widgets .inside-footer-widgets` se queda en 0-2-2,
   que pierde por una clase. Hay que repetir su misma cadena. El resultado se veia a simple vista entre 1024
   y 1366: el margin-left:-40px sobrevivia, se comia los 24px de relleno del
   contenedor y la primera columna arrancaba en x=-16, con «SOBRE NOSOTROS»
   cortado por la mitad. A 1440 no pasaba porque sobraba margen, asi que era de
   los que solo se ven en portatil. Lo enganyoso es que el resto de la regla SI
   se aplicaba (la rejilla y el hueco estaban puestos), o sea que parecia que la
   hoja mandaba cuando solo mandaba a medias. */
html body .site-footer .footer-widgets-container .inside-footer-widgets {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(var(--card-min-sm), 1fr));
	gap: var(--space-14);
	align-items: start;
	margin-left: 0;
}

.footer-widgets .inside-footer-widgets > div {
	padding-left: 0;
	margin-bottom: 0;
}

/* Los widgets traen su propio relleno (.inner-padding) pensado para las
   columnas flotadas de GP; dentro de la rejilla duplica la canaleta. */
.footer-widgets .widget.inner-padding {
	padding: 0;
}

/* Un bloque de encabezado y otro de texto son dos <aside> hermanos, no un
   bloque con titulo: el aire entre ellos hay que ponerlo aqui. */
.footer-widgets .widget + .widget {
	margin-top: var(--space-6);
}

/* Titulos de columna. La seccion 20 del sistema los deja en --fs-h5-sm (20px),
   que es la escala de titular de pagina; en el maquetado son titulos de
   columna y van en la escala de interfaz. */
.footer-widgets h5,
.footer-widgets .wp-block-heading,
.footer-widgets .widget-title {
	margin: 0;
	font-size: var(--fs-ui-lg);
	font-weight: var(--fw-bold);
	line-height: var(--lh-tight);
	letter-spacing: var(--ls-badge);
	color: var(--text-heading);
}

/* Los parrafos del pie llevan la clase de WordPress .has-small-font-size, que
   fija el tamano con !important desde los presets del tema. Para devolverlos a
   la escala del sistema no queda otra que igualar el !important. */
.footer-widgets p,
.footer-widgets .has-small-font-size {
	margin: 0;
	font-size: var(--fs-ui-sm) !important;
	/* El maquetado pide interlineado 2 para las listas de enlaces; no hay token
	   de interlineado 2 en typography.css, asi que se usa el del cuerpo (1.6),
	   que es el valor mas cercano del sistema. */
	line-height: var(--lh-body);
	color: var(--text-secondary);
}

/* Las columnas de enlaces son un solo <p> con <br> entre anclas: no hay <li>
   al que dar margen, el aire sale del interlineado de arriba. El color de los
   enlaces ya lo pone la seccion 20; aqui solo el tamano y la transicion. */
.footer-widgets a {
	font-size: var(--fs-ui-sm);
	text-decoration: none;
	transition: var(--transition-color);
}

.footer-widgets a:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* El enlace "★ Holo" de la columna Menu se marca con el acento: es la unica
   entrada del menu que vende algo. Se engancha por la URL del producto de
   suscripcion porque el ★ es texto y CSS no puede seleccionarlo.
   Solo hace efecto cuando el enlace exista en el widget. */
.footer-widgets a[href*="holo-premium"] {
	color: var(--accent);
	font-weight: var(--fw-semibold);
}

/* Logo de la primera columna. Ya existe: lo imprime
   mu-plugins/holoplaza-pie.php, que saca los DOS ficheros de marca —el oscuro
   para tema claro y el claro para tema oscuro— y deja que el CSS esconda el que
   no toca.

   OJO: ESTA REGLA DECIA OTRA COSA HASTA EL 17-ago-2026, y hay que contar por
   que se cambia porque el razonamiento viejo sonaba bien. Topaba la ALTURA con
   --header-logo-max-h (60px) «para que el logo del pie y el de la cabecera sean
   el mismo tamano y no haya que inventar un valor». El argumento se cayo solo en
   cuanto llego el logo de verdad: SiteFooter.jsx SI da un valor —
   `width: 200, height: 'auto'`— asi que no hay nada que inventar. Y mientras
   tanto ese tope de 60px estaba dimensionando la marca a 116px de ancho, poco
   mas de la mitad de lo que pide el paquete. Medido en vivo antes de tocarlo.

   SE DIMENSIONA POR ANCHO Y NO POR ALTURA, ademas, porque las dos variantes no
   tienen la misma proporcion (250x129 la de tinta, 608x299 la blanca): topando
   la altura saldrian con anchos distintos y el pie pegaria un salto al cambiar
   de tema. */
.footer-widgets .footer-widget-1 img.hlzpie__marca {
	width: 200px;
	max-width: 100%;
	height: auto;
	display: block;
}

/* La caja que las envuelve. `line-height: 0` porque el hueco de linea que deja
   una imagen en flujo normal desalineaba el titulo de la columna respecto a los
   de las columnas de al lado. */
.footer-widgets .hlzpie__marca-caja {
	margin-bottom: var(--space-8);
	line-height: 0;
}

/* El cambio de marca segun el tema.

   EL SUFIJO NOMBRA EL TEMA, NO EL COLOR DEL DIBUJO. Es a proposito y conviene
   leerlo despacio, porque las dos lecturas son plausibles y equivocarse deja el
   logotipo invisible sobre su propio fondo: `--tema-claro` es la que se ve CON
   EL TEMA CLARO, y por tanto es la de tinta negra. La que es blanca es
   `--tema-oscuro`. Empezaron llamandose `--claro`/`--oscuro` y me confundieron
   a mi mismo al escribir la regla de abajo, asi que llevan el prefijo `tema-`
   para que no haya que pensarlo.

   El interruptor deja `data-theme` en el <html> ANTES de pintar (lo pone el
   script de arranque de holoplaza-ds-portada.php), asi que esto no parpadea.
   Sin atributo = tema claro, que es como sale hoy la portada: comprobado
   leyendo el atributo en vivo, devuelve «(sin data-theme)». Por eso la variante
   de tema oscuro nace escondida y solo aparece con el atributo explicito: asi
   el caso normal no necesita ninguna regla.

   La especificidad va contada, no a ojo: la regla de tamano de arriba es 0-2-2,
   estas tienen que ganarle y llevan el atributo delante (0-3-2). Es justo el
   error que ya se cometio dos veces en esta hoja con el pie — escribir
   `html body` creyendo que sube, y quedarse por debajo. */
.footer-widgets .footer-widget-1 img.hlzpie__marca--tema-oscuro {
	display: none;
}

html[data-theme="dark"] .footer-widgets .footer-widget-1 img.hlzpie__marca--tema-claro {
	display: none;
}

html[data-theme="dark"] .footer-widgets .footer-widget-1 img.hlzpie__marca--tema-oscuro {
	display: block;
}

/* Datos de contacto: el correo y el telefono son enlaces y la direccion es
   texto corrido. Que la direccion no se parta por la mitad. */
.footer-widgets a[href^="mailto:"],
.footer-widgets a[href^="tel:"] {
	overflow-wrap: anywhere;
}

/* ---- Barra de copyright ---- */

/* La seccion 20 pone border-top a .site-footer, .site-info y .footer-widgets a
   la vez. Como .footer-widgets es el primer hijo de .site-footer, las dos
   lineas caen pegadas y se ve un filete doble. Se deja la de fuera. */
.footer-widgets {
	border-top: 0;
}

.site-info {
	border-top: var(--border-w) solid var(--border-default);
	font-size: var(--fs-ui-sm);
	color: var(--text-secondary);
}

.inside-site-info {
	max-width: var(--container-max);
	padding-top: var(--space-9);
	padding-bottom: var(--space-9);
}

.site-info .copyright-bar {
	font-size: var(--fs-ui-sm);
}

.site-info a {
	font-size: var(--fs-ui-sm);
	color: var(--text-secondary);
}

.site-info a:hover {
	color: var(--accent);
}

/* ---- Movil ---- */

@media (max-width: 768px) {
	.footer-widgets-container {
		padding: var(--space-14) var(--container-pad-sm);
	}

	.footer-widgets .inside-footer-widgets {
		gap: var(--space-12);
	}

	.inside-site-info {
		padding-left: var(--container-pad-sm);
		padding-right: var(--container-pad-sm);
	}
}


/* ==================================================================
   30. Calendario (FullCalendar v6)
   ================================================================== */
/* ==================================================================
 * 18. Calendario de eventos  (/proximos-eventos/, pagina 4046)
 * ==================================================================
 *
 * SUSTITUYE ENTERA a la seccion 18 actual de ds/holoplaza-ds.css.
 * La seccion vieja apunta a FullCalendar v3 (.fc-day-header, .fc-day-number,
 * .fc-day-grid-event, .fc-title, .fc-unthemed, .fc-today) y en esta pagina no
 * existe NI UNA de esas clases: el calendario que se pinta es FullCalendar
 * v6.1.17, cargado desde jsDelivr por el mu-plugin holoplaza-calendario.php.
 * Comprobado en el HTML servido: hay <div id="holoplaza-calendario"> y NO hay
 * ningun .wpfc-calendar-wrapper.
 *
 * ------------------------------------------------------------------
 * POR QUE ESTE CSS ES TAN ESPECIFICO (y como quitarle la armadura)
 * ------------------------------------------------------------------
 * El calendario tiene una hoja propia: themes/generatepress_child/css/
 * holoplaza-calendar.css, que se encola desde el shortcode y por tanto carga
 * DESPUES de esta.
 *
 * HASTA AGOSTO DE 2026 esa hoja eran 605 lineas de tema OSCURO con los colores
 * cosidos a mano (#0a1e22 de fondo, #FF8C42 de acento) y !important en casi
 * todo. Contra eso una regla normal no podia, y de ahi vienen el prefijo
 * "html body #holoplaza-calendario" (1-2-2) y los !important puntuales que aun
 * se ven en esta seccion.
 *
 * ESE TEMA YA NO EXISTE: la hoja se vacio (604 -> 386 lineas, 87 -> 2 colores
 * literales) y hoy solo tiene geometria, las variables --fc-event-* que esta
 * seccion no declara, y el color por juego. La armadura de aqui se puede
 * rebajar a "#holoplaza-calendario" sin !important, EXCEPTO donde choque con
 * la seccion 4 de esa hoja, que es la unica que sigue usandolos — y a
 * proposito: iguala esta especificidad y gana por orden de carga.
 *
 * LO QUE ESTA SECCION YA NO DECIDE es el color de cada evento. Lo pone
 * holoplaza-calendar.css a partir de la clase hpcal-game-* que emite
 * hpcal_build_event(), con los tokens de ds/games.css.
 *
 * QUE NO SE PUEDE HACER DESDE AQUI (ver el informe): el color por juego de
 * cada evento y los chips de filtro por juego. El feed PHP no emite el juego y
 * pinta el color de fondo del evento en el atributo style, en linea.
 */

/* ------------------------------------------------------------------ */
/* 18.1 Variables de FullCalendar v6                                   */
/* ------------------------------------------------------------------ */

/* v6 se conduce con custom properties, y holoplaza-calendar.css las declara
   SIN !important. Redefinirlas aqui con mas especificidad es la via barata:
   con este solo bloque caen los bordes, el fondo de la cabecera pegajosa, el
   dia de hoy, el enlace "+mas" y el hover de la lista, sin tocar una sola
   regla mas. */
/* OJO CON EL SELECTOR: FullCalendar v6 pone las clases `fc` EN EL PROPIO
   contenedor, no en un hijo. En vivo:
       document.getElementById('holoplaza-calendario').className
         -> "fc fc-media-screen fc-direction-ltr fc-theme-standard"
       document.querySelectorAll('#holoplaza-calendario .fc').length -> 0
   Asi que `#holoplaza-calendario .fc` (con espacio) no casaba con NADA y todo
   este bloque de variables era letra muerta. Se notaba: los bordes se quedaban
   en el #ddd de fabrica de FullCalendar, y en tema oscuro la cabecera pegajosa
   de dias salia como una franja BLANCA cruzando el calendario, porque
   --fc-page-bg-color nunca se recableaba.
   Se deja tambien el descendiente por si una version futura anida. */
html body #holoplaza-calendario,
html body #holoplaza-calendario .fc {
	--fc-border-color: var(--border-default);
	--fc-page-bg-color: var(--surface-card);
	--fc-neutral-bg-color: var(--surface-sunken);
	--fc-neutral-text-color: var(--text-secondary);
	--fc-today-bg-color: var(--accent-fill-faint);
	--fc-highlight-color: var(--accent-fill);
	--fc-non-business-color: var(--surface-sunken);
	--fc-now-indicator-color: var(--accent);

	--fc-button-bg-color: var(--surface-card);
	--fc-button-border-color: var(--border-default);
	--fc-button-text-color: var(--text-heading);
	--fc-button-hover-bg-color: var(--surface-card-hover);
	--fc-button-hover-border-color: var(--border-strong);
	--fc-button-active-bg-color: var(--accent);
	--fc-button-active-border-color: var(--accent);

	--fc-more-link-bg-color: transparent;
	--fc-more-link-text-color: var(--accent);
	--fc-list-event-hover-bg-color: var(--surface-card-hover);
	--fc-small-font-size: var(--fs-ui-2xs);

	font-family: var(--font-sans);
}

/* ------------------------------------------------------------------ */
/* 18.2 Contenedor y leyenda                                           */
/* ------------------------------------------------------------------ */

/* holoplaza-calendar.css encierra el calendario en una caja oscura con marco y
   16px de relleno. En el maquetado el marco lo lleva SOLO la rejilla: la barra
   de mes/vista va suelta encima. Se vacia el contenedor. */
html body #holoplaza-calendario {
	background: transparent;
	border: 0;
	border-radius: 0;
	padding: 0;
	overflow: visible;
}

html body .hpcal-wrap {
	max-width: var(--container-max);
	margin: 0 auto;
	padding: var(--space-10) var(--container-pad) var(--space-20);
	box-sizing: border-box;
}

html body .hpcal-legend {
	gap: var(--space-9);
	margin-bottom: var(--space-8);
}

/* El gris #ccc de la hoja vieja era para fondo casi negro: sobre blanco es
   ilegible. */
html body .hpcal-legend-item {
	color: var(--text-secondary);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-xs);
	gap: var(--space-3);
}

/* Los puntos de la leyenda ya NO se pintan aqui. Iban por TIPO DE POST
   (producto / actividad), que es procedencia en WordPress y no le dice nada al
   cliente. Desde la version 2.2.0 del mu-plugin la leyenda es un punto por
   JUEGO, con solo los juegos que de verdad tienen eventos en la agenda, y el
   color lo pone css/holoplaza-calendar.css desde los tokens de ds/games.css.
   .hpcal-dot-product y .hpcal-dot-cpt ya no existen en el marcado. */

/* ------------------------------------------------------------------ */
/* 18.3 Barra superior: mes, navegacion y conmutador Mes / Lista       */
/* ------------------------------------------------------------------ */

html body #holoplaza-calendario .fc-header-toolbar.fc-toolbar {
	align-items: center;
	gap: var(--space-8);
	margin-bottom: var(--space-8) !important; /* la otra hoja pone 16px !important */
}

/* El maquetado pide 32px; --fs-h4 (35px) es el escalon del sistema mas
   cercano y baja solo a 25px en movil con --fs-h4-sm. */
html body #holoplaza-calendario .fc-toolbar-title {
	color: var(--text-heading) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-h4) !important;
	font-weight: var(--fw-bold) !important;
	line-height: var(--lh-tight);
	/* AQUI HABIA `text-transform: capitalize` y daba «Agosto De 2026».
	   capitalize pone mayuscula en CADA palabra, que es la convencion inglesa;
	   en castellano solo va la primera, y ademas los meses van en minuscula.
	   FullCalendar en locale es ya devuelve "agosto de 2026" bien escrito, asi
	   que solo hay que levantar la primera letra. CSS no tiene un
	   text-transform de tipo frase, pero ::first-letter hace justo eso. */
	text-transform: none;
	margin: 0;
}

html body #holoplaza-calendario .fc-toolbar-title::first-letter {
	text-transform: uppercase;
}

/* Boton fantasma del maquetado: superficie de tarjeta, filete y tinta de
   titular. Nada de relleno de acento — el acento se reserva para la vista
   activa del conmutador. */
html body #holoplaza-calendario .fc-button,
html body #holoplaza-calendario .fc-button-primary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 40px;
	padding: 0 var(--space-7) !important;
	background: var(--surface-card) !important;
	border: 1px solid var(--border-default) !important;
	border-radius: var(--radius) !important;
	color: var(--text-heading) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md) !important;
	font-weight: var(--fw-medium) !important;
	line-height: 1;
	text-transform: none !important;
	box-shadow: none !important;
	transition: var(--transition-color) !important;
}

html body #holoplaza-calendario .fc-button:hover {
	background: var(--surface-card-hover) !important;
	border-color: var(--border-strong) !important;
	color: var(--text-heading) !important;
}

html body #holoplaza-calendario .fc-button:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
	box-shadow: none !important;
}

html body #holoplaza-calendario .fc-button:disabled {
	opacity: .45;
	cursor: default;
}

/* Flechas de mes: cuadradas de 40, como en el maquetado. */
html body #holoplaza-calendario .fc-prev-button,
html body #holoplaza-calendario .fc-next-button {
	width: 40px;
	padding: 0 !important;
}

html body #holoplaza-calendario .fc-icon {
	font-size: var(--fs-ui-lg);
	line-height: 1;
}

/* Grupo prev/next: se pegan en una sola pieza. */
html body #holoplaza-calendario .fc-button-group > .fc-button {
	border-radius: 0 !important;
}
html body #holoplaza-calendario .fc-button-group > .fc-button:first-child {
	border-radius: var(--radius) 0 0 var(--radius) !important;
}
html body #holoplaza-calendario .fc-button-group > .fc-button:last-child {
	border-radius: 0 var(--radius) var(--radius) 0 !important;
}

/* Conmutador Mes / Lista. Es el ultimo trozo de la barra (headerToolbar.right
   = 'dayGridMonth,listMonth'), asi que se identifica por posicion: FullCalendar
   no le pone clase propia. En movil el JS deja una sola vista y entonces no hay
   .fc-button-group; por eso el marco va al grupo y el aspecto de pastilla a los
   botones, que existen en los dos casos. */
html body #holoplaza-calendario .fc-toolbar-chunk:last-child .fc-button-group {
	display: inline-flex;
	gap: var(--space-2);
	padding: var(--space-2);
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
}

html body #holoplaza-calendario .fc-toolbar-chunk:last-child .fc-button-group > .fc-button {
	height: auto;
	padding: var(--space-4) 22px !important;
	background: transparent !important;
	border: 0 !important;
	border-radius: var(--radius) !important;
	color: var(--text-secondary) !important;
	font-size: var(--fs-ui-sm) !important;
	font-weight: var(--fw-medium) !important;
	margin: 0 !important;
}

html body #holoplaza-calendario .fc-toolbar-chunk:last-child .fc-button-group > .fc-button:hover {
	background: var(--surface-card-hover) !important;
	color: var(--text-heading) !important;
}

html body #holoplaza-calendario .fc-button.fc-button-active,
html body #holoplaza-calendario .fc-toolbar-chunk:last-child .fc-button.fc-button-active {
	background: var(--accent) !important;
	border-color: var(--accent) !important;
	color: var(--accent-contrast) !important;
	font-weight: var(--fw-bold) !important;
}

/* ------------------------------------------------------------------ */
/* 18.4 Vista Mes: marco, cabecera de dias y celdas                    */
/* ------------------------------------------------------------------ */

/* El marco del maquetado (filete + esquinas redondeadas + recorte) va aqui,
   no en el contenedor. AVISO: overflow hidden anula el stickyHeaderDates que
   pide el JS; el maquetado manda recorte, asi que se recorta. Si se prefiere
   la cabecera pegajosa, quitar solo esta linea. */
html body #holoplaza-calendario .fc-view-harness {
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	overflow: hidden;
}

/* FullCalendar construye la rejilla con <table>, y el margen inferior generico
   de las tablas del tema (1.5em = 30px con el tipo base) se colaba en TRES de
   ellas a la vez: .fc-col-header, .fc-scrollgrid-sync-table y la propia
   .fc-scrollgrid. Sumaban 62px de franja vacia al pie del calendario, dentro
   del marco, que es justo lo que se veia como una fila de mas en blanco.
   El overflow:hidden de la regla de arriba es lo que la hacia visible: sin el,
   el margen se escaparia del contenedor; con el, queda encerrado y se pinta.
   Antes 62px muertos, ahora 2 (el propio filete). Comprobado en vivo: 42
   celdas y 58 eventos, los mismos que antes. */
html body #holoplaza-calendario table {
	margin-bottom: 0;
}

/* Cabecera lun-dom: minusculas no, versalitas de acento sobre superficie
   hundida, como la rejilla del maquetado. */
html body #holoplaza-calendario .fc-col-header-cell {
	background: var(--surface-sunken) !important;
	border-color: var(--border-default) !important;
	padding: var(--space-7) var(--space-4) !important;
	text-align: center;
	vertical-align: middle;
}

html body #holoplaza-calendario .fc-col-header-cell-cushion {
	display: block;
	color: var(--accent) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-3xs) !important;
	font-weight: var(--fw-bold) !important;
	letter-spacing: var(--ls-badge);
	text-transform: uppercase !important;
	text-decoration: none !important;
	padding: 0;
}

/* Celda de dia. 118px es la altura de celda del maquetado (no hay token de
   altura para esto). */
html body #holoplaza-calendario .fc-daygrid-day {
	background: var(--surface-card) !important;
	border-color: var(--border-default) !important;
}

html body #holoplaza-calendario .fc-daygrid-day-frame {
	min-height: 118px;
	padding: var(--space-4);
	box-sizing: border-box;
}

/* El hover del maquetado es un filete interior de acento, no un cambio de
   fondo: asi no se pelea con el sombreado del dia de hoy. */
html body #holoplaza-calendario .fc-daygrid-day:hover {
	background: var(--surface-card) !important;
}
html body #holoplaza-calendario .fc-daygrid-day:hover .fc-daygrid-day-frame {
	box-shadow: inset 0 0 0 1px var(--accent);
}

html body #holoplaza-calendario .fc-daygrid-day-number {
	color: var(--text-heading) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md) !important;
	font-weight: var(--fw-semibold);
	line-height: 1;
	padding: 0 var(--space-1) var(--space-2) !important;
	text-decoration: none !important;
}

/* Hoy: numero en acento y negrita, y un tinte muy suave en la celda. El
   maquetado reserva el relleno fuerte de acento para el dia SELECCIONADO, que
   es estado del prototipo React y aqui no existe. */
html body #holoplaza-calendario .fc-day-today {
	background: var(--accent-fill-faint) !important;
}

html body #holoplaza-calendario .fc-day-today .fc-daygrid-day-number {
	color: var(--accent) !important;
	font-weight: var(--fw-bold) !important;
}

/* Cola del mes anterior y cabeza del siguiente: apagadas, como en el
   maquetado (opacidad .55 sobre la celda entera). */
html body #holoplaza-calendario .fc-day-other .fc-daygrid-day-frame {
	opacity: .55;
}
html body #holoplaza-calendario .fc-day-other .fc-daygrid-day-number {
	color: var(--text-muted) !important;
}

/* ------------------------------------------------------------------ */
/* 18.5 Pildoras de evento y enlace "+N mas"                           */
/* ------------------------------------------------------------------ */

html body #holoplaza-calendario .fc-daygrid-event {
	display: flex;
	align-items: center;
	gap: var(--space-3);
	padding: var(--space-1) var(--space-3) !important;
	margin: 0 0 var(--space-1) !important;
	border: 1px solid transparent !important;
	border-radius: var(--radius-sm) !important;
	box-shadow: none;
	transition: filter var(--dur-fast) var(--ease);
}

html body #holoplaza-calendario .fc-daygrid-event:hover {
	filter: brightness(1.08);
	transform: none;
	box-shadow: none !important;
}

html body #holoplaza-calendario .fc-event-title {
	font-family: var(--font-sans);
	font-size: var(--fs-ui-2xs) !important;
	font-weight: var(--fw-semibold) !important;
	line-height: var(--lh-tight) !important;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Los eventos son de dia completo: la hora siempre seria "todo el dia". */
html body #holoplaza-calendario .fc-event-time,
html body #holoplaza-calendario .fc-list-event-time {
	display: none !important;
}

/* --- Color de la pildora ---------------------------------------------
 * Aqui habia dos reglas con !important que pintaban el evento segun el TIPO DE
 * POST del que salia (producto / actividad). Se han quitado por dos motivos:
 *
 *   1) El !important ya no hace falta. Se puso porque hpcal_build_event()
 *      mandaba backgroundColor/borderColor/textColor por evento y FullCalendar
 *      los escribia EN LINEA, y contra un style inline no hay especificidad que
 *      valga. Desde la version 2.2.0 el mu-plugin no manda ningun color: manda
 *      una clase hpcal-game-*, justo para que lo decida el CSS.
 *   2) Pintar por procedencia del post no le dice nada al cliente. Ahora el
 *      color es POR JUEGO, con los tokens de ds/games.css, y lo pone la hoja
 *      propia del calendario (css/holoplaza-calendar.css), que solo se descarga
 *      en /proximos-eventos/ en vez de en todas las paginas. */

/* Sin esto el recorte con puntos suspensivos del titulo no llega a activarse:
   el contenedor flex intermedio no encoge por debajo de su contenido. */
html body #holoplaza-calendario .fc-daygrid-event .fc-event-main,
html body #holoplaza-calendario .fc-daygrid-event .fc-event-main-frame,
html body #holoplaza-calendario .fc-daygrid-event .fc-event-title-container {
	min-width: 0;
	flex: 1 1 auto;
}

html body #holoplaza-calendario .fc-daygrid-more-link {
	color: var(--accent) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-2xs) !important;
	font-weight: var(--fw-semibold) !important;
	margin-top: var(--space-1);
	text-decoration: none;
}

html body #holoplaza-calendario .fc-daygrid-more-link:hover {
	text-decoration: underline;
}

/* Globo del "+N mas" */
html body #holoplaza-calendario .fc-popover {
	background: var(--surface-raised) !important;
	border: 1px solid var(--border-default) !important;
	border-radius: var(--radius) !important;
	box-shadow: var(--shadow-dropdown) !important;
}

html body #holoplaza-calendario .fc-popover-header {
	background: var(--surface-sunken) !important;
	color: var(--text-heading) !important;
	border-radius: var(--radius) var(--radius) 0 0 !important;
	padding: var(--space-4) var(--space-6) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
}

/* Icono ACF que el JS inyecta dentro del titulo (eventDidMount). */
html body .hpcal-event-icon {
	border-radius: var(--radius-xs);
}

/* ------------------------------------------------------------------ */
/* 18.6 Vista Lista                                                    */
/* ------------------------------------------------------------------ */

html body #holoplaza-calendario .fc-list {
	background: var(--surface-card);
	border: 1px solid var(--border-default) !important;
	border-radius: var(--radius) !important;
	overflow: hidden;
}

/* Franja de dia: mismo tratamiento que la cabecera de la rejilla. */
html body #holoplaza-calendario .fc-list-day-cushion {
	background: var(--surface-sunken) !important;
	padding: var(--space-5) var(--space-8) !important;
}

html body #holoplaza-calendario .fc-list-day-text,
html body #holoplaza-calendario .fc-list-day-side-text {
	color: var(--accent) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-3xs) !important;
	font-weight: var(--fw-bold) !important;
	letter-spacing: var(--ls-badge);
	text-transform: uppercase !important;
	text-decoration: none !important;
}

html body #holoplaza-calendario .fc-list-event {
	background: var(--surface-card) !important;
}

html body #holoplaza-calendario .fc-list-event:hover td {
	background: var(--surface-card-hover) !important;
}

html body #holoplaza-calendario .fc-list-table td {
	border-color: var(--border-default) !important;
	padding: var(--space-8) var(--space-8) !important;
	vertical-align: middle;
}

html body #holoplaza-calendario .fc-list-event-title a {
	color: var(--text-heading) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-lg) !important;
	font-weight: var(--fw-semibold) !important;
	text-decoration: none !important;
}

html body #holoplaza-calendario .fc-list-event:hover .fc-list-event-title a {
	color: var(--accent) !important;
}

/* El punto de la vista Lista tampoco se pinta ya aqui: mismo caso que las
   pildoras. Va por juego, desde la hoja propia del calendario. */

html body #holoplaza-calendario .fc-list-empty {
	background: var(--surface-sunken);
}

html body #holoplaza-calendario .fc-list-empty-cushion {
	color: var(--text-secondary) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-style: normal;
}

/* ------------------------------------------------------------------ */
/* 18.7 Modal de detalle                                               */
/* ------------------------------------------------------------------ */

html body .hpcal-modal-backdrop {
	background: rgba(0, 0, 0, .55);
}

html body .hpcal-modal-content {
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow-card);
	max-width: 540px;
}

html body .hpcal-modal-close {
	background: var(--surface-sunken);
	border: 1px solid var(--border-default);
	color: var(--text-secondary);
	width: 34px;
	height: 34px;
	font-size: var(--fs-ui);
}

html body .hpcal-modal-close:hover {
	background: var(--accent);
	border-color: var(--accent);
	color: var(--accent-contrast);
}

html body .hpcal-modal-img {
	border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}

html body .hpcal-modal-title {
	color: var(--text-heading);
	font-family: var(--font-sans);
	font-weight: var(--fw-bold);
	line-height: var(--lh-tight);
}

html body .hpcal-modal-date {
	color: var(--accent);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
}

html body .hpcal-modal-excerpt {
	color: var(--text-body);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	line-height: var(--lh-body);
}

html body .hpcal-modal-price {
	color: var(--text-heading);
	font-family: var(--font-sans);
	font-weight: var(--fw-bold);
}

html body .hpcal-modal-price del { color: var(--text-muted); }
html body .hpcal-modal-price ins { color: var(--accent); }

/* Boton primario del sistema (seccion 3), no el degradado naranja cosido. */
html body .hpcal-modal-btn {
	background: var(--accent);
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	color: var(--accent-contrast) !important; /* la otra hoja fuerza #000 */
	font-family: var(--font-sans);
	font-size: var(--fs-ui-md);
	font-weight: var(--fw-bold);
	padding: var(--space-7) 28px;
	transition: all .2s ease;
}

html body .hpcal-modal-btn:hover {
	background: var(--accent-light);
	border-color: var(--accent-light);
	box-shadow: none;
	transform: none;
}

/* Distintivos de tipo del modal. Contorno en vez de relleno: son etiquetas
   informativas, no acciones, y asi no compiten con el boton de acento. */
html body .hpcal-badge {
	border-radius: var(--radius-pill);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-3xs);
	font-weight: var(--fw-bold);
	letter-spacing: var(--ls-badge);
}

html body .hpcal-badge-product {
	background: var(--accent-fill);
	color: var(--accent);
}

html body .hpcal-badge-cpt {
	background: transparent;
	border: 1px solid var(--game-magic);
	color: var(--game-magic);
}

/* ------------------------------------------------------------------ */
/* 18.8 Caja de suscripcion                                            */
/* ------------------------------------------------------------------ */

html body .hpcal-subscribe-box {
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	padding: var(--space-12);
}

html body .hpcal-subscribe-box h3 {
	color: var(--text-heading);
	font-family: var(--font-sans);
	font-size: var(--fs-h5);
	font-weight: var(--fw-bold);
}

html body .hpcal-subscribe-box p {
	color: var(--text-secondary);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	line-height: var(--lh-body);
}

/* El campo estaba en #051518 !important: un hueco negro en una web blanca. */
html body .hpcal-subscribe-row input[type="email"] {
	background: var(--surface-sunken) !important;
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
	color: var(--text-body) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	height: var(--control-h);
	box-sizing: border-box;
}

html body .hpcal-subscribe-row input[type="email"]:focus {
	border-color: var(--accent);
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

html body .hpcal-subscribe-row input[type="email"]::placeholder {
	color: var(--placeholder);
}

html body .hpcal-subscribe-row button {
	background: var(--accent) !important;
	border: 1px solid var(--accent) !important;
	border-radius: var(--radius) !important;
	color: var(--accent-contrast) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-bold) !important;
	height: var(--control-h);
	padding: 0 var(--space-10) !important;
}

html body .hpcal-subscribe-row button:hover {
	background: var(--accent-light) !important;
	border-color: var(--accent-light) !important;
	box-shadow: none;
	transform: none;
}

html body .hpcal-subscribe-msg {
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
}
html body .hpcal-msg-ok  { color: var(--stock-in); }
html body .hpcal-msg-err { color: var(--stock-out); }

/* Aviso de suscripcion confirmada / baja. */
html body .hpcal-alert-ok {
	background: var(--success-fill);
	border: 1px solid var(--success-border);
	border-radius: var(--radius);
	color: var(--stock-in);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
}

/* ------------------------------------------------------------------ */
/* 18.9 Movil                                                          */
/* ------------------------------------------------------------------ */

@media (max-width: 768px) {
	html body .hpcal-wrap {
		padding: var(--space-8) var(--container-pad-sm) var(--space-14);
	}

	html body #holoplaza-calendario .fc-toolbar-title {
		font-size: var(--fs-h4-sm) !important;
	}

	/* Con la barra apilada, el conmutador ocupa el ancho. */
	html body #holoplaza-calendario .fc-toolbar-chunk:last-child .fc-button-group {
		width: 100%;
	}
	html body #holoplaza-calendario .fc-toolbar-chunk:last-child .fc-button-group > .fc-button {
		flex: 1 1 auto;
	}

	/* En movil el JS arranca en listMonth; si se vuelve a Mes, las celdas no
	   necesitan 118px de alto. */
	html body #holoplaza-calendario .fc-daygrid-day-frame {
		min-height: 72px;
		padding: var(--space-2);
	}

	html body #holoplaza-calendario .fc-list-table td {
		padding: var(--space-6) var(--space-5) !important;
	}
}


/* ==================================================================
   31. Portada: remate
   ================================================================== */
/* ==================================================================
   PORTADA (pagina 265) — remate contra ui_kits/tienda/Home.jsx
   ==================================================================

   Va DESPUES de la seccion 23 de ds/holoplaza-ds.css. Solo toca lo que
   sigue sin cuadrar con el maquetado: el aire entre el hero y el titulo
   de "Ultimos lanzamientos", y la franja de "Eventos".

   Lo que NO se toca y por que:

   - El boton del hero (widget 0078a1a) YA sale bien. Elementor lo pinta
     con linear-gradient(90deg, var(--e-global-color-text) 3.96%,
     var(--e-global-color-dd8b130) 108%), y la seccion 2 del DS ya
     recableo esas dos variables del kit a --accent (#BB1823) y
     --hp-blush (#FFE1E3). O sea: el degradado carmesi->rosa del
     maquetado ya esta, y la seccion 3 fuerza el texto a
     --accent-contrast. Comprobado, no hace falta CSS.
   - Los cinco paneles de lanzamientos y las filas de la agenda: hechos
     y correctos en la seccion 23. Aqui solo se reubican, no se
     rediseñan.
   - La imagen del hero (confondochaos-1.png) es la del set "Caos
     Creciente", que es justo lo que el maquetado pone en esa columna.
     No sobra.

   Especificidad: Elementor pinta desde post-265.css con selectores de
   dos clases (.elementor-265 .elementor-element.elementor-element-XXX).
   Se antepone "html body" para ganar sin recurrir a !important, salvo
   en el unico sitio donde el propio DS ya usa !important y no queda
   otra (esta señalado abajo).
   ================================================================== */


/* ==================================================================
   A. Hero
   ================================================================== */

/* La entradilla ("Aprovecha las ofertas...") va en el color del titular
   en el maquetado, no en el color de cuerpo. Elementor ya le da los
   25px, asi que aqui solo el color y el margen del parrafo, que si
   traia del tema y descuadraba el hueco de 40px del contenedor. */
html body .elementor-265 .elementor-element.elementor-element-f3af3ac,
html body .elementor-265 .elementor-element.elementor-element-f3af3ac p {
	margin: 0;
	color: var(--text-heading);
	line-height: var(--lh-body);
}


/* ==================================================================
   B. Separador y titulo "Ultimos lanzamientos"
   ================================================================== */

/* de19554 es un contenedor VACIO cuyo unico contenido es separador.png
   como fondo. El maquetado SI conserva el separador, pero no como banda
   suelta: lo pone de fondo del mismo bloque que lleva el titulo
   (Home.jsx, backgroundPosition 'top right' sobre el div del h2).
   Suelto, con sus 50px de relleno arriba y abajo, mete unos 100px de
   aire muerto entre el hero y el titulo que el maquetado no tiene.
   Se apaga la banda y el dibujo se pasa al bloque del titulo. */
html body .elementor-265 .elementor-element.elementor-element-de19554 {
	display: none;
}

/* 23d9d7b es el contenedor del h2. Recibe el separador arriba a la
   derecha. El :not(...) replica el selector con el que Elementor pinta
   los fondos de contenedor, para sustituir la declaracion en vez de
   pelearse con ella. */
html body .elementor-265 .elementor-element.elementor-element-23d9d7b:not(.elementor-motion-effects-element-type-background) {
	background-image: url("/wp-content/uploads/2025/07/separador.png");
	background-position: top right;
	background-repeat: no-repeat;
}

/* Rellenos del maquetado para ese bloque: 50px arriba y a los lados, y
   CERO abajo. Los 50px de abajo que trae hoy, sumados a los 50 de
   arriba de .hlzds-lanzamientos, dejaban 100px entre el titulo y los
   paneles cuando el maquetado deja 20. */
html body .elementor-265 .elementor-element.elementor-element-23d9d7b {
	--padding-top: var(--space-16);
	--padding-bottom: 0px;
	--padding-left: var(--space-16);
	--padding-right: var(--space-16);
}

/* La otra mitad del hueco de 20px. Se acota al contenedor de la portada
   y no se toca .hlzds-lanzamientos en general: el componente se queda
   como esta para quien lo reutilice. */
html body .elementor-265 .elementor-element.elementor-element-hlzdslanz1 .hlzds-lanzamientos {
	padding-top: var(--space-9);
}

@media (max-width: 1024px) {
	/* separador.png mide 1388x76: por debajo de su ancho hay que
	   encogerlo o se recorta por la izquierda. Es la misma regla que
	   Elementor ya tenia puesta sobre de19554. */
	html body .elementor-265 .elementor-element.elementor-element-23d9d7b:not(.elementor-motion-effects-element-type-background) {
		background-size: contain;
	}
}

@media (max-width: 767px) {
	/* En movil el propio post-265.css bajaba estos rellenos a 20px; como
	   la regla de arriba lo gana, hay que repetir el ajuste aqui. */
	html body .elementor-265 .elementor-element.elementor-element-23d9d7b {
		--padding-top: var(--space-9);
		--padding-bottom: 0px;
		--padding-left: var(--space-9);
		--padding-right: var(--space-9);
	}
}


/* ==================================================================
   C. Franja de "Eventos"
   ==================================================================

   El maquetado (Home.jsx, EventsSection) pide una banda a ancho
   completo sobre --surface-sunken, separada por una linea de 1px, con
   el interior a 1000px y la cabecera (h2 + enlace "Ver calendario
   completo") en la MISMA fila, encima de la lista.

   Lo que hay hoy en 198c4df no es eso:
     - fondo fondopared-min.jpg (foto de pared),
     - un divisor triangular de 180px pintado en --e-global-color-primary
       (o sea, en tinta: una cuña oscura enorme sobre la banda),
     - una franja de cinco logos de marca que el maquetado no lleva,
     - el h2 fuera de la banda gris (la banda la dibuja .hlzds-agenda,
       que va por dentro y queda embutida a 50px de los bordes),
     - y el enlace convertido en un boton grande con degradado teal
       (#051518 -> #1A6F7F, hexadecimales cosidos, fuera del sistema)
       colgando al final.
   ================================================================== */

/* La banda pasa a ser el propio contenedor de Elementor: fondo plano de
   sistema en vez de la foto de pared. */
html body .elementor-265 .elementor-element.elementor-element-198c4df:not(.elementor-motion-effects-element-type-background) {
	background-image: none;
	background-color: var(--surface-sunken);
}

html body .elementor-265 .elementor-element.elementor-element-198c4df {
	border-top: 1px solid var(--border-default);

	/* Home.jsx: marginTop 60 y padding '70px 50px 80px'. 70 y 80 no
	   existen como token, asi que se componen con los que si: 60+10 y
	   60+20. Nada de numeros sueltos. */
	--margin-top: var(--space-20);
	--padding-top: calc(var(--space-20) + var(--space-5));
	--padding-bottom: calc(var(--space-20) + var(--space-9));
	--padding-left: var(--space-16);
	--padding-right: var(--space-16);

	/* El interior a 1000px, que es el ancho del maquetado y el mismo
	   literal que ya usan .hlzds-agenda__cab y .hlzds-agenda__lista.
	   Se hace por --content-width, que es la variable que Elementor
	   consume en .e-con-inner{max-width:var(--content-width)}; el min()
	   conserva el tope del 100% que trae por defecto. */
	--content-width: min(100%, 1000px);
}

/* AQUI HABIA DOS `display: none` Y LOS DOS ESTABAN MAL. Se borran:

   1) El divisor triangular. Se escondia por CSS; ahora esta quitado de verdad
      en _elementor_data (fuera `shape_divider_top*` y el __globals__ que lo
      pintaba), que es donde tocaba. Esconder no es quitar.

   2) La franja de cinco logos de marca (e0af01f). Se dio por sobrante porque
      Home.jsx no la monta — y era falso: el paquete SI la trae, en
      guidelines/brand-tcg-strip.html, en HP_TIENDA.brands y en el readme
      ("Publisher logos at 150px over the plaster wall — homepage only").
      Encima el `display:none` se llevaba por delante cinco enlaces internos a
      categorias, tambien del arbol de accesibilidad.
      Ahora la franja esta montada como contenedor de primer nivel sobre
      fondopared-min.jpg, y se estila en el bloque de portada del final de esta
      hoja. Si esta regla siguiera aqui, la volveria a esconder. */

/* Cabecera y lista en una rejilla: titulo a la izquierda, enlace a la
   derecha alineado por la base, y la lista ocupando las dos columnas.
   El maquetado lo resuelve con flex + space-between porque alli el
   titulo y el enlace son hermanos dentro de un div propio; aqui son
   hermanos de la lista, asi que hace falta colocarlos a mano. */
html body .elementor-265 .elementor-element.elementor-element-198c4df > .e-con-inner {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: end;
	row-gap: var(--space-12);
	column-gap: var(--space-9);
}/* NOTA DE LIMPIEZA (17-ago-2026): aqui vivian las reglas de dos widgets de
   Elementor que ya no existen — cf61124 (el h2 «Eventos») y f0a18f6 (el boton
   «Ver calendario completo»). Se borraron de _elementor_data porque el
   shortcode de la agenda ya pinta su propio titulo, subtitulo y enlace, y
   salian dos veces. Comprobado contra la base de datos antes de quitarlas.
   La rejilla de arriba se queda: 8ccb742 (el shortcode) SI existe. */
html body .elementor-265 .elementor-element.elementor-element-8ccb742 {
	grid-column: 1 / -1;
	grid-row: 2;
}/* La banda gris ya la dibuja el contenedor, asi que .hlzds-agenda tiene
   que dejar de dibujar la suya: por dentro quedaba una segunda caja gris
   con su propia linea y su propio relleno, embutida a 50px de los
   bordes en vez de ir a sangre. Solo dentro de esta seccion: el
   componente sigue trayendo su banda donde se use suelto. */
html body .elementor-265 .elementor-element.elementor-element-198c4df .hlzds-agenda {
	padding: 0;
	background: none;
	border-top: 0;
}

/* .hlzds-agenda__lista ya viene con max-width 1000 y margin auto; con el
   interior del contenedor tambien a 1000 no hace nada, pero se deja
   explicito el ancho completo por si se cambia el tope de arriba. */
html body .elementor-265 .elementor-element.elementor-element-198c4df .hlzds-agenda__lista {
	max-width: none;
}

@media (max-width: 767px) {
	/* Una sola columna: el enlace baja debajo del titulo, pegado a la
	   izquierda. */
	html body .elementor-265 .elementor-element.elementor-element-198c4df > .e-con-inner {
		grid-template-columns: 1fr;
		row-gap: var(--space-9);
	}html body .elementor-265 .elementor-element.elementor-element-8ccb742 {
		grid-column: 1;
		grid-row: 3;
	}/* Mismo motivo que en 23d9d7b: la regla de escritorio de arriba gana
	   a la de movil de post-265.css, hay que repetirla. */
	html body .elementor-265 .elementor-element.elementor-element-198c4df {
		--margin-top: var(--space-14);
		--padding-top: var(--space-14);
		--padding-bottom: var(--space-16);
		--padding-left: var(--space-9);
		--padding-right: var(--space-9);
	}
}

/* ================================================================== */
/* 32. El lienzo: contenedores de contenido                           */
/* ================================================================== */

/* SINTOMA: con el tema de marca puesto, la cabecera y el banner salian claros
   pero el area de contenido seguia siendo un rectangulo casi negro, y los
   titulos —que ya van en tinta oscura— quedaban invisibles encima. Pasaba en
   la parrilla de categoria y en la ficha.

   ORIGEN, ya localizado: no esta en ninguna hoja .css. Lo imprime
   GeneratePress EN LINEA, en <style id="generate-style-inline-css">, generado
   desde el Personalizador con la paleta invertida:

       :root{--contrast:#051518; --base-3:#ffffff;}
       .separate-containers .inside-article,
       .separate-containers .comments-area,
       .separate-containers .page-header,
       .one-container .container,
       .separate-containers .paging-navigation,
       .inside-page-header
           { color: var(--base-3); background-color: var(--contrast); }

   POR QUE EL INTENTO ANTERIOR NO SIRVIO DE NADA: se escribio
   `html body .inside-article`, que es especificidad 0-1-2 (una clase, dos
   elementos). El selector de GeneratePress lleva DOS clases: 0-2-0, y gana.
   Aqui se cualifica con la clase del <body> —`separate-containers` y
   `one-container` son clases del body en este tema— para llegar a 0-2-2 y
   ganar por especificidad, sin recurrir a !important.

   POR QUE NO SE REMAPEA LA PALETA DE GENERATEPRESS ENTERA, que seria mas
   corto: porque `--contrast` tiene dos usos incompatibles en esa misma hoja.
   Es el fondo oscuro de las cajas, pero tambien el COLOR DE TEXTO de los
   botones (`button{color:var(--contrast);background-color:var(--accent)}`).
   Aclararlo dejaria texto claro sobre boton claro. Hay que ir selector a
   selector.

   El area de contenido no pinta fondo: lo pinta el body y estas cajas se
   dejan transparentes. Asi hay UN solo sitio donde cambia el lienzo, y en
   tema oscuro los mismos tokens devuelven el fondo oscuro de siempre. */

html body.separate-containers .inside-article,
html body.separate-containers .comments-area,
html body.separate-containers .page-header,
html body.separate-containers .paging-navigation,
html body.one-container .container,
html body .inside-page-header,
html body .site,
html body #page,
html body .site-content,
html body #content,
html body .content-area,
html body #primary,
html body .entry-content,
html body main,
html body .site-main {
	background-color: transparent;
	color: var(--text-body);
}

/* El unico que pinta fondo es el body: asi hay un solo sitio donde cambia el
   lienzo y no cuatro peleandose.
   Y el color de texto tambien va AQUI, en la especificidad mas baja que puede
   ganarle a GeneratePress (su `body{color:var(--base-3)}` es 0-0-1, esto es
   0-0-2). Todo lo demas hereda. Es a proposito: cuanto mas abajo se declare el
   color base, menos componentes pisa. */
html body {
	background-color: var(--page-bg);
	color: var(--text-body);
}

/* Titulares del contenido.
   AQUI HABIA UNA REGLA GENERAL (todos los h1..h4 de .site-content y
   .entry-content) y era un error mio: con 0-1-3 de especificidad se comia el
   color propio de cualquier componente cuyo titulo sea un h2/h3. Se comprobo
   con estilos computados que las baldosas de «Ultimos lanzamientos» pintaban
   su titulo en rgb(13,13,15) —tinta oscura— sobre el degradado de color, en
   vez del blanco que pide el maquetado.
   Ademas ya no hacia falta: los titulares heredaban blanco porque
   .inside-article traia color:var(--base-3), y eso se corrige arriba. Lo que
   se hereda ya es tinta oscura.
   Se dejan solo los dos casos donde WooCommerce si necesita que se lo digamos
   expresamente, y ninguno es un componente con color propio. */
html body .woocommerce-products-header h1,
html body .woocommerce div.product .product_title {
	color: var(--text-heading);
}

/* AQUI HABIA UNA REGLA DE PARRAFOS (html body .site-content p, .entry-content p
   ...) y era el mismo error que la de titulares, con la misma especificidad
   0-1-3: se comia el color propio de cualquier componente cuyo texto sea un
   <p>. Medido en el calendario con la cascada real: la fecha del modal perdia
   su acento y la entradilla de la caja de suscripcion perdia su gris. Ninguno
   quedaba ilegible, pero aplanaba la jerarquia — que es justo lo que un sistema
   de diseno esta para evitar.
   No se sustituye por nada: el color base lo pone ahora `html body` y los
   parrafos lo heredan. Los componentes conservan el suyo. */

/* Enlaces del contenido.
   GeneratePress tiene una SEGUNDA regla, aparte del `a` generico, que se me
   escapo la primera vez porque solo declara color y no fondo:
       .inside-article a, .paging-navigation a,
       .comments-area a, .page-header a { color: var(--base-3); }
   Es 0-1-1 y le gana al `a { color: var(--link) }` del sistema (0-0-1), asi que
   con el lienzo claro TODO enlace de texto corrido quedaba blanco sobre blanco.
   Comprobado con la cascada real: en «¿Olvidaste la contraseña?» --link valia
   #0d0d0f y aun asi el color computado era rgb(255,255,255).

   POR QUE NO SE CONTESTA CON `.inside-article a` A SECAS, que seria lo obvio:
   porque ese selector coge TAMBIEN los enlaces que son componentes enteros. Las
   baldosas de lanzamientos son un <a> con el antetitulo y la fecha en blanco
   sobre el degradado; hoy salen bien justamente porque heredan el blanco de la
   regla de GeneratePress. Recablearlas a tinta oscura las romperia — es el
   mismo error que ya cometi con una regla general de titulares.
   Por eso se limita al enlace que vive dentro de texto: p, li, td, dd. Un
   componente-enlace nunca cuelga de un parrafo. */
html body .inside-article p a,
html body .inside-article li:not(.product) a,
html body .inside-article td a,
html body .inside-article dd a,
html body .entry-content p a,
html body .comments-area p a,
html body .page-header p a {
	color: var(--link);
}

html body .inside-article p a:hover,
html body .inside-article p a:focus,
html body .inside-article li:not(.product) a:hover,
html body .inside-article td a:hover,
html body .entry-content p a:hover,
html body .entry-content p a:focus {
	color: var(--link-hover);
}

/* ==================================================================
   A. La franja de marcas: es un PANEL, no una banda a sangre
   ==================================================================

   guidelines/brand-tcg-strip.html no deja lugar a dudas sobre que es
   esta pieza:

       <div style="background:url(../assets/fondopared.jpg) center/cover;
                   border-radius:8px; padding:20px; display:flex;
                   gap:16px; justify-content:center">

   Un rectangulo redondeado con relleno, apoyado sobre el fondo de
   pagina. No una franja de pared cruzando la pantalla de lado a lado,
   que es lo que habia.

   MEDIDO ANTES DE TOCAR NADA, a 2000px de ancho: 2000x196 de pared casi
   blanca a sangre, con los cinco logos apinados en los 922px centrales
   y 540px de textura vacia a cada lado. Y pegada por abajo a la banda
   gris de eventos —lo hacia a proposito la seccion C de aqui abajo—,
   asi que desde los logos hasta el final de la pagina no habia un solo
   corte: una losa lavada de mas de 1000px de alto. Es lo que se veia
   como «una banda gris que no se sabe que pinta».

   LA IMAGEN NO SE VUELVE A DECLARAR AQUI, a proposito. La pinta
   Elementor desde _elementor_data, y es exactamente el fichero del
   paquete (fondopared.jpg, 161.458 bytes, identico byte a byte al que
   sirve el sitio; comprobado). Repetir la URL en la hoja crearia un
   segundo sitio donde cambiarla el dia que se cambie la textura. Lo
   unico que se hace es encoger el elemento que ya la lleva.

   EL PANEL SE AJUSTA A LOS LOGOS (`width: fit-content`), no ocupa un
   ancho de rejilla. En el guideline la tarjeta mide apenas mas que la
   fila que contiene —110px x 5 + 4 huecos de 16 = 614px dentro de una
   demo de 700—, o sea que es una PLACA detras de los logos, no una
   banda. Dejarla a 1400 seguia dando 240px de pared vacia a cada lado a
   2000px de ancho: menos escandaloso que los 540 de antes, pero el
   mismo defecto.

   EL max-width NO ES var(--container-max) A SECAS: por debajo de 1400px
   el panel se comeria los bordes de la pantalla. El min() le deja
   siempre los 24px de --container-pad a cada lado. Con `fit-content`
   delante, el max-width solo actua de tope cuando la fila no cabe.

   LOS MARGENES VAN POR LAS VARIABLES DE ELEMENTOR y no por
   `margin-inline: auto`: son las que consume su propia regla de .e-con.
   Escribir la propiedad a pelo tambien ganaria por especificidad, pero
   dejaria dos sitios distintos diciendo lo mismo sobre el mismo margen.

   ARRIBA NO LLEVA MARGEN y no es un olvido: la seccion de lanzamientos
   que tiene encima ya termina con 60px de relleno inferior, los mismos
   60 que se ponen aqui abajo. El aire sale simetrico sin sumar dos
   margenes. */
html body .elementor-265 .elementor-element.elementor-element-e0af01f {
	width: fit-content;
	max-width: min(var(--container-max), calc(100% - 2 * var(--container-pad)));
	border-radius: var(--radius);

	--margin-left: auto;
	--margin-right: auto;
	--margin-bottom: var(--space-20);

	/* Los 20px por los cuatro lados del guideline. Antes eran 0 arriba y
	   abajo y 50 a los lados, que es relleno de seccion, no de panel. */
	--padding-top: var(--space-9);
	--padding-bottom: var(--space-9);
	--padding-left: var(--space-9);
	--padding-right: var(--space-9);
}

/* Cada logo vive en su propio contenedor hijo, y un contenedor de
   Elementor nace con --width:100%. Cinco cajas al 100% dentro de una
   fila flexible se reparten el ancho en quintos iguales y cada logo se
   queda pegado a la izquierda de su quinto: cinco islas separadas por
   huecos enormes, que no es la tira compacta del paquete. Con ancho
   automatico las cajas miden lo que mide su logo y mandan de verdad el
   justify-content:center y el hueco de 16px que ya trae el contenedor
   padre desde _elementor_data. */
html body .elementor-265 .elementor-element.elementor-element-e0af01f > .e-con-inner > .e-con {
	--width: auto;
	flex: 0 0 auto;
}

/* Los cinco logos van a 150px por ajuste del propio widget. Aqui solo
   el tope: por debajo de 1400px la fila tiene que poder encogerse sin
   desbordar la banda. */
html body .elementor-265 .elementor-element.elementor-element-e0af01f img {
	max-width: 100%;
	height: auto;
}


/* ==================================================================
   B. La placa del logo de Riftbound
   ==================================================================

   El logo de Riftbound es un degradado oscuro y sobre la pared gris se
   pierde. El paquete lo resuelve con una placa casi negra detras
   (guidelines/brand-tcg-strip.html: <span style="background:#020101C9;
   padding:4px">). El color ya viene de _elementor_data —de ahi lo
   saco el paquete—; lo que falta es el relleno de 4px, sin el cual la
   placa queda a ras del dibujo. */
html body .elementor-265 .elementor-element.elementor-element-0becafa > .elementor-widget-container {
	padding: var(--space-2);
	border-radius: var(--radius-xs);
	line-height: 0;   /* sin el hueco de linea bajo la imagen la placa sale torcida */
}


/* ==================================================================
   C. El arranque de la banda de eventos
   ==================================================================

   OJO: ESTE COMENTARIO DECIA OTRA COSA HASTA EL 17-ago-2026 y estaba
   describiendo un estado que ya no existe. Decia que la pared y la
   banda de eventos eran «dos rectangulos a sangre, uno encima del
   otro», y que por eso habia que quitarle a eventos el margen superior
   para que no se colara fondo de pagina entre ambas.

   Eso era justo el defecto: pared a sangre + eventos a sangre + el
   mismo gris = una losa continua sin corte. La pared es ahora el panel
   de la seccion A, con sus 60px de margen inferior, asi que el aire
   entre las dos piezas ya lo pone ella.

   El margen se sigue quedando en 0 por otra razon distinta: los 60 del
   panel y unos 60 de eventos NO se suman —son margenes hermanos y
   colapsan al mayor—, pero declarar un margen que nunca se usa deja
   escrito un numero que miente. El corte entre la banda y lo que tiene
   encima lo marca la linea de 1px que el maquetado pide.

   El aire entre los paneles de lanzamientos y la pared lo pone el
   relleno inferior de .hlzds-lanzamientos (60px), que no se toca. */
html body .elementor-265 .elementor-element.elementor-element-198c4df {
	--margin-top: 0px;
}


/* ==================================================================
   D. El boton del heroe
   ==================================================================

   El maquetado lo pinta PLANO en el carmesi de marca, grande:
   Home.jsx le da background var(--accent), padding 14/28, peso 700 y
   fontSize var(--fs-body); y el componente Button del paquete repite
   esos mismos 14/28 en su variante "shop". Lo que sale hoy es el boton
   por defecto de Elementor: 14px de letra y 10/16 de relleno, con el
   degradado carmesi->rosa.

   El degradado no es un error suelto —sale de que la seccion 2 recablea
   las dos variables del kit 627— pero el readme del paquete reserva
   --gradient-cta para "the checkout / back-in-stock CTA", y el heroe no
   es ninguno de los dos. Aqui vuelve al relleno plano.

   No lleva !important: la seccion 3 pone el color del texto con
   !important, y eso se respeta (blanco sobre carmesi es justo lo que
   toca); lo demas se gana por especificidad. */
html body .elementor-265 .elementor-element.elementor-element-0078a1a .elementor-button {
	/* 14/28: el 14 es --space-7; 28 no existe suelto, se compone 24+4. */
	padding: var(--space-7) calc(var(--space-10) + var(--space-2));
	background-image: none;
	background-color: var(--accent);
	border-color: var(--accent);
	font-size: var(--fs-body);
	font-weight: var(--fw-bold);
	border-radius: var(--radius);
}

html body .elementor-265 .elementor-element.elementor-element-0078a1a .elementor-button:hover,
html body .elementor-265 .elementor-element.elementor-element-0078a1a .elementor-button:focus-visible {
	background-image: none;
	background-color: var(--accent-light);
	border-color: var(--accent-light);
}


/* ==================================================================
   E. La tercera linea de la fila de evento
   ==================================================================

   AgendaRow del maquetado lleva tres lineas: chip de juego, titulo y
   una tercera en gris con "hora · plazas". El shortcode ya pinta las
   dos primeras; la tercera la anade ahora con las plazas que quedan
   (hora no hay en los datos, ver el comentario del mu-plugin). */
.hlzds-evento__meta {
	font-size: var(--fs-ui-sm);
	color: var(--text-secondary);
}


/* ==================================================================
   F. Pantallas estrechas
   ================================================================== */

@media (max-width: 1024px) {
	/* A cinco logos de 150px + cuatro huecos de 16px les hacen falta
	   814px libres. Con los 20px de relleno del panel a cada lado, por
	   debajo de ~854px la fila revienta: mejor que envuelva y baje a
	   120px, que es ademas lo que hace el guideline (flex-wrap:wrap).
	   El umbral era ~914px cuando el relleno eran 50px por lado. */
	html body .elementor-265 .elementor-element.elementor-element-e0af01f > .e-con-inner {
		flex-wrap: wrap;
	}

	html body .elementor-265 .elementor-element.elementor-element-e0af01f img {
		width: 120px;
	}
}

@media (max-width: 767px) {
	html body .elementor-265 .elementor-element.elementor-element-e0af01f img {
		width: 100px;
	}

	/* Mismo motivo que en la seccion 31: las reglas de escritorio de
	   arriba ganan tambien dentro de la media query de post-265.css, asi
	   que el margen hay que repetirlo aqui. */
	html body .elementor-265 .elementor-element.elementor-element-198c4df {
		--margin-top: 0px;
	}
}


/* ==================================================================
   33. Tienda: parrilla, ficha y carrito
   ================================================================== */
/* =====================================================================
   HoloPlaza TCG — TIENDA: parrilla de catalogo, ficha y carrito
   Agente «tienda». Traduce ui_kits/tienda/{Catalog,Product,Cart}.jsx y
   components/commerce/{ProductCard,Price,OverlayBadge}.jsx al marcado real
   que sirve el VPS. Solo tokens de ds/{colors,typography,spacing,effects}.css.

   Se carga DESPUES de ds/holoplaza-ds.css.
   ===================================================================== */


/* === 0. Por que existe este fichero (leer antes de fusionar) =========

   HALLAZGO PRINCIPAL, y la razon de que la parrilla siguiera naranja:
   la seccion 26 «Catalogo» del bundle NO PINTA NADA. Sus 67 selectores
   empiezan por `html body .woocommerce ...`, con espacio, y eso exige un
   elemento con clase `woocommerce` DENTRO del body. En las plantillas de
   archivo y de ficha ese elemento no existe: la clase la lleva el propio
   <body> (comprobado con lxml sobre el HTML de produccion — `body
   .woocommerce` devuelve 0 elementos en /categoria/... y en /producto/...).
   En el carrito si existe (lo abre el shortcode), y por eso la seccion 28
   —que ademas ancla en `body.woocommerce-cart`— si se ve.

   Con la 26 muerta, la parrilla se quedaba con las secciones 3/4/5 del
   bundle, que no llevan !important, y perdia contra el tema hijo.

   SEGUNDO HALLAZGO: el naranja del boton NO viene del CSS en linea de
   GeneratePress. Viene de themes/generatepress_child/style.css:

       .woocommerce a.button, ... { background:#FF8C42 !important;
                                    color:#000 !important; ... }

   Contra un !important la especificidad no sirve de nada: solo lo tumba
   otro !important. Por eso los bloques de color del boton llevan
   !important — es la unica herramienta que existe, no comodidad. En
   cuanto ese bloque salga de style.css se pueden quitar de aqui.

   COMO SE ARREGLA EL SELECTOR: se sustituye `html body .woocommerce` por
   `html body[class*="woocommerce"]`. Casa con las tres familias de body que
   pone WooCommerce (`woocommerce` en tienda/categoria/ficha,
   `woocommerce-page` y `woocommerce-cart` en carrito y compra), asi que las
   tarjetas se ven igual en la parrilla, en los relacionados de la ficha y en
   las ventas cruzadas del carrito. Y mantiene EXACTAMENTE la misma
   especificidad que el selector que sustituye —un componente de clase—, con
   lo que las decisiones de peso que ya estaban pensadas siguen valiendo.

   QUE HAY QUE BORRAR DEL BUNDLE AL FUSIONAR: ver la seccion 10 del final.

   LO QUE NO SE TOCA: ni un precio, ni el texto del boton. «Ver producto»
   lo pone functions.php a proposito en los productos variables (hay que
   elegir variacion antes de comprar); aqui solo se le arregla el color y
   la forma.
   ===================================================================== */


/* === 1. Barra de herramientas: recuento + chip de filtro + orden =====

   Catalog.jsx: recuento y chip a la izquierda, desplegable de orden a la
   derecha. En vivo eso son floats del tema hijo, y con floats el chip de
   filtro (lo imprime holoplaza-ds-tienda.php) no tiene donde colocarse.
   Se pasa el contenedor de GP a flex.

   Se da un valor por defecto a TODO hijo directo y solo se saca de la fila
   a los cuatro que conocemos: asi, el dia que un plugin de filtros meta un
   widget ahi dentro, aparecera en una fila propia en vez de colarse en
   medio de la barra.                                                     */

html body[class*="woocommerce"] .wc-columns-container {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	column-gap: var(--space-8);
	row-gap: var(--space-6);
}

html body[class*="woocommerce"] .wc-columns-container > * {
	flex: 1 1 100%;
	order: 5;
}

html body[class*="woocommerce"] .wc-columns-container > .woocommerce-notices-wrapper {
	order: 1;
}

/* GP mueve el desplegable de orden a la prioridad 10 y el recuento a la 20,
   asi que en el DOM salen al reves de como se leen. Se recolocan con
   «order», sin tocar los hooks de nadie. */
html body[class*="woocommerce"] .wc-columns-container > .woocommerce-result-count {
	flex: 0 1 auto;
	order: 2;
	float: none;
	margin: 0;
	padding: 0;
	border: 0;
	font-size: var(--fs-ui-md);
	color: var(--text-secondary);
}

html body[class*="woocommerce"] .wc-columns-container > .hlz-cat-filtros {
	flex: 0 1 auto;
	order: 3;
}

html body[class*="woocommerce"] .wc-columns-container > .woocommerce-ordering {
	flex: 0 1 auto;
	order: 4;
	float: none;
	/* margin-left:auto empuja el desplegable al extremo derecho sin
	   justify-content, que descolocaria el chip. */
	margin: 0 0 0 auto;
	/* GP cuelga su chevron de :after en position:absolute contra este form. */
	position: relative;
	color: var(--text-secondary);
}

html body[class*="woocommerce"] .wc-columns-container > ul.products {
	flex: 1 1 100%;
	order: 6;
	align-self: stretch;
	margin: var(--space-9) 0 0;
}

/* Desplegable = components/core/Select: 260px, fondo hundido, filete por
   defecto y anillo de acento al foco. */
html body[class*="woocommerce"] .woocommerce-ordering select.orderby {
	box-sizing: border-box;
	width: 260px;
	max-width: 100%;
	height: var(--control-h);
	/* 40px por la derecha: es el hueco que necesita el chevron de GP. */
	padding: var(--space-5) var(--space-14) var(--space-5) var(--space-7);
	background: var(--surface-sunken);
	border: var(--border-w) solid var(--border-default);
	border-radius: var(--radius);
	color: var(--text-body);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	cursor: pointer;
	transition: border-color var(--dur) var(--ease);
}

html body[class*="woocommerce"] .woocommerce-ordering select.orderby:focus {
	border-color: var(--accent);
	box-shadow: var(--glow-active);
	outline: none;
}

/* GP clava el chevron en top:10px, calculado para su control de 38px; con
   los 44px de --control-h se quedaba alto. */
html body[class*="woocommerce"] .wc-columns-container > .woocommerce-ordering:after {
	top: 50%;
	transform: translateY(-50%);
	right: var(--space-7);
	color: var(--text-secondary);
}

/* --- Chip del filtro activo (marcado de holoplaza-ds-tienda.php) ------ */

html body[class*="woocommerce"] .hlz-cat-filtros {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--space-4);
	margin: 0;
}

/* Ojo: el texto va en --accent, NO en --accent-contrast. El fondo es
   --accent-fill, un tinte al 10%, no el acento solido; el blanco de
   --accent-contrast sobre ese tinte seria ilegible. La regla del
   --accent-contrast aplica al relleno pleno, como el boton. */
html body[class*="woocommerce"] .hlz-cat-filtros .hlz-cat-chip {
	display: inline-flex;
	align-items: center;
	gap: var(--space-4);
	padding: var(--space-2) var(--space-6);
	background: var(--accent-fill);
	color: var(--accent);
	border: var(--border-w) solid var(--accent);
	border-radius: var(--radius-round);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
	line-height: 1.5;
	text-decoration: none;
	transition: background var(--dur) var(--ease);
}

html body[class*="woocommerce"] .hlz-cat-filtros .hlz-cat-chip:hover,
html body[class*="woocommerce"] .hlz-cat-filtros .hlz-cat-chip:focus {
	background: var(--accent-fill-strong);
	color: var(--accent);
	text-decoration: none;
}

html body[class*="woocommerce"] .hlz-cat-filtros .hlz-cat-chip:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

html body[class*="woocommerce"] .hlz-cat-filtros .hlz-cat-chip__x {
	font-size: var(--fs-ui-xs);
	line-height: 1;
}


/* === 2. Rejilla de cuatro columnas ===================================

   GP ya sirve la rejilla de 4 columnas con calle de 50px y se encarga de
   bajar a 2 en tablet y movil segun los ajustes del cliente
   (wc-tablet-columns-2 / wc-mobile-columns-2). No se le lleva la contraria:
   solo se pasa la calle a token y se limpia la lista.                    */

html body[class*="woocommerce"] .wc-columns-container > ul.products {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--grid-gap-lg);
	padding: 0;
	list-style: none;
}

html body[class*="woocommerce"] .wc-columns-container > ul.products li.product {
	width: auto;
	margin: 0;
	float: none;
}


/* === 3. Tarjeta de producto (ProductCard.jsx) ========================

   Columna que reparte el alto —foto, titulo, precio y el boton abajo del
   todo—, centrada, con el sello anclado a la esquina de la TARJETA: por eso
   el position:relative va aqui y no en la plancha de la foto.            */

html body[class*="woocommerce"] ul.products li.product {
	position: relative;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	height: 100%;
	padding: 0;
	text-align: center;
	background: var(--surface-card);
	border: var(--border-w) solid var(--border-default);
	border-radius: var(--radius-lg);
	/* Recorta la esquina cuadrada del sello contra el radio de la tarjeta:
	   es lo que da el «sello de esquina» del maquetado. */
	overflow: hidden;
	transition: var(--transition-card);
}

html body[class*="woocommerce"] ul.products li.product:hover {
	border-color: var(--accent);
	box-shadow: var(--shadow-card-accent);
}

/* GP deja el enlace en display:block, y entonces titulo y precio no se
   separan: las tarjetas de una misma fila desalinean el precio en cuanto
   una foto tiene distinto alto. Se devuelve a la columna del componente. */
html body[class*="woocommerce"] ul.products li.product .woocommerce-LoopProduct-link {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	justify-content: space-between;
	margin: 0;
	text-decoration: none;
}

/* GP mete 10px de margen a todo hijo del enlace que no sea el primero.
   Aqui el ritmo lo dan el padding del titulo y los margenes propios. */
html body[class*="woocommerce"] ul.products li.product .woocommerce-LoopProduct-link > *:not(:first-child) {
	margin-top: 0;
}

html body[class*="woocommerce"] ul.products li.product a:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* --- Plancha blanca de la foto ---------------------------------------
   EXCEPCION DECLARADA DEL SISTEMA: la foto va SIEMPRE sobre --plate
   (blanco en los dos temas) porque el arte de las cartas viene recortado
   contra blanco. No cambiar por --surface-card aunque «cuadre mejor» con
   el tema oscuro.                                                        */

html body[class*="woocommerce"] ul.products li.product .wc-product-image {
	position: relative;
	margin: 0;
	/* El kit dice 15px; --space-8 son 16 y es el escalon del sistema. */
	padding: var(--space-8);
	background: var(--plate);
	border-radius: var(--radius);
}

html body[class*="woocommerce"] ul.products li.product .inside-wc-product-image {
	position: static;
}

html body[class*="woocommerce"] ul.products li.product .wc-product-image img,
html body[class*="woocommerce"] ul.products li.product img {
	display: block;
	width: 100%;
	height: auto;
	margin: 0;
	border-radius: 0;
	background: var(--plate);
}

/* --- Titulo -----------------------------------------------------------
   !important porque el tema hijo fija font-size y line-height con
   !important (venia de arreglar un desbordamiento del grid de Elementor).
   Los valores coinciden con los tokens: --fs-ui-md son 16px, --lh-tight 1.3. */

html body[class*="woocommerce"] ul.products li.product .woocommerce-loop-product__title {
	margin: 0;
	padding: var(--space-9);
	color: var(--text-heading);
	font-size: var(--fs-ui-md) !important;
	line-height: var(--lh-tight) !important;
	font-weight: var(--fw-bold);
	text-align: center;
}


/* === 4. Precio de la tarjeta =========================================

   SOLO COLOCACION, NINGUN COLOR. El color del precio de la parrilla lo
   fija ahora themes/generatepress_child/style.css con tokens (importe en
   --text-body, tachado en --text-muted, oferta en --accent); duplicarlo
   aqui crearia dos sitios donde tocar el mismo valor. Lo que faltaba era
   la colocacion: `span.price` venia con float:left y `.woocommerce-descuento`
   con float:right, de cuando la tarjeta era una caja suelta, y con eso el
   precio no podia centrarse nunca.

   Nota para el dueno: el kit (components/commerce/Price.jsx) pinta el
   importe en --text-heading y el tachado en --text-secondary, un escalon
   mas de tinta que los tokens de style.css. La diferencia son ~2 puntos de
   luminancia y las dos parejas pasan contraste; se deja como esta para no
   pisar el fichero de otro. Si se quiere fidelidad literal, es un cambio
   en style.css, no aqui.                                                 */

html body[class*="woocommerce"] ul.products li.product .price {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: center;
	gap: var(--space-4);
	float: none;
	width: 100%;
	margin: 0;
	font-size: var(--fs-ui-lg);
}

/* WooCommerce baja el tachado al 50% de opacidad; a ese nivel no llega a
   contraste sobre blanco por muy bien elegido que este el gris. */
html body[class*="woocommerce"] ul.products li.product .price del,
html body[class*="woocommerce"] ul.products li.product .price del .amount,
html body[class*="woocommerce"] ul.products li.product .price del bdi {
	font-weight: var(--fw-regular);
	text-decoration: line-through;
	opacity: 1;
}

html body[class*="woocommerce"] ul.products li.product .price ins,
html body[class*="woocommerce"] ul.products li.product .price ins .amount,
html body[class*="woocommerce"] ul.products li.product .price ins bdi {
	font-weight: var(--fw-bold);
	background: transparent;
	text-decoration: none;
}

/* El «% descuento» es un anadido de la tienda, no esta en el maquetado. Se
   deja como linea de apoyo en texto secundario: el sello OFERTA y el precio
   tachado ya gritan bastante, y en naranja competia con el precio. */
html body[class*="woocommerce"] ul.products li.product .woocommerce-descuento {
	float: none;
	width: 100%;
	margin: var(--space-2) 0 0;
	color: var(--text-secondary);
	font-size: var(--fs-ui-2xs);
	font-weight: var(--fw-semibold);
	line-height: 1.4;
	text-align: center;
}


/* === 5. Sellos de esquina (OverlayBadge.jsx) =========================

   EXCEPCION DECLARADA DEL SISTEMA: el texto va en #fff literal, no en un
   token. Los cuatro fondos son colores saturados identicos en los dos
   temas, asi que --accent-contrast (que cambia con el tema) los dejaria
   ilegibles en oscuro. Es la excepcion 2 del readme del paquete.

   .badge-nuevo es el que estaba roto: lo imprime holoplaza-ds-tienda.php,
   pero en style.css solo existen .badge-agotado y .badge-reserva, asi que
   se quedaba sin fondo y sin posicion — y como cuelga del <a> de la
   tarjeta, heredaba el `a{color:var(--base-3)}` del CSS en linea de GP y
   salia BLANCO SOBRE LA PLANCHA BLANCA. Aqui recupera fondo verde, sitio y
   tinta.                                                                 */

html body[class*="woocommerce"] ul.products li.product .onsale,
html body[class*="woocommerce"] ul.products li.product .badge-reserva,
html body[class*="woocommerce"] ul.products li.product .badge-agotado,
html body[class*="woocommerce"] ul.products li.product .badge-nuevo {
	position: absolute;
	top: 0;
	right: 0;
	left: auto;
	bottom: auto;
	z-index: 10;
	margin: 0;
	/* !important: el tema hijo fija padding y radio con !important. */
	padding: var(--space-3) !important;
	border-radius: var(--radius) !important;
	color: #fff !important;
	font-size: 80%;
	font-weight: var(--fw-bold);
	line-height: 16px;
	letter-spacing: var(--ls-badge);
	text-transform: uppercase;
	min-width: 0;
	min-height: 0;
}

html body[class*="woocommerce"] ul.products li.product .onsale {
	background: var(--hp-sale) !important;
}

html body[class*="woocommerce"] ul.products li.product .badge-reserva {
	background: var(--hp-info-strong) !important;
}

html body[class*="woocommerce"] ul.products li.product .badge-agotado {
	background: var(--hp-black) !important;
}

/* NUEVO se sale de la excepcion del #fff, y a proposito. El kit lo pinta
   blanco sobre --hp-success-4 (#27ae60), y ese par da 2,87:1 medido en la
   parrilla: para un texto de 11px en mayusculas no pasa. Se usa el mismo
   remedio que la seccion 27 ya aplico al badge de la ficha —el verde que
   el sistema oscurecio (--stock-in) con el fondo de pagina de tinta—, con
   lo que ademas los dos NUEVO de la tienda son por fin el mismo verde.
   Da 5,7:1 en claro y sigue siendo verde de stock en oscuro. */
html body[class*="woocommerce"] ul.products li.product .badge-nuevo {
	background: var(--stock-in) !important;
	color: var(--page-bg) !important;
}

/* ProductCard pinta UN sello por tarjeta (tags[0]). En produccion un
   producto en reserva que ademas esta de oferta imprime los dos y se
   superponen en la misma esquina. Reserva y Agotado son la informacion
   urgente —si no puedes comprarlo hoy, el precio da igual—, asi que se
   calla el de oferta. Sin :has() se quedan superpuestos, que es el estado
   actual: no empeora. */
html body[class*="woocommerce"] ul.products li.product:has(.badge-reserva) .onsale,
html body[class*="woocommerce"] ul.products li.product:has(.badge-agotado) .onsale {
	display: none;
}


/* === 6. Boton de la tarjeta (Button variant="shop") ==================

   Relleno de acento, texto en --accent-contrast, 700, 14/28 de padding y
   estirado de lado a lado de la tarjeta. EL TEXTO NO SE TOCA: en los
   productos variables functions.php pone «Ver producto» a proposito.

   Todo el bloque de color va con !important porque style.css del tema hijo
   pinta background, color, border y border-radius con !important sobre
   `.woocommerce a.button`. Un !important solo lo tumba otro !important —
   la especificidad no entra en esa comparacion—, asi que aqui no hay
   alternativa. El dia que ese bloque salga de style.css, estos !important
   se pueden borrar sin que cambie ni un pixel.                           */

html body[class*="woocommerce"] ul.products li.product a.button,
html body[class*="woocommerce"] ul.products li.product > a.button {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: var(--space-3);
	box-sizing: border-box;
	width: 100%;
	align-self: stretch;
	margin: var(--space-8) 0 0;
	/* El kit pide 14/28; --space-12 son 30, el escalon mas cercano. */
	padding: var(--space-7) var(--space-12);
	background: var(--accent) !important;
	background-image: none !important;
	color: var(--accent-contrast) !important;
	border: var(--border-w) solid var(--accent) !important;
	border-radius: var(--radius) !important;
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-bold);
	line-height: 1.4;
	text-align: center;
	text-decoration: none;
	/* El kit usa nowrap, pero en movil la rejilla baja a 2 columnas y
	   «Anadir al carrito» se sale de la tarjeta: aqui parte de linea. */
	white-space: normal;
	transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease);
}

html body[class*="woocommerce"] ul.products li.product a.button:hover,
html body[class*="woocommerce"] ul.products li.product a.button:focus,
html body[class*="woocommerce"] ul.products li.product > a.button:hover,
html body[class*="woocommerce"] ul.products li.product > a.button:focus {
	background: var(--accent-light) !important;
	color: var(--accent-contrast) !important;
	border-color: var(--accent-light) !important;
}

html body[class*="woocommerce"] ul.products li.product a.button:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

/* Estado «ya anadido» del AJAX: variante outline, para que la tarjeta no
   siga ofreciendo un boton pleno sobre algo que ya esta en el carrito. */
html body[class*="woocommerce"] ul.products li.product a.button.added {
	background: transparent !important;
	color: var(--accent) !important;
	border-color: var(--accent) !important;
}


/* === 7. Relacionados y ventas cruzadas ===============================

   Product.jsx cierra la ficha con «Productos relacionados» en la MISMA
   rejilla de cuatro tarjetas del catalogo. Las tarjetas ya las viste la
   seccion 3 (el selector no exige estar en un archivo), asi que aqui solo
   falta la rejilla y el titulo de seccion.

   Este bloque es ademas lo que permite borrar la seccion 16 del bundle
   entera: era la unica pieza suya que la 27 no repetia.                  */

html body[class*="woocommerce"] .related.products > h2,
html body[class*="woocommerce"] .up-sells.products > h2,
html body[class*="woocommerce"] .cross-sells > h2 {
	margin: 0 0 var(--space-10);
	color: var(--text-heading);
	font-size: var(--fs-h4);
	line-height: var(--lh-heading);
	font-weight: var(--fw-bold);
	/* El tema hijo centra el de relacionados; el kit lo alinea a la
	   izquierda con el resto de la pagina. */
	text-align: left;
}

html body[class*="woocommerce"] .related.products ul.products,
html body[class*="woocommerce"] .up-sells.products ul.products,
html body[class*="woocommerce"] .cross-sells ul.products {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--grid-gap-lg);
	margin: 0;
	padding: 0;
	list-style: none;
}

html body[class*="woocommerce"] .related.products ul.products li.product,
html body[class*="woocommerce"] .up-sells.products ul.products li.product,
html body[class*="woocommerce"] .cross-sells ul.products li.product {
	width: auto;
	margin: 0;
	float: none;
}

/* En el carrito las ventas cruzadas van a media pagina: con cuatro
   columnas dentro de la columna de la tabla las tarjetas quedan minusculas. */
html body.woocommerce-cart .cross-sells ul.products {
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--space-12);
}


/* === 8. Ficha: tres remates que la seccion 27 no llega a dar =========

   La seccion 27 del bundle SI esta viva (ancla en `body.single-product`) y
   el grueso de la ficha ya sale como el maquetado: antetitulo, caja de
   compra, aviso de stock, selector, stepper, CTA carmesi y tabla de
   atributos. El h1 tampoco es ya el problema —el lienzo claro lo arreglo—.
   Quedaban tres cosas, medidas a 1440px con Chrome headless.               */

/* 8.1 LA GALERIA SE QUEDABA A MEDIA COLUMNA. Medido: la columna de la
   rejilla mide 682px y div.images 341, justo la mitad, con lo que media
   ficha quedaba en blanco. La culpa es del CSS en linea de GeneratePress:

     .woocommerce #content div.product div.images { width: 50% }

   Ese selector lleva un ID (1-3-3) y NINGUNA cadena de clases lo alcanza:
   la seccion 27 lo intenta con `html body.single-product ...` (0-3-4) y
   pierde. La unica salida sin !important es meter el mismo #content en el
   selector propio, que ademas existe siempre (es el envoltorio de GP). */
html body.single-product #content div.product div.images,
html body.single-product #content div.product .woocommerce-product-gallery {
	width: 100%;
	max-width: none;
	float: none;
}

/* 8.2 EL SELLO DE OFERTA SE IBA AL LADO DEL TITULO. La 27 le da
   `grid-column:1; grid-row:1` para clavarlo en la esquina de la galeria,
   pero el sello es `position:absolute` y su bloque contenedor acaba siendo
   div.product entero, asi que el `right` lo medía contra el borde derecho
   de la ficha: aparecia flotando junto al h1, como si etiquetase al titulo.
   Se le quita el absolute y pasa a ser UN ITEM MAS de la rejilla en la
   celda de la galeria: dos items en la misma celda se superponen, que es
   justo lo que hace OverlayBadge, y ya no hay medidas magicas.

   OJO —me lo comi al primer intento y lo vi en la captura—: en cuanto un
   item se coloca a mano en la celda 1/1, la colocacion automatica deja de
   poder usarla, y la galeria (que iba sin colocar) se iba a la columna 2 y
   el panel de compra a una fila nueva. Colocar el sello obliga a colocar
   tambien a los otros dos: es todo o nada. */
html body.single-product div.product > div.images {
	grid-column: 1;
	grid-row: 1;
}

html body.single-product div.product > div.summary {
	grid-column: 2;
	grid-row: 1;
}

html body.single-product div.product > span.onsale {
	position: relative;
	grid-column: 1;
	grid-row: 1;
	justify-self: end;
	align-self: start;
	top: auto;
	right: auto;
	bottom: auto;
	left: auto;
	margin: var(--space-6);
	z-index: 2;
}

/* Una columna: la 27 ya pasa la rejilla a `1fr` por debajo de 900px, pero
   la colocacion explicita de arriba seguiria pidiendo una columna 2 que ya
   no existe (y el navegador se la inventaria). Se reordena en vertical y el
   sello se queda sobre la galeria. */
@media (max-width: 900px) {
	html body.single-product div.product > div.images,
	html body.single-product div.product > span.onsale {
		grid-column: 1;
		grid-row: 1;
	}

	html body.single-product div.product > div.summary {
		grid-column: 1;
		grid-row: 2;
	}
}

/* Con el sello ya en su esquina aparece un choque que antes no existia: la
   lupa de zoom de WooCommerce vive en esa misma esquina y el sello se le
   ponia encima, tapando un boton real. Se baja la lupa justo debajo del
   sello, y SOLO cuando hay sello (:has()); en un producto sin oferta se
   queda donde estaba. Si el navegador no soporta :has(), lo peor que pasa
   es lo de ahora. */
html body.single-product div.product:has(> span.onsale) .woocommerce-product-gallery__trigger {
	top: calc(var(--space-6) + var(--space-14));
	right: var(--space-6);
}

/* 8.3 HUECO MUERTO ENTRE EL SELECTOR Y EL STEPPER. WooCommerce imprime
   .woocommerce-variation VACIO hasta que se elige variacion, y ese div sin
   contenido seguia sumando su margen inferior y un hueco de flex: unos
   30px de nada entre «Elige una opcion» y el contador. Con :empty solo se
   apaga mientras esta vacio; en cuanto el JS le mete el precio y el aviso
   de la variacion elegida, vuelve a contar. */
html body.single-product div.product .woocommerce-variation.single_variation:empty {
	display: none;
	margin: 0;
}


/* === 9. Carrito: los dos remates que faltaban ========================

   La seccion 28 del bundle esta viva y correcta (ancla en
   `body.woocommerce-cart` y en el div.woocommerce que SI abre el
   shortcode del carrito). Solo quedaban dos cosas, las dos del mismo
   origen que el boton de la parrilla: el !important naranja de style.css.  */

/* «Volver a la tienda» del carrito vacio. La seccion 28 le da degradado de
   marca, pero pierde contra `.woocommerce a.button{background:#FF8C42
   !important;color:#000!important}`: medido en vivo, salia naranja con
   texto negro. Mismo remedio y mismo motivo que en la parrilla; y relleno
   plano, por lo que se explica en el bloque de «Finalizar compra». */
html body.woocommerce-cart p.return-to-shop a.button,
html body.woocommerce-cart p.return-to-shop a.button:hover,
html body.woocommerce-cart p.return-to-shop a.button:focus {
	background: var(--accent) !important;
	background-image: none !important;
	color: var(--accent-contrast) !important;
	border: var(--border-w) solid var(--accent) !important;
	border-radius: var(--radius) !important;
}

/* Los TRES botones del carrito salian naranjas con texto negro, medido en
   vivo con el carrito lleno: rgb(255,140,66) sobre rgb(0,0,0). Es el mismo
   `.woocommerce button.button{background:#FF8C42!important;color:#000!important}`
   de style.css, que la seccion 28 no podia tumbar porque escribe sin
   !important. Los valores son los que ya eligio la 28; lo unico que se
   anade es el peso que les faltaba.

   «Finalizar compra»: RELLENO PLANO DE ACENTO, no el degradado que traia
   la seccion 28. Y no es preferencia: --gradient-cta va de #BB1823 a
   #FFE1E3 de izquierda a derecha, asi que en un boton de 290px el texto
   blanco, que va centrado, cae sobre el tramo palido. Medido pixel a pixel
   sobre la captura del carrito lleno: 6,2:1 en el borde izquierdo, 4,2:1 a
   un tercio, 2,7:1 en el centro-derecha y 1,4:1 en el extremo. El boton
   mas importante de la tienda no puede tener el rotulo en 2:1. Con el
   relleno plano son 6,4:1 en todo su ancho, que es ademas lo que pide
   Cart.jsx en el kit (`background: 'var(--accent)'`).
   El degradado sigue siendo valido donde el texto no lo cruza (franjas,
   filetes, cabeceras de seccion). */
html body.woocommerce-cart .cart_totals a.checkout-button,
html body.woocommerce-cart .cart_totals a.checkout-button.button.alt,
html body.woocommerce-cart .cart_totals a.checkout-button:hover,
html body.woocommerce-cart .cart_totals a.checkout-button:focus {
	background: var(--accent) !important;
	background-image: none !important;
	color: var(--accent-contrast) !important;
	border: var(--border-w) solid var(--accent) !important;
}

html body.woocommerce-cart .cart_totals a.checkout-button:hover,
html body.woocommerce-cart .cart_totals a.checkout-button:focus {
	background: var(--accent-hover) !important;
	border-color: var(--accent-hover) !important;
}

/* «Aplicar cupon» y «Actualizar carrito» = Button variant="outline": el kit
   deja UNA sola llamada plena en esta pagina, la de finalizar compra. Tres
   botones rellenos compitiendo era justo lo que se veia. */
html body.woocommerce-cart td.actions button.button[name="apply_coupon"],
html body.woocommerce-cart td.actions button.button[name="update_cart"] {
	background: transparent !important;
	background-image: none !important;
	border: var(--border-w) solid var(--border-default) !important;
	border-radius: var(--radius) !important;
}

html body.woocommerce-cart td.actions button.button[name="apply_coupon"] {
	color: var(--text-body) !important;
}

html body.woocommerce-cart td.actions button.button[name="update_cart"] {
	color: var(--text-secondary) !important;
}

html body.woocommerce-cart td.actions button.button[name="apply_coupon"]:hover,
html body.woocommerce-cart td.actions button.button[name="update_cart"]:hover:not([disabled]) {
	background: var(--accent-fill) !important;
	border-color: var(--accent) !important;
	color: var(--accent) !important;
}

/* «Quitar» venia dentro de un rectangulo carmesi: GP Premium le pone
   `border:1px solid !important` a todo a.remove (heredaba el color del
   texto, de ahi el filete rojo). En el kit «Quitar» es un enlace pelado. */
html body.woocommerce-cart td.product-remove a.remove,
html body.woocommerce-cart td.product-remove a.remove:hover {
	border: 0 !important;
}

/* Carrito vacio = components/core/EmptyState: caja de filete discontinuo,
   texto atenuado y centrado. WooCommerce lo pinta como aviso informativo y
   style.css lo tinta de verde menta con !important; el maquetado no tiene
   ninguna barra de color ahi. */
html body.woocommerce-cart .cart-empty.woocommerce-info {
	display: block;
	padding: var(--space-14) var(--space-9) !important;
	background: none !important;
	background-color: transparent !important;
	border: var(--border-w) dashed var(--border-default) !important;
	border-radius: var(--radius);
	color: var(--text-secondary) !important;
	font-size: var(--fs-ui-md);
	text-align: center;
}

/* El aviso trae el icono ✓ de WooCommerce colgado de un ::before. */
html body.woocommerce-cart .cart-empty.woocommerce-info::before {
	content: none;
}

html body.woocommerce-cart p.return-to-shop {
	margin: var(--space-9) 0 0;
	text-align: center;
}

/* La plantilla cart-empty.php imprime un <br> dentro del propio enlace y el
   boton salia con una linea en blanco encima (83px de alto para un rotulo
   de una linea). */
html body.woocommerce-cart p.return-to-shop a.button br {
	display: none;
}


/* === 10. QUE BORRAR DEL BUNDLE AL FUSIONAR ===========================

   1) SECCION 26 «Catalogo» COMPLETA (desde el rotulo `26. Catalogo` hasta
      justo antes de `27. Ficha`). Son ~585 lineas que no pintan nada por
      el `html body .woocommerce` con espacio; las secciones 1-6 de este
      fichero son ese mismo maquetado con el selector arreglado, mas el
      sello NUEVO que faltaba.

   2) SECCION 16 «Ficha de producto» COMPLETA (desde el rotulo
      `16. Ficha de producto` hasta justo antes de `17. Finalizar compra`).
      Todo lo suyo lo hace ya la seccion 27, mejor y con el marcado nuevo:
        · `.product_title` y su media query  -> 27 §3 (y con .summary
          delante, que evita pisar el h2 de los relacionados)
        · `div.images` / `.woocommerce-product-gallery` sobre --plate -> 27 §2
        · `.woocommerce-product-details__short-description`            -> 27 §12
        · el bloque entero de `.woocommerce-tabs`                      -> 27 §13
        · `.related > h2` / `.upsells > h2`   -> seccion 7 DE ESTE FICHERO
          (era la unica pieza de la 16 que la 27 no repetia: sin esto, no
          se puede borrar la 16 sin perder el titulo de relacionados)
      La unica regla de la 16 que hay que mirar dos veces antes de borrar
      es `.woocommerce .quantity input.qty`, porque NO esta acotada a la
      ficha: comprobado que el carrito lo cubre la 28 §4
      (`...cart .woocommerce div.quantity input.qty`) y la ficha la 27 §8,
      asi que no queda nadie sin campo de cantidad.

   3) NO borrar las secciones 3, 4 y 5 del bundle (botones, tarjetas,
      precios generales): las usan la compra, mi-cuenta y el monedero.

   AVISO PARA LOS DEMAS AGENTES: el mismo fallo del selector queda en otros
   9 sitios fuera de mi area — 6 sueltos en las secciones de cabecera y 3 en
   la seccion 31 «Portada: remate». Ahi tambien `html body .woocommerce`
   casa con cero elementos.
   ===================================================================== */


/* === 11. Pantallas estrechas ========================================= */

/* La calle de 50px es para 4 columnas sobre el contenedor de 1400px. En
   cuanto GP baja a 2 columnas sobra muchisimo aire lateral. */
@media (max-width: 1024px) {
	html body[class*="woocommerce"] .wc-columns-container > ul.products,
	html body[class*="woocommerce"] .related.products ul.products,
	html body[class*="woocommerce"] .up-sells.products ul.products {
		gap: var(--space-12);
	}
}

@media (max-width: 767px) {
	html body[class*="woocommerce"] .wc-columns-container {
		row-gap: var(--space-5);
	}

	/* El desplegable pasa a linea propia: a 320px no cabe junto al recuento. */
	html body[class*="woocommerce"] .wc-columns-container > .woocommerce-ordering {
		flex: 1 1 100%;
		margin-left: 0;
	}

	html body[class*="woocommerce"] .woocommerce-ordering select.orderby {
		width: 100%;
	}

	html body[class*="woocommerce"] .wc-columns-container > ul.products {
		gap: var(--space-9);
		margin-top: var(--space-6);
	}

	html body[class*="woocommerce"] ul.products li.product .wc-product-image {
		padding: var(--space-5);
	}

	html body[class*="woocommerce"] ul.products li.product .woocommerce-loop-product__title {
		padding: var(--space-6) var(--space-5) var(--space-4);
	}

	html body[class*="woocommerce"] ul.products li.product .price {
		font-size: var(--fs-ui-md);
	}

	html body[class*="woocommerce"] ul.products li.product a.button,
	html body[class*="woocommerce"] ul.products li.product > a.button {
		margin-top: var(--space-5);
		padding: var(--space-5) var(--space-6);
		font-size: var(--fs-ui-xs);
	}

	/* Relacionados y cruzadas siguen la misma bajada de columnas que GP
	   aplica al catalogo. */
	html body[class*="woocommerce"] .related.products ul.products,
	html body[class*="woocommerce"] .up-sells.products ul.products,
	html body[class*="woocommerce"] .cross-sells ul.products {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: var(--space-9);
	}
}


/* ==================================================================
   34. Cromo: avisos, botones, formularios y pie
   ================================================================== */
/* ====================================================================
 * CROMO: avisos, botones, formularios, cabecera y pie
 * ====================================================================
 * Agente «chrome». Todo lo de aqui son controles globales: lo que sale en
 * TODA la web y no pertenece a ninguna pagina concreta.
 *
 * DE DONDE VIENE EL PROBLEMA. Hay tres capas peleandose, y por orden de
 * impresion la ultima es esta hoja:
 *
 *   1. GeneratePress imprime CSS EN LINEA desde el Personalizador con la
 *      paleta invertida: usa --contrast (#051518) como fondo de las cajas Y
 *      como COLOR DE TEXTO de los botones. Por eso no se puede remapear su
 *      paleta de un plumazo; hay que ir selector a selector.
 *   2. themes/generatepress_child/style.css tiene reglas fosiles del tema
 *      oscuro con `!important` y hasta 0-4-0 de especificidad.
 *   3. Los CSS de WooCommerce y GP Premium.
 *
 * REGLA QUE ME HE IMPUESTO CON `!important`: solo se usa donde el rival ya
 * lleva `!important`. Donde el rival juega limpio, se gana subiendo
 * especificidad (`html body ...`), no a martillazos. Cada `!important` de
 * abajo lleva al lado el selector rival que obliga a ponerlo.
 *
 * Todo esta comprobado EN VIVO contra holoplazatcg.com (Chromium headless,
 * estilos calculados) en los dos temas, no leyendo el CSS.
 * ==================================================================== */


/* ====================================================================
 * C1. Avisos de WooCommerce
 * ==================================================================== */

/* Los tres avisos venian con colores que no son de la marca:
 *   .woocommerce-message  verde #0b9444  (Personalizador de GP)
 *   .woocommerce-info     azul  #1e73be  (GP), pisado por un menta #e4f6f3
 *                         con !important desde el style.css del hijo
 *   .woocommerce-error    rosa  #e8626d  (GP)
 * Los tres eran ademas rectangulos de color plano con texto blanco encima.
 *
 * El sistema tiene una receta para esto y es components/core/FormNotice, la
 * misma que documenta guidelines/colors-semantic-fills.html: relleno teñido
 * al 8-12 %, borde de 1px del mismo color y radio de 8px. El relleno es
 * TRANSLUCIDO a proposito: asi el mismo aviso funciona sobre pagina blanca y
 * sobre pagina oscura sin escribir dos veces cada color.
 *
 * EL TEXTO NO VA DEL COLOR DEL TONO, va en --text-body. FormNotice pinta el
 * texto del color del tono, pero eso vale para una etiqueta corta de estado,
 * no para un parrafo: el verde #27ae60 sobre su propio relleno al 10 % da
 * 2,6:1 y no llega al minimo. El propio sistema ya avisa de esto cuando
 * define --stock-in («#66b520 oscurecido para aguantar 4.5:1 sobre el relleno
 * al 12 %»). El color del tono se queda en el borde, que es decorativo, y en
 * el filete izquierdo grueso, que es el que distingue los tres de un vistazo.
 *
 * El azul de «info» va literal (rgba(52,152,219,...)) porque el paquete lo
 * escribe literal: no hay token --info-fill en tokens/colors.css. */

/* `.cart-empty` queda FUERA de todo este bloque. WooCommerce le pone la clase
   .woocommerce-info al «Tu carrito esta vacio», pero eso no es un aviso: es un
   estado vacio, y el sistema lo trata aparte (components/core/EmptyState: caja
   de filete discontinuo y texto apagado, sin relleno de color). La seccion 8
   del sistema ya lo tiene resuelto; teñirlo de azul lo convertiria en una
   notificacion que nadie ha disparado. */
html body .woocommerce-message,
html body .woocommerce-info:not(.cart-empty),
html body .woocommerce-error,
html body .woocommerce .woocommerce-message,
html body .woocommerce .woocommerce-info:not(.cart-empty),
html body .woocommerce .woocommerce-error {
	border-radius: var(--radius);
	border-style: solid;
	border-width: 1px 1px 1px 4px; /* el filete izquierdo es la señal de tono */
	padding: var(--space-7) var(--space-9);
	font-size: var(--fs-ui-sm);
	line-height: var(--lh-body);
	list-style: none;
}

html body .woocommerce-message,
html body .woocommerce .woocommerce-message {
	background: var(--success-fill);
	border-color: var(--success-border);
	color: var(--text-body);
}

/* !important obligado: style.css del hijo lleva
   `.woocommerce-info{background-color:#e4f6f3!important;color:#000!important}` */
html body .woocommerce-info:not(.cart-empty),
html body .woocommerce .woocommerce-info:not(.cart-empty) {
	background: rgba(52, 152, 219, .08) !important;
	border-color: rgba(52, 152, 219, .25);
	color: var(--text-body) !important;
}

html body .woocommerce-error,
html body .woocommerce .woocommerce-error {
	background: var(--danger-fill);
	border-color: var(--danger-border);
	color: var(--text-body);
}

/* Enlaces sueltos dentro de un aviso: son acciones, van en acento y
   subrayados (dentro de un panel teñido el color solo no basta para
   distinguir un enlace).
   !important obligado en «info»: style.css lleva
   `div.woocommerce-info a{color:#000!important}` (0-2-1). */
html body div.woocommerce-message a:not(.button),
html body div.woocommerce-error a:not(.button),
html body .woocommerce-error a:not(.button) {
	color: var(--accent);
	text-decoration: underline;
}

html body div.woocommerce-info a:not(.button) {
	color: var(--accent) !important;
	text-decoration: underline;
}

/* Y el boton de accion («Ver carrito») sigue siendo un boton de verdad.
   WooCommerce lo desnuda (`background:0 0;padding:0`) y el style.css del hijo
   lo repintaba naranja con texto negro. */
html body div.woocommerce-message a.button,
html body div.woocommerce-info a.button,
html body div.woocommerce-error a.button {
	background: var(--accent) !important;
	border: 1px solid var(--accent) !important;
	color: var(--accent-contrast) !important;
	border-radius: var(--radius) !important;
	padding: var(--space-3) var(--space-7) !important;
	font-weight: var(--fw-bold);
	text-decoration: none;
}


/* ====================================================================
 * C2. Botones
 * ==================================================================== */

/* EL DIAGNOSTICO. Habia dos averias distintas y se veian a la vez:
 *
 *   a) Los botones de WooCommerce salian NARANJA #FF8C42 con texto NEGRO en
 *      toda la web, tema claro incluido. No era el Personalizador: es un
 *      bloque de style.css del hijo con `background:#FF8C42!important;
 *      color:#000!important` y hasta 0-4-0 de especificidad
 *      (`.button.product_type_simple.add_to_cart_button.ajax_add_to_cart`).
 *      El naranja es el acento del tema OSCURO; en el tema de marca era el
 *      unico naranja de la pagina.
 *
 *   b) Los botones genericos si cogian el acento correcto (--accent sale de
 *      ds/colors.css porque GP no declara esa variable), pero con el texto en
 *      `var(--contrast)`, o sea tinta #051518 sobre carmesi #BB1823: 2,95:1,
 *      por debajo del minimo. Se leia como un boton «apagado».
 *
 * LA RECETA DEL SISTEMA es components/core/Button variante primary: relleno
 * --accent y texto --accent-contrast, que es blanco en claro y tinta en
 * oscuro. Un solo par de tokens sirve para los dos temas.
 *
 * Los selectores replican los del rival con `html body` delante para ganar
 * por especificidad con el mismo `!important`. */

/* --- a) La familia de WooCommerce ------------------------------------- */
/* Rival: style.css, mismo listado, con !important. */
html body .button.product_type_simple.add_to_cart_button.ajax_add_to_cart,
html body .woocommerce #respond input#submit,
html body .woocommerce a.button,
html body .woocommerce button.button,
html body .woocommerce input.button,
html body .wc-block-components-button,
html body .woocommerce a.button:hover,
html body button.button:hover {
	background: var(--accent) !important;
	color: var(--accent-contrast) !important;
	border: 1px solid var(--accent) !important;
	border-radius: var(--radius) !important;
}

html body .woocommerce a.button:hover,
html body .woocommerce button.button:hover,
html body .woocommerce input.button:hover,
html body .woocommerce #respond input#submit:hover,
html body .wc-block-components-button:hover,
html body button.button:hover {
	background: var(--accent-hover) !important;
	border-color: var(--accent-hover) !important;
	color: var(--accent-contrast) !important;
}

/* --- b) Cuenta, registro, pedido y libreta de direcciones -------------- */
/* Rival: mismo listado en style.css con `background:#FF8C42!important`. */
html body .action_buttons_style.duplicate_billing_front,
html body .action_buttons_style.duplicate_shipping_front,
html body .billing_edit_front.action_buttons_style,
html body .shipping_edit_front.action_buttons_style,
html body .action_buttons_style.delete_address_billing_front,
html body .action_buttons_style.delete_address_shipping_front,
html body button#place_order,
html body .woocommerce-button.button.woocommerce-form-login__submit,
html body .woocommerce-Button.woocommerce-button.button.woocommerce-form-register__submit.email_verification_popup {
	background: var(--accent) !important;
	color: var(--accent-contrast) !important;
	border: 1px solid var(--accent);
	border-radius: var(--radius);
}

/* --- c) El CTA de «Finalizar compra» ----------------------------------- */
/* Venia con el degradado naranja->crema y tinta negra encima. El aviso expreso
   del sistema aplica entero: NUNCA tinta oscura sobre --gradient-cta, porque
   en el tema de marca ese degradado arranca en carmesi y el texto oscuro no
   llega a contraste. Y no vale con cambiar el texto a blanco: el degradado
   TERMINA en crema/rosa palido, donde el blanco tampoco se lee. La receta del
   sistema para un CTA solido es acento plano + --accent-contrast, que es lo
   que hace tambien la seccion 21 con el banner de Holo Premium. */
html body a.checkout-button.button.alt.wc-forward,
html body a.checkout-button.button.alt.wc-forward:hover,
html body button#wc_bis_send_form {
	background: var(--accent) !important;
	background-image: none !important;
	color: var(--accent-contrast) !important;
	border: 1px solid var(--accent);
	border-radius: var(--radius);
	font-weight: var(--fw-bold);
}

/* --- d) «Anadir al carrito» de la ficha -------------------------------- */
/* OJO AL SOLAPE: la ficha de producto es de otro agente. Esto entra aqui
   porque es el mismo bloque naranja+tinta de style.css y dejarlo fuera
   significaba dejar UN boton naranja en toda una web ya carmesi. Si el agente
   de tienda lo ha arreglado tambien, sobra este bloque: es identico. */
html body.woocommerce div.product .single_add_to_cart_button,
html body.woocommerce div.product .single_add_to_cart_button.button,
html body.woocommerce div.product .single_add_to_cart_button.alt,
html body.woocommerce div.product .single_add_to_cart_button.disabled,
html body.woocommerce div.product .single_add_to_cart_button.wc-variation-selection-needed,
html body.woocommerce div.product .single_add_to_cart_button[disabled] {
	background-color: var(--accent) !important;
	background-image: none !important;
	color: var(--accent-contrast) !important;
}

html body.woocommerce div.product form.cart .single_add_to_cart_button.button:hover {
	background: var(--accent-light);
	color: var(--accent-contrast);
}

/* --- e) Los botones genericos de GeneratePress ------------------------- */
/* GeneratePress pinta TODO <button> con fondo de acento, asi que su texto debe
   ir en --accent-contrast. Aqui solo se corrige el color, nunca el fondo.

   ESTA REGLA YA HA ROTO TRES COSAS y conviene contar por que, porque el error
   estaba en como se escribio la excepcion, no en la idea:

     - el aspa de cerrar del modal de eventos, invisible en los dos temas;
     - las tiras de pestanas de Album, Mazos, Lista de deseos y Amigos, texto
       blanco sobre blanco (1:1) en claro y 1,12:1 en oscuro;
     - y habria seguido rompiendo el siguiente componente que llevara <button>.

   El motivo es siempre el mismo: un plugin propio le pone a su boton un fondo
   de tarjeta con especificidad baja, pero NO le pone color; esta regla, con
   `html body` y una retahila de :not(), gana de calle y le mete la tinta del
   acento sobre un fondo que no es el acento. El boton desaparece.

   La primera version excluia clases UNA A UNA, escritas a mano tras recorrer
   las paginas de aquel dia. Eso es una lista que nace incompleta y envejece
   mal: cada componente nuevo con un <button> vuelve a caer en la trampa.

   Ahora se excluye POR PREFIJO. Todos los componentes propios usan prefijo
   (hpa-, hps-, hpal-, hpcal-, hpm-, hplt-, hprm-, hlz-), asi que un solo
   :not([class*="..."]) por familia cubre los que hay y los que vengan. Un
   componente propio se pinta a si mismo entero —fondo y tinta— y no necesita
   que nadie le adivine el color. */
html body button:not([class*="hpa-"]):not([class*="hps-"]):not([class*="hpal-"]):not([class*="hpcal-"]):not([class*="hpm-"]):not([class*="hplt-"]):not([class*="hprm-"]):not([class*="hpt-"]):not([class*="hlz"]):not(.menu-toggle):not(.show-password-input):not(.wc-block-components-panel__button):not(.plus):not(.minus),
html body input[type="button"],
html body input[type="reset"],
html body input[type="submit"],
html body a.button,
html body a.wp-block-button__link:not(.has-background) {
	color: var(--accent-contrast);
}

/* --- f) El boton flotante «Descargar App» ------------------------------ */
/* Es un control global (sale en todas las paginas) y venia con el naranja del
   tema oscuro cosido en un <style> del <head>. Al ser un id hace falta otro
   id para ganarle; con `html body` delante sobra. */
html body #hlz-pwa-btn {
	background: var(--accent);
}

html body #hlz-pwa-btn:hover {
	background: var(--accent-hover);
}


/* ====================================================================
 * C3. Formularios
 * ==================================================================== */

/* HISTORIA CORTA: los campos eran texto blanco sobre fondo casi negro
 * (`input{color:var(--base-3);background-color:var(--contrast)}` del
 * Personalizador). Al pasar style.css a tokens se cambiaron a
 * `background-color:var(--surface-field)`, y ahi aparecio una averia peor:
 *
 *   --surface-field es «la pildora del buscador», y en el tema OSCURO vale
 *   BLANCO a proposito (es el unico acento claro del cromo oscuro). Con el
 *   texto en --text-body (#f2f2f3 en oscuro) los campos quedaban blanco sobre
 *   blanco: 1,05:1, ilegibles. Verificado en /mi-cuenta/ con el tema oscuro
 *   puesto: usuario y contrasena no se veian al teclear.
 *
 * El token bueno para un campo es --surface-sunken, que es justo lo que usa
 * components/core/Input, y que sigue al tema en los dos sentidos: gris papel
 * en claro, tinta en oscuro. Cuando esta regla entre, la de style.css sobra.
 *
 * El `!important` es obligado porque el rival lo lleva. */
html body input[type="text"],
html body input[type="email"],
html body input[type="url"],
html body input[type="password"],
html body input[type="search"]:not(.hplt-lh__search-input),
html body input[type="tel"],
html body input[type="number"],
html body input[type="date"],
html body textarea,
html body select {
	background-color: var(--surface-sunken) !important;
	color: var(--text-body) !important;
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
	font-family: var(--font-sans);
	font-size: var(--fs-ui-sm);
}

html body input::placeholder,
html body textarea::placeholder {
	color: var(--placeholder);
	opacity: 1;
}

/* El foco: GP lo dejaba en gris (`border-color:var(--contrast-3)`) y ademas
   ganaba, porque su selector `input[type=text]:focus` es 0-2-1 y el del
   sistema era `input:focus`, 0-1-1. Se veia un campo que al enfocarlo se
   apagaba en vez de encenderse. La receta de Input es borde de acento mas un
   halo de 3px del relleno de acento. */
html body input[type="text"]:focus,
html body input[type="email"]:focus,
html body input[type="url"]:focus,
html body input[type="password"]:focus,
html body input[type="search"]:focus,
html body input[type="tel"]:focus,
html body input[type="number"]:focus,
html body input[type="date"]:focus,
html body textarea:focus,
html body select:focus {
	border-color: var(--accent) !important;
	box-shadow: 0 0 0 3px var(--accent-fill);
	outline: none;
}

/* Navegacion por teclado: el halo de arriba es suave a proposito (es un
   estado de edicion, no de foco visible). Para quien navega con tabulador
   hace falta el anillo duro del sistema. */
html body input:focus-visible,
html body textarea:focus-visible,
html body select:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
}

html body label,
html body .woocommerce form .form-row label {
	color: var(--text-body);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-semibold);
}

/* EL OJO DE «VER CONTRASENA». Va dentro del campo, y al devolver el campo al
   tema (tinta en oscuro, antes era blanco siempre) se quedaba invisible.
   No se arregla con `color`: WooCommerce lo pinta como background-image, un
   SVG en data-URI con `fill="%23111111"` cosido dentro de la propia URL, que
   no hereda currentColor. Lo unico que se puede hacer desde CSS sin sustituir
   el asset es invertirlo cuando el fondo es oscuro.
   (Primero lo intente con `color: var(--text-secondary)` y el barrido siguio
   dando 1,08:1: por eso esta escrito asi.) */
html[data-theme="dark"] body .woocommerce form .show-password-input::before,
html[data-theme="dark"] body .woocommerce-page form .show-password-input::before {
	filter: invert(1);
}

/* Los campos de WooCommerce heredan lo de arriba, pero el checkout usa
   `.input-text` en cajas que no son <input> (los select2 de pais/provincia). */
html body .woocommerce form .form-row .select2-container .select2-selection {
	background-color: var(--surface-sunken);
	border: 1px solid var(--field-border);
	border-radius: var(--radius);
	color: var(--text-body);
}


/* ====================================================================
 * C4. Cabecera: remates sobre la seccion 11
 * ==================================================================== */

/* El grueso de la cabecera ya lo hace la seccion 11 y el propio
   holoplaza-plantillas/assets/header.css, que hoy va con tokens (antes tenia
   #051518 y #fff cosidos). Aqui van solo los tres remates que faltaban. */

/* 1. EL CONTADOR DEL CARRITO. La seccion 11 apunta a `.hplt-lh__count`, que no
      existe: la clase que imprime el PHP es `.hplt-lh__cart-count`. Por eso el
      globito seguia naranja con tinta oscura en el tema claro, que era el
      unico naranja de toda la cabecera.
      >> Se puede borrar el bloque `html .hplt-lh__count` de la seccion 11: no
         casa con nada. */
html .hplt-lh__cart-count {
	background: var(--accent);
	color: var(--accent-contrast);
}

/* 2. LA LUPA. La seccion 11 la dejo en --text-secondary, un gris apagado.
      Va en el carmesi de marca, y FIJO, no en var(--accent): la pildora es una
      superficie clara en los dos temas, y en el tema oscuro --accent es el
      naranja #FF8C42, que sobre pildora blanca da 2,31:1 (medido; lo probe
      primero con --accent y salio esto en el barrido). El carmesi da 6,4:1
      sobre blanco. Misma excepcion documentada que la tinta del campo. */
html .hplt-lh .hplt-lh__search-btn {
	color: var(--hp-red);
}

html .hplt-lh .hplt-lh__search-btn:hover {
	color: var(--hp-red-hover);
}

/* 3. EL CAMPO DEL BUSCADOR. La pildora es una superficie clara en los DOS
      temas, asi que su tinta no puede seguir a --text-body: en oscuro
      --text-body es #f2f2f3 y quedaba blanco sobre pildora blanca (medido:
      1,12:1, no se veia lo que escribias). Se fija, como manda SearchPill.
      El `!important` es obligado y no es por especificidad: la regla global de
      campos de style.css lleva `color:var(--text-body)!important`, y un
      !important gana a cualquier selector por largo que sea. Este campo esta
      excluido de mi propia regla de campos (C3) con :not(), pero de la de
      style.css no lo puedo excluir, asi que hay que pisarla. */
html .hplt-lh .hplt-lh__search-input {
	color: var(--hp-near-black) !important;
	background: transparent !important;
	border: 0 !important;
	box-shadow: none !important;
	padding: 0 !important;
	border-radius: 0 !important;
}


/* ====================================================================
 * C5. Pie de pagina
 * ==================================================================== */

/* El pie ya esta maquetado en la seccion B. Aqui solo se repara un choque:
   la regla del lienzo (`html body .site`, 0-1-2) tambien casa con el pie,
   porque GeneratePress imprime <div class="site footer-widgets">. Le dejaba
   el fondo transparente y solo se veia bien de rebote, porque el <footer>
   que hay detras si pinta --surface-sunken. Se le devuelve el fondo suyo
   para que no dependa de un accidente. */
html body div.footer-widgets {
	background: var(--surface-sunken);
}


/* ====================================================================
 * C6. Piezas de GeneratePress que hoy NO estan en pantalla
 * ==================================================================== */

/* AVISO HONESTO: `.site-header`, `.main-navigation`, `#wc-mini-cart` y
   `a.generate-back-to-top` llevan color cosido en el CSS en linea del
   Personalizador, pero NINGUNO de los cuatro existe hoy en el HTML servido
   (comprobado en portada, tienda, carrito, mi cuenta y checkout): la cabecera
   propia sustituye a la de GP y su nav, y el mini-carrito y el «volver
   arriba» estan desactivados en las opciones del tema.
   Estas reglas son un seguro por si alguien enciende esas opciones: cuestan
   nada y evitan que reaparezca una banda #051518 suelta sobre pagina blanca.
   No estan verificadas en pantalla porque no hay pantalla que verificar. */

html body .site-header {
	background-color: var(--page-bg);
	color: var(--text-heading);
}

html body .site-header a {
	color: var(--text-heading);
}

html body .site-header a:hover {
	color: var(--accent);
}

html body .main-navigation {
	background-color: var(--page-bg);
}

html body .main-navigation .main-nav ul li a,
html body .main-navigation .menu-toggle,
html body .main-navigation .menu-bar-items {
	color: var(--text-heading);
}

html body #wc-mini-cart {
	background-color: var(--surface-raised);
	color: var(--text-body);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
}

html body #wc-mini-cart a:not(.button),
html body #wc-mini-cart a.remove {
	color: var(--text-body);
}

html body #wc-mini-cart .button {
	background-color: var(--accent);
	color: var(--accent-contrast);
}

html body a.generate-back-to-top {
	background-color: var(--accent);
	color: var(--accent-contrast);
	border-radius: var(--radius);
}

html body a.generate-back-to-top:hover,
html body a.generate-back-to-top:focus {
	background-color: var(--accent-hover);
	color: var(--accent-contrast);
}


/* ====================================================================
 * C7. Submenus — PREPARADO, SIN ACTIVAR
 * ==================================================================== */

/* Por decision del dueno los submenus son lo ULTIMO que se toca, asi que este
   bloque va comentado. NO lo descomentes sin su visto bueno.
 *
 * Estado actual, para que se decida con datos: los desplegables NO estan
 * rotos. La seccion 11 ya los pasa a tokens (--surface-raised de fondo,
 * --text-body de texto, --accent-fill al pasar por encima) y le gana al
 * #0b1e22 cosido en header.css. Verificado en vivo: el fondo del submenu sale
 * blanco y el texto en tinta con el tema claro.
 *
 * Lo unico que le falta al maquetado es afinado fino — el aire entre entradas
 * y el filete de separacion con la barra. Eso es lo que hay aqui.
 *
 * html .hplt-lh__menu .sub-menu {
 *     padding: var(--space-3) 0;
 *     border-radius: var(--radius);
 *     margin-top: -1px;
 * }
 *
 * html .hplt-lh__menu .sub-menu li a {
 *     padding: var(--space-4) var(--space-8);
 *     font-size: var(--fs-ui-sm);
 *     line-height: var(--lh-tight);
 * }
 *
 * Y el submenu de GeneratePress, que hoy no se pinta porque su nav no existe,
 * pero cuyo CSS en linea deja `--base` (#f0f0f0) de fondo:
 *
 * html body .main-navigation ul ul {
 *     background-color: var(--surface-raised);
 *     border: 1px solid var(--border-hairline);
 *     box-shadow: var(--shadow-dropdown);
 * }
 */


/* ==================================================================
   35. Ficha: la barra horizontal
   ================================================================== */

/* SINTOMA: en la ficha de producto la pagina se arrastraba 720px a la derecha.
   Medido, no supuesto: clientWidth 1440, scrollWidth 2152, y window.scrollX
   llegaba de verdad a 712. En movil eso es una barra horizontal en toda la
   ficha, y el contenido "bailando" al deslizar.

   QUIEN LO CAUSA: `div.reset_variations_alert.screen-reader-text`, el aviso que
   WooCommerce pone en el formulario de variaciones para los lectores de
   pantalla. Va vacio y debe medir 1x1 px; medido, ocupaba 1352 px de ancho
   arrancando en x=800, o sea que su borde derecho caia en 2152. Exactamente el
   desbordamiento.

   POR QUE: GP Premium trae en su hoja de WooCommerce

       .woocommerce div.product form.cart > :not(.quantity):not(.single_add_to_cart_button)
           { width: 100% }

   pensado para que los hijos del formulario ocupen la linea entera. Pero el
   :not() no excluye el aviso de lector de pantalla, y con 5 clases (0-5-2) le
   gana al `.screen-reader-text { width: 1px }` de WordPress (0-1-0). El texto
   sigue siendo invisible —lo esconde el clip— pero su CAJA mide 1352 px y
   empuja el documento.

   Es hoja de un plugin de terceros, asi que no se toca: se contesta desde aqui
   con 0-5-4, una clase mas de tipo. Sin !important, que no hace falta cuando la
   especificidad basta.

   Nota de por que la primera version de esta seccion no valia: culpe a la
   galeria (FlexSlider le pone width:400% al carrusel) y le puse `position:
   relative` al visor. Era mentira: ese carrusel SI estaba recortado por el
   overflow:hidden de .flex-viewport. Lo dijo la biseccion, apagando ramas del
   arbol hasta que el ancho bajaba. */
html body.single-product.woocommerce div.product form.cart > .screen-reader-text {
	width: 1px;
	max-width: 1px;
}


/* ==================================================================
   36. La descripcion corta, invisible en la pestana
   ================================================================== */

/* GeneratePress imprime desde el Personalizador
       .woocommerce-product-details__short-description { color: var(--base-3) }
   —blanco, escrito para la web oscura— con especificidad 0-1-0. Dentro de la
   caja de compra no se notaba porque alli manda una regla mas especifica, pero
   la MISMA descripcion se repite dentro de la pestana «Descripcion», y ahi
   ganaba: «Contiene: ...» salia blanco sobre blanco, contraste 1.00 medido.
   El color de la pestana no bastaba porque se hereda, y una regla propia del
   elemento le gana a cualquier herencia por muy especifica que sea. */
html body .woocommerce-product-details__short-description,
html body .woocommerce-product-details__short-description p,
html body .woocommerce-product-details__short-description li {
	color: var(--text-body);
}


/* ==================================================================
   37. Remates medidos sobre la web en vivo
   ================================================================== */

/* El aspa del modal de evento era INVISIBLE en los dos temas: 1,04:1 en claro y
   1,00:1 en oscuro (tinta y fondo identicos). No fallaba su regla —que existe y
   llega— sino la de mas arriba, la de «todo boton lleva tinta de contraste
   sobre el acento», que va la ultima de la cascada y tiene una lista de
   excepciones escrita a mano donde faltaba este boton. Su fondo no es el
   acento, es --surface-sunken, asi que la tinta de contraste desaparecia.
   Solo se veia al pasar el raton, que si le pone fondo de acento.
   Se arregla anadiendolo a esa lista (arriba) y fijando aqui su color. */
html body .hpcal-modal-close {
	color: var(--text-secondary);
}

/* El titulo de los eventos se cortaba a hachazo —«Pokemon TCG Torne»— porque
   el contenedor iba con text-overflow: clip. El kit lo pide con puntos
   suspensivos (Eventos.jsx, EventChip). */
html body #holoplaza-calendario .fc-event-title-container,
html body #holoplaza-calendario .fc-event-title {
	text-overflow: ellipsis;
}

/* Vista Lista: cada fila traia un borde azul #3a87ad que no es de la paleta —
   es el azul de fabrica de FullCalendar— y ademas era el mismo en todas, asi
   que ni siquiera distinguia el juego (de eso ya se encarga el punto). */
html body #holoplaza-calendario .fc-list-event,
html body #holoplaza-calendario .fc-list-table td {
	border-color: var(--border-default);
}

/* El boton del heroe desbordaba la portada 67px en movil: 427px de ancho con
   white-space: nowrap dentro de una pantalla de 390. Y el desbordamiento
   ensanchaba el bloque contenedor, asi que la pildora de idioma —que es fixed
   contra el borde derecho— se iba 47px fuera de la pantalla. O sea que un
   boton que no parte dejaba el selector de idioma medio invisible. */
@media (max-width: 768px) {
	html body .elementor-265 .elementor-button {
		white-space: normal;
		max-width: 100%;
	}
}

/* El interruptor de tema media 22x22: por debajo del objetivo tactil de 44px
   que recomienda WCAG. Se agranda el area sensible sin mover el icono. */
html body .hplt-lh__theme {
	min-width: 44px;
	min-height: 44px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

/* El buscador de la cabecera era la UNICA parada de tabulacion de la pagina sin
   foco visible, y esta entre el logo y el boton de buscar, que si lo tienen:
   quien navegue con teclado perdia el rastro justo ahi. */
html body .hplt-lh__search-input:focus-visible {
	outline: 2px solid var(--focus-ring);
	outline-offset: 2px;
}

/* El idioma activo quedaba a 3,02:1 (tinta de acento sobre su propio relleno al
   18 %). Es texto de 12px, asi que necesita 4,5:1. Con tinta de titular sube a
   14,6:1 y el relleno sigue marcando cual esta puesto. */
html body .hpt-menu-switcher .hpt-lang-btn.active,
html body .hpt-floating .hpt-lang-btn.active {
	color: var(--text-heading);
}


/* ==================================================================
   38. Mis Alertas: el ultimo rincon con la paleta oscura vieja
   ================================================================== */

/* holoplaza-alerts es el unico de los plugins propios SIN bloque :root, asi que
   no se puede reapuntar de golpe: lleva 23 colores oscuros cosidos uno a uno.
   Se fueron corrigiendo selector a selector y se quedaron fuera los `background`
   de estos: el panel «Crear nueva alerta» y el aviso de «no tienes alertas»
   salian en verde-petroleo #0d2327 en medio de una pagina blanca, y encima sus
   rotulos —ya reapuntados a --text-secondary— daban 2,28:1 sobre ese fondo.
   Cuatro textos ilegibles en una pagina que por lo demas estaba bien. */
html body .hpal-form,
html body .hpal-empty,
html body .hpal-table,
html body .hpal-autocomplete {
	background: var(--surface-card);
	color: var(--text-body);
	border-color: var(--border-default);
}

html body .hpal-channel-info code {
	background: var(--surface-sunken);
	color: var(--text-body);
}

/* El desplegable se abria en oscuro desde un formulario blanco. Se lee, pero
   canta. (El <option> es de los pocos sitios donde el navegador aun manda.) */
html body .hpal-select option {
	background: var(--surface-card);
	color: var(--text-body);
}

/* En oscuro el texto de ayuda de los campos quedaba a 2,6:1. */
html body .hpal-input::placeholder,
html body .hpal-form input::placeholder,
html body .hpal-form textarea::placeholder {
	color: var(--text-muted);
	opacity: 1;
}

/* A 390px esta pagina sacaba 23px de barra horizontal, y NO era la tira de
   navegacion —esa ya esta bien—: era la cabecera de cada tarjeta de canal.
   Es un flex sin flex-wrap, asi que la fila «WhatsApp + insignia NO CONECTADO»
   no podia partirse y fijaba un ancho minimo de 281px; con los rellenos de
   tarjeta, seccion y pagina, 413. Dejandola envolver, cabe. */
html body .hpal-channel-header {
	flex-wrap: wrap;
	gap: var(--space-3, 8px);
}

html body .hpal-channel-card {
	min-width: 0;
}

/* El ojo de «mostrar contraseña» esta excluido a proposito de la regla global
   de botones —si no, el glifo se pintaria del color del acento y desapareceria
   sobre el campo—, pero al quedarse fuera heredaba un negro que en tema oscuro
   da 1,08:1. Necesita color propio, no exclusion a secas. */
html body .show-password-input,
html body .show-password-input::after {
	color: var(--text-muted);
}


/* ==================================================================
   39. Catalogo: barra horizontal en movil y el guion del rango
   ================================================================== */

/* A 390px la parrilla sacaba 80px de barra horizontal (scrollWidth 470 contra
   viewport 390). La regla que manda en movil es de GeneratePress:
       @media (max-width:1024px) .wc-tablet-columns-2 .products {
           grid-template-columns: repeat(2, 1fr);
       }
   y `1fr` es `minmax(auto, 1fr)`: con min-width:auto las columnas no bajan de
   su min-content, asi que se quedaban clavadas en 201px cada una — 201+20+201 =
   422 dentro de 390. Depende del contenido: donde los titulos son cortos
   (fundas) no desbordaba, y por eso costaba verlo.
   La seccion del catalogo ya lleva el seguro minmax(0, 1fr)... pero solo en el
   bloque de 4 columnas; el de movil solo tocaba el hueco. Aqui se pone el
   seguro tambien abajo. minmax(0, ...) es lo que permite a una columna de
   rejilla encogerse por debajo de su contenido. */
@media (max-width: 1024px) {
	html body[class*="woocommerce"] ul.products,
	html body[class*="woocommerce"] .wc-columns-container .products {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
	html body[class*="woocommerce"] ul.products li.product {
		min-width: 0;
	}
}

@media (max-width: 480px) {
	html body[class*="woocommerce"] ul.products,
	html body[class*="woocommerce"] .wc-columns-container .products {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* El guion que separa el rango de precios («64,95 € - 89,95 €») era INVISIBLE
   en tema oscuro: 1,09 de contraste, nueve veces en una sola pagina de
   categoria. El cliente leia las dos cifras sin separador.
   Sale de la hoja de WooCommerce de GeneratePress:
       .woocommerce ul.products li.product .price { color: #222222 }
   El tema hijo tiene EXACTAMENTE la misma especificidad y carga antes, asi que
   pierde el empate. Los importes se salvaban de casualidad porque el tema hijo
   tambien lista `.price .amount`, selector que GP no tiene; el guion va suelto,
   sin envolver en nada, y heredaba el #222.
   Ya habia un comentario describiendo esto en style.css, pero la cura se aplico
   solo a la ficha y no al listado. */
html body[class*="woocommerce"] ul.products li.product .price,
html body[class*="woocommerce"] .woocommerce ul.products li.product .price {
	color: var(--text-body);
}

/* El precio bailaba hasta 17px dentro de la misma fila. El enlace de la tarjeta
   usa justify-content: space-between, que solo clava el primer hijo y el
   ultimo. El kit le cuelga TRES hijos (plancha, titulo, precio), asi que el
   precio es el ultimo y queda abajo. Produccion le cuelga CUATRO, porque el
   tema añade la linea del porcentaje: el precio pasa a ser el tercero de cuatro
   y flota segun cuantas lineas ocupe el titulo.
   Se ancla el bloque de precio abajo con margin-top:auto, que hace el trabajo
   que hacia space-between cuando solo habia tres. */
html body[class*="woocommerce"] ul.products li.product .price {
	margin-top: auto;
}

html body[class*="woocommerce"] ul.products li.product .woocommerce-descuento {
	margin-top: 0;
}


/* ==================================================================
   40. Ficha: repartir el contenido entre las dos columnas

   Viene del agente de maquetacion del 17-ago-2026 y es continuacion de la
   seccion 27. Se pega aqui, al final, en vez de dentro de la 27 para no
   partir aquella; la especificidad de cada regla esta calculada para ganar
   con independencia del orden, y el comentario de cada bloque lo indica.
   ================================================================== */
/* ==================================================================
   FICHA DE PRODUCTO — parche propuesto  (agente de maquetacion, 17-ago-2026)

   Va DENTRO de la seccion «27. Ficha» de
   themes/generatepress_child/ds/holoplaza-ds.css, pegado AL FINAL de la
   seccion. Todas las reglas llevan especificidad calculada para ganar a la
   que ya hay sin necesidad de !important; si aun asi se pega antes, siguen
   ganando (ver la nota de especificidad de cada bloque).

   QUE ARREGLA Y POR QUE, con las medidas tomadas en vivo a 1440 px sobre
   /producto/equilibrio-perfecto-etb/ (variable) y
   /producto/cenit-supremo-blister-pin-pack-3/ (simple):

     galeria (columna izq.)   751 px de alto
     resumen (columna dcha.) 1131 px de alto   -> 380 px de desnivel
     hueco galeria -> pestanas                    480 px

   El blanco NO viene de un margen suelto: viene de que la columna DERECHA
   es 380 px MAS LARGA que la galeria, y la izquierda se queda vacia a su
   lado. Ajustar los anchos de columna no lo cura (comprobado: con 0.85fr/1fr
   el desnivel sube a 458 px y con 1.4fr/1fr a 434 px; el 1.1fr/1fr actual ya
   es el optimo). La unica cura es repartir el contenido, y eso pide mover un
   bloque en el DOM: la tabla de atributos baja a la columna de la galeria.
   Ese movimiento lo hace el PHP de f-ficha.php.txt; aqui esta la colocacion.

   SIN EL PHP este archivo sigue siendo seguro: los bloques 1 y 2 no
   encuentran .hlz-ficha-datos y no pintan nada, y los bloques 3, 4 y 5
   (pestanas, miniaturas, tabla fuera del resumen) funcionan igual.
   ================================================================== */


/* ==================================================================
   1. La tabla de atributos pasa a la columna de la galeria
   ================================================================== */

/* TODO ESTE BLOQUE VA DENTRO DE `min-width: 901px`, y no al reves con un
   reseteo en movil. Lo probe primero de la otra forma y salio mal: en la
   version de una columna, `span.onsale` conserva `grid-row:1; grid-column:1`
   (se lo pone la seccion 27 para anclar el sello a la galeria). Si a la
   galeria se le suelta la fila, la colocacion automatica ve la celda 1/1
   ocupada por el sello y baja la galeria a la fila 2: aparecia una fila
   fantasma de 49,6 px, el sello quedaba flotando 68 px POR ENCIMA de la
   imagen y la pagina crecia 80 px. Medido a 390 px.
   Encerrandolo en la consulta de escritorio, en movil no cambia
   absolutamente nada de la colocacion actual. 901px es el complemento
   exacto del `max-width: 900px` que ya usa la seccion 27. */
@media (min-width: 901px) {

	/* La rejilla tenia una sola fila util. Se declaran dos: fila 1 =
	   galeria + panel de compra, fila 2 = datos bajo la galeria. */
	html body.single-product div.product {
		grid-template-rows: auto auto;
	}

	/* La galeria se ancla a la fila 1 en vez de depender de la colocacion
	   automatica: en cuanto hay un item con fila explicita, el
	   automatismo deja de ser predecible.
	   Especificidad (0,3,4) frente a los (0,2,4) de la regla que ya
	   existe: gana este aunque se pegue antes en el archivo. */
	html body.single-product div.product div.images.images {
		grid-column: 1;
		grid-row: 1;
	}

	/* El panel de compra ocupa columna 2, filas 1-2. Con el
	   `align-items:start` que ya hay NO se estira: se queda arriba y de
	   su alto natural, que es lo que se quiere.
	   (0,3,4) frente a (0,2,4) de la regla vigente. */
	html body.single-product div.product div.summary.entry-summary {
		grid-column: 2;
		grid-row: 1 / span 2;
	}

	/* El bloque nuevo bajo la galeria.
	   ATENCION A LA ESPECIFICIDAD: la regla que ya hay,
	   `... div.product > *:not(.images):not(.summary):not(.onsale)`, vale
	   (0,5,3) y manda todo lo que no sea galeria ni panel a `1 / -1`. Se
	   repite aqui su misma forma anadiendo la clase, lo que da (0,6,3) y
	   gana independientemente del orden en el archivo. */
	html body.single-product div.product > .hlz-ficha-datos:not(.images):not(.summary):not(.onsale) {
		grid-column: 1;
		grid-row: 2;
		align-self: start;
		min-width: 0;
	}
}


/* ==================================================================
   2. La tabla de atributos, ya fuera de .summary
   ================================================================== */

/* Todo el estilo de la tabla estaba escrito contra
   `... div.summary .hlz-atributos`. Al sacarla del panel ese selector deja
   de casar y la tabla saldria con el estilo crudo de WooCommerce (bordes
   grises, celdas centradas). Se repiten las mismas declaraciones sin exigir
   `.summary`, de modo que valen en los DOS sitios: si el PHP no llega a
   desplegarse, las reglas viejas (mas especificas) siguen mandando dentro
   del panel y no cambia nada. */
html body.single-product div.product .hlz-atributos {
	width: 100%;
	margin: 0;
	border: 0;
	border-collapse: collapse;
	font-size: var(--fs-ui-sm);
}

html body.single-product div.product .hlz-atributos tr {
	border: 0;
}

html body.single-product div.product .hlz-atributos th,
html body.single-product div.product .hlz-atributos td {
	padding: var(--space-5) 0;
	border: 0;
	border-bottom: var(--border-w) solid var(--border-default);
	background: transparent;
	line-height: 1.5;
	vertical-align: top;
}

html body.single-product div.product .hlz-atributos th {
	width: 40%;
	color: var(--text-secondary);
	font-weight: var(--fw-regular);
	text-align: left;
}

html body.single-product div.product .hlz-atributos td {
	color: var(--text-heading);
	text-align: right;
}

html body.single-product div.product .hlz-atributos td a {
	color: inherit;
	text-decoration: none;
}

html body.single-product div.product .hlz-atributos td a:hover {
	color: var(--accent);
	text-decoration: underline;
}

/* La ultima fila no necesita raya: cierra el bloque y, colgando de la
   galeria, una raya suelta al aire parece un corte.
   OJO: aqui NO vale `td:last-child`. El <td> es el ultimo hijo de CADA <tr>,
   asi que ese selector apaga la raya de todas las celdas de valor y las
   lineas quedan a media anchura (solo bajo la etiqueta). Me paso al escribir
   este bloque y se vio en la captura ampliada. Solo `tr:last-child`. */
html body.single-product div.product .hlz-ficha-datos .hlz-atributos tr:last-child th,
html body.single-product div.product .hlz-ficha-datos .hlz-atributos tr:last-child td {
	border-bottom: 0;
}


/* ==================================================================
   3. Pestanas: se separaban dos veces
   ================================================================== */

/* Medido: entre el final de la columna mas larga y las pestanas hay 100 px,
   y son dos separaciones sumadas — los 50 px de `gap` de la rejilla (las
   pestanas son una fila mas) MAS los 50 px de `margin-top` propios. Se
   quita el margen y manda solo el gap: 50 px limpios en vez de 100.
   Solo de 901 px hacia arriba; en movil la rejilla usa un gap de 30 px y
   ahi el margen si esta haciendo falta.
   (0,4,3) frente a los (0,3,3) de la regla vigente. */
@media (min-width: 901px) {
	html body.single-product div.product > .woocommerce-tabs.wc-tabs-wrapper {
		margin-top: 0;
	}
}


/* ==================================================================
   4. Miniaturas de la galeria
   ================================================================== */

/* El <li> primero: WooCommerce le da `width:25%` con
   `.woocommerce div.product div.images .flex-control-thumbs li`, que vale
   (0,4,3). La seccion 27 ya intenta ponerlo en `auto`, pero lo hace con
   (0,3,4) y PIERDE — comparan primero las clases, 4 > 3 — asi que ese
   `width:auto` nunca ha llegado a aplicarse. Aqui se usa (0,4,5) y si.
   Importa porque a 390 px el 25 % son 73 px y la miniatura se recortaba de
   ancho pero no de alto. */
html body.single-product div.product div.images .flex-control-thumbs li {
	width: auto;
	max-width: none;
	float: none;
	margin: 0;
}

/* Estaban a 64x64 (el dueno las midio en 46: son 64, medido). A ese tamano
   la segunda foto de este producto —un bodegon con los sobres, los dados y
   las fundas— se lee como una mancha gris, que es justo lo que se
   describio. A 88 px se distingue el contenido y sigue habiendo sitio de
   sobra: la fila mide 632 px y el producto con mas fotos que he mirado
   tiene 4 (4x88 + 3x8 = 376 px).
   `aspect-ratio` + `height:auto` en vez de un alto fijo: si el contenedor
   es mas estrecho que 88 px, el `max-width:100%` de WooCommerce recorta el
   ancho y con un alto fijo la caja salia RECTANGULAR (medido: 68x88 a
   390 px). Asi se encoge cuadrada.
   El srcset del nucleo ya sirve un archivo de 100 px para esta ranura, asi
   que a 88 px la imagen sigue llegando nitida y no hay que tocar el PHP.
   (0,3,5) frente a los (0,3,4) de la regla vigente. */
html body.single-product div.product .flex-control-thumbs li img {
	display: block;   /* eran <img> en linea: sobraban 5 px de hueco bajo cada fila */
	width: 88px;
	max-width: 100%;
	aspect-ratio: 1 / 1;
	height: auto;
}

/* La miniatura activa se distinguia solo por el color del borde, de 1 px.
   Se le dobla el grosor con un anillo interior (box-shadow, no border, para
   no mover el tamano de la caja ni descuadrar la fila). */
html body.single-product div.product .flex-control-thumbs img.flex-active {
	box-shadow: inset 0 0 0 var(--border-w) var(--accent);
}


/* ==================================================================
   5. Cierre del panel de compra
   ================================================================== */

/* Con la tabla fuera, la descripcion corta queda pegada al pie del panel de
   compra y se lee como continuacion suya, no como un bloque huerfano. Una
   raya arriba la separa sin necesidad de meterla en una tarjeta.
   Medido: la distancia del precio a la descripcion corta baja de 767 px a
   537 px, que era la otra queja.
   El selector exige `.hlz-buybox +` a proposito: si el PHP no se despliega,
   entre el panel y la descripcion sigue estando la tabla y esta regla no
   casa, asi que no aparece una raya donde no toca. */
html body.single-product div.product .summary .hlz-buybox + .woocommerce-product-details__short-description {
	padding-top: var(--space-9);
	border-top: var(--border-w) solid var(--border-default);
}


/* ==================================================================
   41. Carrito: una sola rejilla para la tabla, y el movil

   Viene del agente de maquetacion del 17-ago-2026 y sustituye en la
   practica al planteamiento de la seccion 28, que ponia display:grid en
   cada <tr> y por eso convertia la tabla en seis rejillas independientes
   que median sus columnas por separado.
   ================================================================== */
/* =====================================================================
   HoloPlaza TCG — CARRITO: correcciones de maquetacion
   ---------------------------------------------------------------------
   Destino sugerido: seccion 28 de
   themes/generatepress_child/ds/holoplaza-ds.css, SUSTITUYENDO los bloques
   que se citan abajo. Si se prefiere no tocar la seccion 28, este fichero
   funciona tal cual siempre que se cargue DESPUES de holoplaza-ds.css:
   los selectores tienen la misma especificidad que los suyos, asi que
   decide el orden de origen.

   Solo tokens de ds/colors.css, spacing.css, typography.css y effects.css.
   Ni un hex suelto. Funciona igual en tema claro y en data-theme="dark".

   QUE ARREGLA (medido en produccion, 17-ago-2026, con 2 productos):

   [1440px]
     - Los rotulos de la cabecera no caian sobre su columna:
       Precio +96px, Cantidad +95px, Subtotal +25px de desfase.
     - Las columnas bailaban ENTRE FILAS: precio en x=656 y x=648 (8px),
       subtotal en x=866 y x=862 (4px).
       Causa raiz: la seccion 28 pone `display:grid` en cada <tr>, asi que
       cada fila es una rejilla INDEPENDIENTE y sus pistas `auto` se miden
       contra el contenido de esa fila sola. La cabecera es otra rejilla
       mas, con otro contenido, y por eso no coincide con ninguna.
     - Agujero de 172-205px entre el nombre y el precio.
     - «Quitar» medía 39x18px (minimo tactil 44px).
     - Glifo de camion pegado a «Cambiar dirección».
     - «Actualizar carrito» a opacity .45, ilegible.

   [390px]
     - Pagina de 3.450px de alto con 2 productos.
     - Un «:» suelto junto a cada miniatura.
     - «Envío» impreso dos veces en los totales.
     - Solo 302 de 390px utiles (77%).
   ===================================================================== */


/* =====================================================================
   1. ESCRITORIO: UNA SOLA REJILLA PARA TODA LA TABLA (subgrid)
   =====================================================================
   Sustituye al bloque «3. LA TABLA DEL CARRITO» de la seccion 28.

   El problema no es el reparto de anchos, es que habia SEIS rejillas
   (la cabecera y una por fila) creyendo que eran una tabla. Ninguna sabia
   lo que median las pistas de las otras.

   La rejilla se declara UNA vez en <table>; <thead> y <tbody> pasan a
   `display:contents` para que las <tr> sean hijas directas de esa rejilla;
   y cada <tr> hereda las MISMAS pistas con `grid-template-columns:subgrid`.
   Asi `max-content` se resuelve una sola vez mirando todas las filas y la
   cabecera a la vez: desaparece el desfase y desaparece el baile.

   Por que subgrid y no volver a una <table> de verdad: el maquetado exige
   que «Quitar» salga al FINAL de la fila cuando en el HTML de WooCommerce
   es la PRIMERA celda. Con display:table no hay forma de reordenar celdas;
   con subgrid se conserva `order` dentro de cada fila. Comprobado que
   Chrome 151 de produccion soporta subgrid (CSS.supports = true); el
   @supports de mas abajo deja la version antigua para navegadores viejos.

   AVISO DE ACCESIBILIDAD (heredado de la seccion 28, no lo empeora este
   fichero): sacar la tabla de `display:table` le quita la semantica de
   tabla. Sigue haciendo falta el ARIA de agente-carrito.php. */

@supports (grid-template-columns: subgrid) {
	@media (min-width: 769px) {

		html body.woocommerce-cart table.shop_table.cart {
			display: grid;
			/* miniatura | nombre (elastico) | precio | cantidad | subtotal | quitar
			   Las pistas numericas llevan un minimo generoso a proposito: al
			   ensancharlas, la pista elastica del nombre se encoge y el agujero
			   central baja de ~172px a ~55px sin partir los nombres largos. */
			grid-template-columns:
				calc(var(--stepper-w) * 2)      /* 80px, la plancha de la miniatura */
				minmax(0, 1fr)                  /* nombre */
				minmax(5rem, max-content)       /* precio */
				max-content                     /* stepper de cantidad */
				minmax(5rem, max-content)       /* subtotal */
				minmax(4.5rem, max-content);    /* quitar (44px tactiles + aire) */
			column-gap: var(--space-7);
			width: 100%;
			border: 0;
			border-radius: 0;
		}

		/* Que las <tr> sean hijas de la rejilla de la <table>. */
		html body.woocommerce-cart table.shop_table.cart thead,
		html body.woocommerce-cart table.shop_table.cart tbody {
			display: contents;
		}

		html body.woocommerce-cart table.shop_table.cart tr {
			display: grid;
			grid-template-columns: subgrid;
			grid-column: 1 / -1;
			align-items: center;
			column-gap: var(--space-7);
			border-bottom: 1px solid var(--border-default);
		}

		html body.woocommerce-cart table.shop_table.cart tr:last-child {
			border-bottom: 0;
		}

		/* --- Cabecera --------------------------------------------------- */
		/* Las dos primeras celdas no llevan rotulo y «Producto» se estira
		   sobre miniatura + nombre, como en el kit. */
		html body.woocommerce-cart table.shop_table.cart thead th.product-remove,
		html body.woocommerce-cart table.shop_table.cart thead th.product-thumbnail {
			display: none;
		}

		html body.woocommerce-cart table.shop_table.cart thead th.product-name     { grid-column: 1 / 3; }
		html body.woocommerce-cart table.shop_table.cart thead th.product-price    { grid-column: 3; }
		html body.woocommerce-cart table.shop_table.cart thead th.product-quantity { grid-column: 4; }
		html body.woocommerce-cart table.shop_table.cart thead th.product-subtotal { grid-column: 5; }

		/* --- Alineacion: los numeros a la derecha, con su rotulo encima ---
		   Un carrito es una tabla de dinero: si el precio y el subtotal no
		   van alineados a la derecha, las comas decimales no se apilan y la
		   columna se lee mal. El rotulo tiene que ir alineado IGUAL que su
		   valor, o vuelve el efecto de «etiqueta despegada» aunque las
		   pistas ya coincidan. */
		html body.woocommerce-cart table.shop_table.cart thead th.product-price,
		html body.woocommerce-cart table.shop_table.cart thead th.product-subtotal,
		html body.woocommerce-cart table.shop_table.cart td.product-price,
		html body.woocommerce-cart table.shop_table.cart td.product-subtotal {
			text-align: right;
		}

		html body.woocommerce-cart table.shop_table.cart thead th.product-quantity,
		html body.woocommerce-cart table.shop_table.cart td.product-quantity {
			text-align: center;
		}

		html body.woocommerce-cart table.shop_table.cart td.product-remove {
			text-align: right;
		}
	}
}

/* Reserva para navegadores sin subgrid: se conserva el reparto de la
   seccion 28 (desalineado, pero no roto) y al menos se igualan las pistas
   numericas para reducir el baile entre filas. */
@supports not (grid-template-columns: subgrid) {
	@media (min-width: 769px) {
		html body.woocommerce-cart table.shop_table.cart tr {
			grid-template-columns:
				calc(var(--stepper-w) * 2) minmax(0, 1fr)
				5rem max-content 5rem 4.5rem;
		}
		html body.woocommerce-cart table.shop_table.cart thead th.product-price,
		html body.woocommerce-cart table.shop_table.cart thead th.product-subtotal,
		html body.woocommerce-cart table.shop_table.cart td.product-price,
		html body.woocommerce-cart table.shop_table.cart td.product-subtotal { text-align: right; }
		html body.woocommerce-cart table.shop_table.cart td.product-remove { text-align: right; }
	}
}


/* =====================================================================
   2. «QUITAR»: objetivo tactil de 44px
   =====================================================================
   Medido: 39x18px. El minimo recomendado son 44x44 (WCAG 2.5.8 pide 24px
   como minimo absoluto, pero en un enlace DESTRUCTIVO junto a un stepper
   que tambien se toca, quedarse en 18px de alto invita al borrado
   accidental).

   Se crece con min-height/min-width y flex, no con padding, para no
   desplazar el texto respecto al resto de la fila. `justify-content:
   flex-end` lo mantiene pegado a la derecha aunque la caja mida 44px. */
html body.woocommerce-cart td.product-remove a.remove {
	display: inline-flex;
	align-items: center;
	justify-content: flex-end;
	min-width: 44px;
	min-height: 44px;
	width: auto;
	height: auto;
}


/* =====================================================================
   3. EL GLIFO RARO DE «CAMBIAR DIRECCIÓN»
   =====================================================================
   No es un emoji roto ni una fuente que no carga: es el icono de CAMION
   de la tipografia de iconos de WooCommerce (U+E019), que
   woocommerce.css cuelga de `a.shipping-calculator-button::after`. La
   fuente carga bien (document.fonts.check('13px WooCommerce') = true).

   Se ve mal por dos motivos: el subrayado del enlace le pasa por encima de
   las ruedas, y un camion no dice nada que el texto «Cambiar dirección» no
   diga ya. Se apaga en vez de maquillarlo.

   Especificidad: la regla de WooCommerce es
     .woocommerce-cart .cart-collaterals .shipping-calculator-button::after
   es decir (0,3,0). Un `html body.woocommerce-cart a.shipping-...` solo llega
   a (0,2,3) y PIERDE (mandan las clases antes que los elementos): probado en
   vivo, el camion seguia ahi. Hay que repetir .cart-collaterals para subir a
   (0,3,2). */
html body.woocommerce-cart .cart-collaterals .shipping-calculator-button::after {
	content: none;
}


/* =====================================================================
   4. «ACTUALIZAR CARRITO» APAGADO
   =====================================================================
   OJO: el boton esta DESHABILITADO de verdad (`disabled` = true en el
   DOM). Es el comportamiento normal de WooCommerce: solo se activa al
   cambiar una cantidad. Aqui NO se toca esa logica.

   Lo que si es un defecto es como se dibuja el estado inactivo:
   opacity .45 sobre fondo transparente deja el texto en un gris lavado
   que parece un fallo de pintado. Se cambia por un chip inactivo
   explicito: relleno hundido, texto --text-muted (contraste real) y
   cursor not-allowed. Sigue leyendose «no se puede pulsar», pero como
   decision de diseno y no como error.

   Sobre la especificidad: la seccion 28 ya declara
     html body.woocommerce-cart td.actions button.button[name="update_cart"][disabled]
       { opacity: .45 }                                      -> (0,6,4)
     html body.woocommerce-cart td.actions button.button[name="update_cart"]
       { color: var(--text-secondary) !important }           -> (0,5,4) !important
   asi que hay que subir a (0,7,5) anadiendo table.shop_table.cart, y el color
   necesita !important para ganar al !important de la linea 5741 del DS. Si
   estas reglas se integran DENTRO de la seccion 28 sustituyendo a las
   originales, se puede quitar el !important y acortar el selector. */
html body.woocommerce-cart table.shop_table.cart td.actions button.button[name="update_cart"][disabled],
html body.woocommerce-cart table.shop_table.cart td.actions button.button[name="update_cart"]:disabled {
	opacity: 1;
	color: var(--text-muted) !important;
	/* La linea 5730 del DS declara `background: transparent !important`, asi
	   que aqui no basta con ganar en especificidad: hay que responder con
	   !important. */
	background: var(--surface-sunken) !important;
	border-color: var(--border-default) !important;
	cursor: not-allowed;
}


/* =====================================================================
   5. MOVIL (<=768px): el carrito deja de ser una lista de etiquetas
   =====================================================================
   Estado medido a 390px con 2 productos: 3.450px de pagina, 586px por
   producto, un «:» suelto por miniatura y «Envío» dos veces.

   Por debajo de 769px manda woocommerce-smallscreen.css, que apila cada
   celda a lo ancho con su `data-title` delante. Eso da seis lineas por
   producto. Aqui se convierte cada fila en una TARJETA de tres franjas,
   que es como se lee un carrito en un movil.

   Varios `!important` son inevitables y estan justificados uno a uno:
   smallscreen declara `text-align:right!important` y `display:block` en
   todas las celdas. No es capricho de especificidad. */
@media (max-width: 768px) {

	/* --- 5.1 Recuperar el ancho que se come Elementor ------------------
	   Medido a 390px: .inside-article deja 24px por lado (GeneratePress, se
	   respeta) y ADEMAS la seccion Elementor de la pagina 9 mete otros 20px
	   por lado. Resultado: 302 de 390px utiles, el 77%. En una tabla de
	   dinero esos 40px son la diferencia entre que el subtotal quepa en la
	   linea o no. Se recorta solo en el carrito y solo en movil. */
	html body.woocommerce-cart .elementor > .e-con {
		padding-left: var(--space-2);
		padding-right: var(--space-2);
	}

	/* --- 5.2 El «:» suelto ---------------------------------------------
	   smallscreen pinta `content: attr(data-title) ": "` en TODA celda.
	   td.product-thumbnail no tiene data-title, asi que el contenido
	   generado se queda en «: » a secas y se pinta junto a la miniatura.
	   (En product-remove y en actions WooCommerce ya lo apaga; en
	   thumbnail se le olvido.) */
	html body.woocommerce-cart table.shop_table.cart td.product-thumbnail::before,
	html body.woocommerce-cart table.shop_table.cart td.product-name::before,
	html body.woocommerce-cart table.shop_table.cart td.product-quantity::before {
		content: none;
	}

	/* Precio y subtotal SI conservan rotulo: son dos cifras en euros una
	   encima de otra y sin etiqueta no se distinguen. Pero se pinta en
	   linea y en gris, no en negrita flotando a la izquierda. */
	html body.woocommerce-cart table.shop_table.cart td.product-price::before,
	html body.woocommerce-cart table.shop_table.cart td.product-subtotal::before {
		content: attr(data-title) " ";
		float: none;
		font-weight: var(--fw-regular);
		font-size: var(--fs-ui-2xs);
		color: var(--text-muted);
	}

	/* --- 5.3 La tarjeta -------------------------------------------------
	        [mini] [nombre        ] [Quitar]
	        [mini] [precio unidad          ]
	        [ stepper      ] [subtotal     ]
	   El stepper y el subtotal comparten franja porque son las dos cosas
	   que se tocan/miran al revisar el carrito. */
	html body.woocommerce-cart table.shop_table.cart tr.cart_item {
		display: grid !important;   /* smallscreen fuerza display:block */
		grid-template-columns: 76px minmax(0, 1fr) auto;
		grid-template-areas:
			"mini nombre  quitar"
			"mini precio  precio"
			"cant cant    subtot";
		column-gap: var(--space-6);
		row-gap: var(--space-3);
		align-items: center;
		padding: var(--space-7) 0;
		border-bottom: 1px solid var(--border-default);
	}

	html body.woocommerce-cart table.shop_table.cart tr.cart_item td {
		display: block !important;
		text-align: left !important;   /* contra el right!important de smallscreen */
		padding: 0;
		border: 0;
		background: none;              /* smallscreen pinta cebra en tr:nth-child(2n) */
	}

	html body.woocommerce-cart table.shop_table.cart td.product-thumbnail { grid-area: mini; }
	html body.woocommerce-cart table.shop_table.cart td.product-name      { grid-area: nombre; }
	html body.woocommerce-cart table.shop_table.cart td.product-remove    { grid-area: quitar; text-align: right !important; }
	html body.woocommerce-cart table.shop_table.cart td.product-price     { grid-area: precio; }
	html body.woocommerce-cart table.shop_table.cart td.product-quantity  { grid-area: cant; }
	html body.woocommerce-cart table.shop_table.cart td.product-subtotal  { grid-area: subtot; text-align: right !important; font-weight: var(--fw-semibold); }

	/* La miniatura ocupa las dos primeras franjas y se queda cuadrada. */
	html body.woocommerce-cart table.shop_table.cart td.product-thumbnail {
		grid-row: 1 / 3;
		align-self: start;
	}

	/* La seccion 28 le da a la plancha `width: calc(var(--stepper-w)*3)` =
	   120px y `margin: 0 auto`, pensado para la miniatura centrada de la
	   version apilada. Dentro de una pista de 76px eso se desborda y es lo
	   que hinchaba la tarjeta. Se ajusta a la pista. */
	html body.woocommerce-cart table.shop_table.cart td.product-thumbnail > a,
	html body.woocommerce-cart table.shop_table.cart td.product-thumbnail > img {
		width: 100%;
		margin: 0;
	}

	/* El nombre se recorta para que la tarjeta no crezca sin control con los
	   nombres largos de las cartas, pero a TRES lineas, no a dos: con dos y
	   los ~185px que deja la miniatura, «Fundas 100 unidades Penny Sleeves»
	   se quedaba en «Fundas 100 unidades...». En un carrito el cliente tiene
	   que reconocer lo que esta comprando; 20px mas de tarjeta salen baratos. */
	html body.woocommerce-cart td.product-name a {
		display: -webkit-box;
		-webkit-line-clamp: 3;
		-webkit-box-orient: vertical;
		overflow: hidden;
	}

	/* --- 5.4 La fila de acciones (cupon + actualizar) -------------------
	   Medido: 254px de alto, con el campo de cupon y su boton apilados a lo
	   ancho completo. Puestos en dos columnas ocupan una sola linea. */
	html body.woocommerce-cart table.shop_table.cart td.actions {
		display: block !important;
		text-align: left !important;
		padding: var(--space-8) 0 0;
	}

	/* El campo y su boton, en una linea. Las celdas se asignan a mano: el
	   <label class="screen-reader-text"> que WooCommerce mete delante cuenta
	   como hijo y, dejando la colocacion automatica, empujaba el boton a una
	   segunda fila (comprobado: input en y=929 y boton en y=991). */
	html body.woocommerce-cart table.shop_table.cart td.actions .coupon {
		display: grid;
		grid-template-columns: minmax(0, 1fr) auto;
		gap: var(--space-4);
		align-items: center;
		max-width: none;
	}

	html body.woocommerce-cart table.shop_table.cart td.actions .coupon > label {
		grid-area: 1 / 1;   /* el rotulo invisible no reserva sitio propio */
	}

	html body.woocommerce-cart table.shop_table.cart td.actions .coupon input.input-text {
		grid-area: 1 / 1;
		width: 100%;
		/* la seccion 18 del DS le pone min-width:200px; en 334px de ancho eso
		   deja al boton sin sitio */
		min-width: 0;
		margin: 0;
	}

	/* El boton lleva `padding: 0 var(--space-9)` de la seccion 28 y se comia
	   188 de los 332px, dejando el campo en 136px («Código de cup…»). Se le
	   recorta el relleno solo en movil: el campo pasa a ~190px. */
	html body.woocommerce-cart table.shop_table.cart td.actions .coupon button.button[name="apply_coupon"] {
		grid-area: 1 / 2;
		white-space: nowrap;
		padding: 0 var(--space-6);
		font-size: var(--fs-ui-xs);
	}

	html body.woocommerce-cart table.shop_table.cart td.actions .button[name="update_cart"],
	html body.woocommerce-cart table.shop_table.cart td.actions button[name="update_cart"] {
		width: 100%;
		margin-top: var(--space-5);
	}

	/* --- 5.5 Los totales: «Envío» dejaba de salir dos veces -------------
	   Mecanismo exacto: smallscreen esconde los <th> del cuerpo
	   (`tbody th{display:none}`) y pone el rotulo con
	   `td::before{content:attr(data-title)": "}`. Pero en la fila de envio
	   el <th> vuelve a `display:block` (lo reactiva woocommerce.css para
	   .cart_totals tr.shipping), asi que se pintan LOS DOS: el <th> «Envío»
	   y el ::before «Envío: ».
	   Comprobado fila a fila: subtotal th=none, envio th=BLOCK, total th=none.

	   Se resuelve al reves de como lo hace WooCommerce: se recupera el <th>
	   en las tres filas (es la etiqueta REAL, seleccionable y traducible) y
	   se apaga el ::before en todas. De paso desaparece el «Subtotal:5,40 €»
	   pegado, que salia de mezclar un ::before flotado a la izquierda con un
	   valor alineado a la derecha. */
	html body.woocommerce-cart .cart_totals table td::before {
		content: none !important;
	}

	html body.woocommerce-cart .cart_totals table tbody th {
		display: block !important;
		text-align: left;
		font-weight: var(--fw-semibold);
		color: var(--text-body);
		padding: 0;
	}

	html body.woocommerce-cart .cart_totals table tr {
		display: grid !important;
		grid-template-columns: minmax(0, 1fr) auto;
		column-gap: var(--space-6);
		align-items: baseline;
		padding: var(--space-5) 0;
	}

	html body.woocommerce-cart .cart_totals table td {
		display: block !important;
		text-align: right !important;
		padding: 0;
	}

	/* La fila de envio lleva una lista de radios: no cabe en la segunda
	   columna, asi que ocupa el ancho entero bajo su rotulo. */
	html body.woocommerce-cart .cart_totals table tr.woocommerce-shipping-totals {
		grid-template-columns: minmax(0, 1fr);
		row-gap: var(--space-3);
	}

	html body.woocommerce-cart .cart_totals table tr.woocommerce-shipping-totals td {
		text-align: left !important;
	}

	/* Los radios de envio son objetivos tactiles: se les da altura. */
	html body.woocommerce-cart .cart_totals ul#shipping_method li {
		display: flex;
		align-items: flex-start;
		gap: var(--space-4);
		min-height: 44px;
		padding: var(--space-2) 0;
	}

	html body.woocommerce-cart .cart_totals ul#shipping_method li label {
		margin: 0;
	}
}


/* ==================================================================
   42. Mi cuenta: el menu lateral y el reparto de las dos columnas

   Viene del agente de maquetacion del 17-ago-2026. La causa de que el menu
   midiera 1236px no era el espaciado sino un <br> fantasma dentro de cada
   enlace: Elementor inyecta el menu en the_content (prioridad 9) y wpautop
   (prioridad 10) convierte en <br /> el salto de linea que la plantilla de
   WooCommerce trae detras de <a href="...">. Dieciseis entradas por 25,6px
   son 410px de menu tirados.
   ================================================================== */
/* ======================================================================
   MI CUENTA — arreglo de maquetado
   Agente de maquetacion, 17-ago-2026. Medido en produccion con sesion del
   usuario 892 (ddz) sobre las 15 pestanas + Salir.

   QUE ARREGLA, Y POR QUE EN ESTE ORDEN
   ------------------------------------
   1. El <br> fantasma dentro de cada enlace del menu. Es la causa REAL del
      "muchisimo aire": no es el padding (son 12px), es una linea vacia de
      25,6px encima de cada rotulo. Medido: cada <li> ocupa 77px cuando su
      contenido son 19px de texto. 16 entradas x 25,6px = 410px tirados.
   2. El menu, ya sin la linea fantasma, se aprieta a un ritmo de ~44px.
   3. Las dos columnas pasan a ser superficies, y la de contenido se estira
      hasta la altura del menu: el hueco de la derecha deja de ser un agujero.
   4. La entrada activa gana una barra de acento y un fondo tenue, porque hoy
      lo unico que la distingue a 1440 es el color del texto.
   5. El <h1> baja de 60px a la escala del sistema.

   DE DONDE SALE EL <br>  (para quien venga detras)
   ------------------------------------------------
   NO esta en la plantilla. Comprobado en el servidor:
       wc_get_template('myaccount/navigation.php')  -> sin <br>
       wpautop( esa misma salida )                  -> con <br />
   El menu se pinta dentro del contenido de la pagina 11 (Elementor inyecta el
   shortcode en `the_content` con prioridad 9) y `wpautop`, que corre en la 10,
   convierte el salto de linea que hay justo detras de `<a ...>` en un <br />.
   El arreglo de fondo es de PHP (ver mc-cuenta.php.txt, apartado 3). Mientras
   no se toque el PHP, esta regla lo tapa sin efectos colaterales: dentro de un
   enlace de este menu no hay ningun <br> legitimo.

   TOKENS: todo sale de ds/colors.css, ds/spacing.css y ds/effects.css. No hay
   ni un color literal, asi que el tema oscuro (data-theme="dark") funciona
   solo, sin un bloque aparte.

   ORDEN DE CARGA: estas reglas empatan en especificidad con las de la seccion
   9 de holoplaza-ds.css a proposito (mismo peso, no se sube a la fuerza), asi
   que TIENEN QUE IR DESPUES de esa hoja. Al fusionar, van al final de la
   seccion 9, no antes.
   ====================================================================== */


/* ----------------------------------------------------------------------
   1. La linea fantasma
   ----------------------------------------------------------------------
   Un solo selector devuelve 410px de alto en el menu de escritorio y 400px
   en el de movil. Es el arreglo con mejor relacion arreglo/riesgo de todo
   el fichero. */

.woocommerce-account .woocommerce-MyAccount-navigation li a br {
	display: none;
}


/* ----------------------------------------------------------------------
   2. El menu: una tarjeta con filas de 44px
   ----------------------------------------------------------------------
   Hoy el menu es una lista suelta de 16 rayas horizontales sobre el fondo de
   la pagina. Con 16 entradas eso no lee como un indice, lee como una lista de
   la compra. Se convierte en tarjeta —la misma que usa el resto del sistema—
   para que la columna tenga un borde y un principio y un final claros.

   POR QUE 44px Y NO MENOS: es --control-h, el objetivo tactil minimo del
   sistema (ds/spacing.css). Bajar de ahi haria el menu mas corto pero lo
   dejaria por debajo del minimo pulsable en tactil, y este menu se usa mucho
   desde el movil. */

.woocommerce-account .woocommerce-MyAccount-navigation {
	flex: 0 1 280px;
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	/* En claro la tarjeta es blanca sobre pagina blanca: sin la sombra del
	   sistema solo se veria la raya del borde. En oscuro la sombra apenas se
	   nota, pero alli la tarjeta ya destaca sola (#1a1a1d sobre #0d0d0f). */
	box-shadow: var(--shadow-card);
	overflow: hidden; /* recorta el fondo de la fila activa a la curva */
	/* No se estira con la columna de contenido: el menu mide lo que mide.
	   Esto es lo que permite que sea el CONTENIDO el que rellene el hueco
	   (apartado 3) y no al reves. */
	align-self: flex-start;
}

.woocommerce-account .woocommerce-MyAccount-navigation ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* La raya de separacion pasa del <li> al enlace para que no cruce por debajo
   de la barra de acento de la fila activa. */
.woocommerce-account .woocommerce-MyAccount-navigation li {
	border-bottom: 0;
}

.woocommerce-account .woocommerce-MyAccount-navigation li a {
	display: block;
	position: relative;
	padding: var(--space-6) var(--space-8) var(--space-6) var(--space-10);
	border-bottom: 1px solid var(--border-default);
	color: var(--text-body);
	font-size: var(--fs-ui-sm);
	font-weight: var(--fw-medium);
	/* 1.25 sobre 14px = 17,5px de caja de linea. Con 12+12 de padding y la
	   raya, la fila queda en 42,5px: el ritmo compacto que se buscaba sin
	   apretar el texto. */
	line-height: 1.25;
	text-decoration: none;
	transition: background-color .15s ease, color .15s ease;
}

/* La ultima fila no lleva raya: ya la pone el borde de la tarjeta. */
.woocommerce-account .woocommerce-MyAccount-navigation li:last-child a {
	border-bottom: 0;
}

.woocommerce-account .woocommerce-MyAccount-navigation li a:hover,
.woocommerce-account .woocommerce-MyAccount-navigation li a:focus-visible {
	background: var(--surface-card-hover);
	color: var(--accent);
}

/* «Salir» separada del resto: es la unica entrada destructiva del menu y hoy
   se confunde con «Holo Premium», que tiene justo encima. */
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a {
	color: var(--text-muted);
	border-top: 1px solid var(--border-default);
}


/* ----------------------------------------------------------------------
   2b. La entrada activa
   ----------------------------------------------------------------------
   Medido a 1440: hoy la activa solo cambia de color (rgb(187,24,35)) y de
   grosor. Sobre 16 filas iguales eso se pierde, sobre todo si la activa esta
   a mitad de la lista. Se le anade fondo tenue y una barra de acento a la
   izquierda: dos senales mas, ninguna que dependa solo del color (que es lo
   que pide no dejar fuera a quien no distingue el rojo).

   A <=767px NO se toca: alli la activa ya es una pildora rellena de acento
   con texto en --accent-contrast, y funciona. */

.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
	background: var(--accent-fill);
	color: var(--accent);
	font-weight: var(--fw-bold);
}

.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a::before {
	content: "";
	position: absolute;
	inset: 0 auto 0 0;
	width: 3px;
	background: var(--accent);
}


/* ----------------------------------------------------------------------
   3. El hueco de abajo a la derecha
   ----------------------------------------------------------------------
   El sintoma que ve el dueno: el menu llega hasta abajo y la caja de la
   derecha se queda a media altura. Medido a 1440 antes de tocar nada:
   menu 1.236px contra 125px de contenido en Escritorio (1.111px de hueco) y
   94px en Descargas (1.142px).

   Se ataca por los dos lados:
     - el menu adelgaza (apartados 1 y 2),
     - y lo que quede de diferencia lo ocupa la columna de contenido, que pasa
       de `align-items:flex-start` (se encoge a su contenido) a estirarse.

   POR QUE ESTIRAR Y NO PONER UN min-height FIJO: un min-height hay que
   acertarlo, y aqui el menu cambia de alto segun el usuario (Holo Premium y
   Mi Mercado no salen para todo el mundo). `stretch` lo resuelve solo y no
   deja hueco ni se pasa. Y en las dos pestanas donde el contenido YA es mas
   alto que el menu —Detalles de la cuenta (1.419px) y Mis Alertas (1.818px)—
   no hace nada, porque no hay nada que estirar. */

.woocommerce-account .entry-content > .woocommerce,
.woocommerce-account .woocommerce {
	display: flex;
	gap: var(--space-14);
	align-items: stretch;
	flex-wrap: wrap;
}

.woocommerce-account .woocommerce-MyAccount-content {
	flex: 1 1 620px;
	min-width: 0;
	color: var(--text-body);
	/* La superficie es lo que convierte el hueco en "panel" en vez de en
	   "agujero".

	   POR QUE --surface-card Y NO --surface-sunken, que fue el primer intento:
	   medido, en oscuro --surface-sunken vale #0d0d0f y el fondo de la pagina
	   tambien, o sea que el panel habria quedado invisible justo en el tema
	   donde mas se nota un hueco. --surface-card es el unico que se separa del
	   fondo en los dos temas (claro: #fff con el borde y la sombra haciendo el
	   trabajo; oscuro: #1a1a1d sobre #0d0d0f).

	   Efecto colateral asumido: las tarjetas que pintan los plugins propios
	   (monedero, mercado, premium) son tambien --surface-card, asi que dentro
	   del panel se quedan sin contraste de relleno. Siguen definidas por su
	   borde y su curva —comprobado en Mi monedero— y se ha preferido eso a
	   dejar el hueco sin superficie, que es lo que se venia a arreglar. */
	background: var(--surface-card);
	border: 1px solid var(--border-default);
	border-radius: var(--radius);
	padding: var(--space-10) var(--space-12);
}

/* El primer y el ultimo elemento del panel no deben anadir su propio margen
   al padding del panel: es lo que hace que un panel parezca mal centrado. */
.woocommerce-account .woocommerce-MyAccount-content > *:first-child {
	margin-top: 0;
}

.woocommerce-account .woocommerce-MyAccount-content > *:last-child {
	margin-bottom: 0;
}


/* ----------------------------------------------------------------------
   4. El titulo de la pagina
   ----------------------------------------------------------------------
   Sale a 60px. La seccion 9 de holoplaza-ds.css ya intentaba bajarlo a
   --fs-h2, pero apunta a `h1.entry-title` / `.page-title` y el <h1> de estas
   paginas NO es ninguno de los dos: es un widget de encabezado de Elementor
   (`h1.elementor-heading-title`), asi que aquella regla nunca llego a
   aplicarse. Se reapunta al selector real.

   El TEXTO del titulo («Mi cuenta» en las 15 pestanas) no se arregla aqui:
   eso es PHP, va en mc-cuenta.php.txt (apartado 1). Cambiar texto desde CSS
   obligaria a esconder el <h1> real y pintar otro con `content`, que deja al
   lector de pantalla y al buscador con el titulo equivocado. */

.woocommerce-account h1.elementor-heading-title {
	font-size: var(--fs-h2);
	line-height: var(--lh-heading);
	color: var(--text-heading);
	margin-bottom: var(--space-9);
}


/* ----------------------------------------------------------------------
   5. Estrecho (<=991px): la nube de pildoras, y hasta donde tiene que llegar
   ----------------------------------------------------------------------
   La nube de pildoras que ya existe se queda: es la decision correcta y esta
   razonada en holoplaza-ds.css (una tira que se desplaza empujaba la pagina a
   1.400px de ancho). Aqui se la deshace de lo que sobra... y se la estira
   hasta 991px, que es el arreglo de un fallo que no estaba en la lista.

   EL FALLO DE LA FRANJA 768-991
   -----------------------------
   El corte de la nube esta en 767px, pero las dos columnas dejan de caber
   bastante antes de eso. Los numeros: el menu pide 280px, la calle 40 y el
   contenido tiene flex-basis 620 => 940px de bases, mas 48 de margenes del
   contenedor = 988px. Por debajo de ~988 el `flex-wrap: wrap` parte la linea
   y el contenido cae DEBAJO del menu.

   Resultado medido a 768px, antes de tocar nada: el cliente se come 1.236px
   de menu en vertical antes de ver una sola linea de su pedido. Es el peor
   caso de toda la pagina, y justo el que se escapaba por 1px del corte.

   Por eso este bloque va a 991px y no a 767: se lleva la nube a toda la
   franja en la que las dos columnas no caben. Las reglas se repiten enteras
   en vez de heredarse del bloque de 767 de holoplaza-ds.css a proposito, para
   que esta hoja se pueda leer sola y no dependa de un valor que esta en otro
   fichero que ademas estan tocando otras manos. Los valores son los mismos.

   Medido antes: 618px de pildoras a 390px antes de llegar al contenido,
   porque cada pildora arrastraba tambien la linea fantasma del apartado 1. */

@media (max-width: 991px) {
	/* La nube: el menu deja de ser columna y pasa a fluir en varias lineas.
	   Y deja de ser tarjeta, porque una nube de pildoras dentro de una caja
	   con borde son dos marcos para lo mismo. */
	.woocommerce-account .woocommerce-MyAccount-navigation {
		flex: 1 1 100%;
		min-width: 0;
		max-width: 100%;
		align-self: auto;
		background: none;
		border: 0;
		border-radius: 0;
		box-shadow: none;
		overflow: visible;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation ul {
		display: flex;
		flex-wrap: wrap;
		gap: var(--space-3);
		padding-bottom: var(--space-2);
	}

	.woocommerce-account .woocommerce-MyAccount-navigation li {
		flex: 0 1 auto;
		min-width: 0;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation li a {
		/* Sin nowrap a proposito: una pildora que no cabe parte su rotulo en
		   dos lineas en vez de estirar la fila. */
		padding: var(--space-5) var(--space-8);
		border: 1px solid var(--border-default);
		border-radius: var(--radius-pill);
		font-size: var(--fs-ui-sm);
		line-height: 1.2;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
		background: var(--accent);
		border-color: var(--accent);
		color: var(--accent-contrast);
	}

	/* La barra de acento sobra sobre una pildora ya rellena de acento. */
	.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a::before {
		display: none;
	}

	.woocommerce-account .woocommerce-MyAccount-content {
		flex: 1 1 100%;
	}
}

/* Y ya solo en movil de verdad (<=767px): quitarle el marco al contenido y
   bajar el titulo, que son las dos cosas que solo hacen falta cuando el ancho
   util escasea de verdad. La nube ya la ha puesto el bloque de arriba. */

@media (max-width: 767px) {
	/* El panel de contenido pierde el marco: a 390px un borde y 30px de
	   padding a cada lado se comen el ancho util de la tabla del monedero. */
	.woocommerce-account .woocommerce-MyAccount-content {
		background: none;
		border: 0;
		border-radius: 0;
		padding: 0;
	}

	.woocommerce-account h1.elementor-heading-title {
		font-size: var(--fs-h2-sm);
	}
}


/* ----------------------------------------------------------------------
   6. OPCION, sin activar: el menu a dos columnas en pantallas anchas
   ----------------------------------------------------------------------
   Se deja escrita y medida, pero COMENTADA, porque cambia la decision de
   diseno que hay documentada en ui_kits/mi-cuenta/AccountLayout.jsx (una
   columna de 280px) y esa decision no es de este arreglo: es del sistema.
   Que la descomente quien lleve el sistema si le convence el numero.

   Medido a 1440 en Escritorio, con todo lo anterior ya puesto:
     una columna  -> menu 683px, pagina 1.508px
     dos columnas -> menu 350px, pagina 1.168px   (-43% frente al original)

   A favor: el panel de contenido deja de ser una caja casi vacia en las siete
   pestanas de contenido corto. En contra: un menu de cuenta a dos columnas se
   parece mas a un mapa del sitio que a un indice lateral, y «Salir» acaba en
   una celda suelta abajo a la derecha.

@media (min-width: 1200px) {
	.woocommerce-account .woocommerce-MyAccount-navigation {
		flex: 0 1 420px;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation ul {
		display: grid;
		grid-template-columns: 1fr 1fr;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation li:nth-child(odd) a {
		border-right: 1px solid var(--border-default);
	}
}
   ---------------------------------------------------------------------- */


/* ==================================================================
   43. Cabecera: la fila del menu, los desplegables y el movil

   Viene del agente de cabecera del 17-ago-2026, y corrige de paso una
   conclusion equivocada que se venia arrastrando: el desbordamiento a 1280
   NO lo causaba el selector de idioma. Quitandolo el desborde no bajaba,
   SUBIA de 37 a 67px — era solo el elemento que quedaba mas a la derecha.

   Las dos causas reales son la seccion 25 (flex-wrap:nowrap con
   justify-content:center, que reparte el sobrante a los dos lados y a 1280
   dejaba «Pokemon TCG» empezando en x=-37, cortada y sin forma de llegar a
   ella) y los desplegables, que aun cerrados suman al area de
   desplazamiento porque se ocultan con visibility:hidden.
   ================================================================== */
/* ==================================================================
   43. Cabecera: desbordamiento, submenus accesibles y menu movil
   ==================================================================
   DONDE VA: al FINAL de themes/generatepress_child/ds/holoplaza-ds.css,
   como seccion 43.

   POR QUE AHI Y NO EN plugins/holoplaza-plantillas/assets/header.css:
   functions.php encola 'hlz-ds' con prioridad 9999 y dependencia de
   'generate-child', asi que holoplaza-ds.css se imprime SIEMPRE detras de
   header.css. Una regla escrita en header.css con la misma especificidad
   PIERDE. Ademas el fallo principal que se corrige aqui esta introducido en
   la seccion 25 de esta misma hoja, y el arreglo tiene que vivir al lado de
   lo que arregla.

   Todo el color sale de tokens de ds/colors.css: la cabecera se pinta sobre
   --page-bg y tiene que seguir al tema activo (claro por defecto,
   <html data-theme="dark"> para el oscuro). Ni un color literal.
   ------------------------------------------------------------------ */


/* ------------------------------------------------------------------
   43.1  EL DESBORDAMIENTO HORIZONTAL
   ------------------------------------------------------------------
   MEDIDO ANTES DE TOCAR NADA (portada, tema claro):

     ancho   fila del menu   sitio disponible   resultado
     1440         1425px          1352px        se sale 37px por cada lado,
                                                pero cae en el margen de la
                                                pagina: quedan 7px de aire
     1366         1353px          1318px        idem, quedan 6px de aire
     1280         1353px          1232px        DESBORDE 37px a la derecha
                                                Y 37px RECORTADOS a la izquierda
     1150         1353px          1102px        66px fuera por cada lado

   O sea: la fila del menu NO CABE en NINGUNA de las anchuras de escritorio
   medidas. A 1440 y 1366 no se nota porque el sobrante aterriza en el
   margen lateral de la pagina; el colchon real es de 7px y 6px. Eso no es
   un margen de diseno, es un empate por los pelos.

   LA CAUSA no es el selector de idioma. Se comprobo quitandolo en vivo a
   1280: el desbordamiento no bajo, SUBIO de 37px a 67px (al estrecharse la
   fila se recolocaron las entradas y quedo asomando el desplegable de la
   ultima). Y a 1024 quitarlo no cambia nada: 54px antes y 54px despues.
   El selector es solo el elemento que queda mas a la derecha a 1280, no el
   motivo.

   LA CAUSA REAL es la seccion 25 de esta hoja:

       html .hplt-lh__menu { flex-wrap: nowrap; justify-content: center; }

   `nowrap` obliga a diez entradas que suman 1353px a caber en 1232px, y
   `center` reparte el sobrante a los DOS lados. El de la derecha da barra de
   desplazamiento; el de la IZQUIERDA se recorta en silencio y no hay forma
   de llegar a el (no se puede desplazar hacia la izquierda). A 1280 eso deja
   "Pokemon TCG" empezando en x=-37: la primera categoria de la tienda,
   cortada y sin manera de verla entera. Ese daño nadie lo habia medido.

   ARREGLO: devolver `flex-wrap: wrap`. Con `wrap` el desbordamiento
   horizontal es IMPOSIBLE por construccion — la fila salta de linea en vez
   de salirse. No depende de que las cuentas cuadren hoy: aguanta que mañana
   se renombre una categoria o cargue otra fuente.

   Y para que siga cabiendo en UNA linea (que es lo que quiere el maquetado,
   y el motivo por el que se puso `nowrap`), se ataca el problema por donde
   toca: sacando de la fila los 125px del selector de idioma (43.2) y
   apretando el relleno lateral segun el ancho (aqui abajo).

   OPCIONES DESCARTADAS:
   - Bajar el tamano de letra del menu: el sistema fija los enlaces en
     15px/600 y encogerlos rompe la jerarquia tipografica. Ya lo dice la
     propia seccion 25 y sigue siendo cierto.
   - Colapsar a hamburguesa antes (a 1080 o 1200): esconderia las nueve
     categorias justo en las dos resoluciones de portatil mas usadas. En una
     tienda cuya navegacion SON las categorias, es el peor cambio posible.
   - Dejarlo en dos lineas siempre: cabe, pero la seccion 25 ya conto que
     "Otros TCG" caia sola en la segunda linea y parecia un error. Con `wrap`
     las dos lineas siguen existiendo, pero solo por debajo de ~1200px, donde
     de verdad no hay sitio.
   - Quitar el selector de idioma del menu y ya: no arregla nada por si solo
     (medido: 1280 empeora a 67px, 1024 se queda igual). Hace falta ademas
     43.3. */

html .hplt-lh__menu {
	/* Deshace el `nowrap` de la seccion 25. Con esto el menu no puede
	   desbordar ni recortar: si no cabe, salta de linea. */
	flex-wrap: wrap;
	justify-content: center;
	row-gap: 0;
}

/* Escalera de relleno lateral. Objetivo: que las nueve categorias sigan en
   UNA linea hasta donde sea razonable, sin tocar el tamano de letra.
   Medido con el selector de idioma ya fuera de la fila (43.2):
     >=1401 -> 16px de relleno -> la fila mide 1300px
     <=1400 -> 12px            -> 1228px
     <=1300 ->  8px            -> 1156px  (cabe en 1280, sobran 76px)
     <=1120 ->  6px            -> 1138px  (aqui ya suele ir en dos lineas)
   Por debajo de eso salta a dos lineas sola, que es justo lo que se quiere. */
@media (max-width: 1400px) {
	html .hplt-lh__menu > li > a {
		padding-left: var(--space-6);
		padding-right: var(--space-6);
	}
}
@media (max-width: 1300px) {
	html .hplt-lh__menu > li > a {
		padding-left: var(--space-4);
		padding-right: var(--space-4);
	}
}
@media (max-width: 1120px) {
	html .hplt-lh__menu > li > a {
		padding-left: var(--space-3);
		padding-right: var(--space-3);
	}
}

/* Cuando el menu SI se parte en dos lineas, que se note que es a proposito:
   un poco de aire vertical y altura suficiente para las dos filas. Sin esto
   las dos lineas se pegan y parecen un fallo de maquetado. */
html .hplt-lh__menu > li {
	position: relative;
}


/* ------------------------------------------------------------------
   43.2  EL SELECTOR DE IDIOMA SALE DEL MENU Y SE VA A LA BANDA 1
   ------------------------------------------------------------------
   El selector ES/EN no es una categoria de producto: es un control del
   sitio, como el interruptor de tema o el icono de cuenta. Su sitio es la
   banda 1, al lado del interruptor de tema, no en medio de las categorias.

   Ademas libera 125px de la fila del menu, que es justo lo que le falta
   para caber en una linea a 1280.

   Sitio de sobra medido en la banda 1 (portada):
     1440 -> sobraban 344px    1280 -> sobraban 224px
     1366 -> sobraban 310px    1200 -> sobraban 144px
   A 1024 y por debajo la banda 1 va justa, pero el buscador es
   `flex: 0 1 620px` y encoge para dejar sitio: a 1024 pasa de 588px a
   ~466px, que sigue siendo un campo de busqueda holgado.

   El movimiento se hace en PHP (ver sm-cabecera.php.txt). Este bloque solo
   lo viste. */

/* La pildora de idioma dentro de la barra de acciones. */
html .hplt-lh__actions .hpt-switcher {
	display: inline-flex;
	align-items: center;
	gap: var(--space-2);
	flex: 0 0 auto;
}

html .hplt-lh__actions .hpt-lang-btn {
	color: var(--text-heading);
	border: 1px solid transparent;
	background: none;
	padding: var(--space-2) var(--space-3);
	border-radius: var(--radius-sm, 6px);
	line-height: 1;
	cursor: pointer;
}
html .hplt-lh__actions .hpt-lang-btn:hover {
	border-color: var(--accent);
	background: var(--accent-fill);
	color: var(--accent);
}
/* El idioma activo se marca con el acento del tema, no con negrita sola:
   en la banda 1 hay poco contraste de peso y la negrita sola no se lee. */
html .hplt-lh__actions .hpt-lang-btn.active {
	border-color: var(--accent);
	background: var(--accent-fill-strong);
	color: var(--text-heading);
	font-weight: var(--fw-bold);
}
html .hplt-lh__actions .hpt-divider {
	color: var(--border-strong);
}

/* Por debajo de 1200 se sueltan las banderas y quedan solo ES | EN: ahorra
   ~44px justo donde la banda 1 empieza a ir justa, y las siglas ya dicen lo
   mismo (la bandera era decorativa, va con aria-hidden). */
@media (max-width: 1200px) {
	html .hplt-lh__actions .hpt-flag {
		display: none;
	}
}

/* A 768 y por debajo manda la pildora flotante de siempre
   (.hpt-floating), que ya existe y no se toca. Se esconde la de la banda 1
   para no ofrecer el mismo control dos veces en una pantalla pequena. */
@media (max-width: 768px) {
	html .hplt-lh__actions .hpt-switcher {
		display: none;
	}
}

/* Si por lo que sea el selector siguiera inyectandose en el menu (por
   ejemplo si se despliega el CSS pero no el PHP), esta regla evita que
   aparezca DOS veces. Sin `!important`: basta la especificidad. */
html .hplt-lh__actions .hpt-switcher ~ .hpt-switcher {
	display: none;
}


/* ------------------------------------------------------------------
   43.3  LOS DESPLEGABLES QUE SE SALEN POR LA DERECHA
   ------------------------------------------------------------------
   Esta es la segunda causa de desbordamiento, independiente de la anterior,
   y la que sobrevive a todo lo demas.

   `.hplt-lh__menu li .sub-menu` es `position:absolute; left:0; min-width:210px`.
   En las entradas de la derecha, ese panel de 210px arranca en el borde
   izquierdo de su entrada y se va 210px hacia la derecha, saliendose de la
   pantalla. Y aunque este cerrado NO desaparece del calculo: esta oculto con
   `visibility:hidden`, que sigue ocupando sitio en el area de desplazamiento
   (solo `display:none` no ocuparia).

   MEDIDO: a 1024 el desbordamiento de 54px es ENTERAMENTE de esto — al
   ocultar los submenus con display:none baja a 0px. A 1280 esta tapado por
   el problema de la fila, y aparece en cuanto aquel se arregla (por eso al
   quitar el selector de idioma el desbordamiento subia a 67px).

   ARREGLO: a las entradas cuyo panel no cabe se les ancla el desplegable por
   la DERECHA en vez de por la izquierda. La clase la pone el JS midiendo de
   verdad (ver sm-cabecera.js.txt), no un `nth-child` fijo: el numero de
   entradas que caben cambia con el ancho y con el idioma.

   OPCION DESCARTADA: `overflow-x: clip` en la banda 2. Mata el
   desbordamiento en una linea, pero recorta el desplegable de la ultima
   categoria por la mitad. Un panel cortado es peor que uno movido. */
html .hplt-lh__menu li.hplt-sub-der > .sub-menu {
	left: auto;
	right: 0;
}

/* Red de seguridad por CSS, para el instante entre que carga la pagina y
   corre el JS (y por si el JS fallara): ningun desplegable puede ser mas
   ancho que la pantalla ni salirse por la derecha del contenedor. */
html .hplt-lh__menu li .sub-menu {
	max-width: min(210px, calc(100vw - var(--space-9)));
}


/* ------------------------------------------------------------------
   43.4  ESCAPE CIERRA EL DESPLEGABLE
   ------------------------------------------------------------------
   Los desplegables se abren con `:hover` y con `:focus-within` (CSS puro, y
   asi sigue: funciona sin JavaScript). El problema es que Escape no tenia
   forma de cerrarlos, porque mientras el raton siga encima o el foco siga
   dentro, `:hover`/`:focus-within` los mantienen abiertos.

   Solucion: el JS marca la entrada con `.hplt-sub-cerrado` al pulsar Escape,
   y esta regla gana a las de apertura. Especificidad a proposito:
     esta                                    -> 0-3-0
     html .hplt-lh__menu li:hover > .sub-menu -> 0-2-1  (seccion 11 / header.css)
   El JS quita la clase en cuanto el raton sale o el foco se va, para que la
   entrada vuelva a comportarse igual que las demas. */
html .hplt-lh__menu li.hplt-sub-cerrado > .sub-menu {
	opacity: 0;
	visibility: hidden;
	transform: translateY(6px);
}


/* ------------------------------------------------------------------
   43.5  EL BOTON DE DESPLEGAR (el que da el ARIA y el plegado en movil)
   ------------------------------------------------------------------
   El JS inserta un <button> detras del enlace de cada categoria con hijos.
   POR QUE UN BOTON APARTE Y NO EL PROPIO ENLACE: el enlace tiene que seguir
   llevando a la categoria (una persona que toca "Pokemon TCG" espera ir a
   Pokemon TCG). Un mismo elemento no puede navegar y desplegar a la vez sin
   robarle una de las dos cosas a alguien. Con un boton hermano, cada gesto
   tiene su destino y el ARIA (aria-expanded/aria-controls) vive donde debe.

   En escritorio el boton ES la flechita: sustituye al `::after` que la
   pintaba, para que no salgan dos. */
html .hplt-lh__menu > li.menu-item-has-children > a::after {
	content: none;
}

html .hplt-lh__subtoggle {
	/* Botón desnudo: hereda el color del enlace de al lado. */
	appearance: none;
	border: 0;
	background: none;
	padding: 0 var(--space-3) 0 0;
	margin: 0;
	color: inherit;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	line-height: 1;
	/* GeneratePress da `button{padding:10px 20px}` y aqui eso deformaria la
	   fila del menu entera. Mismo motivo que documenta header.css para la
	   lupa del buscador. */
}
html .hplt-lh__subtoggle svg {
	width: 10px;
	height: 10px;
	display: block;
	transition: transform var(--dur-fast, .15s);
}
html .hplt-lh__menu > li.hplt-abierto > .hplt-lh__subtoggle svg {
	transform: rotate(180deg);
}
html .hplt-lh__subtoggle:hover,
html .hplt-lh__subtoggle:focus-visible {
	color: var(--accent);
}

/* En escritorio el boton se pega al texto del enlace, dentro de la misma
   entrada, para que se lea como una sola cosa. Se le quita el relleno
   derecho al enlace y se lo queda el boton. */
@media (min-width: 769px) {
	html .hplt-lh__menu > li.menu-item-has-children {
		display: inline-flex;
		align-items: center;
	}
	html .hplt-lh__menu > li.menu-item-has-children > a {
		padding-right: var(--space-2);
	}
}

/* Anillo de foco visible: el boton es nuevo y sin esto no se ve al tabular.
   Se usa el token de la casa (--focus-outline = 2px solid var(--accent) en
   effects.css), que ya sigue al tema: carmesi en claro, naranja en oscuro. */
html .hplt-lh__subtoggle:focus-visible,
html .hplt-lh__menu a:focus-visible {
	outline: var(--focus-outline);
	outline-offset: var(--focus-outline-offset);
	border-radius: var(--radius-sm);
}

/* ------------------------------------------------------------------
   43.5b  ABRIR CON CLIC / TECLADO TAMBIEN EN ESCRITORIO
   ------------------------------------------------------------------
   Sin esto el boton solo serviria en movil: en escritorio el desplegable se
   abre por :hover y :focus-within, pero pulsar el boton no haria nada
   visible. Hace falta para los portatiles con pantalla tactil (donde no hay
   hover) y para quien navega con teclado y prefiere Enter a las flechas.

   Especificidad 0-3-0, la misma que .hplt-sub-cerrado de 43.4. No hay empate
   posible porque el JS nunca deja las dos clases a la vez: al abrir quita
   .hplt-sub-cerrado y al pulsar Escape quita .hplt-abierto. */
@media (min-width: 769px) {
	html .hplt-lh__menu > li.hplt-abierto > .sub-menu {
		opacity: 1;
		visibility: visible;
		transform: none;
	}
}


/* ------------------------------------------------------------------
   43.6  EL MENU EN MOVIL: PLEGADO DE ENTRADA
   ------------------------------------------------------------------
   MEDIDO ANTES: a 390px el menu se abria con los SEIS submenus ya
   desplegados — 2.241px de alto y 53 filas <li>. En una pantalla de 844px de
   alto eso son casi tres pantallas de desplazamiento para llegar al final
   del menu, y las nueve categorias de primer nivel quedan enterradas entre
   sus hijas.

   La regla de la seccion 406 de header.css deja los submenus
   `position:static; opacity:1; visibility:visible` en movil, o sea abiertos
   siempre. Aqui se pliegan y solo se abren con su boton.

   Se usa display:none/block y no una animacion de altura a proposito: el
   contenido de cada submenu tiene alto variable (de 1 a 14 entradas) y
   animar altura con `max-height` fijo o recorta el submenu largo o deja un
   salto feo en el corto. Plegar de golpe es honesto y no miente. */
@media (max-width: 768px) {
	/* Plegados por defecto. Especificidad suficiente para ganar a
	   `.hplt-lh--open .hplt-lh__menu .sub-menu` (0-3-0) de header.css. */
	html .hplt-lh--open .hplt-lh__menu .sub-menu {
		display: none;
	}
	html .hplt-lh--open .hplt-lh__menu li.hplt-abierto > .sub-menu {
		display: block;
	}

	/* La entrada ocupa toda la fila: el enlace a la izquierda (y sigue
	   navegando a su categoria) y el boton de desplegar a la derecha, con
	   44px de lado, que es el objetivo tactil minimo del sistema
	   (--control-h). Antes toda la fila era enlace y no habia forma de
	   desplegar sin navegar. */
	html .hplt-lh--open .hplt-lh__menu > li.menu-item-has-children {
		display: flex;
		align-items: center;
		flex-wrap: wrap;
		justify-content: space-between;
	}
	html .hplt-lh--open .hplt-lh__menu > li.menu-item-has-children > a {
		flex: 1 1 auto;
		padding-right: var(--space-4);
	}
	html .hplt-lh--open .hplt-lh__subtoggle {
		width: var(--control-h);
		height: var(--control-h);
		padding: 0;
		flex: 0 0 auto;
		/* Una linea fina a la izquierda separa "ir a la categoria" de
		   "desplegar": sin ella el dedo no sabe donde acaba una cosa y
		   empieza la otra. */
		border-left: 1px solid var(--border-hairline);
	}
	html .hplt-lh--open .hplt-lh__subtoggle svg {
		width: 14px;
		height: 14px;
	}
	/* El submenu abierto ocupa la fila entera, debajo de las dos cosas. */
	html .hplt-lh--open .hplt-lh__menu > li.menu-item-has-children > .sub-menu {
		flex: 1 0 100%;
	}

	/* El submenu abierto se distingue del nivel 1 por sangria y una linea
	   guia, no por color de fondo: en movil la banda es del color de la
	   pagina y un fondo distinto partiria la cabecera en dos tonos. */
	html .hplt-lh--open .hplt-lh__menu li.hplt-abierto > .sub-menu {
		padding-left: var(--space-6);
		margin-left: var(--space-8);
		border-left: 2px solid var(--border-hairline);
	}
	html .hplt-lh--open .hplt-lh__menu .sub-menu li a {
		color: var(--text-body);
		padding: var(--space-5) var(--space-8);
	}

	/* La banda 2 abierta no puede ser mas alta que la pantalla: se le da
	   desplazamiento propio. Con los submenus plegados el menu mide ~470px y
	   no hace falta, pero si alguien abre dos submenus largos (One Piece
	   tiene 13 entradas) vuelve a pasarse, y sin esto el desplazamiento se lo
	   come la pagina de detras. */
	html .hplt-lh--open .hplt-lh__bar2 {
		max-height: calc(100vh - var(--space-24));
		overflow-y: auto;
		overscroll-behavior: contain;
	}
}


/* ==================================================================
   44. Pie: la marca y la linea de servicio                          
   ==================================================================

   QUE SE VEIA
   -----------
   Cuatro columnas de texto suelto sobre el mismo gris que la banda de
   eventos de encima, sin nada que anclara el bloque, y debajo una banda
   de 84px con el copyright centrado y solo. Medido a 2000px: las
   columnas ocupan 324..1676 y la de copyright, un texto de 147px en
   mitad de 2000.

   QUE PIDE EL PAQUETE (components/chrome/SiteFooter.jsx)
   ------------------------------------------------------
   - La marca a 200px encabezando la PRIMERA COLUMNA, no en una fila
     propia. El propio componente explica por que, y conviene no
     redescubrirlo: «on its own row it left a wide empty band to the
     right of the mark».
   - La fila de cierre con DOS textos y `justify-content: space-between`:
     copyright a la izquierda, reclamo de servicio a la derecha.

   El HTML de las dos cosas lo pone mu-plugins/holoplaza-pie.php.

   LA MAQUETA DE LA MARCA NO ESTA AQUI, esta arriba, junto al resto de
   reglas del pie (busca `.hlzpie__marca-caja`). Alli ya vivia una regla
   escrita de antemano para este logotipo, y tenerla en dos sitios era
   garantia de pelea de especificidad: gano la de arriba y la marca
   salio a 116px en vez de a 200. Aqui solo queda la fila de cierre. */

/* --- La fila de cierre ----------------------------------------- */

/* POR QUE NO BASTA CON `justify-content: space-between`, que es lo que
   dice el paquete y lo primero que se probo:

   .copyright-bar no es el contenedor de la fila, es un HIJO de
   .inside-site-info, y ese padre ya es `display:flex` con
   `justify-content:center` (de GeneratePress). O sea que la barra es un
   ITEM flexible: se encoge hasta el tamano de su contenido —medido, 521px
   dentro de un carril de 1400— y entonces `space-between` no tiene
   espacio libre que repartir. Los dos textos salian juntos y centrados,
   que es exactamente lo que se veia.

   El arreglo no es tocar el padre (eso afectaria a cualquier otra cosa
   que se ponga en esa barra) sino decirle a la propia barra que crezca.
   `flex-grow` es lo minimo que hace falta; el `space-between` de la
   linea siguiente ya funcionaba, solo estaba repartiendo cero.

   El `text-align: left` es aparte: GeneratePress centra el texto y con
   space-between no se nota, pero al envolver en pantalla estrecha si. */
html body .site-info .copyright-bar {
	flex: 1 1 auto;
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	align-items: baseline;
	gap: var(--space-4) var(--space-8);
	text-align: left;
}

html body .site-info .copyright-bar > p {
	margin: 0;
}

.hlzpie__servicio {
	color: var(--text-secondary);
}

@media (max-width: 767px) {
	/* Con dos textos y poco ancho, space-between deja uno pegado a cada
	   borde y un agujero en medio. Apilados y centrados se lee mejor. */
	html body .site-info .copyright-bar {
		justify-content: center;
		text-align: center;
	}
}

/* ── Cabecera en móvil: logo a escala y el tema cede su sitio a la cuenta ────
   (20-ago-2026, pedido del dueño.) El 18-ago se escondió el icono de cuenta
   para hacer sitio al botón de la app, y resultó que la gente en móvil no
   tenía por dónde iniciar sesión: el pie queda lejísimos y nadie lo busca ahí.
   Se invierte el trueque: vuelve la cuenta (con su medalla de socio) y el que
   se va en pantallas estrechas es el interruptor de tema claro/oscuro, que es
   cosmético y en móvil casi nadie lo tocaba; en escritorio sigue estando. El
   tema elegido en escritorio no se pierde: la preferencia vive en el
   navegador de cada dispositivo y el móvil arranca en el tema por defecto.
   Va con `html body .` porque el interruptor se fija más arriba (§ objetivo
   táctil de 44px) con display:inline-flex a esa misma especificidad (0-1-2):
   con menos, esta regla perdería y el icono no se iría. */
@media (max-width: 768px) {
	html .hplt-lh__logo img {
		max-height: 40px;
	}
	html body .hplt-lh__theme {
		display: none;
	}
}

/* ── Botón de descargar la app en la cabecera, solo móvil (18-ago-2026) ─────
   El envoltorio .hplt-lh__descarga lo pinta la cabecera viva; dentro va el
   widget del mu-plugin holoplaza-pwa con sus estilos inline. Se oculta el
   envoltorio (que no lleva estilo inline) y no el widget, para no pelearse
   con los inline del mu-plugin. En escritorio no se enseña: la cabecera va
   completa y la instalación de la app es cosa del móvil. */
html .hplt-lh__descarga {
	display: none;
}
@media (max-width: 768px) {
	html .hplt-lh__descarga {
		display: inline-flex;
		align-items: center;
	}
	/* Compactar el botón mini a la altura de la fila de iconos. Con !important
	   a la fuerza: el widget trae padding y tamaño INLINE y sin él estas
	   reglas pierden siempre, por mucha especificidad que lleven. */
	html .hplt-lh__descarga #hlz-install-btn {
		padding: 6px 12px !important;
		font-size: 13px !important;
		border-radius: 999px !important;
	}
}

/* ── El disco de accesibilidad (Ally/pojo-accessibility) fuera en móvil ─────
   (18-ago-2026, decisión del dueño.) El widget lo inyecta JavaScript como
   elemento flotante y en pantallas estrechas quedaba medio fuera del borde
   derecho, tapando la cabecera. Su configuración vive en la nube de Elementor
   (no hay ajuste local de "ocultar en móvil"), así que se esconde el
   contenedor raíz por CSS. Los dos selectores porque el nombre del host ha
   cambiado entre versiones del plugin. En escritorio sigue disponible. */
@media (max-width: 768px) {
	html #ea11y-root,
	html .ea11y-widget-container {
		display: none !important;
	}
}

/* ── Barra de admin en móvil: fuera los botones de plugins (18-ago-2026) ────
   El "botón rojo cortado" de la captura del dueño era el círculo de Elementor
   de la BARRA DE ADMIN, colgando junto a su avatar: solo lo ve un admin
   logueado, jamás un cliente. WordPress oculta sus propios nodos por debajo
   de 782px (su breakpoint), pero los que añaden los plugins no traen ese
   comportamiento y quedan asomando cortados sobre la cabecera. Se ocultan en
   estrecho; en escritorio siguen todos. Estas reglas solo pueden afectar a
   quien tiene la barra: para el resto estos ids ni existen. */
@media (max-width: 782px) {
	html #wpadminbar #wp-admin-bar-elementor_edit_page,
	html #wpadminbar #wp-admin-bar-elementor_inspector,
	html #wpadminbar #wp-admin-bar-wpseo-menu,
	html #wpadminbar #wp-admin-bar-hlz-purgar-cache,
	html #wpadminbar #wp-admin-bar-duplicate-post,
	html #wpadminbar #wp-admin-bar-gp_elements-menu,
	html #wpadminbar li[id^="wp-admin-bar-element-"] {
		display: none !important;
	}
}
