/* =========================================================================
   Puente entre el marcado de WordPress/WooCommerce y el CSS del rediseño.

   El resto de hojas son las del prototipo, portadas tal cual. Este archivo
   es el ÚNICO sitio donde se añade CSS nuevo, y sólo por una razón:
   WooCommerce emite marcado que el prototipo nunca tuvo (avisos, paginación,
   contenedores .woocommerce, estados de carga del botón AJAX).

   Manteniéndolo aparte se ve de un vistazo qué se ha tocado respecto al
   diseño original, y las hojas portadas siguen comparables con las de
   ../public/css.
   ========================================================================= */

/* --------------------------------------------------------------- reset -- */

/*
   El atributo `hidden` tiene que ganar.

   Los navegadores lo aplican con `[hidden] { display: none }` en su hoja de
   estilos, que es de autoría del agente y especificidad (0,1,0): cualquier
   `display` que declare el tema la anula sin querer. Es un fallo silencioso
   y desagradable de encontrar — el elemento sigue a la vista y el
   JavaScript «no hace nada».

   Aquí pasó dos veces: con el botón «Ver más» de la descripción
   (`display: inline-flex`) y con el visor de la galería.
*/
[hidden] {
  display: none !important;
}

/* ------------------------------------------------------------ marquesina -- */

/*
   El prototipo generaba este grupo desde JS con estilos en línea
   (sections.js → renderMarquee). Aquí es una clase para no repetir el
   atributo style en cada pasada del bucle.
*/
.marquee__group {
  display: flex;
  align-items: center;
  gap: 2.5rem;
  padding: 1rem 1.25rem;
  font-family: var(--mono);
  font-size: 0.8rem;
  letter-spacing: 0.12em;
  color: var(--text-2);
  white-space: nowrap;
}

/* --------------------------------------------- contenedores de WooCommerce -- */

/*
   El shortcode [products] y las plantillas de Woo envuelven todo en
   .woocommerce y en .columns-N. Se neutralizan para que la retícula la
   gobierne .shop-grid / .prod-grid y no el layout de WooCommerce.
*/
.woocommerce,
.woocommerce-page .woocommerce {
  max-width: none;
}

.woocommerce .prod-grid,
.woocommerce .shop-grid {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Woo añade .columns-N al contenedor; no debe imponer anchos. */
[class*='columns-'] > .prod-grid,
[class*='columns-'] > .shop-grid {
  width: 100%;
}

/* La tarjeta lleva .product de wc_product_class(): que no reintroduzca float. */
.prod-card.product,
.prod-card.type-product {
  float: none;
  width: auto;
  margin: 0;
  clear: none;
}

/*
   Tarjeta a prueba de fallos.
   ---------------------------
   components.css da por hecho que la imagen llena una caja de altura fija
   (`height: 220px` + `img { height: 100% }`). Eso se apoya en dos cosas
   frágiles con el marcado real de WooCommerce:

     · `height: 100%` sobre el <img> depende de que el padre tenga altura
       resuelta. Si algo la altera, el <img> colapsa a cero y la tarjeta
       queda con un hueco blanco donde debería ir la foto.
     · `mix-blend-mode: multiply` obliga al navegador a componer la imagen
       en una capa aparte. Combinado con la transición de `transform` del
       hover, hay motores que dejan de pintarla.

   Aquí se fija la caja por `aspect-ratio` y la imagen por `max-width` /
   `max-height`, que no dependen de la altura del padre, y se retira el
   modo de fusión. El aspecto es el mismo: el fondo de la caja ya es
   blanco, así que `multiply` no aportaba nada sobre estas fotos.
*/
.prod-card__media {
  height: auto;
  aspect-ratio: 1 / 1;
  min-height: 180px;
}

.prod-card__media img {
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 100%;
  mix-blend-mode: normal;
}

/* Sin foto: que el hueco no quede vacío del todo. */
.prod-card__media:empty::after,
.prod-card__media img[src=''] {
  content: '';
  display: block;
  width: 40%;
  height: 40%;
  background: var(--bg-2);
}

/*
   El pie de la tarjeta: precio a la izquierda y botón a la derecha, y si no
   caben, el botón entero debajo. Sin `min-width: 0` el precio de
   WooCommerce (que va envuelto en varios <span>) impide que la fila
   encoja y empuja el botón fuera de la tarjeta.
*/
.prod-card__foot { min-width: 0; }
.prod-card__price { min-width: 0; }

.prod-card__foot .add-btn {
  flex-shrink: 0;
}

@media (max-width: 380px) {
  .prod-card__foot .add-btn {
    width: 100%;
    flex-shrink: 1;
  }
}

/* --------------------------------------------------- botón «Agregar» AJAX -- */

/*
   WooCommerce marca el botón con .loading mientras la petición está en
   vuelo y con .added al terminar, y añade un enlace .added_to_cart que en
   este diseño sobra (el cajón se abre solo).
*/
.add-btn {
  display: inline-block;
  text-align: center;
  text-decoration: none;
  line-height: 1.2;
}

.add-btn.loading {
  opacity: 0.6;
  pointer-events: none;
}

.add-btn.added {
  background: var(--xg);
}

.prod-card .added_to_cart {
  display: none;
}

/* Producto no comprable: el enlace «Ver producto» comparte estilo. */
.prod-card .add-btn.product_type_variable,
.prod-card .add-btn.product_type_grouped,
.prod-card .add-btn.product_type_external {
  background: var(--panel);
  color: var(--ink);
  border: 1px solid var(--line-strong);
}

/* ------------------------------------------------------------ paginación -- */

/*
   .pager del prototipo estilaba <button>. WooCommerce y paginate_links()
   emiten <a> y <span class="current">. Se replica el mismo aspecto.
*/
.pager a,
.pager span.page-numbers {
  display: grid;
  place-items: center;
  min-width: 38px;
  height: 38px;
  padding-inline: 0.6rem;
  border: 1px solid var(--line);
  background: var(--panel);
  font-family: var(--mono);
  font-size: 0.8rem;
  color: var(--text-2);
  text-decoration: none;
  transition: all 0.18s var(--ease);
}

.pager a:hover {
  border-color: var(--ink);
  color: var(--ink);
}

.pager span.current {
  background: var(--ink);
  border-color: var(--ink);
  color: #fff;
  font-weight: 500;
}

.pager span.dots {
  border-color: transparent;
  background: none;
  color: var(--text-4);
}

/* --------------------------------------------------- avisos de WooCommerce -- */

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

.woocommerce-message,
.woocommerce-error,
.woocommerce-info {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin: 0 0 1.5rem;
  padding: 0.95rem 1.15rem;
  border: 1px solid var(--line);
  border-left-width: 3px;
  background: var(--panel);
  font-size: var(--fs-sm);
  list-style: none;
}

.woocommerce-message {
  border-left-color: var(--xg);
}

.woocommerce-error {
  border-left-color: #b8452f;
}

.woocommerce-info {
  border-left-color: var(--text-4);
}

.woocommerce-message .button,
.woocommerce-error .button,
.woocommerce-info .button {
  margin-left: auto;
  flex-shrink: 0;
}

/* -------------------------------------------- galería: flechas y ampliar -- */

/*
   Controles que el prototipo no tenía. Aparecen al pasar el ratón sobre la
   imagen para no competir con la pieza, y en táctil se quedan siempre
   visibles: allí no hay hover que los revele.
*/
.gallery__nav,
.gallery__zoom {
  position: absolute;
  z-index: 2;
  display: grid;
  place-items: center;
  border: 1px solid var(--line);
  background: color-mix(in srgb, var(--panel) 88%, transparent);
  color: var(--text-2);
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.2s var(--ease), color 0.2s var(--ease), border-color 0.2s var(--ease);
}

.gallery__main:hover .gallery__nav,
.gallery__main:hover .gallery__zoom,
.gallery__nav:focus-visible,
.gallery__zoom:focus-visible {
  opacity: 1;
}

.gallery__nav:hover,
.gallery__zoom:hover {
  color: var(--ink);
  border-color: var(--ink);
}

.gallery__nav {
  top: 50%;
  transform: translateY(-50%);
  width: 40px;
  height: 52px;
}

.gallery__nav svg { width: 18px; height: 18px; }
.gallery__nav--prev { left: 0; border-left: none; }
.gallery__nav--next { right: 0; border-right: none; }

.gallery__zoom {
  top: 14px;
  right: 14px;
  width: 38px;
  height: 38px;
}

.gallery__zoom svg { width: 16px; height: 16px; }

/* Con el zoom en sitio activo, los controles estorban. */
.gallery__main.is-zoomed .gallery__nav,
.gallery__main.is-zoomed .gallery__zoom {
  opacity: 0;
  pointer-events: none;
}

/* Táctil: sin hover, los controles se quedan a la vista. */
@media (hover: none) {
  .gallery__nav,
  .gallery__zoom {
    opacity: 1;
  }

  /* El zoom en sitio depende del ratón: en táctil se usa el visor. */
  .gallery__main { cursor: default; }
}

/* ------------------------------------------- visor a pantalla completa -- */

.lightbox {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(0.5rem, 2vw, 1.5rem);
  padding: clamp(1rem, 4vw, 3rem);
  background: color-mix(in srgb, var(--ink) 92%, transparent);
  animation: xame-fade 0.18s var(--ease);
}

/* Lo esconde la regla global de [hidden]; aquí sólo se declara el layout. */

@keyframes xame-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}

.lightbox__stage {
  margin: 0;
  flex: 1;
  min-width: 0;
  height: 100%;
  display: grid;
  place-items: center;
}

.lightbox__stage img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  background: #fff;
}

.lightbox__close,
.lightbox__nav {
  display: grid;
  place-items: center;
  flex-shrink: 0;
  width: 46px;
  height: 46px;
  border: 1px solid color-mix(in srgb, #fff 35%, transparent);
  background: none;
  color: #fff;
  cursor: pointer;
  transition: background 0.2s var(--ease), border-color 0.2s var(--ease);
}

.lightbox__close:hover,
.lightbox__nav:hover {
  background: color-mix(in srgb, #fff 15%, transparent);
  border-color: #fff;
}

.lightbox__close {
  position: absolute;
  top: clamp(1rem, 3vw, 2rem);
  right: clamp(1rem, 3vw, 2rem);
}

.lightbox__nav svg { width: 20px; height: 20px; }
.lightbox__close svg { width: 18px; height: 18px; }

.lightbox__count {
  position: absolute;
  bottom: clamp(1rem, 3vw, 2rem);
  left: 50%;
  transform: translateX(-50%);
  font-family: var(--mono);
  font-size: var(--fs-mono-sm);
  letter-spacing: 0.08em;
  color: color-mix(in srgb, #fff 75%, transparent);
}

@media (max-width: 640px) {
  /* En pantalla estrecha las flechas se superponen a la imagen. */
  .lightbox { padding: 3.5rem 0.75rem; }

  .lightbox__nav {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
  }

  .lightbox__nav--prev { left: 0.5rem; }
  .lightbox__nav--next { right: 0.5rem; }
}

/* ------------------------------------------------------ ficha de producto -- */

/*
   `woocommerce_template_single_add_to_cart()` emite un <form class="cart">
   con el selector de cantidad y el botón dentro. El rediseño espera que
   ambos sean hermanos dentro de .buy__actions, así que el formulario se
   convierte en el propio contenedor flex.

   Se usa el formulario nativo y no uno propio a conciencia: trae el nonce,
   las variaciones, el control de stock y el carrito AJAX ya resueltos.
*/
.buy__actions form.cart {
  display: flex;
  gap: 0.6rem;
  flex-wrap: wrap;
  align-items: stretch;
  width: 100%;
  margin: 0;
}

/* El botón nativo toma el aspecto de .btn--primary del rediseño. */
.buy__actions .single_add_to_cart_button {
  min-height: 46px;
  flex: 1;
  min-width: 170px;
  padding-inline: 1.5rem;
  border: none;
  background: var(--xg);
  color: #fff;
  font: inherit;
  font-weight: 700;
  font-size: 0.9rem;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: background 0.2s var(--ease);
}

.buy__actions .single_add_to_cart_button:hover:not(:disabled) {
  background: var(--ink);
}

.buy__actions .single_add_to_cart_button:disabled,
.buy__actions .single_add_to_cart_button.disabled {
  background: var(--line-strong);
  cursor: not-allowed;
}

.buy__actions .single_add_to_cart_button.loading {
  opacity: 0.65;
  pointer-events: none;
}

/* Productos variables: los desplegables de variación. */
.buy__actions .variations {
  width: 100%;
  border-collapse: collapse;
  margin-bottom: 0.9rem;
}

.buy__actions .variations th,
.buy__actions .variations td {
  padding: 0.35rem 0;
  text-align: left;
  vertical-align: middle;
}

.buy__actions .variations label {
  font-family: var(--mono);
  font-size: var(--fs-mono);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-3);
}

.buy__actions .variations select {
  width: 100%;
  height: 42px;
  padding-inline: 0.7rem;
  border: 1px solid var(--line);
  background: var(--panel);
  font: inherit;
  font-size: 0.88rem;
}

.buy__actions .woocommerce-variation-price {
  width: 100%;
  margin-bottom: 0.75rem;
}

.buy__actions .reset_variations {
  font-size: 0.78rem;
  color: var(--text-4);
}

/* El precio ya está en .buy__price-row: dentro del form sobra. */
.buy__actions .woocommerce-variation-availability {
  width: 100%;
  font-size: 0.82rem;
}

/* Descripción y ficha con el contenido del editor. */
.rte__wrap > *:first-child { margin-top: 0; }
.rte__wrap > *:last-child { margin-bottom: 0; }

/*
   Descripción larga dentro de la columna de compra, entre el resumen y el
   precio. product.css no la definía porque el prototipo la llevaba con
   estilos en línea.

   Se recorta con «Ver más» en lugar de con scroll: sin tope, una ficha
   larga empuja el precio y el botón de comprar fuera de la pantalla; con
   scroll interno, el texto queda atrapado en una caja diminuta y cuesta
   leerlo. El botón deja la decisión en quien mira.
*/
.buy__desc {
  display: grid;
  gap: 0.6rem;
  justify-items: start;
}

.buy__description {
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--text-2);
}

/* Recortada: sólo cuando el JS confirma que hay texto de sobra. */
.buy__desc.is-clamped .buy__description {
  max-height: 11.5rem;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 2.5rem), transparent);
  mask-image: linear-gradient(to bottom, #000 calc(100% - 2.5rem), transparent);
}

/* Abierta: ni recorte ni degradado. */
.buy__desc.is-open .buy__description {
  max-height: none;
  overflow: visible;
  -webkit-mask-image: none;
  mask-image: none;
}

.buy__desc-toggle {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0;
  border: none;
  background: none;
  cursor: pointer;
  font: inherit;
  font-family: var(--mono);
  font-size: var(--fs-mono-sm);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--xg);
  border-bottom: 1px solid currentColor;
  transition: color 0.2s var(--ease);
}

.buy__desc-toggle:hover { color: var(--ink); }

.buy__desc-toggle svg {
  width: 11px;
  height: 11px;
  transition: transform 0.22s var(--ease);
}

.buy__desc.is-open .buy__desc-toggle svg { transform: rotate(180deg); }

/* -------------------------------------------------- carrito y checkout -- */

/*
   El <form> del checkout lleva class="checkout", así que la rejilla de dos
   columnas ya se la da checkout.css. No se redeclara aquí: duplicarla sólo
   crea dos sitios donde tocar el mismo ancho.
*/

/*
   La rejilla de campos va en los `__field-wrapper`, no en un envoltorio
   propio.

   `woocommerce_checkout_billing` y `_shipping` no imprimen campos sueltos:
   sacan .woocommerce-billing-fields con un <h3> y un .__field-wrapper
   dentro. Envolver el hook en una rejilla metía cada DIV entero en una
   columna y dejaba media mitad vacía. Los campos de verdad están un nivel
   más abajo.
*/
.woocommerce-billing-fields__field-wrapper,
.woocommerce-shipping-fields .shipping_address .woocommerce-address-fields__field-wrapper,
.woocommerce-additional-fields__field-wrapper {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 1.1rem;
}

/* Anchos que marca WooCommerce en cada campo. */
.woocommerce-billing-fields__field-wrapper .form-row-wide,
.woocommerce-shipping-fields .form-row-wide,
.woocommerce-additional-fields__field-wrapper .form-row-wide,
.woocommerce-additional-fields__field-wrapper .notes {
  grid-column: 1 / -1;
}

/* Encabezados de sección dentro de los paneles. */
.checkout__main h3,
.checkout__aside h3,
.woocommerce-billing-fields > h3,
.woocommerce-shipping-fields > h3,
.woocommerce-additional-fields > h3 {
  margin: 0 0 1rem;
  font-family: var(--mono);
  font-size: var(--fs-mono);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-3);
  font-weight: 500;
}

/* «¿Enviar a una dirección diferente?» es un <h3> con una casilla dentro. */
#ship-to-different-address label {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  cursor: pointer;
  margin: 0;
}

.woocommerce-shipping-fields .shipping_address { margin-top: 1.1rem; }
.woocommerce-additional-fields { margin-top: 1.5rem; }

/*
   Cupón. WooCommerce lo cuelga de `woocommerce_before_checkout_form`, es
   decir, fuera de la rejilla del checkout y sin ningún estilo propio.
*/
.woocommerce-form-coupon-toggle {
  margin-bottom: 1rem;
}

form.checkout_coupon {
  display: flex;
  gap: 0.5rem;
  align-items: center;
  flex-wrap: wrap;
  margin: 0 0 1.5rem;
  padding: 1rem 1.15rem;
  border: 1px solid var(--line);
  background: var(--panel);
}

form.checkout_coupon p { margin: 0; }

form.checkout_coupon .form-row-first {
  flex: 1;
  min-width: 200px;
}

form.checkout_coupon input[type='text'] {
  width: 100%;
  height: 40px;
  padding-inline: 0.85rem;
  border: 1px solid var(--line);
  background: var(--bg);
  font: inherit;
  font-size: 0.88rem;
}

form.checkout_coupon button {
  height: 40px;
  padding-inline: 1.25rem;
  border: none;
  background: var(--ink);
  color: #fff;
  font: inherit;
  font-weight: 600;
  font-size: 0.85rem;
  cursor: pointer;
  white-space: nowrap;
}

form.checkout_coupon button:hover { background: var(--xg); }

/* El aparte se queda a la vista al desplazarse por los datos. */
@media (min-width: 901px) {
  .checkout__aside { position: sticky; top: calc(var(--header-h) + 16px); }
}

/* Cantidad dentro de la tabla del carrito. */
.cart-table .qty-picker { transform: scale(0.9); transform-origin: left center; }

/* Cupón. */
.cart-actions .coupon {
  display: flex;
  gap: 0.4rem;
  flex: 1;
  min-width: 220px;
}

.cart-actions .coupon input {
  flex: 1;
  min-width: 0;
  height: 38px;
  padding-inline: 0.75rem;
  border: 1px solid var(--line);
  background: var(--bg);
  font: inherit;
  font-size: 0.85rem;
}

/*
   Métodos de envío. WooCommerce los emite como <ul id="shipping_method">
   con radios; el rediseño los pinta como .ship-option.
*/
#shipping_method {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.4rem;
}

#shipping_method li { display: block; }

#shipping_method label {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  font-size: 0.85rem;
  cursor: pointer;
}

.woocommerce-shipping-destination {
  margin: 0.5rem 0 0;
  font-size: 0.78rem;
  color: var(--text-4);
}

/* Métodos de pago: el cuerpo sólo se ve con el método elegido. */
.pay__body p:last-child { margin-bottom: 0; }

.pay__body .wc-bacs-bank-details,
.pay__body ul {
  list-style: none;
  margin: 0.75rem 0 0;
  padding: 0;
  font-size: 0.82rem;
}

.pay__body .wc-bacs-bank-details li { padding: 0.2rem 0; }

/* Condiciones y aviso de privacidad. */
.woocommerce-privacy-policy-text,
.woocommerce-terms-and-conditions-wrapper {
  font-size: 0.78rem;
  color: var(--text-4);
  margin-bottom: 0.9rem;
}

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

/* Bloqueo mientras el checkout recalcula por AJAX. */
.blockUI.blockOverlay {
  background: var(--panel) !important;
  opacity: 0.6 !important;
}

/*
   Envoltorio del contenido en las pantallas de WooCommerce.

   Existe a propósito SIN estilos: es el hueco donde antes iba `.prose`, y
   .prose estaba dando márgenes de artículo y enlaces verdes a las tablas
   de pedido y a los datos bancarios. Aquí el marcado se estila por su
   nombre, no por herencia.
*/
.wc-content { /* intencionadamente vacío */ }

/* ------------------------------------------------------ pedido recibido -- */

/*
   Esta pantalla es la que más marcado ajeno acumula: además del recibo,
   WooCommerce imprime las instrucciones de la pasarela, los datos
   bancarios, la tabla del pedido y las direcciones — y encima cuelgan ahí
   sus bloques los plugins (aquí, el de subir el comprobante).

   Nada de eso se reescribe: reescribirlo obligaría a mantener una copia de
   cada plantilla y a perseguir cada plugin. Se le da el aspecto del
   rediseño desde aquí.
*/

.receipt { padding-block: clamp(1.5rem, 3vw, 2.5rem); }

/* Bloque que un plugin inserte en el mensaje de gracias. */
.receipt__custom {
  display: grid;
  gap: 0.75rem;
  justify-items: center;
  max-width: 34rem;
}

.receipt__custom h1,
.receipt__custom h2,
.receipt__custom h3 {
  font-size: 1.05rem;
  font-weight: 700;
  margin: 0;
}

.receipt__custom p { margin: 0; color: var(--text-2); font-size: 0.92rem; }

.receipt__custom a {
  display: inline-block;
  padding: 0.7rem 1.4rem;
  background: #25d366;
  color: #fff;
  font-weight: 700;
  font-size: 0.88rem;
  text-decoration: none;
}

.receipt__actions {
  display: flex;
  gap: 0.6rem;
  flex-wrap: wrap;
  margin-top: 1.5rem;
}

/*
   Ninguna URL puede reventar el ancho.

   Los enlaces de WhatsApp que arman estos plugins son cadenas de cientos
   de caracteres sin un solo espacio. Si alguna acaba visible —por un
   filtro que devuelva texto en vez de HTML, por ejemplo— sin esto empuja
   toda la página a lo ancho.
*/
.receipt,
.woocommerce-order-details,
.woocommerce-customer-details { overflow-wrap: anywhere; }

/* --- instrucciones de la pasarela y datos bancarios --- */

.receipt > p {
  margin: 1.25rem 0 0;
  font-size: 0.9rem;
  line-height: 1.65;
  color: var(--text-2);
}

.woocommerce-bacs-bank-details {
  margin-top: 1.25rem;
  border: 1px solid var(--line);
  background: var(--bg);
  padding: 1.1rem 1.25rem;
}

.wc-bacs-bank-details-heading {
  margin: 0 0 0.85rem;
  font-family: var(--mono);
  font-size: var(--fs-mono);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-3);
  font-weight: 500;
}

.wc-bacs-bank-details-account-name {
  margin: 0 0 0.5rem;
  font-size: 1rem;
  font-weight: 800;
  letter-spacing: -0.01em;
}

ul.wc-bacs-bank-details {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.15rem;
}

ul.wc-bacs-bank-details li {
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
  padding: 0.35rem 0;
  font-size: 0.86rem;
  color: var(--text-3);
  border-bottom: 1px solid var(--line);
}

ul.wc-bacs-bank-details li:last-child { border-bottom: none; }
ul.wc-bacs-bank-details strong { color: var(--ink); font-weight: 600; }

/* --- detalle del pedido y direcciones --- */

.woocommerce-order-details,
.woocommerce-customer-details {
  margin-top: 1.75rem;
  border: 1px solid var(--line);
  background: var(--panel);
  padding: clamp(1.1rem, 2.5vw, 1.6rem);
}

.woocommerce-order-details__title,
.woocommerce-customer-details .woocommerce-column__title {
  margin: 0 0 1rem;
  font-family: var(--mono);
  font-size: var(--fs-mono);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-3);
  font-weight: 500;
}

table.woocommerce-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.88rem;
}

table.woocommerce-table th,
table.woocommerce-table td {
  padding: 0.7rem 0.85rem;
  border-bottom: 1px solid var(--line);
  text-align: left;
  vertical-align: top;
}

table.woocommerce-table thead th {
  background: var(--ink);
  color: var(--on-dark);
  font-family: var(--mono);
  font-size: var(--fs-mono-sm);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 500;
}

table.woocommerce-table td:last-child,
table.woocommerce-table thead th:last-child { text-align: right; }

table.woocommerce-table tfoot th {
  text-align: right;
  font-weight: 600;
  color: var(--text-3);
}

table.woocommerce-table tfoot tr:last-child th,
table.woocommerce-table tfoot tr:last-child td { border-bottom: none; }

table.woocommerce-table .product-quantity {
  color: var(--text-4);
  font-weight: 500;
}

.woocommerce-customer-details address {
  font-style: normal;
  font-size: 0.9rem;
  line-height: 1.7;
  color: var(--text-2);
}

.woocommerce-customer-details address p { margin: 0.35rem 0 0; }

/* Botones «Pagar» / «Cancelar» de la fila de acciones. */
.order-actions-button {
  display: inline-block;
  margin-left: 0.4rem;
  padding: 0.45rem 0.9rem;
  border: 1px solid var(--line-strong);
  background: var(--panel);
  color: var(--ink);
  font-size: 0.8rem;
  text-decoration: none;
}

.order-actions-button:first-child {
  margin-left: 0;
  background: var(--ink);
  border-color: var(--ink);
  color: #fff;
}

/* --- bloques de plugins colgados de woocommerce_thankyou --- */

.woocommerce-order-details > .shortcode_wrapper {
  margin-bottom: 1.5rem;
}

/*
   El plugin del comprobante trae `background:#f5f5f5` en línea y sin ancho
   controlado. No se puede ganar a un estilo en línea sin !important, así
   que se hace aquí y sólo para eso.
*/
.peprodev_woocommerce_receipt_uploader table {
  background: var(--bg) !important;
  border: 1px solid var(--line);
}

.peprodev_woocommerce_receipt_uploader img.receipt-preview {
  max-width: 90px;
  height: auto;
}

.peprodev_woocommerce_receipt_uploader .button,
.peprodev_woocommerce_receipt_uploader input[type='file'] {
  font: inherit;
  font-size: 0.85rem;
}

.peprodev_woocommerce_receipt_uploader .button {
  padding: 0.5rem 1rem;
  border: none;
  background: var(--ink);
  color: #fff;
  cursor: pointer;
}

/* ------------------------------------------------------------- mi cuenta -- */

/*
   Campos generados por woocommerce_form_field(). El filtro
   `woocommerce_form_field_args` (inc/woocommerce-hooks.php) ya les pone la
   clase .field; aquí se encaja lo que WooCommerce añade por su cuenta.
*/
.field .woocommerce-input-wrapper { display: block; }
.field .woocommerce-input-wrapper > * { width: 100%; }

.field abbr.required {
  color: #b8452f;
  text-decoration: none;
  border: none;
}

.field .optional { color: var(--text-4); }

/* Ancho de columna dentro de .form-grid. */
.form-grid .field--wide,
.form-grid .form-row-wide { grid-column: 1 / -1; }

/* Select2, que WooCommerce usa para país y provincia. */
.field .select2-container .select2-selection--single {
  height: 42px;
  border: 1px solid var(--line);
  border-radius: 0;
  background: var(--bg);
}

.field .select2-container--default .select2-selection--single .select2-selection__rendered {
  line-height: 40px;
  padding-left: 0.85rem;
  color: var(--ink);
}

.field .select2-container--default .select2-selection--single .select2-selection__arrow { height: 40px; }

/* Pie de panel con el botón de guardar. */
.panel__foot {
  display: flex;
  justify-content: flex-end;
  gap: 0.6rem;
  flex-wrap: wrap;
}

/*
   Pestañas de acceso / registro.

   Sin JavaScript los dos formularios se ven uno debajo del otro y funcionan
   igual: sólo cuando account.js marca .is-enhanced se oculta el inactivo.
   Así la pantalla nunca queda inservible si el JS falla.
*/
.auth.is-enhanced .auth__pane { display: none; }
.auth.is-enhanced .auth__pane.is-active { display: block; }

.auth__pane + .auth__pane { margin-top: 2.5rem; }
.auth.is-enhanced .auth__pane + .auth__pane { margin-top: 0; }

/* Recuperar contraseña: sin la columna de la imagen. */
.auth--single { grid-template-columns: 1fr; min-height: 0; }
.auth--single .auth__form { max-width: 460px; margin-inline: auto; width: 100%; }

/* Avisos de WooCommerce dentro de la cuenta, con el ancho del panel. */
.woocommerce-MyAccount-content > .woocommerce-message,
.woocommerce-MyAccount-content > .woocommerce-error,
.woocommerce-MyAccount-content > .woocommerce-info {
  margin-bottom: 1.25rem;
}

/* La lista de errores de WooCommerce llega como <ul>. */
ul.woocommerce-error {
  flex-direction: column;
  align-items: flex-start;
  gap: 0.35rem;
}

ul.woocommerce-error li { list-style: none; }

/* ---------------------------------------------------------- valoraciones -- */

/*
   Bloque de valoraciones de WooCommerce.

   Requiere estilarse entero: al quitar `woocommerce.css` (ver
   inc/woocommerce-hooks.php) se fue también la fuente de iconos con la que
   WooCommerce dibuja las estrellas, y el selector de puntuación quedaba
   como una fila de enlaces que decían «1 de 5 estrellas».
   Aquí las estrellas son un carácter ★ y no dependen de ninguna fuente.
*/

#reviews {
  padding-block: clamp(2rem, 4vw, 3rem);
  border-top: 1px solid var(--line);
}

.woocommerce-Reviews-title {
  font-size: clamp(1.3rem, 2.5vw, 1.75rem);
  font-weight: 800;
  letter-spacing: -0.01em;
  margin-bottom: 1.25rem;
}

.woocommerce-noreviews {
  margin: 0 0 1.75rem;
  padding: 0.95rem 1.15rem;
  border: 1px solid var(--line);
  border-left: 3px solid var(--line-strong);
  background: var(--panel);
  color: var(--text-3);
  font-size: var(--fs-sm);
}

/* --- valoraciones publicadas --- */

.commentlist {
  list-style: none;
  margin: 0 0 2rem;
  padding: 0;
  display: grid;
  gap: 1rem;
}

.commentlist .review {
  border: 1px solid var(--line);
  background: var(--panel);
  padding: 1.15rem 1.3rem;
}

.commentlist .comment_container {
  display: flex;
  gap: 1rem;
  align-items: flex-start;
}

.commentlist .avatar {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  flex-shrink: 0;
}

.commentlist .meta {
  margin: 0 0 0.5rem;
  font-size: var(--fs-sm);
  color: var(--text-3);
}

.commentlist .meta strong {
  color: var(--ink);
  font-weight: 700;
}

.commentlist .description p:last-child { margin-bottom: 0; }

/* --- formulario --- */

#review_form_wrapper {
  border-top: 1px solid var(--line);
  padding-top: 1.75rem;
}

.comment-reply-title {
  display: block;
  font-family: var(--mono);
  font-size: var(--fs-mono);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-3);
  margin-bottom: 1.15rem;
}

.comment-form {
  display: grid;
  gap: 1.1rem;
  max-width: 620px;
}

.comment-form p { margin: 0; }

.comment-form label {
  display: block;
  margin-bottom: 0.45rem;
  font-family: var(--mono);
  font-size: var(--fs-mono-sm);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-3);
}

.comment-form .required { color: #b8452f; }

.comment-form textarea,
.comment-form input[type='text'],
.comment-form input[type='email'] {
  width: 100%;
  padding: 0.75rem 0.9rem;
  border: 1px solid var(--line);
  background: var(--bg);
  font: inherit;
  font-size: 0.92rem;
  outline: none;
  transition: border-color 0.2s var(--ease);
}

.comment-form textarea {
  min-height: 130px;
  resize: vertical;
}

.comment-form textarea:focus,
.comment-form input:focus { border-color: var(--xg); }

.comment-form .form-submit input[type='submit'] {
  padding: 0.85rem 1.9rem;
  border: none;
  background: var(--ink);
  color: #fff;
  font: inherit;
  font-weight: 700;
  font-size: 0.88rem;
  cursor: pointer;
  transition: background 0.2s var(--ease);
}

.comment-form .form-submit input[type='submit']:hover { background: var(--xg); }

.comment-form-cookies-consent {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.comment-form-cookies-consent label {
  margin: 0;
  text-transform: none;
  letter-spacing: 0;
  font-family: inherit;
  font-size: 0.82rem;
  color: var(--text-3);
}

/* --- selector de estrellas --- */

.comment-form-rating label { margin-bottom: 0.35rem; }

p.stars {
  margin: 0;
  line-height: 1;
}

p.stars > span {
  display: inline-flex;
  gap: 3px;
}

p.stars a {
  position: relative;
  display: block;
  width: 1.5rem;
  height: 1.5rem;
  overflow: hidden;
  text-indent: -999em;   /* esconde el texto «1 de 5 estrellas» */
  text-decoration: none;
  color: var(--line-strong);
  transition: color 0.15s var(--ease);
}

p.stars a::before {
  content: '★';
  position: absolute;
  inset: 0;
  text-indent: 0;
  font-size: 1.45rem;
  line-height: 1;
  color: currentColor;
}

/* Al pasar el ratón se llenan hasta la estrella señalada. */
p.stars > span:hover a { color: var(--xg); }
p.stars > span a:hover ~ a { color: var(--line-strong); }

/*
   Elegida. WooCommerce marca el enlace con .active y el párrafo con
   .selected (assets/js/frontend/single-product.js); se replica ese
   contrato en vez de inventar clases propias.
*/
p.stars.selected a:not(.active) { color: var(--xg); }
p.stars.selected a.active { color: var(--xg); }
p.stars.selected a.active ~ a { color: var(--line-strong); }

p.stars a:focus-visible { outline: 2px solid var(--xg); outline-offset: 2px; }

/* El <select> de respaldo sólo se ve si el JS de WooCommerce no cargó. */
.comment-form-rating select {
  width: 100%;
  max-width: 260px;
  height: 42px;
  padding-inline: 0.7rem;
  border: 1px solid var(--line);
  background: var(--panel);
  font: inherit;
}

/* -------------------------------------------------- cajón del carrito -- */

/*
   `.widget_shopping_cart_content` es el contenedor que WooCommerce
   reemplaza por AJAX; el nombre de la clase no es negociable. Pero .drawer
   es un flex en columna con .drawer__body a flex:1, y este envoltorio de
   más rompería ese reparto: `display: contents` lo hace transparente para
   el layout sin quitarlo del DOM.
*/
.drawer .widget_shopping_cart_content {
  display: contents;
}

/* Mientras una petición al carrito está en vuelo. */
.drawer.is-busy .drawer__body,
.drawer.is-busy .drawer__foot {
  opacity: 0.55;
  pointer-events: none;
  transition: opacity 0.15s var(--ease);
}

/* La miniatura la genera WooCommerce con sus propias clases. */
.cart-line img {
  width: 62px;
  height: 62px;
  object-fit: contain;
  background: var(--bg-2);
  border: 1px solid var(--line);
  flex-shrink: 0;
}

.cart-line__img-link {
  display: block;
  line-height: 0;
}

/* Datos de variación que imprime wc_get_formatted_cart_item_data(). */
.cart-line .variation {
  margin: 0.25rem 0 0;
  font-size: 0.72rem;
  color: var(--text-4);
}

.cart-line .variation dt,
.cart-line .variation dd {
  display: inline;
  margin: 0;
}

.cart-line .variation dd + dt::before {
  content: ' · ';
}

.drawer__note {
  font-size: 0.72rem;
  color: var(--text-4);
  text-align: center;
}

/* --------------------------------------------------------------- filtros -- */

/*
   En el prototipo las opciones eran <label> con un checkbox que manejaba JS.
   Aquí cada opción es un <a> real (funciona sin JavaScript y es enlazable),
   y el checkbox queda sólo como señal visual: no debe capturar el clic ni el
   foco, o el enlace no navegaría.
*/
a.opt {
  text-decoration: none;
  color: inherit;
}

a.opt input[type='checkbox'] {
  pointer-events: none;
}

/* Enlaces de precio rápido: mismo aspecto que los botones del prototipo. */
.price-quick a {
  text-decoration: none;
}

/* Las fichas de filtro aplicado son enlaces que lo quitan. */
.applied__chip,
.applied__clear {
  text-decoration: none;
}

/* Las filas del árbol de categorías pasaron de <button> a <a>. */
a.cat-row__link {
  text-decoration: none;
  text-align: left;
}

/* La caja plegada oculta su cuerpo. */
.filter-box.is-collapsed .filter-box__body {
  display: none;
}

.filter-box.is-collapsed .filter-box__caret {
  transform: rotate(-90deg);
}

/*
   shop.css gira este icono 90°, que es lo correcto para un galón que
   apunta a la derecha. El de aquí apunta hacia abajo, así que abierto debe
   apuntar arriba: 180°. Esta regla existe sólo para ganarle a aquella.
*/
.cat-row__toggle.is-open svg {
  transform: rotate(180deg);
}

/* ------------------------------------------------------------ utilidades -- */

/* WordPress usa .screen-reader-text donde el prototipo usaba .sr-only. */
.screen-reader-text {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Contenido de páginas y entradas escrito desde el editor. */
.prose > * + * {
  margin-top: 1.1rem;
}

.prose h2 {
  margin-top: 2.25rem;
  font-size: clamp(1.3rem, 2.5vw, 1.75rem);
}

.prose h3 {
  margin-top: 1.75rem;
  font-size: 1.15rem;
}

.prose ul,
.prose ol {
  padding-left: 1.35rem;
}

.prose li + li {
  margin-top: 0.4rem;
}

.prose img {
  max-width: 100%;
  height: auto;
}

.prose a {
  color: var(--xg);
}
