/* ==========================================================================
   MAVERICK 1997 — product.css
   Ficha de producto (PDP). Prefijo exclusivo del área: .mvk-pdp-

   Dos columnas iguales por auto-fit: galería y información. Colapsan solas a
   una columna cuando cada una bajaría de 380px, o sea alrededor de los 820px
   de viewport. No hace falta media query para eso: las dos declaradas (1080 y
   760) gobiernan la galería sticky, la barra de compra fija y las columnas de
   "Completá tu look".

   Todos los valores salen del prototipo (markup 1097-1204, estilos 2085-2165).
   Donde el prototipo choca con una regla de fidelidad, gana la regla y queda
   anotado en el comentario.

   ⚠️ Nada de markup vectorial ni data-URI vectorial en este archivo: la CDN de
   Hostinger deja inguardable por editor cualquier archivo que lo contenga.
   ========================================================================== */

/* ==========================================================================
   1. Cáscara y barra superior
   ========================================================================== */

.mvk-pdp-main {
  /* 🚨 Contexto de formato propio, y NO es decorativo.
     Esto es un display:block sin padding, sin borde y sin overflow, y el
     <body> tampoco lo contiene (su overflow-x:hidden se propaga al viewport y
     el body queda en overflow visible). Sin flow-root, el margen superior del
     primer hijo en flujo SE ESCAPA y baja la ficha entera —barra de Volver
     incluida— mientras getComputedStyle(main).marginTop sigue devolviendo 0px.
     Ese es exactamente el mecanismo que hizo que dos auditorías midieran
     "marginTop 0, paddingTop 0" y concluyeran que el hueco no existía.
     Hoy el primer hijo es .woocommerce-notices-wrapper y no trae margen de
     arriba, así que no cambia ni un píxel; el día que lo traiga —o que el
     aviso de WooCommerce se estile con margin-block-start— el hueco vuelve y
     vuelve a ser irrastreable. */
  display: flow-root;
  background: var(--mvk-white);

  /* 🚨 Borde de CONTROL, no de separador.
     --mvk-line (#E5E3E0) da 1.28:1 sobre blanco. Sirve de sobra para una línea
     decorativa —un separador no tiene que cumplir contraste—, pero WCAG 1.4.11
     pide 3:1 para lo que dibuja el LÍMITE de un control, y las cajas de talle,
     los swatches, las miniaturas y el campo de código postal no tienen ningún
     otro límite: adentro solo hay una letra suelta, un color plano o nada. A
     390px se veían cinco letras flotando en blanco (nadie las lee como botones)
     y un campo de texto invisible al lado del botón negro "Calcular".
     #8A8A8A da 3.45:1 sobre blanco; #949494 queda en 3.03:1, demasiado al filo.
     ⚠️ Es un token PRESTADO: cuando se toque main.css tiene que subir a la
     paleta como --mvk-line-strong —el mismo problema lo tienen todos los
     formularios del tema— y esta declaración desaparecer. */
  --mvk-pdp-line-control: #8A8A8A;
}

/* Sticky por debajo del bloque fijo del header (que va en z-index 90).
   El offset ya lo publica header.css; acá solo se consume. */
.mvk-pdp-bar {
  position: sticky;
  /* 🚨 El offset SCROLLEADO, no el de reposo, y la cadena de respaldo importa.
     --mvk-hdr-offset describe el header quieto. De 1080px para arriba, apenas
     se scrollean 30px entra .is-scrolled y la fila baja a --mvk-hdr-short: el
     bloque fijo pasa de 130,72px a 110px. Esta barra se pega justamente para
     quedar A RAS del header, y con el valor de reposo quedaba una franja de
     ~20px por la que se veía pasar la foto y el título deslizándose: no es
     blanco quieto, es un agujero.
     Y una barra sticky SIEMPRE se está viendo con la página ya scrolleada, o
     sea con el header corto: ese es el valor que corresponde.
     El respaldo es --mvk-hdr-offset y no 102px pelado a propósito: si
     header.css todavía no publica el token, esto tiene que caer en el
     comportamiento de hoy y no en un número de celular sobre escritorio. */
  inset-block-start: var(--mvk-hdr-offset-scrolled, var(--mvk-hdr-offset, 102px));
  z-index: 5;
  background: rgba(255, 255, 255, .92);
  backdrop-filter: blur(10px);
  border-block-end: 1px solid var(--mvk-line);
}

.mvk-pdp-bar__in {
  max-width: var(--mvk-max-wide);
  margin: 0 auto;
  /* 🚨 6px, no 12px. El alto ya lo pone el area tactil.
     .mvk-pdp-volver mide 44px de alto —minimo de accesibilidad, no se toca— y
     con 12px arriba y abajo mas el filete la barra daba 69px para una miga de
     pan de 12px. Con 6px queda en 57px y el area tactil sigue intacta. */
  padding: 6px var(--mvk-pad);
  display: flex;
  align-items: center;
  gap: 14px;
}

/* El hover no mueve el botón: separa la flecha del texto abriendo el gap. */
.mvk-pdp-volver {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  height: 44px;
  flex: none;
  color: var(--mvk-black);
  font: 500 10px/1 var(--mvk-sans);
  letter-spacing: .24em;
  text-transform: uppercase;
  transition: gap .35s var(--mvk-ease);
}

.mvk-pdp-volver:hover,
.mvk-pdp-volver:focus-visible {
  gap: 16px;
  color: var(--mvk-black);
}

.mvk-pdp-migas {
  min-width: 0;
  font: 400 12px/1 var(--mvk-sans);
  color: var(--mvk-text-mid);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.mvk-pdp-migas a { color: var(--mvk-text-mid); }
.mvk-pdp-migas a:hover { color: var(--mvk-black); }

.mvk-pdp-migas .is-current { color: var(--mvk-black); }

/* ==========================================================================
   2. La grilla
   ========================================================================== */

.mvk-pdp {
  max-width: var(--mvk-max-wide);
  margin: 0 auto;
  padding: clamp(18px, 3vw, 40px) var(--mvk-pad) 120px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr));
  gap: clamp(24px, 4vw, 64px);
  align-items: start;
}

/* 🚨 Los hijos de un grid arrancan en min-width:auto y no se achican por debajo
   de su contenido. La columna de información tiene texto largo (descripción,
   nota de envíos) y sin esto empujaba scroll horizontal a todo el sitio. */
.mvk-pdp > * { min-width: 0; }

/* ==========================================================================
   3. Galería
   ========================================================================== */

/* 🚨 Miniaturas en TIRA VERTICAL al costado, no en la fila de abajo.
   El prototipo (línea 2104) las pone en un grid de 4 columnas debajo de la
   foto, pero el handoff 3.9 pide textualmente "imagen principal 3:4 +
   miniaturas verticales" y era el único punto de esa sección que no se podía
   tildar en el repaso contra el documento de entrega. Estaba resuelto a favor
   del prototipo en un comentario, que no es lo mismo que estar decidido: acá
   manda el handoff, porque es un requisito escrito y no una medida.
   La tira vale de 1080px para arriba, que es el layout que describe el
   documento. Por debajo vuelven a la fila horizontal del prototipo: los 88px
   del costado le salían de la foto —a 900px la dejaban en 297px de ancho
   contra los 397px de antes— y ahí la foto es lo que hay que mirar. */
.mvk-pdp-gal {
  display: grid;
  grid-template-columns: 88px minmax(0, 1fr);
  gap: 12px;
  align-items: start;
  position: sticky;
  /* 🚨 offset + 16, igual que .mvk-shop-filters (shop.css) y .mvk-co-aside
     (checkout.css): los tres sticky del tema usan el mismo respiro.
     Los 84px de antes salían del prototipo, donde la ficha era una capa a
     pantalla completa SIN header fijo y ese 84 ERA la reserva del cromo
     superior. Acá esa reserva ya la pone --mvk-hdr-offset: sumarle los 84
     la declaraba dos veces. Medido a 1280px el offset resuelve a 130,72px,
     así que la foto se clavaba en 214,72 y dejaba 84px de blanco liso entre
     el header y la foto durante TODO el scroll de la ficha —que es larga—,
     robados del alto útil de la propia foto 3:4. */
  inset-block-start: calc(var(--mvk-hdr-offset-scrolled, var(--mvk-hdr-offset, 102px)) + 16px);
}

/* Con una sola foto no hay miniaturas: la foto se queda con las dos columnas en
   vez de dejar 88px de aire a la izquierda. Gana por especificidad (0,2,0). */
.mvk-pdp-gal > :only-child { grid-column: 1 / -1; }

.mvk-pdp-gal__main {
  grid-column: 2;
  grid-row: 1;
  position: relative;
  /* 🚨 3:4, no el 4/5 del prototipo (línea 1108). La regla de fidelidad 6 y el
     stock real (400×533) mandan sobre el prototipo en este punto. */
  aspect-ratio: 3 / 4;
  overflow: hidden;
  background: var(--mvk-bg);
}

.mvk-pdp-gal__zoom {
  position: absolute;
  inset: 0;
  overflow: hidden;
}

.mvk-pdp-gal__vacia {
  position: absolute;
  inset: 0;
  background: var(--mvk-bg);
}

/* 🚨 Clase duplicada a propósito. .woocommerce img { height:auto } de
   WooCommerce tiene especificidad (0,1,1) y le gana a cualquier regla del tema
   de una sola clase: sin esto la foto se dibujaba con su alto natural y se
   salía de la caja. */
.mvk-pdp-foto.mvk-pdp-foto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
  object-position: center 12%;
  transform-origin: center center;
  transition: transform .5s var(--mvk-ease);
}

/* Cambio de foto: se vuelve a disparar quitando y poniendo la clase. */
.mvk-pdp-foto.is-cross {
  animation: mvkCross .85s var(--mvk-ease) both;
}

.mvk-pdp-gal__hint {
  position: absolute;
  inset-block-end: 14px;
  inset-inline-start: 14px;
  font: 500 9px/1 var(--mvk-mono);
  letter-spacing: .2em;
  text-transform: uppercase;
  padding: 8px 11px;
  color: var(--mvk-black);
  background: rgba(255, 255, 255, .82);
  backdrop-filter: blur(6px);
  pointer-events: none;
}

/* --- Miniaturas ---------------------------------------------------------- */

.mvk-pdp-gal__thumbs {
  grid-column: 1;
  grid-row: 1;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.mvk-pdp-thumb {
  position: relative;
  overflow: hidden;
  aspect-ratio: 3 / 4;
  border: 0;
  /* outline y no border: el aro de la activa no puede cambiar la caja.
     El gris de reposo va en el token de control: sobre el --mvk-bg de la propia
     miniatura, el #E5E3E0 daba 1.16:1 y no dibujaba ningún límite (1.4.11). */
  outline: 1px solid var(--mvk-pdp-line-control);
  outline-offset: -1px;
  background: var(--mvk-bg);
  padding: 0;
  cursor: pointer;
  opacity: .72;
  transition: opacity .3s ease, outline-color .3s ease;
}

.mvk-pdp-thumb:hover { opacity: 1; }

.mvk-pdp-thumb.is-active {
  outline: 1.5px solid var(--mvk-black);
  opacity: 1;
}

.mvk-pdp-thumb:focus-visible {
  outline: 2px solid var(--mvk-black);
  outline-offset: 2px;
}

/* Misma trampa de especificidad que la foto grande. */
.mvk-pdp-thumbimg.mvk-pdp-thumbimg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
  object-position: center 12%;
  transition: transform 1.2s var(--mvk-ease);
}

.mvk-pdp-thumb:hover .mvk-pdp-thumbimg { transform: scale(1.06); }

/* ==========================================================================
   4. Columna de información
   ========================================================================== */

.mvk-pdp-info {
  display: flex;
  flex-direction: column;
  gap: 26px;
  min-width: 0;
}

/* --- Encabezado ---------------------------------------------------------- */

.mvk-pdp-head {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

/* Rótulo chico: 10px en mayúsculas. La regla 4 pide de .2em a .32em y esto
   estaba en .16em, así que la etiqueta negra se veía comprimida al lado del
   rótulo "COLOR" (.3em) que tiene 40px más abajo: dos sistemas tipográficos
   distintos en el mismo bloque. */
.mvk-pdp-badge {
  align-self: flex-start;
  background: var(--mvk-black);
  color: var(--mvk-white);
  font: 600 10px/1 var(--mvk-sans);
  letter-spacing: .2em;
  text-transform: uppercase;
  padding: 7px 10px;
}

/* 🚨 El título más grande de la ficha usa los TOKENS, no valores sueltos.
   Antes escribía line-height .92 y letter-spacing -.025em a mano. El .92 es
   exactamente --mvk-title-lh, así que no cambia nada; el tracking sí estaba
   más cerrado que el de todos los demás títulos del sitio (--mvk-title-ls vale
   -.02em) y ningún ajuste global lo alcanzaba: mover el token en main.css
   cambiaba el hero, los carruseles, el catálogo y "Completá tu look", y dejaba
   el nombre del producto —hasta 62px— con otro tracking, imposible de rastrear
   porque el valor no aparecía en ninguna búsqueda del token. Si algún día el
   remate pide de verdad un tracking más cerrado, va como token nuevo en
   main.css, no como literal acá. */
.mvk-pdp-title {
  margin: 0;
  font-family: var(--mvk-display);
  font-weight: 600;
  text-transform: uppercase;
  font-size: clamp(32px, 4.4vw, 62px);
  line-height: var(--mvk-title-lh);
  letter-spacing: var(--mvk-title-ls);
}

.mvk-pdp-meta {
  margin: 0;
  font: 400 13px/1.3 var(--mvk-sans);
  letter-spacing: .1em;
  text-transform: uppercase;
  /* Fondo claro ⇒ --mvk-text-soft-light, nunca --mvk-text-soft (regla 4). */
  color: var(--mvk-text-soft-light);
}

/* --- Precio -------------------------------------------------------------- */

.mvk-pdp-precio {
  display: flex;
  flex-direction: column;
  gap: 9px;
  padding-block-end: 22px;
  border-block-end: 1px solid var(--mvk-line);
}

.mvk-pdp-precio__fila {
  display: flex;
  align-items: baseline;
  gap: 12px;
  flex-wrap: wrap;
}

/* "Desde": mientras el importe grande es el mínimo de un rango. Rótulo chico,
   dentro del rango de tracking de la regla 4. Lo esconde product.js apenas hay
   una variación resuelta. */
.mvk-pdp-precio__desde {
  font: 500 10px/1 var(--mvk-sans);
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--mvk-text-soft-light);
}

.mvk-pdp-precio__now {
  font-family: var(--mvk-display);
  font-weight: 600;
  font-size: clamp(28px, 3.4vw, 42px);
  line-height: 1;
  letter-spacing: -.01em;
}

.mvk-pdp-precio__old {
  font: 400 16px/1 var(--mvk-sans);
  color: var(--mvk-text-soft-light);
  text-decoration: line-through;
}

/* Mismo caso que la etiqueta: 10.5px en mayúsculas es un rótulo chico y va de
   .2em para arriba. El text-transform va explícito para no depender de que la
   cadena traducida venga ya en mayúsculas. */
.mvk-pdp-precio__off {
  background: var(--mvk-black);
  color: var(--mvk-white);
  font: 600 10.5px/1 var(--mvk-sans);
  letter-spacing: .2em;
  text-transform: uppercase;
  padding: 7px 9px;
}

.mvk-pdp-transfer {
  margin: 0;
  font: 500 13.5px/1.4 var(--mvk-sans);
  color: var(--mvk-black);
}

.mvk-pdp-cuota {
  margin: 0;
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  font: 500 13.5px/1.4 var(--mvk-sans);
  color: var(--mvk-text-mid);
}

.mvk-pdp-cuota svg {
  width: 16px;
  height: 16px;
  flex: none;
}

/* 🚨 El ÚNICO acento de toda la pantalla: el importe de la cuota sin interés.
   El prototipo pinta de rojo la línea entera —ícono incluido—, pero la regla de
   fidelidad 2 dice "solo en el importe", así que el resto queda en gris. Mismo
   criterio que .mvk-card-quota-amount en la tarjeta. */
.mvk-pdp-cuota__importe {
  font-weight: 600;
  color: var(--mvk-red);
}

/* ==========================================================================
   5. El formulario: color, talle, cantidad y CTA
   ========================================================================== */

.mvk-pdp-form {
  display: flex;
  flex-direction: column;
  gap: 26px;
  margin: 0;
  min-width: 0;
}

.mvk-pdp-grupo {
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 0;
}

.mvk-pdp-rotulo {
  font: 500 9.5px/1 var(--mvk-sans);
  letter-spacing: .3em;
  text-transform: uppercase;
  color: var(--mvk-text-soft-light);
}

.mvk-pdp-rotulo-fila {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.mvk-pdp-stock {
  font: 400 11.5px/1 var(--mvk-sans);
  color: var(--mvk-text-mid);
  text-align: end;
}

/* Quedan pocas del talle elegido.
 *
 * Sube a negro y a semibold, sin color de alarma. La paleta es monocroma y un
 * rojo acá sería el único punto de color de toda la ficha: leería como error de
 * validación —"algo hiciste mal"— y no como "apurate, quedan dos". El peso
 * alcanza para que se despegue del gris de al lado.
 */
.mvk-pdp-stock.is-poco {
  font-weight: 600;
  color: var(--mvk-black);
}

/* El nombre del color marcado, al lado del rótulo "Color". No es un rótulo
   chico en mayúsculas: es el valor elegido, y va tal como se cargó el término
   ("Verde militar"), en la misma línea de base que el rótulo. */
.mvk-pdp-elegido {
  font: 500 12px/1 var(--mvk-sans);
  color: var(--mvk-black);
  text-align: end;
}

/* --- Los radios de verdad -------------------------------------------------
   Color y talle son <input type="radio"> reales para que la ficha agregue al
   carrito con el JavaScript apagado. Se sacan de la vista con el recorte del
   patrón de WordPress, NUNCA con opacity:0 ni display:none: tienen que seguir
   recibiendo foco y flechas del teclado. Lo que se ve es el <label>. */

.mvk-pdp-choice {
  /* Anclado al grupo (ver el position:relative de .mvk-pdp-colores y
     .mvk-pdp-talles): un absolute sin ancestro posicionado se va al principio
     del documento y al tabular la página pega un salto. */
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  padding: 0;
  border: 0;
  overflow: hidden;
  white-space: nowrap;
  clip-path: inset(50%);
}

/* --- Color: círculos de 32px --------------------------------------------- */

.mvk-pdp-colores {
  position: relative;
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}

/* Excepción permitida a la regla 1: es un botón circular.
   🚨 El borde tiene que llegar a 3:1. El rgba(12,11,11,.28) original compone
   sobre blanco como #BBBBBB: 1.92:1. Con un término de color claro —blanco,
   crudo, hueso, beige, arena: media tienda de indumentaria— el círculo quedaba
   blanco sobre página blanca sin ningún límite perceptible. En una ficha con
   Negro, Gris y Blanco se veían DOS colores y un hueco: nadie elegía el
   blanco (1.4.11). */
.mvk-pdp-color {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: 1px solid var(--mvk-pdp-line-control);
  background: var(--swatch, var(--mvk-black));
  padding: 0;
  cursor: pointer;
  display: block;
  transform: scale(1);
  transition: transform .4s var(--mvk-ease), box-shadow .3s ease;
}

/* Anillo blanco HACIA ADENTRO más aro negro hacia afuera. */
.mvk-pdp-choice:checked + .mvk-pdp-color {
  box-shadow: 0 0 0 2px var(--mvk-white) inset, 0 0 0 1.5px var(--mvk-black);
  transform: scale(1.08);
}

.mvk-pdp-choice:focus-visible + .mvk-pdp-color {
  outline: 2px solid var(--mvk-black);
  outline-offset: 3px;
}

/* 🚨 Contraste forzado de Windows: el modo pisa background y box-shadow, así
   que los swatches quedaban TODOS del mismo color y, encima, el elegido no se
   distinguía del resto (su marca es un doble box-shadow). Con
   forced-color-adjust:none el disco conserva el --swatch —que acá es
   información, no decoración— y el elegido se marca con un aro del color de
   selección del sistema, que sí sobrevive. */
@media (forced-colors: active) {
  .mvk-pdp-color {
    forced-color-adjust: none;
    border-color: CanvasText;
  }

  .mvk-pdp-choice:checked + .mvk-pdp-color {
    outline: 3px solid Highlight;
    outline-offset: 2px;
  }
}

/* --- Talle: cajas de 58×52 con relleno de abajo hacia arriba -------------- */

.mvk-pdp-talles {
  position: relative;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.mvk-pdp-talle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* min-width y no width: "3XL" o "Único" se estiran con el padding. */
  min-width: 58px;
  height: 52px;
  padding: 0 14px;
  /* 🚨 El borde ES el control. Adentro de la caja solo hay una letra suelta:
     con --mvk-line (1.28:1) alguien con baja visión leía "S M L XL XXL" como
     una lista de talles disponibles, no como cinco botones, seguía de largo
     hasta "Agregar al carrito" y recibía un "Elegí un talle" sin entender
     dónde se elige (1.4.11). El estado elegido y el agotado ya estaban bien:
     relleno negro 19.66:1 y tachado, los dos sin depender del color. */
  border: 1px solid var(--mvk-pdp-line-control);
  color: var(--mvk-black);
  font-family: var(--mvk-display);
  font-weight: 500;
  font-size: 14px;
  letter-spacing: .06em;
  cursor: pointer;
  /* El relleno es un degradado sólido que crece desde abajo, no un cambio de
     background-color: por eso la transición se ve subir. El texto cambia de
     color 50 ms después, cuando el negro ya lo alcanzó. */
  background-color: var(--mvk-white);
  background-image: linear-gradient(var(--mvk-black), var(--mvk-black));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% 0%;
  transition: background-size .45s var(--mvk-ease),
              color .3s ease .05s,
              border-color .3s ease;
}

.mvk-pdp-talle:hover { border-color: var(--mvk-black); }

.mvk-pdp-choice:checked + .mvk-pdp-talle {
  border-color: var(--mvk-black);
  color: var(--mvk-white);
  background-size: 100% 100%;
}

.mvk-pdp-choice:focus-visible + .mvk-pdp-talle {
  outline: 2px solid var(--mvk-black);
  outline-offset: 2px;
}

/* Agotado: NO existe en la PDP del prototipo. Se deriva del único tratamiento
   de agotado que hay en todo el archivo (la tarjeta): tachado. El prototipo lo
   pinta #C9C5C0, que sobre blanco da 1.7:1 y no se lee, así que se usa el mismo
   gris medio que ya eligió la tarjeta. El talle agotado se muestra, no se
   esconde: saber que existe y está sin stock es información. */
.mvk-pdp-choice:disabled + .mvk-pdp-talle,
.mvk-pdp-talle.is-agotado {
  color: var(--mvk-text-mid);
  border-color: var(--mvk-pdp-line-control);
  text-decoration: line-through;
  cursor: not-allowed;
  background-size: 100% 0%;
}

.mvk-pdp-talle.is-agotado:hover { border-color: var(--mvk-pdp-line-control); }

/* --- Agotado POR COLOR, sin una línea de JavaScript -----------------------
   🚨 El `disabled` que sirve PHP solo puede afirmar lo que es cierto elija lo
   que elija la persona: que el talle no está en NINGÚN color. Lo demás depende
   del radio de color marcado, y sin JavaScript nada lo recalculaba: la ficha
   mostraba para siempre la grilla del primer color. Un talle agotado en el
   color 1 pero disponible en el 2 quedaba tachado y deshabilitado, o sea
   inalcanzable, y al revés se enviaba el formulario para que WooCommerce lo
   rechazara y la persona perdiera lo elegido.

   Cada talle lleva en data-mvk-gone los índices de los colores donde no está, y
   cada radio de color su índice en data-mvk-color-i: con :has() el navegador
   cruza los dos y tacha el que corresponde. Ocho colores es el techo (más que
   suficiente para una prenda); a partir del noveno la corrección la hace
   product.js, que no tiene tope. Gana en especificidad al estado elegido a
   propósito: si el talle marcado deja de existir al cambiar de color, se tiene
   que ver tachado. */

.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="0"]:checked) .mvk-pdp-talle[data-mvk-gone~="0"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="1"]:checked) .mvk-pdp-talle[data-mvk-gone~="1"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="2"]:checked) .mvk-pdp-talle[data-mvk-gone~="2"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="3"]:checked) .mvk-pdp-talle[data-mvk-gone~="3"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="4"]:checked) .mvk-pdp-talle[data-mvk-gone~="4"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="5"]:checked) .mvk-pdp-talle[data-mvk-gone~="5"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="6"]:checked) .mvk-pdp-talle[data-mvk-gone~="6"],
.mvk-pdp-form:has(.mvk-pdp-choice[data-mvk-color-i="7"]:checked) .mvk-pdp-talle[data-mvk-gone~="7"] {
  color: var(--mvk-text-mid);
  border-color: var(--mvk-pdp-line-control);
  text-decoration: line-through;
  cursor: not-allowed;
  background-size: 100% 0%;
  /* Sin esto el <label> seguía marcando su radio de un toque. */
  pointer-events: none;
}

.mvk-pdp-fittip {
  margin: 0;
  font: 400 12.5px/1.5 var(--mvk-sans);
  color: var(--mvk-text-mid);
  max-width: 46ch;
  text-wrap: pretty;
}

/* --- Cantidad y CTA ------------------------------------------------------ */

.mvk-pdp-acciones {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  align-items: stretch;
}

.mvk-pdp-qty {
  display: flex;
  align-items: center;
  border: 1px solid var(--mvk-black);
  height: 58px;
  flex: none;
}

.mvk-pdp-qty__btn {
  width: 46px;
  height: 100%;
  border: 0;
  background: var(--mvk-white);
  color: var(--mvk-black);
  cursor: pointer;
  font: 400 16px/1 var(--mvk-sans);
  transition: background .25s ease;
}

.mvk-pdp-qty__btn:hover { background: var(--mvk-panel); }

.mvk-pdp-qty__n {
  min-width: 30px;
  width: 44px;
  height: 100%;
  border: 0;
  background: transparent;
  color: var(--mvk-black);
  text-align: center;
  font: 600 15px/1 var(--mvk-sans);
  appearance: textfield;
  -moz-appearance: textfield;
}

.mvk-pdp-qty__n::-webkit-outer-spin-button,
.mvk-pdp-qty__n::-webkit-inner-spin-button {
  -webkit-appearance: none;
  appearance: none;
  margin: 0;
}

.mvk-pdp-qty__n:focus-visible {
  outline: 2px solid var(--mvk-black);
  outline-offset: -2px;
}

.mvk-pdp-add {
  position: relative;
  overflow: hidden;
  flex: 1 1 220px;
  height: 58px;
  border: 0;
  background: var(--mvk-black);
  color: var(--mvk-white);
  font: 600 11.5px/1 var(--mvk-sans);
  letter-spacing: .24em;
  text-transform: uppercase;
  cursor: pointer;
  transition: opacity .25s ease;
}

.mvk-pdp-add:hover { opacity: .9; }

/* El botón es negro sobre página blanca: el aro tiene que ser negro y por
   fuera, o con currentColor quedaría blanco sobre blanco. */
.mvk-pdp-add:focus-visible {
  outline: 2px solid var(--mvk-black);
  outline-offset: 3px;
}

/* Barrido blanco de confirmación. Capa decorativa, no contenido. */
.mvk-pdp-add__fill {
  position: absolute;
  inset: 0;
  background: var(--mvk-white);
  transform-origin: left center;
  transform: scaleX(0);
  transition: transform .55s var(--mvk-ease);
  pointer-events: none;
}

.mvk-pdp-add__txt {
  position: relative;
  z-index: 1;
  color: var(--mvk-white);
  transition: color .3s ease .12s;
}

.mvk-pdp-add.is-added .mvk-pdp-add__fill { transform: scaleX(1); }
.mvk-pdp-add.is-added .mvk-pdp-add__txt  { color: var(--mvk-black); }

/* Botón de consulta por WhatsApp.
 *
 * Es el secundario del par: el negro macizo de arriba compra, este pregunta.
 * La jerarquía se sostiene con relleno contra contorno —el patrón de siempre—
 * y no bajando el contraste del borde. Con el gris claro de --mvk-line el
 * botón se leía DESHABILITADO, que es lo contrario de lo que se quiere en el
 * único camino que le queda a quien no se anima a comprar todavía.
 *
 * Nada de verde de WhatsApp: la paleta de la marca es blanco y negro, y una
 * mancha de color acá se ve pegoteada. El glifo ya dice WhatsApp solo.
 *
 * display:flex y no inline-flex: se encogía al ancho del texto y quedaba un
 * botoncito descolgado bajo un CTA de ancho completo.
 */
/* La fila de acciones secundarias: consultar y compartir.
   El de WhatsApp se lleva todo el ancho sobrante y el de compartir queda
   cuadrado, del mismo alto. */
.mvk-pdp-acciones {
  display: flex;
  gap: 10px;
  min-width: 0;
}

.mvk-pdp-acciones .mvk-pdp-wa {
  flex: 1 1 auto;
  min-width: 0;
}

/* Compartir: mismo lenguaje que el de al lado, sin rótulo.
   aspect-ratio y no width fija: así sigue al alto si mañana cambia. */
.mvk-pdp-share {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  aspect-ratio: 1;
  height: 52px;
  padding: 0;
  border: 1px solid var(--mvk-black);
  background: transparent;
  color: var(--mvk-black);
  cursor: pointer;
  transition: background .3s var(--mvk-ease), color .3s var(--mvk-ease);
}

.mvk-pdp-share:hover {
  background: var(--mvk-black);
  color: var(--mvk-white);
}

.mvk-pdp-share:focus-visible {
  outline: 2px solid var(--mvk-black);
  outline-offset: 3px;
}

.mvk-pdp-wa {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  height: 52px;
  border: 1px solid var(--mvk-black);
  font: 600 10.5px/1 var(--mvk-sans);
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--mvk-black);
  background: transparent;
  transition: background .3s var(--mvk-ease), color .3s var(--mvk-ease);
}

/* Inversión completa, el mismo gesto que usa el resto del sitio. El ícono
   sigue al texto porque está dibujado con currentColor. */
.mvk-pdp-wa:hover {
  background: var(--mvk-black);
  color: var(--mvk-white);
}

/* El aro va por fuera: el fondo es blanco en reposo y negro en hover, así que
   un outline interno desaparecería contra uno de los dos estados. */
.mvk-pdp-wa:focus-visible {
  outline: 2px solid var(--mvk-black);
  outline-offset: 3px;
}

.mvk-pdp-wa svg { flex: none; }

/* --- Sin stock: lo que ocupa el lugar del formulario ---------------------- */

/* Mismas reglas de caja que .mvk-pdp-form: este bloque ocupa exactamente su
   lugar en la columna, así el ritmo vertical de la ficha no cambia según haya
   stock o no, y el enlace de WhatsApp —que es el mismo componente— sale con el
   mismo ancho que cuando está dentro del formulario. */
.mvk-pdp-sinstock {
  display: flex;
  flex-direction: column;
  gap: 16px;
  min-width: 0;
}

.mvk-pdp-sinstock__txt {
  margin: 0;
  max-width: 46ch;
  font: 500 13px/1.5 var(--mvk-sans);
  color: var(--mvk-text-mid);
  text-wrap: pretty;
}

/* ==========================================================================
   6. Calculadora de envío
   ========================================================================== */

.mvk-pdp-envio {
  border-block-start: 1px solid var(--mvk-line);
  padding-block-start: 22px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.mvk-pdp-envio form {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 0;
}

.mvk-pdp-envio input {
  flex: 1 1 140px;
  min-width: 0;
  height: 46px;
  padding: 0 12px;
  /* 🚨 Campo blanco sobre página blanca: el borde es lo ÚNICO que lo dibuja, y
     --mvk-line-input (#DAD6D0) da 1.45:1. Es el caso canónico de falla de
     1.4.11: con el brillo bajo o con baja visión no se ve dónde hay que
     escribir y se aprieta "Calcular" con el campo vacío. El placeholder no
     salva nada, porque desaparece al escribir y no es el límite del control. */
  border: 1px solid var(--mvk-pdp-line-control);
  background: var(--mvk-white);
  color: var(--mvk-black);
  font: 400 14px/1 var(--mvk-sans);
}

.mvk-pdp-envio input:focus-visible {
  outline: 2px solid var(--mvk-black);
  outline-offset: 1px;
}

.mvk-pdp-envio button {
  height: 46px;
  padding: 0 22px;
  border: 0;
  background: var(--mvk-black);
  color: var(--mvk-white);
  font: 600 10px/1 var(--mvk-sans);
  letter-spacing: .22em;
  text-transform: uppercase;
  cursor: pointer;
  transition: opacity .25s ease;
}

.mvk-pdp-envio button:hover { opacity: .84; }

/*
 * El resultado ahora puede traer varias tarifas separadas por " · " y llegar
 * despues de una espera, asi que se le da lugar para dos renglones en vez de
 * empujar el acordeon cada vez que cambia de alto.
 */
.mvk-pdp-envio__res {
  min-height: 2.6em;
  margin: 0;
  font: 500 13px/1.5 var(--mvk-sans);
  color: var(--mvk-black);
  text-wrap: pretty;
}

.mvk-pdp-envio__nota {
  margin: 0;
  font: 400 12px/1.5 var(--mvk-sans);
  color: var(--mvk-text-soft-light);
  text-wrap: pretty;
}

/* ==========================================================================
   7. Acordeón
   ========================================================================== */

.mvk-pdp-acc {
  display: flex;
  flex-direction: column;
}

.mvk-pdp-acc__item { border-block-end: 1px solid var(--mvk-line); }

.mvk-pdp-acc__h {
  margin: 0;
  font: inherit;
}

.mvk-pdp-acc__btn {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 16px 0;
  border: 0;
  background: transparent;
  cursor: pointer;
  font: 600 12.5px/1 var(--mvk-sans);
  letter-spacing: .1em;
  text-transform: uppercase;
  text-align: start;
  color: var(--mvk-black);
}

/* El signo que gira NO es un ícono vectorial: es el carácter "+", que rotado
   45° queda como una ×. Así el acordeón no necesita markup vectorial. */
.mvk-pdp-acc__ico {
  font: 400 16px/1 var(--mvk-sans);
  color: var(--mvk-text-mid);
  display: inline-block;
  flex: none;
  transition: transform .25s ease;
}

.mvk-pdp-acc__btn[aria-expanded="true"] .mvk-pdp-acc__ico { transform: rotate(45deg); }

/* 🚨 El cuerpo del acordeón va en la paleta, no en un gris inventado.
   Antes era #3A3A3A, un valor que no existía en ningún otro archivo del tema:
   el bloque de texto que MÁS se lee en la ficha —descripción, composición,
   envíos— era el único párrafo del sitio que no salía de un token, y ningún
   ajuste de la paleta lo alcanzaba. Es contenido principal, así que va en
   --mvk-black; --mvk-text-mid es para lo secundario (la nota de envíos, el
   consejo de calce), y el peso 300 ya lo separa de los titulares. */
.mvk-pdp-acc__panel {
  padding: 0 0 20px;
  font: 300 14px/1.7 var(--mvk-sans);
  color: var(--mvk-black);
  max-width: 60ch;
  text-wrap: pretty;
}

.mvk-pdp-acc__panel.is-open { animation: mvkAcc .5s var(--mvk-ease) both; }

.mvk-pdp-acc__panel p { margin: 0 0 12px; }
.mvk-pdp-acc__panel p:last-child { margin-block-end: 0; }

.mvk-pdp-specs {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.mvk-pdp-specs li {
  position: relative;
  padding-inline-start: 16px;
}

.mvk-pdp-specs li::before {
  content: "—";
  position: absolute;
  inset-inline-start: 0;
  color: var(--mvk-text-soft-light);
}

/* ==========================================================================
   8. Completá tu look
   ========================================================================== */

.mvk-pdp-look {
  /* Más angosto que la ficha a propósito: 1240, no 1560. */
  max-width: var(--mvk-max);
  margin: 0 auto;
  padding: 0 var(--mvk-pad) 140px;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.mvk-pdp-look__h {
  margin: 0 0 26px;
  text-align: center;
  font-family: var(--mvk-display);
  font-weight: 600;
  text-transform: uppercase;
  font-size: clamp(24px, 3.2vw, 42px);
  /* El tracking ya salía del token; el line-height estaba en 1 a mano. Los dos
     valores de un título vienen de la misma pareja o el ajuste global miente. */
  line-height: var(--mvk-title-lh);
  letter-spacing: var(--mvk-title-ls);
}

/* La palabra "look" en Georgia itálica minúscula: el patrón de título mixto
   del prototipo. */
.mvk-pdp-look__h em {
  font-family: Georgia, 'Times New Roman', serif;
  font-style: italic;
  text-transform: none;
  font-weight: 400;
  letter-spacing: 0;
}

/* minmax(0, 1fr) y no 1fr: es el mismo arreglo del min-width:auto de los grids
   que arriba se resuelve con min-width:0. */
.mvk-pdp-rel {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 24px 18px;
  width: 100%;
}

/* ==========================================================================
   9. Barra de compra fija en celular
   ========================================================================== */

/* 🚨 z-index 75, no 8.
   La franja de abajo la ocupan dos cosas: esta barra (0 a ~72px por debajo de
   1080px) y el botón flotante de WhatsApp, que es fixed en bottom:14px, mide
   54px y va en z-index 70 (footer.css). Se solapan exactos y con un 8 ganaba el
   flotante: un toque en el extremo derecho del CTA abría WhatsApp en vez de
   agregar el producto. Hoy no se nota porque inc/config.php todavía no tiene
   número cargado y floats.php no dibuja nada, pero ese campo está marcado como
   pendiente y se va a cargar.
   La escala de capas del tema la fija template-parts/floats.php: WhatsApp 70,
   volver arriba 90, menú 110, avisos 120. El 75 mete la barra de compra entre
   el flotante y el "volver arriba", que queda en bottom:86px y sigue a la vista
   y clickeable. La ficha no pierde el canal de WhatsApp: tiene su propio CTA
   ("¿Dudas con el talle? Escribinos") dentro del formulario, que es además el
   que sabe de qué producto se está hablando.
   Se probó reservar un hueco al final de la barra para dejar la burbuja a la
   vista, y no sirve: a 375px se llevaba 82 de los 375 y dejaba el CTA en 85px
   de ancho, y de 760 para arriba el flotante es una cápsula con etiqueta de
   ~285px, así que ningún hueco fijo alcanza.
   Si se prefiere que el flotante siga visible también acá, hay que subirlo
   desde footer.css (.mvk-wa bottom: 92px y .mvk-totop bottom: 164px dentro del
   bloque de máximo 1079.98px). No se toca desde este archivo: cada área es
   dueña de sus clases y pisarlas de afuera es exactamente lo que rompe. */
.mvk-pdp-buy {
  position: fixed;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 75;
  display: none;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
  background: rgba(255, 255, 255, .96);
  backdrop-filter: blur(10px);
  border-block-start: 1px solid var(--mvk-line);
}

.mvk-pdp-buy__txt {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.mvk-pdp-buy__name {
  font: 500 12px/1.2 var(--mvk-sans);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.mvk-pdp-buy__price {
  display: flex;
  align-items: baseline;
  gap: 6px;
  font: 600 14px/1 var(--mvk-sans);
}

.mvk-pdp-buy__cta {
  flex: 1;
  height: 52px;
  border: 0;
  background: var(--mvk-black);
  color: var(--mvk-white);
  font: 600 12px/1 var(--mvk-sans);
  letter-spacing: .14em;
  text-transform: uppercase;
  cursor: pointer;
}

/*
 * Producto no comprable: el CTA de la barra fija es un <span>, no un botón.
 *
 * 🚨 El gris NO es --mvk-line sobre --mvk-text-soft-light: esa combinación da
 * 3,0:1 y el rótulo prácticamente no se lee. Va --mvk-panel con --mvk-text-mid
 * (#6B6B6B sobre #F8F7F5 = 5,1:1). El filete es el que le da forma de control
 * apagado: sin él, sobre la barra casi blanca, queda un texto suelto.
 * display:grid porque el <span> no hereda el centrado vertical del <button>.
 */
.mvk-pdp-buy__cta.is-off {
  display: grid;
  place-items: center;
  border: 1px solid var(--mvk-line);
  background: var(--mvk-panel);
  color: var(--mvk-text-mid);
  cursor: default;
}

/*
 * 🚨 El aro de foco va BLANCO y hacia adentro, no negro.
 *
 * El botón tiene fondo var(--mvk-black): un outline negro por dentro es negro
 * sobre negro y no se ve nada. Para quien navega con teclado, el control más
 * importante de la ficha quedaba sin indicador de foco (WCAG 2.4.7).
 *
 * Blanco sobre el negro de marca da 19.6:1. Va hacia adentro (offset negativo)
 * porque el botón está pegado al borde de la barra fija y un aro hacia afuera
 * se recortaría.
 */
.mvk-pdp-buy__cta:focus-visible {
  outline: 2px solid var(--mvk-white);
  outline-offset: -5px;
}

/* Mismo caso: fondo negro, aro blanco. */
.mvk-pdp-envio button:focus-visible {
  outline: 2px solid var(--mvk-white);
  outline-offset: -5px;
}

/* ==========================================================================
   10. Aviso flotante
   ========================================================================== */

.mvk-pdp-toast {
  position: fixed;
  inset-block-end: 22px;
  inset-inline: 0;
  z-index: 120;
  margin: 0 auto;
  width: max-content;
  max-width: calc(100% - 32px);
  padding: 14px 20px;
  background: var(--mvk-black);
  color: var(--mvk-white);
  font: 600 10.5px/1.4 var(--mvk-sans);
  /* Rótulo chico en mayúsculas: de .2em para arriba, como todos los del área. */
  letter-spacing: .2em;
  text-transform: uppercase;
  text-align: center;
  box-shadow: var(--mvk-shadow-fab);
  animation: mvkSheet .4s var(--mvk-ease) both;
}

/* ==========================================================================
   11. Entrada escalonada de la columna de información

   🚨 El contenido se ve SIEMPRE. product.js agrega .is-inview y recién ahí
   corre la animación; si el JavaScript no carga, la ficha se ve igual, quieta.
   Nunca opacity:0 como estado por defecto.
   ========================================================================== */

[data-mvk-in].is-inview {
  animation: mvkPdpIn .8s var(--mvk-d, 0s) both var(--mvk-ease);
}

.mvk-pdp-head            { --mvk-d: .05s; }
.mvk-pdp-precio          { --mvk-d: .14s; }
.mvk-pdp-grupo--color    { --mvk-d: .22s; }
.mvk-pdp-grupo--talle    { --mvk-d: .3s; }
.mvk-pdp-acciones        { --mvk-d: .38s; }
/* Ocupa el lugar de .mvk-pdp-acciones cuando no hay stock: mismo turno. */
.mvk-pdp-sinstock        { --mvk-d: .38s; }
.mvk-pdp-gal__thumbs     { --mvk-d: .2s; }

/* ==========================================================================
   12. Breakpoints — los dos oficiales
   ========================================================================== */

/* Tablet: la galería deja de acompañar el scroll y aparece la barra de compra. */
@media (max-width: 1079.98px) {
  /* La galería deja de acompañar el scroll y las miniaturas vuelven a la fila
     horizontal debajo de la foto: acá el ancho se lo lleva la foto. */
  .mvk-pdp-gal {
    display: flex;
    flex-direction: column;
    /* 🚨 Volver a stretch. El align-items:start de la grilla, heredado acá,
       deja a la foto —que solo tiene aspect-ratio— en 0 de ancho: en una
       columna flex el start es horizontal y la caja se encoge a su contenido,
       que no existe. */
    align-items: stretch;
    position: static;
    inset-block-start: auto;
  }

  .mvk-pdp-gal__thumbs {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }

  .mvk-pdp-rel { grid-template-columns: repeat(3, minmax(0, 1fr)); }

  .mvk-pdp-buy { display: flex; }

  /* Que la barra fija no tape el final del acordeón ni la última fila. */
  .mvk-pdp { padding-block-end: 96px; }
  .mvk-pdp-look { padding-block-end: 120px; }
  .mvk-pdp-toast { inset-block-end: 88px; }
}

@media (max-width: 759.98px) {
  .mvk-pdp-rel { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  .mvk-pdp-bar__in { gap: 10px; }

  /* En celular el botón de agregar necesita la fila entera. */
  .mvk-pdp-add { flex: 1 1 100%; }
}

/* ==========================================================================
   13. Movimiento reducido — se apaga todo, incluido el zoom
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .mvk-pdp *,
  .mvk-pdp *::before,
  .mvk-pdp *::after,
  .mvk-pdp-toast,
  .mvk-pdp-buy * {
    animation: none !important;
    transition-duration: .001s !important;
  }

  .mvk-pdp-foto.mvk-pdp-foto { transform: none !important; }
}

/* ==========================================================================
   14. Visor a pantalla completa
   ========================================================================== */

/* [hidden] va DESPUÉS y con más peso que la regla base: el atributo hidden
   trae display:none del navegador, y cualquier display del tema se lo come.
   Sin esta línea el visor arranca abierto y tapa la ficha entera. */
.mvk-lb {
  position: fixed;
  inset: 0;
  z-index: 900;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--mvk-black);
  opacity: 0;
  transition: opacity .3s var(--mvk-ease);
}

.mvk-lb[hidden] { display: none; }

.mvk-lb.is-open { opacity: 1; }

.mvk-lb__top {
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
}

.mvk-lb__n {
  font: 500 11px/1 var(--mvk-sans);
  letter-spacing: .2em;
  color: var(--mvk-white);
}

/* 44px de lado: es el mínimo para tocar con el pulgar sin errarle. El ícono
   mide 18 y el resto es área de toque invisible. */
.mvk-lb__x,
.mvk-lb__nav {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--mvk-white);
  cursor: pointer;
  transition: opacity .25s var(--mvk-ease);
}

.mvk-lb__x:hover,
.mvk-lb__nav:hover { opacity: .6; }

.mvk-lb__x:focus-visible,
.mvk-lb__nav:focus-visible {
  outline: 2px solid var(--mvk-white);
  outline-offset: 2px;
}

.mvk-lb__nav {
  position: absolute;
  inset-block-start: 50%;
  z-index: 2;
  transform: translateY(-50%);
}

.mvk-lb__nav--prev { inset-inline-start: 6px; }
.mvk-lb__nav--next { inset-inline-end: 6px; }

/* Con la foto acercada estorban: el dedo que arrastra pasa por encima. */
.mvk-lb.is-zoom .mvk-lb__nav { opacity: 0; pointer-events: none; }

/* touch-action:none es lo que deja que los gestos los maneje el JavaScript.
   Sin esto el navegador se queda con la pinza y con el arrastre, y ni el zoom
   ni el pase de foto llegan a ejecutarse. */
.mvk-lb__vista {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  overflow: hidden;
  touch-action: none;
}

.mvk-lb__img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  transform-origin: center center;
  transition: transform .25s var(--mvk-ease);
  user-select: none;
  -webkit-user-drag: none;
}

/* Durante el gesto no puede haber transición: la foto perseguiría al dedo con
   un cuarto de segundo de atraso y se sentiría rota. */
.mvk-lb.is-zoom .mvk-lb__img {
  transition: none;
  cursor: grab;
}

@media (prefers-reduced-motion: reduce) {
  .mvk-lb,
  .mvk-lb__img { transition: none; }
}
