/* ============================================================
   MVANT — sistema de diseño
   Boutique de sneakers / galería contemporánea / lujo minimalista
   ============================================================ */

:root {
  --bg: #111111;
  --bg-alt: #080808;
  --bg-card: #181818;
  --bg-elevated: #242424;
  /* Atmósfera MVANT global (ver más abajo): degradado carbón → antracita → negro
     profundo, único para todas las páginas públicas. */
  --bg-carbon: #101010;
  --bg-deep: #050505;
  --text: #ffffff;
  --text-muted: #bdbdbd;
  --silver: #9c9c9c;

  /* Identidad de acento MVANT — azul eléctrico (reemplaza el ámbar/camel anterior) */
  --mvant-accent: #00a8ff;
  --mvant-neon: #00d9ff;
  --mvant-electric-white: #bff5ff;
  --accent: var(--mvant-accent);

  --border: rgba(255, 255, 255, 0.1);
  --border-strong: rgba(255, 255, 255, 0.2);
  --ease: cubic-bezier(0.16, 0.84, 0.44, 1);
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;

  /* Regla MVANT de product media (Home/Catálogo/Relacionados/Product Page/Bolsa): toda
     fotografía que represente un producto usa este mismo fit/radio, sin excepción — la
     única excepción real es el Hero (fondo puramente decorativo, sigue en cover aparte).
     "contain" nunca recorta: si una foto futura no es 1:1, se ve completa y centrada,
     con el propio fondo del wrapper (var(--bg-card)) rellenando el sobrante. */
  --product-media-fit: contain;
  --product-media-radius: 14px;
}

* { box-sizing: border-box; }

html { background: var(--bg); scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* ---------- Atmósfera MVANT global ----------
   FUENTE ÚNICA de fondo para todas las páginas públicas (index.html debajo del Hero,
   catalog.html, product.html, condiciones.html, contacto.html). Scope con
   :has(#siteHeader): todas las públicas comparten ese header; admin.html usa
   .admin-header y nunca queda incluido, así su look no cambia.

   Implementación: SOLO background-color + background-image en <body> — nada de
   pseudo-elemento con position:fixed + z-index negativo (la versión anterior). Ese
   enfoque es frágil entre navegadores: <body> no crea su propio "stacking context", así
   que un ::before con z-index:-1 puede terminar pintándose DETRÁS del propio fondo de
   <body> en vez de encima — eso es exactamente lo que producía el resultado inconsistente
   (Cómo comprar/Catálogo mostrando solo el background-color plano de respaldo, mientras
   Nosotros se veía bien porque su degradado nunca dependió de este mecanismo: vive en
   divs normales dentro de .brand-experience, sin trucos de z-index). Con el degradado
   como background-image de body no hay ambigüedad posible: un background siempre se
   pinta detrás de todo el contenido de su propio elemento, en cualquier navegador.

   background-attachment:fixed ancla el degradado al viewport (no al alto total del
   documento) para que se vea igual de "denso" en una página corta (Contacto) que en una
   larga (Catálogo con varios productos) — si algún navegador muy antiguo lo ignora, cae
   a "scroll" sin romper nada, solo se repite con el contenido. */
body:has(#siteHeader) {
  background-color: var(--bg-deep);
  background-image:
    radial-gradient(ellipse 1400px 800px at 50% -10%, rgba(255, 255, 255, 0.05), transparent 60%),
    linear-gradient(180deg, var(--bg-carbon) 0%, var(--bg-alt) 50%, var(--bg-deep) 100%);
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-size: 100% 100vh;
}

a { color: inherit; text-decoration: none; }
button { font-family: inherit; }
img { display: block; max-width: 100%; }

a:focus-visible, button:focus-visible, input:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 3px;
}

.container-wide { max-width: 1400px; margin: 0 auto; padding: 0 32px; }
@media (max-width: 640px) { .container-wide { padding: 0 20px; } }

.eyebrow {
  display: block;
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--silver);
  font-weight: 500;
  margin-bottom: 10px;
}

/* ---------- Scroll reveal ---------- */

/* La animación de aparición al hacer scroll se desactivó por rendimiento (ver auditoría de
   scroll): los elementos .reveal se muestran directamente, sin depender de is-visible ni de
   JS. window.MVANT.observeReveal (js/main.js) se conserva como no-op porque catalog.js y
   home.js siguen llamándolo tras renderizar contenido dinámico. Se reconstruirá una
   animación específica y optimizada más adelante, donde tenga sentido. */
.reveal { opacity: 1; transform: none; }

/* ---------- Header ---------- */

/* Header global de las 6 páginas públicas: transparente arriba, sólido tras el primer
   scroll. .is-scrolled lo activa/desactiva js/main.js mediante un IntersectionObserver
   sobre un sentinel de 1px al inicio del <body> — sin listener de scroll, sin rAF (ver
   PASO A4). Transición corta y solo en background-color/border-color, sin blur ni
   transform, tal como se pidió. */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  background: transparent;
  border-bottom: 1px solid transparent;
  transition: background-color 0.2s ease, border-color 0.2s ease;
}
.site-header.is-scrolled {
  background: #050505;
  border-bottom-color: var(--border);
}

/* Marcador invisible (1x1px) al inicio de <body> en las 6 páginas públicas — lo observa
   js/main.js con IntersectionObserver para saber cuándo activar/desactivar .is-scrolled.
   position:absolute + tamaño mínimo: no reserva espacio ni afecta el layout de nada. */
[data-scroll-sentinel] {
  position: absolute;
  top: 0;
  left: 0;
  width: 1px;
  height: 1px;
  pointer-events: none;
  opacity: 0;
}

/* Indicador de página activa: reutiliza el mismo ::after (línea inferior) que ya usa el
   hover de .nav-link, solo que en reposo en vez de solo al pasar el mouse — evita crear
   un segundo lenguaje visual para "activo" vs "hover". Sin pill, sin fondo, sin JS. */
.nav-link.active::after {
  transform: scaleX(1);
  opacity: 1;
}

/* position+z-index es necesario aquí: .mobile-nav vive DENTRO de .site-header (ver HTML)
   con position:fixed + z-index:90 para cubrir toda la pantalla al abrirse. Sin este
   z-index, .header-inner es un hijo "static" de .site-header y pinta por DEBAJO de
   cualquier descendiente posicionado con z-index dentro del mismo stacking context —
   el z-index:100 de .site-header solo importa frente a OTROS elementos de nivel
   superior (main, .hero, etc.), nunca frente a sus propios hijos. Sin esto, el botón de
   menú (dentro de .header-inner) quedaba completamente tapado por .mobile-nav al abrir
   el menú — imposible de ver o tocar para cerrar. */
.header-inner {
  position: relative;
  z-index: 95;
  max-width: 1400px;
  margin: 0 auto;
  padding: 22px 32px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}

.logo-mark { font-size: 1.15rem; font-weight: 600; letter-spacing: 0.14em; }

.main-nav { display: flex; gap: 34px; }

/* ---------- Menú desplegable (mega menu) ---------- */

.nav-item { position: relative; display: flex; align-items: center; }

.mega-menu {
  /* Puente invisible: arranca pegado al link (sin espacio muerto) y el padding-top
     hace de colchón visual, así el hover nunca se corta al bajar el cursor hacia el panel. */
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  padding-top: 20px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.35s var(--ease), visibility 0.35s;
  z-index: 150;
}
.nav-item:hover .mega-menu,
.nav-item:focus-within .mega-menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

/* repeat(2, 1fr): Tenis y Perfumes ahora son dos mega-menús separados (antes uno solo con
   3 columnas: Hombre/Mujer/Perfumes) — cada uno solo necesita Hombre + Mujer como columnas
   reales; "Todos" (.mega-menu-all) ocupa la fila completa arriba, ver más abajo. */
.mega-menu-inner {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 36px;
  min-width: 380px;
  background: rgba(8, 8, 8, 0.94);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid var(--border);
  padding: 30px 34px;
  transform: translateY(-10px);
  transition: transform 0.35s var(--ease);
}
.nav-item:hover .mega-menu-inner,
.nav-item:focus-within .mega-menu-inner {
  transform: translateY(0);
}

.mega-col { display: flex; flex-direction: column; gap: 3px; }

/* Fila "Todos": ocupa las 2 columnas del grid, con un separador para no confundirse con
   Hombre/Mujer. Reutiliza la tipografía de .mega-col-title (mismo Design System). */
.mega-menu-all { grid-column: 1 / -1; padding-bottom: 12px; margin-bottom: 4px; border-bottom: 1px solid var(--border); }

.mega-col-title {
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #fff;
  margin-bottom: 12px;
  transition: color 0.3s ease;
}
.mega-col-title:hover { color: var(--mvant-accent); }

.mega-brand-list a {
  display: block;
  font-size: 0.82rem;
  color: var(--text-muted);
  padding: 5px 0;
  transition: color 0.3s ease;
}
.mega-brand-list a:hover { color: var(--mvant-accent); }

.mega-brand-list:empty::after {
  content: "Próximamente";
  display: block;
  font-size: 0.78rem;
  color: var(--text-muted);
  opacity: 0.6;
  padding: 5px 0;
}

.nav-link {
  position: relative;
  font-size: 0.76rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #fff;
  padding-bottom: 6px;
  transition: color 0.3s ease;
}
.nav-link::before {
  /* micro chispa que recorre la línea de izquierda a derecha */
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 3px;
  background: radial-gradient(circle 5px at 0% 50%, var(--mvant-electric-white), var(--mvant-neon) 40%, transparent 72%);
  background-repeat: no-repeat;
  background-size: 22px 3px;
  background-position: -10% 0;
  opacity: 0;
  pointer-events: none;
}
.nav-link::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 1px;
  background: var(--mvant-accent);
  transform: scaleX(0);
  transform-origin: left;
  opacity: 0;
  box-shadow: none;
  transition: transform 0.32s cubic-bezier(0.65, 0, 0.35, 1), opacity 0.3s ease, box-shadow 0.35s ease;
}
.nav-link:hover { color: var(--mvant-accent); text-shadow: 0 0 6px rgba(0, 168, 255, 0.45); }
.nav-link:hover::after {
  transform: scaleX(1);
  opacity: 1;
  box-shadow: 0 0 5px var(--mvant-accent), 0 0 10px rgba(0, 168, 255, 0.45);
  animation: mvant-glow-pulse 0.45s ease-out;
}
.nav-link:hover::before { animation: mvant-spark 0.42s cubic-bezier(0.4, 0, 0.2, 1) forwards; }

@keyframes mvant-glow-pulse {
  0% { box-shadow: 0 0 0 rgba(0, 168, 255, 0); }
  55% { box-shadow: 0 0 0 rgba(0, 168, 255, 0); }
  70% { box-shadow: 0 0 9px var(--mvant-electric-white), 0 0 16px rgba(0, 217, 255, 0.7); }
  100% { box-shadow: 0 0 5px var(--mvant-accent), 0 0 10px rgba(0, 168, 255, 0.45); }
}
@keyframes mvant-spark {
  0% { opacity: 1; background-position: -10% 0; }
  85% { opacity: 1; background-position: 105% 0; }
  100% { opacity: 0; background-position: 110% 0; }
}

.header-actions { display: flex; align-items: center; gap: 18px; }
/* .social-link es hoy siempre el ícono de Instagram del header — en reposo sigue blanco/
   gris MVANT; el color de marca (gradiente Instagram) solo aparece al interactuar. */
.social-link { color: #fff; opacity: 0.8; transition: opacity 0.3s ease, color 0.3s ease, filter 0.3s ease; }
.social-link:hover,
.social-link:focus-visible,
.social-link:active {
  opacity: 1;
  color: #dd2a7b;
  filter: drop-shadow(0 0 4px rgba(245, 133, 41, 0.4)) drop-shadow(0 0 4px rgba(129, 52, 175, 0.35));
}

/* ---------- Microinteracción de marca global: WhatsApp / Instagram ----------
   Regla única, por href/atributo — no por página ni por componente — para que cualquier
   enlace REAL de estas dos plataformas (footer, menú mobile, CTA de Home, dock de compra
   de Product Page, tarjeta de Contacto) muestre su color de marca solo al interactuar,
   sin tocar el archivo de esas páginas ni duplicar la regla en cada una. En reposo todo
   sigue blanco/gris MVANT — el color nunca es el estado por defecto.
   Quedan fuera (ya tienen su propio tratamiento dedicado, ver arriba/abajo): .social-link,
   .contact-card (icono/CTA con su glow propio), .btn-whatsapp (icono verde ya aprobado en
   Product Page/Bolsa) y #contactWhatsapp. */
a[href*="instagram.com"]:not(.social-link):not(.contact-card):hover,
a[href*="instagram.com"]:not(.social-link):not(.contact-card):focus-visible,
a[href*="instagram.com"]:not(.social-link):not(.contact-card):active {
  color: #dd2a7b;
  text-shadow: 0 0 8px rgba(245, 133, 41, 0.35), 0 0 8px rgba(129, 52, 175, 0.3);
}
a[data-wa-link]:not(.btn-whatsapp):hover,
a[data-wa-link]:not(.btn-whatsapp):focus-visible,
a[data-wa-link]:not(.btn-whatsapp):active,
a[href*="wa.me"]:not(.btn-whatsapp):not(#contactWhatsapp):hover,
a[href*="wa.me"]:not(.btn-whatsapp):not(#contactWhatsapp):focus-visible,
a[href*="wa.me"]:not(.btn-whatsapp):not(#contactWhatsapp):active {
  color: #25d366;
  text-shadow: 0 0 8px rgba(37, 211, 102, 0.35);
}

.menu-toggle {
  display: none;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  background: none;
  border: none;
  cursor: pointer;
  padding: 0;
}
.menu-toggle span { display: block; height: 2px; width: 26px; border-radius: 1px; background: #fff; transition: transform 0.3s ease, opacity 0.3s ease; }
.menu-toggle.is-open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.menu-toggle.is-open span:nth-child(2) { opacity: 0; }
.menu-toggle.is-open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.mobile-nav { display: none; }

@media (max-width: 860px) {
  .main-nav { display: none; }
  .menu-toggle { display: flex; }
  /* Dark soft/liquid glass — translúcido + blur moderado (14px, no full-screen pesado),
     en vez del fondo sólido anterior. El propio panel hace de "backdrop": tocar el fondo
     entre los links (fuera de un <a>) cierra el menú, ver lógica en main.js. */
  .mobile-nav {
    position: fixed;
    inset: 0;
    padding: 110px 32px 40px;
    background: rgba(8, 8, 8, 0.88);
    border-left: 1px solid rgba(255, 255, 255, 0.08);
    display: flex;
    flex-direction: column;
    gap: 22px;
    transform: translateY(-100%);
    transition: transform 0.45s var(--ease);
    z-index: 90;
    overflow-y: auto;
  }
  @supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
    .mobile-nav { backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); }
  }
  .mobile-nav.is-open { transform: translateY(0); }
  .mobile-nav a {
    font-size: 1.35rem;
    font-weight: 500;
    letter-spacing: 0.02em;
    color: #fff;
    border-bottom: 1px solid var(--border);
    padding-bottom: 16px;
    transition: color 0.2s ease;
  }
  .mobile-nav a:hover,
  .mobile-nav a:focus-visible { color: var(--mvant-accent); }
  body.nav-open { overflow: hidden; }
}

/* ---------- Hero ---------- */

.hero {
  position: relative;
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background: var(--bg-alt);
}

/* ---------- Hero MVANT 2.0 — imágenes finales (mvant-hero-desktop.jpeg / mobile.jpeg) ----------
   <picture> entrega la versión mobile (composición vertical propia, con los 6 tenis + los
   4 perfumes) o desktop (paisaje, tenis izquierda / perfumes derecha) según viewport — ver
   el <source> en index.html, corte en 767px. Sin JS, sin parallax, sin cursor-follow: es
   una fotografía estática, servida como LCP con fetchpriority="high" y sin loading="lazy". */
.hero-2-media {
  position: absolute;
  inset: 0;
  z-index: 1;
  line-height: 0;
}
.hero-2-media img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 50%;
}

/* Velo sutil solo arriba/abajo (para legibilidad del header transparente y transición
   hacia el fondo global) — el centro de la imagen queda intacto, sin oscurecer producto. */
.hero-2-scrim {
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.4) 0%, transparent 20%, transparent 78%, rgba(5, 5, 5, 0.55) 100%);
}

/* Panel "soft smoked glass": lámina de vidrio arquitectónico — translúcida, con un
   reflejo interior diagonal muy sutil (::before) que le da sensación de vidrio real sin
   recargarlo. Mismo tratamiento base en todas las pantallas; solo tamaño/padding/blur
   cambian en móvil para que el panel se sienta compacto y flotante. Nunca depende de
   backdrop-filter para verse bien — ver @supports más abajo. */
.hero-content {
  position: relative;
  z-index: 5;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  max-width: 560px;
  margin: 0 24px;
  padding: 52px 60px;
  overflow: hidden;
  background: rgba(10, 14, 18, 0.24);
  border: 1px solid rgba(255, 255, 255, 0.16);
  border-radius: 18px;
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
/* Reflejo interno: un velo diagonal clarísimo en la esquina superior — no un brillo, solo
   la insinuación de una superficie de vidrio. z-index:-1 lo mantiene detrás del texto/CTA
   dentro del propio stacking context del panel (position:relative + z-index:5 de arriba). */
.hero-content::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(135deg, rgba(255, 255, 255, 0.08) 0%, transparent 45%);
  pointer-events: none;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .hero-content {
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
  }
}
@media (max-width: 767px) {
  /* El panel crece un poco (336→360px) sin comerse el producto ni forzar el CTA a dos
     líneas — sigue siendo el mismo ancho mínimo ya validado, solo con más aire. */
  .hero-content { padding: 26px 30px; max-width: 360px; border-radius: 16px; gap: 12px; background: rgba(10, 14, 18, 0.22); }
  @supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
    .hero-content { backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }
  }
}

/* MVANT: peso ligero + tracking amplio en toda resolución. El tope desktop crece (4.9→
   5.8rem) para más protagonismo dentro del panel más grande; el mínimo (2.8rem, el que
   manda en mobile) no se toca — la composición mobile "ya funciona bien" y se conserva
   tal cual, tal como se pidió. */
.hero-title {
  font-size: clamp(2.8rem, 11vw, 5.8rem);
  font-weight: 300;
  letter-spacing: 0.17em;
  line-height: 0.95;
  margin: 0;
}
.hero-tagline {
  font-size: clamp(0.82rem, 2.2vw, 0.95rem);
  font-weight: 300;
  letter-spacing: 0.04em;
  color: #d8d8d8;
  opacity: 0.85;
  margin: 4px 0 0;
}

.hero-eyebrow {
  margin-top: 4px;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-muted);
}


.btn-outline {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 44px;
  padding: 15px 30px;
  border: 1px solid rgba(255, 255, 255, 0.5);
  color: #fff;
  background: transparent;
  font-size: 0.76rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  overflow: hidden;
  transition: border-color 0.3s ease, color 0.3s ease, box-shadow 0.35s ease, text-shadow 0.3s ease;
}
.btn-outline::before {
  /* pulso eléctrico que recorre el borde inferior */
  content: "";
  position: absolute;
  left: 0;
  bottom: -1px;
  width: 100%;
  height: 3px;
  background: radial-gradient(circle 5px at 0% 50%, var(--mvant-electric-white), var(--mvant-neon) 40%, transparent 72%);
  background-repeat: no-repeat;
  background-size: 26px 3px;
  background-position: -10% 0;
  opacity: 0;
  pointer-events: none;
}
.btn-outline .cta-arrow { display: inline-block; transition: transform 0.3s ease; }
.btn-outline:hover {
  border-color: var(--mvant-accent);
  color: var(--mvant-accent);
  text-shadow: 0 0 6px rgba(0, 168, 255, 0.45);
  box-shadow: 0 0 5px var(--mvant-accent), 0 0 10px rgba(0, 168, 255, 0.45);
}
.btn-outline:hover .cta-arrow { transform: translateX(5px); }
.btn-outline:hover::before { animation: mvant-spark 0.45s cubic-bezier(0.4, 0, 0.2, 1) forwards; }

/* padding-left/right explícitos (nunca el shorthand "padding: Ty 0 By", que pone left/right
   en 0 y anulaba el padding heredado de .container-wide) — el mismo bug que se documentó y
   corrigió abajo solo para móvil también afectaba a tablet/desktop: entre 641px y 1399px la
   grilla quedaba completamente pegada al borde de la pantalla (0 de gutter real), algo que
   quedaba enmascarado en ≥1400px por el margen externo que deja el max-width. clamp() da un
   gutter fluido y más generoso a partir de aquí, y max-width se amplía a 1480px de contenido
   para aprovechar mejor pantallas grandes ("amplio, premium, equilibrado" sin breakpoints
   fijos para el gutter). */
.catalog-page {
  padding-top: 150px;
  padding-bottom: 120px;
  padding-left: clamp(24px, 4vw, 64px);
  padding-right: clamp(24px, 4vw, 64px);
  max-width: 1480px;
}
/* En móvil, 150px de aire superior deja casi toda la pantalla vacía antes de ver contenido
   — se reduce para que header + título + buscador + marcas + filtros quepan pronto,
   conservando algo de aire (no pegado al header). Exclusivo de catalog.html.

   También se fija aquí el padding lateral (padding-left/right por separado, NUNCA el
   shorthand "padding"): el shorthand de la regla de arriba pone left/right en 0, lo que
   anulaba por completo el "padding: 0 20px" heredado de .container-wide en móvil y dejaba
   toda la grilla pegada a los bordes de la pantalla. clamp() da un gutter fluido en vez de
   un valor fijo: ~15px a 375px, ~16px a 390-393px, ~17-18px a 430-440px. */
@media (max-width: 640px) {
  .catalog-page {
    padding-top: 92px;
    padding-left: clamp(14px, 4vw, 18px);
    padding-right: clamp(14px, 4vw, 18px);
  }
  /* El footer (.footer-inner) usa 32px fijos en todo el sitio; en catalog.html eso se ve
     inconsistente frente al gutter más angosto de la grilla en móvil. Se iguala solo aquí,
     vía selector de hermano adyacente (.catalog-page + .site-footer), sin tocar el
     footer de las demás páginas. */
  .catalog-page + .site-footer .footer-inner {
    padding-left: clamp(14px, 4vw, 18px);
    padding-right: clamp(14px, 4vw, 18px);
  }
}

/* ---------- Placeholders de fotografía ---------- */

.media-placeholder {
  position: relative;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  background: linear-gradient(155deg, #1c1c1c, #0b0b0b);
  border: 1px solid var(--border);
}
.media-placeholder-mark { font-size: 1.6rem; font-weight: 600; letter-spacing: 0.2em; color: rgba(255, 255, 255, 0.14); }
.media-placeholder-label { font-size: 0.62rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); text-align: center; padding: 0 14px; }

/* ---------- Secciones generales ---------- */

/* .section (bare) y .section-selected son exclusivas de index.html — reducidas para que
   el Home se sienta más fluido/conectado entre bloques, sin el vacío de 120px anterior.
   .section-header/.section-conditions NO se tocan: las comparten condiciones.html. */
.section { padding: 64px 0; }
.section-selected { padding-top: 28px; }
.section-conditions { padding-top: 160px; }
.section-header { display: flex; flex-direction: column; margin-bottom: 52px; }
.section-title { font-size: clamp(2rem, 5vw, 3.2rem); font-weight: 600; letter-spacing: -0.01em; margin: 0; }

/* ============================================================
   Rediseño mobile-first del catálogo (catalog.html / js/catalog.js)
   Todo lo de este bloque usa clases nuevas o exclusivas de catalog.html
   (.catalog-page, .catalog-controls, .search-input, .filter-tabs/.filter-link,
   .results-bar, .active-filter-chips/.active-chip, #productGrid, #emptyState)
   — no toca .product-grid/.product-card/.section-header/.empty-state, que
   comparten index.html, product.html y admin.html.
   ============================================================ */

/* El fondo de esta página ahora viene del sistema global MVANT (ver "Atmósfera MVANT
   global" cerca del inicio del archivo) — .catalog-page ya no pinta su propio fondo. */

.catalog-hero { margin-bottom: 36px; }
.catalog-hero .eyebrow { margin-bottom: 10px; }
.catalog-hero-title {
  font-size: clamp(1.9rem, 5.5vw, 2.75rem);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.1;
  margin: 0 0 10px;
}
.catalog-hero-tagline { font-size: 0.92rem; color: var(--text-muted); margin: 0; }

/* ---------- Controles de catálogo ---------- */

.catalog-controls {
  display: flex;
  flex-direction: column;
  gap: 16px;
  margin-bottom: 24px;
  padding-bottom: 22px;
  border-bottom: 1px solid var(--border);
}
@media (min-width: 640px) {
  .catalog-controls { gap: 20px; }
}

/* Buscador — soft glass: mismos tokens de color/borde que .mvant-glass, aplicados
   directamente (un <input> es un elemento reemplazado y no admite ::before/::after, así
   que no puede llevar la clase .mvant-glass en sí; se reutilizan sus valores a mano). El
   fondo/borde funcionan sin blur en navegadores sin soporte — backdrop-filter se suma
   solo si @supports lo confirma. */
.search-input {
  display: block;
  width: 100%;
  background: rgba(10, 14, 18, 0.32);
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
  border-radius: 14px;
  color: #fff;
  font-size: 0.95rem;
  padding: 15px 16px 15px 46px;
  min-height: 52px;
  outline: none;
  font-family: inherit;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='18' height='18' fill='none' stroke='%23bdbdbd' stroke-width='1.6'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='21' y1='21' x2='16.2' y2='16.2'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: 16px center;
  transition: border-color 0.2s ease, background-color 0.2s ease;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .search-input { backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
}
.search-input::placeholder { color: var(--text-muted); }
.search-input:focus { border-color: var(--mvant-accent); background: rgba(10, 14, 18, 0.42); }

.results-bar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 22px; }
.results-meta { font-size: 0.75rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); margin-bottom: 0; }

.sort-select {
  background: rgba(10, 14, 18, 0.32);
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
  color: #fff;
  padding: 12px 14px;
  font-size: 0.8rem;
  font-family: inherit;
  letter-spacing: 0.02em;
  outline: none;
  cursor: pointer;
  border-radius: 14px;
  min-height: 48px;
  transition: border-color 0.2s ease;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .sort-select { backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
}
.sort-select:focus { border-color: var(--mvant-accent); }

/* ---------- Barra Filtros / Ordenar + panel de filtros (talla, género, categoría) ---------- */

.catalog-toolbar { display: flex; gap: 12px; }
.catalog-toolbar .sort-select { flex: 1; min-width: 0; }

.catalog-filters-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  flex: 1;
  min-width: 0;
  min-height: 48px;
  padding: 12px 16px;
  background: rgba(10, 14, 18, 0.32);
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
  border-radius: 14px;
  color: #fff;
  font-size: 0.8rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  font-family: inherit;
  cursor: pointer;
  transition: border-color 0.2s ease;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .catalog-filters-btn { backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
}
.catalog-filters-btn:hover,
.catalog-filters-btn[aria-expanded="true"] { border-color: var(--mvant-accent); }
.catalog-filters-btn svg { flex-shrink: 0; }
.catalog-filters-btn-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  background: var(--mvant-accent);
  color: #000;
  font-size: 0.62rem;
  font-weight: 700;
}
.catalog-filters-btn-count[hidden] { display: none; }

.catalog-filters-panel {
  display: flex;
  flex-direction: column;
  gap: 18px;
  margin-top: 14px;
  padding: 18px;
  background: rgba(10, 14, 18, 0.28);
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
  border-radius: 16px;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .catalog-filters-panel { backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
}
.catalog-filters-panel[hidden] { display: none; }

/* Cada grupo (Género/Marca/Talla) es un <details> nativo — igual patrón ya usado en el
   Admin (.advanced-options, .admin-tools): abre/cierra con mouse, touch y teclado sin JS
   propio, y expone su estado real vía el atributo [open], que el navegador ya maneja. */
.catalog-filter-group { display: flex; flex-direction: column; gap: 10px; }
.catalog-filter-group + .catalog-filter-group { border-top: 1px solid var(--border); padding-top: 16px; }
.catalog-filter-label { font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--silver); font-weight: 600; }
.catalog-filter-options { display: flex; flex-wrap: wrap; gap: 8px; }
.catalog-filter-group[hidden] { display: none; }

.filter-accordion-summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  cursor: pointer;
  list-style: none;
}
.filter-accordion-summary::-webkit-details-marker { display: none; }
.filter-accordion-summary:hover .catalog-filter-label { color: #fff; }
.filter-accordion-chevron { color: var(--text-muted); flex-shrink: 0; transition: transform 0.25s ease, color 0.25s ease; }
.filter-accordion[open] > .filter-accordion-summary .filter-accordion-chevron { transform: rotate(180deg); color: var(--mvant-accent); }
.filter-accordion > .catalog-filter-options { margin-top: 2px; }

.catalog-chip {
  background: transparent;
  border: 1px solid var(--border-strong);
  color: var(--text-muted);
  font-size: 0.76rem;
  padding: 8px 14px;
  border-radius: 20px;
  cursor: pointer;
  font-family: inherit;
  min-height: 36px;
  transition: border-color 0.2s ease, color 0.2s ease, background-color 0.2s ease;
}
.catalog-chip:hover { border-color: var(--mvant-accent); color: #fff; }
.catalog-chip.active { background: var(--mvant-accent); border-color: var(--mvant-accent); color: #000; font-weight: 600; }

.catalog-clear-btn {
  align-self: flex-start;
  background: transparent;
  border: none;
  color: var(--mvant-accent);
  font-size: 0.76rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  padding: 6px 0;
  cursor: pointer;
  font-family: inherit;
}
.catalog-clear-btn:hover { text-decoration: underline; }

.catalog-empty-text { margin: 0 0 16px; }

.active-filter-chips:not(:empty) { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; }
.active-chip {
  background: transparent;
  border: 1px solid var(--mvant-accent);
  color: var(--mvant-accent);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 6px 12px;
  border-radius: 20px;
  cursor: pointer;
  transition: background-color 0.2s ease, color 0.2s ease;
}
.active-chip:hover { background: var(--mvant-accent); color: #000; }

/* ---------- Grilla de productos ---------- */

.product-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 48px 32px; }
@media (max-width: 1024px) { .product-grid { grid-template-columns: repeat(2, 1fr); gap: 40px 24px; } }
@media (max-width: 400px) { .product-grid { grid-template-columns: 1fr; } }

/* Catálogo: SIEMPRE 2 columnas en móvil (390-430px), incluso por debajo de 400px —
   override específico por id, no toca la regla .product-grid de arriba (compartida con
   la vitrina del Home y la vista previa del admin).

   Progresión desktop: 2 (móvil, sin cambios) → 3 en tablet/desktop chico (860-1279px,
   "cómodas" según lo pedido) → 4 en desktop grande (1280px+), sin pasar de 4 para que la
   card no pierda anchura elegante ni se sienta una grilla de ecommerce genérico. */
/* minmax(0, 1fr) en vez de 1fr a secas: un track de grid "1fr" solo (sin el minmax)
   tiene un mínimo implícito de "auto", es decir, se puede forzar a crecer más allá de
   su reparto si el contenido de una card trae una palabra/token sin espacios (nombre de
   producto, referencia, etc.) — eso descuadra las 2 columnas (una se estira, la otra
   queda angosta) y puede desbordar la página en mobile. minmax(0, 1fr) fija un piso de
   0 para que el track SIEMPRE respete el reparto en partes iguales, sin importar el
   contenido. Confirmado con una prueba dirigida: con "1fr" un texto largo descuadraba
   las columnas a 269px/94px; con "minmax(0, 1fr)" se mantienen 173.78px/173.78px. */
#productGrid.product-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 10px; }
@media (min-width: 560px) { #productGrid.product-grid { gap: 20px 16px; } }
@media (min-width: 860px) { #productGrid.product-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px 24px; } }
@media (min-width: 1280px) { #productGrid.product-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 40px 28px; } }

/* ---------- Tarjeta de producto del catálogo (MVANT 2.0) ----------
   El catálogo ya NO tiene sus propias clases .catalog-card*: reutiliza literalmente el
   componente .mvant-card ya aprobado en Selected Pieces (Home) — ver "MVANT LIQUID GLASS"
   más abajo, incluida su misma lógica de renderCatalogCard/renderSelectedCard. Aquí solo se
   agregan los ajustes exclusivos de la grilla del catálogo (borde en hover); proporción de
   imagen y object-fit ya viven en la regla base .mvant-card-media (root fix, ver arriba),
   compartida con Home — no se duplican aquí. */
#productGrid .mvant-card-media {
  border: 1px solid var(--border);
  transition: border-color 0.2s ease, transform 0.2s ease;
}
#productGrid .mvant-card:hover .mvant-card-media,
#productGrid .mvant-card:focus-visible .mvant-card-media {
  border-color: var(--border-strong);
}

/* minmax(0,1fr) arriba resuelve el track del grid, pero un token sin espacios dentro
   de la card (p. ej. una referencia larga) igual puede desbordar la CAJA de texto y
   pisar la columna vecina si esa caja no tiene su propio min-width:0 y forma de
   partir la palabra. Este bloque es exclusivo de #productGrid — no toca .mvant-card
   base ni el carrusel de Selected Pieces del Home. */
#productGrid .mvant-card,
#productGrid .mvant-card-info {
  min-width: 0;
}
#productGrid .mvant-card-name,
#productGrid .mvant-card-sizes {
  overflow-wrap: anywhere;
}

/* ---------- Ajuste mobile — legibilidad y utilidad comercial ----------
   Aprobado: desktop y estructura mobile (2 columnas, fondo, imágenes, responsive)
   quedan intactos. Este bloque solo agranda tipografía/aire en <=640px sobre clases
   ya exclusivas del catálogo (.search-input, .filter-tabs/.filter-link, .sort-select,
   .catalog-filters-btn) y overrides con prefijo #productGrid para no tocar el carrusel
   .mvant-card de Selected Pieces en el Home. */
@media (max-width: 640px) {
  .search-input { font-size: 1rem; }
  .sort-select { font-size: 0.85rem; }
  .catalog-filters-btn { font-size: 0.85rem; }

  .filter-tabs { gap: 30px; }
  .filter-link { font-size: 0.8rem; letter-spacing: 0.12em; padding: 0 0 10px; }

  #productGrid.product-grid { gap: 18px 14px; }

  #productGrid .mvant-card-info { padding-top: 18px; gap: 8px; }
  #productGrid .mvant-card-name { font-size: 1.02rem; }
  #productGrid .mvant-card-price { font-size: 1.12rem; }
  #productGrid .mvant-card-sizes { font-size: 0.82rem; }
  #productGrid .mvant-card-sizes.is-out { font-size: 0.74rem; }
  #productGrid .mvant-card-badge { font-size: 0.72rem; padding: 5px 12px; }
  #productGrid .mvant-card-cta { font-size: 0.72rem; }
}

.product-card-link { display: block; }

/* --product-media-radius/--product-media-fit: mismos tokens de la regla global MVANT de
   product media (ver :root y .mvant-card-media) — Catálogo, Home y "También te puede
   interesar" comparten literalmente los mismos valores en vez de repetir números sueltos. */
.product-card-media { position: relative; aspect-ratio: 1 / 1; background: var(--bg-card); overflow: hidden; border: 1px solid var(--border); border-radius: var(--product-media-radius); }
.product-card-media::after {
  content: "";
  position: absolute;
  inset: -20%;
  z-index: 2;
  pointer-events: none;
  background: radial-gradient(circle, rgba(0, 168, 255, 0.18), transparent 70%);
  opacity: 0;
  transition: opacity 0.4s ease;
}
.product-card:hover .product-card-media::after { opacity: 1; }

.product-card-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: var(--product-media-fit); object-position: center; z-index: 1; transition: transform 0.5s var(--ease), opacity 0.5s ease; }
.product-card-img.img-side { opacity: 0; }
.product-card-media:hover .img-front { transform: scale(1.045); }
.product-card-media:has(.img-side):hover .img-front { opacity: 0; }
.product-card-media:hover .img-side { opacity: 1; transform: scale(1.045); }

.product-card-info { padding-top: 18px; display: flex; flex-direction: column; gap: 4px; }
.product-card-brand { font-size: 0.68rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--silver); }
.product-card-name { font-size: 1rem; font-weight: 500; margin: 2px 0 0; transition: color 0.3s ease; }
.product-card:hover .product-card-name { color: var(--accent); }
.product-card-ref { font-size: 0.7rem; color: var(--text-muted); letter-spacing: 0.04em; }

.product-card-row { display: flex; align-items: center; justify-content: space-between; margin-top: 8px; }
.product-card-price { font-size: 0.92rem; font-weight: 600; }
.product-card-avail { font-size: 0.64rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent); }
.product-card-avail.is-out { color: var(--text-muted); }

.product-card-sizes { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.size-chip { font-size: 0.66rem; padding: 3px 7px; border: 1px solid var(--border); color: var(--text-muted); letter-spacing: 0.04em; }
.size-chip.unavail { opacity: 0.35; text-decoration: line-through; }

.product-card-cta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 14px;
  font-size: 0.68rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #fff;
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 0.35s ease, transform 0.35s ease;
}
.product-card:hover .product-card-cta { opacity: 1; transform: translateY(0); }
.product-card-cta .cta-arrow { display: inline-block; transition: transform 0.3s ease; }
.product-card:hover .product-card-cta .cta-arrow { transform: translateX(4px); }

.empty-state { text-align: center; padding: 80px 20px; color: var(--text-muted); font-size: 0.9rem; }
/* Aviso "Próximamente" de Perfumes (ver js/catalog.js) — el mismo #emptyState, con menos
   padding propio porque la tarjeta .catalog-coming-soon ya trae el suyo. */
.empty-state.is-coming-soon { padding: 24px 0 64px; }

.catalog-coming-soon {
  max-width: 460px;
  margin: 0 auto;
  padding: 56px 32px;
  border-radius: 20px;
  text-align: center;
}
.catalog-coming-soon .eyebrow { color: var(--mvant-accent); margin-bottom: 14px; }
.catalog-coming-soon-title {
  font-size: clamp(1.7rem, 5vw, 2.4rem);
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0 0 12px;
  color: #fff;
}
.catalog-coming-soon-text { font-size: 0.92rem; color: var(--text-muted); line-height: 1.6; margin: 0; }

/* ============================================================
   MVANT LIQUID GLASS — sistema global reutilizable (sitewide)
   ============================================================
   Fase actual: aplicado solo en Home (debajo del Hero). Pensado desde el inicio para
   reutilizarse tal cual en catálogo/producto/nosotros/cómo comprar/contacto/footer en
   fases posteriores — por eso vive como un primitivo genérico (.mvant-glass) + 3
   variantes de tamaño, no como estilos sueltos por sección.

   Principio: el fondo global MVANT (ver "Atmósfera MVANT global" al inicio del archivo)
   sigue siendo el protagonista oscuro/mineral; el glass es una capa de interfaz ENCIMA de
   ese universo, solo donde aporta jerarquía/navegación/CTA — nunca una superficie grande
   ni glass anidado dentro de glass (ver Selected Pieces: la foto NO va envuelta en vidrio,
   solo la franja de información inferior).

   Rendimiento: backdrop-filter entre 4-8px, siempre sobre superficies pequeñas (cards,
   franjas, botones) — nunca full-screen. Transiciones únicamente en
   background-color/border-color/transform, 150-220ms. Sin JS, sin animación de blur. */
.mvant-glass {
  position: relative;
  z-index: 1;
  overflow: hidden;
  background: rgba(10, 14, 18, 0.24);
  border: 1px solid rgba(255, 255, 255, 0.14);
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
/* Reflejo interior mínimo — mismo recurso ya aprobado en el panel del Hero, ahora
   disponible para cualquier superficie glass del sitio. z-index:-1 lo mantiene detrás del
   contenido gracias a que .mvant-glass ya crea su propio stacking context (position hace de +
   z-index). */
.mvant-glass::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, transparent 45%);
  pointer-events: none;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .mvant-glass { backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
}

/* Variantes de tamaño/uso — el primitivo de arriba resuelve color/borde/sombra/reflejo/blur;
   estas solo definen radio y padding según el contexto. */
.mvant-glass-panel { border-radius: 18px; padding: 40px 44px; }
.mvant-glass-card { border-radius: 16px; padding: 26px 24px; }
.mvant-glass-control { border-radius: 14px; padding: 16px 22px; }

/* ---------- Selected Pieces ---------- */
/* Card comercial reutilizable (.mvant-card): imagen limpia arriba, SIN overlay de texto —
   toda la información comercial vive DEBAJO, en flujo normal, nunca superpuesta a la
   foto. El único detalle con "liquid glass" es el badge de "Últimas unidades" (chip
   chico) — el resto del bloque de info usa una superficie plana simple, coherente con el
   pedido de "glass muy sutil solo en detalles, no en toda la card". Mobile: scroll
   horizontal nativo con scroll-snap (sin JS). Desktop (≥900px): grid de hasta 4 columnas.
   Pensada para reutilizarse en catálogo/otras listas más adelante — solo depende de
   .mvant-card + contenedor, sin acoplarse a Selected Pieces. */
/* El bleed (margen negativo + padding) DEBE igualar exactamente el padding real de
   .container-wide en cada ancho para que el carrusel llegue al borde del viewport sin
   pasarse de largo. Antes usaba un -24px fijo en todo el rango <900px, pero
   .container-wide pasa a 20px de padding en <=640px (ver @media arriba) — ese desajuste
   de 4px por lado era overflow de documento REAL (scrollWidth 397 vs clientWidth 393 a
   393px), invisible a simple vista porque body ya tiene overflow-x:hidden, pero que sí
   afectaba a cualquier elemento position:fixed;inset:0 (como el drawer de la Bolsa,
   ver bag.js): en mobile Safari, un documento con overflow horizontal real infla el
   viewport de layout más allá del ancho físico del teléfono, y por eso el drawer
   aparecía "cortado/desplazado" — solo en Home, porque solo aquí existía ese overflow. */
.mvant-pieces {
  display: flex;
  gap: 16px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  padding-bottom: 4px;
  margin: 0 -20px;
  padding-left: 20px;
  padding-right: 20px;
}
@media (min-width: 641px) {
  .mvant-pieces { margin: 0 -32px; padding-left: 32px; padding-right: 32px; }
}
.mvant-pieces::-webkit-scrollbar { display: none; }
/* Card mobile: flex-basis 100% del content-box de .mvant-pieces (=viewport - 40px, el
   mismo gutter de .container-wide) — no del viewport. Con scroll-snap-type:x mandatory,
   el navegador ajusta el scroll inicial para alinear la primera card exactamente al
   borde del carrusel (consume los 20px de padding-left como parte del snap), así que la
   card renderizada ocupa realmente ~89-91% del viewport (verificado: 328px de 393px) y
   el sobrante fijo de 40px del gutter menos el gap de 16px deja ~24px de "pista" de la
   siguiente card, constante en cualquier ancho — ni una fórmula en vw ni un % menor a
   100 lo logran una vez se cuenta ese comportamiento real del navegador. */
.mvant-pieces .mvant-card { flex: 0 0 100%; scroll-snap-align: start; }
@media (min-width: 560px) {
  .mvant-pieces .mvant-card { flex-basis: 46vw; }
}
@media (min-width: 900px) {
  .mvant-pieces { display: grid; grid-template-columns: repeat(4, 1fr); overflow: visible; margin: 0; padding: 0; }
  .mvant-pieces .mvant-card { flex-basis: auto; }
}

.mvant-card { display: flex; flex-direction: column; color: inherit; }
/* Corrección de raíz (Home Selected Pieces + Catálogo comparten esta misma clase base):
   antes aspect-ratio:3/4 + object-fit:cover recortaba ~12.5% de cada lado de toda foto
   cuadrada (1:1) real. aspect-ratio:1/1 coincide con las fotos actuales — cero recorte —
   y --product-media-fit (contain) es la red de seguridad para una foto futura no cuadrada:
   nunca corta, solo dejaría un margen del propio fondo de la caja. */
.mvant-card-media {
  position: relative;
  aspect-ratio: 1 / 1;
  border-radius: var(--product-media-radius);
  overflow: hidden;
  background: var(--bg-card);
}
.mvant-card-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: var(--product-media-fit);
  object-position: center;
  transition: transform 0.5s var(--ease);
}
.mvant-card:hover .mvant-card-media img,
.mvant-card:focus-visible .mvant-card-media img { transform: scale(1.04); }

.mvant-card-info {
  padding-top: 14px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
}
.mvant-card-name {
  font-size: 0.95rem;
  font-weight: 600;
  color: #fff;
  line-height: 1.3;
  margin: 0;
  /* Máximo 2 líneas — nombres largos terminan en "…" en vez de desbordar la card. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.mvant-card-row { display: flex; align-items: center; width: 100%; }
.mvant-card-price { font-size: 1.05rem; font-weight: 700; color: #fff; }
.mvant-card-sizes { font-size: 0.74rem; letter-spacing: 0.02em; color: var(--text-muted); }
.mvant-card-sizes.is-out { color: var(--silver); text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.68rem; }
.mvant-card-avail-dot {
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #4ade80;
  margin-right: 6px;
  vertical-align: middle;
}
/* Único detalle con blur real de la card: un chip chico, económico de pintar. */
.mvant-card-badge {
  display: inline-flex;
  align-items: center;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--mvant-accent);
  padding: 4px 10px;
  border-radius: 999px;
}
.mvant-card-cta {
  margin-top: 2px;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
  display: inline-flex;
  align-items: center;
  gap: 6px;
  transition: color 0.2s ease;
}
.mvant-card-cta .cta-arrow { transition: transform 0.2s ease; }
.mvant-card:hover .mvant-card-cta,
.mvant-card:focus-visible .mvant-card-cta { color: #fff; }
.mvant-card:hover .mvant-card-cta .cta-arrow,
.mvant-card:focus-visible .mvant-card-cta .cta-arrow { transform: translateX(3px); }

/* ---------- Explora MVANT ---------- */
.mvant-explore-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
@media (min-width: 900px) {
  .mvant-explore-grid { grid-template-columns: repeat(4, 1fr); gap: 24px; }
}
.mvant-explore-card {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: space-between;
  gap: 24px;
  min-height: 156px;
  color: #fff;
  transition: border-color 0.2s ease, transform 0.2s ease, background-color 0.2s ease;
}
.mvant-explore-card:hover,
.mvant-explore-card:focus-visible {
  border-color: rgba(255, 255, 255, 0.28);
  transform: translateY(-2px);
}
.mvant-explore-num { font-size: 0.72rem; letter-spacing: 0.14em; color: var(--text-muted); }
.mvant-explore-label { font-size: 1.1rem; font-weight: 600; letter-spacing: -0.01em; }
.mvant-explore-cta {
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--mvant-accent);
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

/* ---------- Cómo comprar (teaser) ---------- */
.mvant-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-bottom: 36px; }
@media (max-width: 640px) {
  .mvant-steps { grid-template-columns: 1fr; }
}
.mvant-step { display: flex; align-items: center; gap: 16px; }
.mvant-step-num { font-size: 1.5rem; font-weight: 300; color: var(--mvant-accent); flex-shrink: 0; }
.mvant-step-label { font-size: 0.95rem; font-weight: 500; }
.mvant-section-cta { display: flex; justify-content: center; }

/* ---------- Contacto (teaser) ---------- */
.mvant-contact-teaser { text-align: center; }
.mvant-contact-teaser .section-title { margin-bottom: 32px; }
.mvant-contact-teaser-ctas { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; }
.mvant-contact-cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  flex: 1 1 240px;
  max-width: 320px;
  min-height: 64px;
  padding: 20px 28px;
  border-radius: 16px;
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #fff;
  transition: border-color 0.2s ease, transform 0.2s ease, color 0.2s ease, text-shadow 0.2s ease;
}
.mvant-contact-cta:hover,
.mvant-contact-cta:focus-visible {
  border-color: rgba(255, 255, 255, 0.3);
  transform: translateY(-2px);
}
.mvant-contact-cta.is-disabled { opacity: 0.4; pointer-events: none; }

/* ---------- Experiencia de marca ---------- */

.brand-experience { position: relative; min-height: 100vh; display: flex; align-items: center; justify-content: center; overflow: hidden; background: var(--bg-alt); }
.brand-experience-media {
  position: absolute;
  inset: -8%;
  background: radial-gradient(circle at 30% 30%, var(--bg-elevated), var(--bg-alt) 65%);
  will-change: transform;
}
.brand-experience-overlay { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(8, 8, 8, 0.35), rgba(8, 8, 8, 0.88)); }
.brand-experience-content { position: relative; z-index: 2; text-align: center; max-width: 720px; padding: 0 24px; display: flex; flex-direction: column; align-items: center; gap: 22px; }
.brand-experience-content h2 { font-size: clamp(2.2rem, 6vw, 4.2rem); font-weight: 600; letter-spacing: 0.01em; margin: 0; }
.brand-experience-content p { font-size: 1rem; color: var(--text-muted); line-height: 1.6; max-width: 520px; margin: 0; }

.brand-experience--expanded { min-height: auto; flex-direction: column; gap: 72px; padding: 160px 0 120px; }
.brand-pillars {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 1400px;
  margin: 0 auto;
  padding: 0 24px;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 32px;
  text-align: left;
}
.brand-pillar p { color: var(--text-muted); font-size: 0.9rem; line-height: 1.7; margin: 0; text-align: justify; text-justify: inter-word; }
@media (min-width: 1700px) {
  .brand-pillars { max-width: 1600px; }
}
@media (max-width: 860px) {
  .brand-pillars { grid-template-columns: 1fr; gap: 36px; text-align: center; }
}

/* ---------- Condiciones (página independiente — layout editorial premium) ---------- */

.section-conditions .container-wide { max-width: 1180px; padding: 0 60px; }
@media (max-width: 900px) { .section-conditions .container-wide { padding: 0 32px; } }
@media (max-width: 560px) { .section-conditions .container-wide { padding: 0 20px; } }

.section-conditions .section-header { margin-bottom: 0; }
.section-conditions .section-title { font-size: clamp(2.25rem, 5vw, 3.5rem); }
.conditions-title-accent { display: block; width: 52px; height: 3px; background: var(--mvant-accent); margin-top: 22px; }

/* Override específico de .reveal ya inerte junto con el global (ver "Scroll reveal" arriba) */
.section-conditions .reveal { transform: none; }

/* Los 3 pasos: tarjetas editoriales */
.conditions-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; margin-top: 64px; }

.conditions-step-card {
  position: relative;
  background: var(--bg-card);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 6px;
  padding: 34px;
  overflow: hidden;
  transition: border-color 0.28s ease, box-shadow 0.28s ease;
}
.conditions-step-card::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: var(--mvant-accent);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s ease;
}
.conditions-step-card:hover { border-color: rgba(0, 168, 255, 0.55); box-shadow: 0 0 20px rgba(0, 168, 255, 0.05); }
.conditions-step-card:hover::before { transform: scaleX(1); }
.conditions-step-card:nth-child(2) { transition-delay: 0.08s; }
.conditions-step-card:nth-child(3) { transition-delay: 0.16s; }

.conditions-step-icon { display: block; color: rgba(255, 255, 255, 0.55); margin-bottom: 20px; transition: color 0.28s ease; }
.conditions-step-card:hover .conditions-step-icon { color: var(--mvant-neon); }

.conditions-step-number { display: block; font-size: 2.3rem; font-weight: 300; line-height: 1; color: rgba(0, 168, 255, 0.75); margin-bottom: 16px; }
.conditions-step-card h3 { font-size: 1.08rem; font-weight: 600; color: #fff; margin: 0 0 10px; }
.conditions-step-card p { color: #a7a7a7; font-size: 0.88rem; font-weight: 300; line-height: 1.6; margin: 0; }

/* Información / condiciones: bloques editoriales, sin tarjetas */
.conditions-info { margin-top: 92px; }
.conditions-info-label { display: block; margin-bottom: 40px; }

.conditions-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 44px 56px; }
.conditions-item-accent { display: block; width: 28px; height: 2px; background: var(--mvant-accent); margin-bottom: 16px; }
.conditions-item h4 { font-size: 0.78rem; letter-spacing: 0.16em; text-transform: uppercase; font-weight: 600; color: #fff; margin: 0 0 10px; }
.conditions-item p { color: #a7a7a7; font-size: 0.88rem; font-weight: 300; line-height: 1.6; max-width: 480px; margin: 0; }
.conditions-item:nth-child(2) { transition-delay: 0.06s; }
.conditions-item:nth-child(3) { transition-delay: 0.12s; }
.conditions-item:nth-child(4) { transition-delay: 0.18s; }

/* Cambios y devoluciones: callout de ancho completo, no una alerta */
.conditions-note {
  margin-top: 96px;
  padding: 36px 40px;
  background: rgba(255, 255, 255, 0.015);
  border-left: 2px solid var(--mvant-accent);
}
.conditions-note h4 { font-size: 0.74rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--silver); font-weight: 500; margin: 0 0 16px; }
.conditions-note p { color: #a7a7a7; font-size: 0.85rem; font-weight: 300; line-height: 1.65; max-width: 800px; margin: 0; }

@media (max-width: 900px) {
  .conditions-steps { grid-template-columns: repeat(2, 1fr); }
  .conditions-step-card:last-child { grid-column: 1 / -1; }
}
@media (max-width: 640px) {
  .conditions-steps { grid-template-columns: 1fr; gap: 20px; margin-top: 48px; }
  .conditions-step-card:last-child { grid-column: auto; }
  .conditions-step-card { padding: 28px; }
  .conditions-info { margin-top: 64px; }
  .conditions-info-label { margin-bottom: 28px; }
  .conditions-grid { grid-template-columns: 1fr; gap: 32px; }
  .conditions-note { margin-top: 64px; padding: 28px 24px; }
}

/* ---------- Footer ---------- */

.site-footer { border-top: 1px solid var(--border); background: var(--bg-alt); padding: 64px 0 28px; }
.footer-inner { max-width: 1400px; margin: 0 auto; padding: 0 32px; }
.footer-top { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-start; gap: 32px; padding-bottom: 40px; }
.footer-logo { font-size: 1.3rem; }
.footer-links { display: flex; flex-wrap: wrap; gap: 26px; }
.footer-links a { display: inline-block; padding: 6px 0; font-size: 0.75rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-muted); transition: color 0.3s ease, text-shadow 0.3s ease; }
.footer-links a:hover { color: var(--accent); }
.footer-links a.is-disabled { pointer-events: none; opacity: 0.4; }
.footer-bottom {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  padding-top: 26px;
  border-top: 1px solid var(--border);
  font-size: 0.7rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--silver);
}

/* ---------- Página de producto (MVANT 2.0) ----------
   Mismo lenguaje visual del catálogo/Home: fondo global sin cajas nuevas, glass solo en
   superficies pequeñas (panel de info en desktop, controles de talla, CTA), producto
   siempre protagonista. Reutiliza .mvant-glass (definido más abajo, "MVANT LIQUID
   GLASS") — no crea un sistema de vidrio paralelo. */

.product-main { padding: 150px 0 120px; }
@media (max-width: 900px) {
  /* CAUSA REAL del vacío superior + los bordes pegados en mobile: el shorthand de 3
     valores de arriba ("150px 0 120px") asigna 0 a left/right — nunca lo toca, porque en
     desktop eso queda enmascarado: .container-wide tiene max-width:1400px + margin:auto,
     así que en pantallas >=1400px ya hay margen EXTERIOR aunque el padding interno sea 0.
     En mobile no existe ese margen exterior (el viewport nunca llega a 1400px), así que
     con padding interno 0 todo el contenido queda pegado al borde real de la pantalla.
     Mismo patrón de bug ya documentado y corregido para .catalog-page.
     Arreglo: en vez de tocar la regla base (eso SÍ movería el desktop aprobado, sumando
     32px que hoy no se ven), se reafirma acá left/right solo dentro de esta media query
     — mismo gutter que ya usa el catálogo mobile aprobado. padding-top baja de 150px a
     120px: header real mobile mide 89px, así que quedan ~31px de aire tras el header
     (dentro del rango de 24-40px pedido, nunca pegado). */
  .product-main {
    padding-top: 120px;
    padding-bottom: 130px;
    padding-left: clamp(14px, 4vw, 18px);
    padding-right: clamp(14px, 4vw, 18px);
  }
}
.back-link { display: inline-block; font-size: 0.74rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); margin-bottom: 40px; transition: color 0.3s ease; }
@media (max-width: 900px) { .back-link { margin-bottom: 28px; } }
.back-link:hover { color: var(--accent); }

/* minmax(0, ...) en vez de fr sueltos: sin esto, una columna con contenido "ancho" por
   naturaleza (la caja de galería con aspect-ratio) empuja su propio track más allá del
   ancho real del grid en vez de encogerse — el mismo bug de "blowout" ya visto en el grid
   del catálogo. */
.product-page { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr); gap: 64px; align-items: start; }
@media (max-width: 900px) { .product-page { grid-template-columns: minmax(0, 1fr); gap: 32px; } }

.gallery { position: sticky; top: 120px; }
@media (max-width: 900px) { .gallery { position: static; } }

/* Sin aspect-ratio fijo: la caja se ajusta a la proporción real de la fotografía
   (igual que .product-card-media en catálogo/"También te puede interesar"), en vez de
   forzar la fotografía a una proporción de caja arbitraria. Con fotos 1:1 la caja queda
   cuadrada, sin bandas vacías; con una foto futura de otra proporción, max-height +
   object-fit:contain evitan que la caja crezca de forma desproporcionada sin recortar. */
.gallery-main {
  position: relative;
  max-width: 560px;
  max-height: 640px;
  margin: 0 auto;
  border-radius: 18px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
}
.gallery-main img { display: block; width: 100%; height: auto; max-height: 640px; object-fit: var(--product-media-fit); object-position: center; }

.gallery-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.4);
  background: rgba(8, 8, 8, 0.55);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.95rem;
  line-height: 1;
  cursor: pointer;
  opacity: 0.85;
  transition: opacity 0.25s ease, border-color 0.25s ease, color 0.25s ease, background-color 0.25s ease;
}
.gallery-main:hover .gallery-arrow { opacity: 1; }
.gallery-arrow-prev { left: 12px; }
.gallery-arrow-next { right: 12px; }
.gallery-arrow:hover { border-color: var(--mvant-accent); color: var(--mvant-accent); background: rgba(8, 8, 8, 0.75); }

/* Miniaturas — reemplazan los puntos genéricos por fotos reales del producto: en
   desktop dejan ver de un vistazo todos los ángulos disponibles; en mobile son el
   "solución táctil simple" pedida (scroll horizontal nativo, sin librería). */
.gallery-thumbs {
  display: flex;
  gap: 10px;
  margin-top: 14px;
  max-width: 560px;
  margin-left: auto;
  margin-right: auto;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  padding-bottom: 2px;
}
.gallery-thumbs::-webkit-scrollbar { display: none; }
.gallery-thumb {
  flex-shrink: 0;
  width: 64px;
  aspect-ratio: 3 / 4;
  padding: 0;
  border-radius: 10px;
  border: 1px solid var(--border);
  background: var(--bg-card);
  overflow: hidden;
  cursor: pointer;
  opacity: 0.65;
  transition: border-color 0.2s ease, opacity 0.2s ease;
}
/* contain (no cover): la miniatura sigue siendo 3:4 para no rediseñar la galería, pero la
   foto real (1:1) ya no se recorta — el propio fondo var(--bg-card) de la miniatura
   rellena el margen si lo hay, igual que el resto del sistema de product media. */
.gallery-thumb img { width: 100%; height: 100%; object-fit: var(--product-media-fit); object-position: center; }
.gallery-thumb:hover { opacity: 0.9; }
.gallery-thumb.active { border-color: var(--mvant-accent); opacity: 1; }

/* Panel de información — Liquid/Soft Glass premium solo en desktop (ver @media 900px
   más abajo, que lo neutraliza en mobile para que la ficha no se sienta una caja negra
   encima del fondo global). */
.product-info-panel { border-radius: 20px; padding: 36px 40px; }
@media (max-width: 900px) {
  .product-info-panel {
    background: none;
    border: none;
    box-shadow: none;
    padding: 0;
  }
  .product-info-panel::before { content: none; }
}

.product-info-brand { display: block; font-size: 0.75rem; letter-spacing: 0.18em; text-transform: uppercase; color: var(--silver); margin-bottom: 10px; }
.product-info-name { font-size: clamp(1.8rem, 3vw, 2.6rem); font-weight: 600; letter-spacing: -0.01em; margin: 0 0 8px; }
.product-info-ref { display: block; font-size: 0.74rem; color: var(--text-muted); letter-spacing: 0.06em; margin-bottom: 18px; }
/* Precio: blanco + un poco más grande que el resto de la ficha — fácil de identificar
   sin recurrir a un verde ecommerce genérico, la marca sigue siendo azul MVANT/blanco. */
.product-info-price { display: block; font-size: 1.65rem; font-weight: 700; color: #fff; letter-spacing: -0.01em; margin-bottom: 20px; }
.product-info-desc { color: var(--text-muted); line-height: 1.7; font-size: 0.92rem; max-width: 46ch; margin: 0; }

.section-divider { height: 1px; background: var(--border); margin: 26px 0; border: none; }

.purchase-info-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 0.76rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  transition: color 0.2s ease;
}
.purchase-info-link:hover { color: var(--mvant-accent); }
.purchase-info-link .cta-arrow { transition: transform 0.2s ease; }
.purchase-info-link:hover .cta-arrow { transform: translateX(3px); }

/* Tallas — soft glass control pequeño (mismos tokens que .search-input/.sort-select).
   disponible: borde tenue · seleccionada: borde azul MVANT · agotada: visible pero
   deshabilitada (no se ocultan tallas ya cargadas en products.json). */
.size-selector { margin-bottom: 24px; }
.size-grid { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 12px; }
/* Mobile: grid de verdad (5 columnas fijas) en vez de flex-wrap — con flex, la última
   fila de una lista de 14 tallas queda con 2 sueltas del tamaño natural de su contenido,
   una retícula irregular. Con grid todas las filas comparten el mismo ancho de columna. */
@media (max-width: 900px) {
  .size-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 8px; }
  .size-btn { min-width: 0; width: 100%; }
}
/* 3 estados MUY diferenciados a propósito (mismo sistema en desktop y mobile, solo
   cambia el tamaño vía el grid mobile de arriba):
   - disponible: borde claramente visible + fondo "elevado" (más claro que el glass base)
     — se lee de inmediato como algo tocable.
   - seleccionada: máxima jerarquía — borde azul MVANT de 2px, relleno azul translúcido
     más saturado que antes, glow pequeño y estático (sin animación).
   - agotada: casi plana contra el fondo — borde apenas visible, texto muy apagado,
     tachada — sigue ahí para que se entienda que la talla existe, pero nadie la confunde
     con una disponible. */
.size-btn {
  min-width: 48px;
  height: 48px;
  padding: 0 10px;
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(255, 255, 255, 0.4);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
  color: #fff;
  font-weight: 500;
  font-size: 0.85rem;
  font-family: inherit;
  cursor: pointer;
  transition: border-color 0.2s ease, background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .size-btn { backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
}
.size-btn:hover:not(:disabled):not(.selected) { border-color: rgba(255, 255, 255, 0.65); background: rgba(255, 255, 255, 0.1); }
.size-btn.selected {
  border: 2px solid var(--mvant-accent);
  background: rgba(0, 168, 255, 0.22);
  color: #fff;
  font-weight: 700;
  box-shadow: 0 0 0 1px rgba(0, 168, 255, 0.25), 0 0 10px rgba(0, 168, 255, 0.35);
}
.size-btn:disabled {
  background: rgba(255, 255, 255, 0.02);
  border-color: rgba(255, 255, 255, 0.07);
  box-shadow: none;
  color: rgba(255, 255, 255, 0.24);
  font-weight: 400;
  text-decoration: line-through;
  cursor: not-allowed;
}
.size-empty { color: var(--text-muted); font-size: 0.85rem; margin-top: 12px; }

/* Disponibilidad: 3 estados reales (ver getAvailability() en shared.js) — el punto usa
   azul MVANT para "disponible"/"pocas unidades" (sigue siendo comprable) y gris apagado
   solo para "agotado"; el texto ya distingue los 3 estados sin necesitar 3 colores. */
.availability-row { display: flex; align-items: center; gap: 9px; margin-bottom: 22px; }
.availability-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
.availability-row:has(.is-out) .availability-dot { background: var(--text-muted); }
.availability-text { font-size: 0.72rem; font-weight: 600; letter-spacing: 0.14em; }
.availability-text.is-low { color: var(--mvant-accent); }
.availability-text.is-out { color: var(--text-muted); }

/* CTA WhatsApp — soft glass + icono discreto, NO el verde genérico de WhatsApp. Un toque
   de verde muy sutil aparece solo en hover/focus, cuando el botón ya está activo. */
.btn-whatsapp {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 16px 20px;
  border-radius: 14px;
  color: #fff;
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  transition: border-color 0.25s ease, background-color 0.25s ease, opacity 0.25s ease;
}
.btn-whatsapp-icon { flex-shrink: 0; opacity: 0.85; }
.btn-whatsapp .cta-arrow { display: inline-block; transition: transform 0.3s ease; }
.btn-whatsapp:not([aria-disabled="true"]):hover,
.btn-whatsapp:not([aria-disabled="true"]):focus-visible {
  border-color: rgba(37, 211, 102, 0.55);
  background: rgba(10, 14, 18, 0.4);
}
.btn-whatsapp:not([aria-disabled="true"]):hover .btn-whatsapp-icon,
.btn-whatsapp:not([aria-disabled="true"]):focus-visible .btn-whatsapp-icon { opacity: 1; color: #25d366; }
.btn-whatsapp:not([aria-disabled="true"]):hover .cta-arrow { transform: translateX(5px); }
.btn-whatsapp[aria-disabled="true"] { opacity: 0.55; pointer-events: none; }

/* CTA secundario ("Agregar a la bolsa") — misma familia visual que el botón de WhatsApp
   pero deliberadamente más discreto (sin relleno, borde tenue): la jerarquía debe quedar
   clara de un vistazo, WhatsApp es la acción principal. */
.product-cta-group { display: flex; flex-direction: column; gap: 10px; }
.btn-add-bag {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  padding: 14px 20px;
  border-radius: 14px;
  background: transparent;
  border: 1px solid var(--border-strong);
  color: var(--text-muted);
  font-size: 0.76rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-family: inherit;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease;
}
.btn-add-bag:hover:not(:disabled) { border-color: var(--mvant-accent); color: #fff; }
.btn-add-bag:disabled { opacity: 0.45; cursor: not-allowed; }
.whatsapp-hint { font-size: 0.72rem; color: var(--text-muted); margin-top: 10px; min-height: 16px; }

/* ---------- Dock de compra fijo (SOLO mobile) ----------
   CSS puro, sin listeners de scroll ni JS de layout: solo position:fixed + un toggle de
   [hidden] cuando ya hay talla + WhatsApp habilitados (ver updateWhatsappLink en
   product.js). Se oculta por completo si no aplica, para no duplicar el CTA principal
   sin necesidad ni tapar contenido. */
.mobile-buy-dock { display: none; }
@media (max-width: 900px) {
  .mobile-buy-dock:not([hidden]) {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    position: fixed;
    /* env(safe-area-inset-*) protege el dock del home indicator / esquinas redondeadas
       en iPhones con notch (requiere viewport-fit=cover en product.html); en navegadores
       sin soporte o sin safe area, el fallback "0px" lo deja exactamente igual que antes. */
    left: calc(12px + env(safe-area-inset-left, 0px));
    right: calc(12px + env(safe-area-inset-right, 0px));
    bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    z-index: 80;
    padding: 14px 18px;
    border-radius: 16px;
  }
}
.mobile-buy-dock-price { font-size: 1.05rem; font-weight: 700; color: #fff; flex-shrink: 0; }
.mobile-buy-dock-cta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 0.74rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #fff;
  white-space: nowrap;
  transition: color 0.2s ease, text-shadow 0.2s ease;
}
.mobile-buy-dock-cta .cta-arrow { transition: transform 0.2s ease; }
.mobile-buy-dock-cta:hover .cta-arrow { transform: translateX(3px); }

/* Con el dock visible (talla elegida), el pie de página real (Bogotá/© MVANT) queda al
   final del scroll justo detrás del dock fijo — este selector solo existe en product.html
   (#mobileBuyDock no está en ninguna otra página), así que no toca el footer del resto
   del sitio. */
@media (max-width: 900px) {
  body:has(#mobileBuyDock:not([hidden])) .site-footer { padding-bottom: 86px; }
}

/* ---------- Relacionados ---------- */
.related-products { margin-top: 90px; }
@media (max-width: 900px) {
  .related-products { margin-top: 56px; }
  /* #relatedGrid es .product-grid (compartida con Home/admin) — se scopea por id para no
     tocar esa clase en otras páginas. minmax(0,1fr) evita el mismo "grid blowout" ya
     corregido en el catálogo (un nombre largo puede forzar una columna a crecer más que
     la otra); el gap baja del valor desktop (48px/32px, pensado para 3 columnas anchas) a
     algo proporcional a 2 columnas mobile. */
  #relatedGrid.product-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 16px; }
}

/* ============================================================
   Bolsa MVANT — icono/contador del header + drawer (js/bag.js)
   ============================================================
   Disponible en las 6 páginas públicas (Home, Catálogo, Producto, Nosotros, Cómo
   comprar, Contacto): mismo botón en el header, mismo drawer inyectado por bag.js. Sin
   backend/pago/reserva de stock — solo pedir por WhatsApp lo que el cliente ya eligió. */

.bag-toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: none;
  border: none;
  color: #fff;
  opacity: 0.85;
  cursor: pointer;
  transition: opacity 0.2s ease, color 0.2s ease;
}
.bag-toggle:hover { opacity: 1; color: var(--mvant-accent); }
.bag-count {
  position: absolute;
  top: 1px;
  right: 1px;
  min-width: 15px;
  height: 15px;
  padding: 0 3px;
  border-radius: 999px;
  background: var(--mvant-accent);
  color: #000;
  font-size: 0.6rem;
  font-weight: 700;
  line-height: 15px;
  text-align: center;
}
.bag-count[hidden] { display: none; }

body.bag-open { overflow: hidden; }

.bag-drawer-wrap { position: fixed; inset: 0; z-index: 200; }
.bag-drawer-wrap[hidden] { display: none; }
.bag-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.5);
  opacity: 0;
  transition: opacity 0.3s ease;
}
.bag-drawer-wrap.is-open .bag-backdrop { opacity: 1; }

.bag-drawer {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  /* min(92vw, 390px): nunca supera el viewport y deja un margen visible del lado
     izquierdo (el fondo/backdrop se asoma) en vez de ocupar el 100% del ancho. */
  width: min(92vw, 390px);
  display: flex;
  flex-direction: column;
  border-radius: 0;
  border-width: 0 0 0 1px;
  transform: translateX(100%);
  transition: transform 0.3s var(--ease);
  padding: 24px;
}
.bag-drawer-wrap.is-open .bag-drawer { transform: translateX(0); }

.bag-drawer-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; flex-shrink: 0; }
.bag-drawer-title { font-size: 1.05rem; font-weight: 600; }
.bag-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  background: none;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  transition: color 0.2s ease;
}
.bag-close:hover { color: #fff; }

.bag-drawer-items { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; padding-right: 2px; }
.bag-empty { color: var(--text-muted); font-size: 0.85rem; text-align: center; padding: 48px 0; }

.bag-item { display: flex; gap: 12px; padding-bottom: 16px; border-bottom: 1px solid var(--border); }
.bag-item:last-child { border-bottom: none; padding-bottom: 0; }
.bag-item-media { flex-shrink: 0; width: 64px; aspect-ratio: 3 / 4; border-radius: 10px; overflow: hidden; background: var(--bg-card); }
/* contain (no cover), misma regla global de product media: la miniatura de la Bolsa
   mantiene su tamaño/diseño actual, solo deja de recortar el tenis/perfume. */
.bag-item-media img { width: 100%; height: 100%; object-fit: var(--product-media-fit); object-position: center; }
.bag-item-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.bag-item-name { font-size: 0.85rem; font-weight: 600; color: #fff; line-height: 1.3; overflow-wrap: anywhere; }
.bag-item-meta { font-size: 0.68rem; color: var(--text-muted); letter-spacing: 0.02em; }
.bag-item-price { font-size: 0.85rem; font-weight: 700; color: #fff; }
.bag-qty { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
.bag-qty-btn {
  width: 26px;
  height: 26px;
  border-radius: 8px;
  border: 1px solid var(--border-strong);
  background: transparent;
  color: #fff;
  cursor: pointer;
  font-size: 0.95rem;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: inherit;
}
.bag-qty-btn:hover { border-color: var(--mvant-accent); }
.bag-qty-value { min-width: 16px; text-align: center; font-size: 0.8rem; }
.bag-remove {
  margin-left: auto;
  background: none;
  border: none;
  color: var(--text-muted);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  cursor: pointer;
  font-family: inherit;
}
.bag-remove:hover { color: #fff; }

.bag-drawer-footer { flex-shrink: 0; border-top: 1px solid var(--border); padding-top: 16px; margin-top: 16px; }
.bag-subtotal-row { display: flex; align-items: center; justify-content: space-between; font-size: 0.92rem; font-weight: 700; color: #fff; margin-bottom: 8px; }
.bag-disclaimer { font-size: 0.68rem; color: var(--text-muted); line-height: 1.5; margin: 0 0 14px; }

@media (max-width: 480px) {
  .bag-drawer { padding: 20px; }
}

/* ---------- Toast discreto ("Añadido a tu bolsa ✓") ---------- */
.mvant-toast {
  position: fixed;
  left: 50%;
  bottom: 90px;
  transform: translateX(-50%) translateY(10px);
  z-index: 300;
  max-width: calc(100vw - 32px);
  padding: 12px 20px;
  border-radius: 12px;
  background: rgba(10, 14, 18, 0.92);
  border: 1px solid rgba(255, 255, 255, 0.14);
  color: #fff;
  font-size: 0.8rem;
  font-weight: 600;
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.25s ease, transform 0.25s ease;
}
.mvant-toast.is-visible { opacity: 1; transform: translateX(-50%) translateY(0); }

/* ============================================================
   Panel de administración
   ============================================================ */

.admin-shell { min-height: 100vh; font-size: 15px; }

.field { margin-bottom: 18px; display: flex; flex-direction: column; gap: 7px; }
.field label { font-size: 0.78rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-muted); }
.field input, .field select, .field textarea {
  background: var(--bg);
  border: 1px solid var(--border);
  color: #fff;
  padding: 13px 14px;
  font-size: 0.95rem;
  font-family: inherit;
  outline: none;
  width: 100%;
}
.field input:focus, .field select:focus, .field textarea:focus { border-color: var(--accent); }
.field textarea { resize: vertical; min-height: 80px; }
.field-hint { font-size: 0.78rem; color: var(--text-muted); line-height: 1.5; margin: 2px 0 0; }
.field-warning { color: var(--mvant-accent); font-size: 0.78rem; margin: 6px 0 0; }

.checkbox-field { display: flex; align-items: center; gap: 9px; font-size: 0.88rem; color: var(--text-muted); }
.checkbox-field input { width: auto; flex-shrink: 0; }
.checkbox-field-block { align-items: flex-start; margin-bottom: 18px; }
.checkbox-field-block input { margin-top: 3px; }

.btn {
  border: none;
  padding: 12px 20px;
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  cursor: pointer;
  transition: filter 0.2s ease, opacity 0.2s ease;
}
.btn:hover { filter: brightness(1.15); }
.btn:disabled { opacity: 0.35; cursor: not-allowed; filter: none; }
.btn-primary { background: var(--accent); color: #000; }
.btn-secondary { background: transparent; color: var(--accent); border: 1px solid var(--accent); }
.btn-danger-solid { background: #e5484d; color: #fff; }
.btn-ghost { background: transparent; color: var(--text-muted); border: 1px solid var(--border); }
.btn-ghost:hover { border-color: var(--accent); color: #fff; }
.btn-block { width: 100%; }
.btn-sm { padding: 8px 14px; font-size: 0.72rem; }
.btn-lg { padding: 15px 26px; font-size: 0.85rem; }

.error-msg:not(:empty) { color: #ff8a8a; font-size: 0.85rem; padding: 10px 12px; background: rgba(229, 72, 77, 0.1); border: 1px solid rgba(229, 72, 77, 0.35); margin: 12px 0; }
.error-msg:empty { display: none; }

.admin-header { background: var(--bg-card); border-bottom: 1px solid var(--border); padding: 18px 24px; position: sticky; top: 0; z-index: 30; }
.admin-header-inner { max-width: 1200px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }

.admin-main-wide { max-width: 1200px; margin: 0 auto; padding: 32px 24px 90px; }

/* ---------- Dashboard ---------- */

.admin-dashboard { margin-bottom: 28px; }
.admin-stats { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
@media (max-width: 900px) { .admin-stats { grid-template-columns: repeat(2, 1fr); } }
.admin-stat { display: flex; flex-direction: column; gap: 6px; padding: 20px 16px; background: var(--bg-card); border: 1px solid var(--border); text-align: center; }
.admin-stat-num { font-size: 2rem; font-weight: 700; color: var(--text); line-height: 1; }
.admin-stat-label { font-size: 0.72rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-muted); }
.admin-stat-ready { border-color: rgba(0, 168, 255, 0.4); }
.admin-stat-ready .admin-stat-num { color: var(--mvant-accent); }
.admin-dashboard-note { margin: 12px 2px 0; max-width: 780px; }

.admin-offline { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; }
.admin-offline[hidden] { display: none; }
.admin-offline-card { background: var(--bg-card); border: 1px solid var(--border); padding: 36px 32px; width: 100%; max-width: 480px; }
.admin-offline-card h1 { font-size: 1.05rem; font-weight: 600; margin: 0 0 14px; }
.admin-offline-card p { font-size: 0.85rem; color: var(--text-muted); line-height: 1.6; margin: 0 0 12px; }
.admin-offline-card pre { background: var(--bg); border: 1px solid var(--border); padding: 12px 14px; font-size: 0.82rem; color: var(--mvant-accent); overflow-x: auto; margin: 0 0 14px; }

/* ---------- Barra principal: + Nuevo producto, buscar, filtros ---------- */

.admin-toolbar { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-bottom: 16px; }
.admin-search-row { flex: 1 1 280px; min-width: 220px; }
.admin-search-input { width: 100%; background: var(--bg-card); border: 1px solid var(--border); color: #fff; padding: 13px 14px; font-size: 0.9rem; font-family: inherit; outline: none; }
.admin-search-input:focus { border-color: var(--accent); }

.admin-quickfilters { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.admin-quickfilters-spacer { flex: 1 1 auto; min-width: 8px; }
.chip-filter {
  background: transparent; border: 1px solid var(--border-strong); color: var(--text-muted);
  padding: 8px 16px; font-size: 0.78rem; font-weight: 600; letter-spacing: 0.02em;
  cursor: pointer; transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
}
.chip-filter:hover { border-color: var(--mvant-accent); color: #fff; }
.chip-filter.is-active { background: var(--mvant-accent); border-color: var(--mvant-accent); color: #000; }
.admin-select-compact { background: var(--bg-card); border: 1px solid var(--border); color: #fff; padding: 8px 12px; font-size: 0.78rem; font-family: inherit; outline: none; }
.admin-select-compact:focus { border-color: var(--accent); }

/* ---------- Herramientas (import/export) — deliberadamente discreto ---------- */

.admin-tools { margin-top: 28px; border-top: 1px solid var(--border); padding-top: 16px; }
.admin-tools summary { cursor: pointer; font-size: 0.78rem; color: var(--text-muted); letter-spacing: 0.02em; }
.admin-tools summary:hover { color: #fff; }
.admin-tools-body { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-top: 14px; }
.admin-tools-body .hint-text { flex-basis: 100%; margin: 10px 0 0; }

.hint-text { font-size: 0.78rem; color: var(--text-muted); line-height: 1.6; margin: 0 0 18px; }
.hint-text.is-warning { color: var(--mvant-accent); }

.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }

/* ---------- Opciones avanzadas (ID / slug) ---------- */

.advanced-options { border: 1px dashed var(--border-strong); padding: 14px 16px; margin: 4px 0 18px; }
.advanced-options summary { cursor: pointer; font-size: 0.78rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-muted); }
.advanced-options summary:hover { color: #fff; }
.advanced-options-body { margin-top: 14px; }
.advanced-options-body .field:last-child { margin-bottom: 0; }

/* ---------- Lista de productos ---------- */

.admin-bulk-bar { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-bottom: 12px; padding: 10px 12px; border: 1px solid var(--border); background: var(--bg-card); }
.admin-bulk-bar .checkbox-field { margin: 0; }
.admin-danger-text { color: #ff8a8a; border-color: rgba(229, 72, 77, 0.4); }
.admin-danger-text:hover { border-color: #ff8a8a; color: #fff; }

.admin-list { display: flex; flex-direction: column; gap: 8px; }
.admin-row {
  border: 1px solid var(--border); background: var(--bg-card); padding: 14px 16px;
  display: grid; grid-template-columns: auto 56px 1fr auto auto auto; align-items: center; gap: 16px;
}
@media (max-width: 1100px) { .admin-row { grid-template-columns: auto 56px 1fr; grid-template-areas: "select thumb main" "select thumb price" "actions actions actions"; row-gap: 8px; } }
.admin-row.is-selected { border-color: var(--accent); background: rgba(0, 168, 255, 0.06); }
.admin-item-select { width: 16px; height: 16px; flex-shrink: 0; cursor: pointer; }
.admin-row-thumb { width: 56px; height: 56px; background: var(--bg); display: flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; font-size: 0.58rem; color: var(--text-muted); text-align: center; }
.admin-row-thumb img { width: 100%; height: 100%; object-fit: cover; }
.admin-row-main { min-width: 0; }
.admin-row-name { font-weight: 600; font-size: 0.98rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.admin-row-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.admin-row-chips { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
.admin-row-price { font-weight: 600; font-size: 0.92rem; white-space: nowrap; }
.admin-row-stock { font-size: 0.8rem; color: var(--text-muted); white-space: nowrap; }
.admin-row-actions { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }
.admin-row-retire {
  background: none; border: none; color: var(--text-muted); font-size: 0.72rem;
  letter-spacing: 0.04em; text-transform: uppercase; cursor: pointer; padding: 8px 4px;
}
.admin-row-retire:hover { color: #ff8a8a; }

.status-chip { font-size: 0.66rem; letter-spacing: 0.03em; text-transform: uppercase; padding: 4px 9px; border-radius: 20px; font-weight: 600; white-space: nowrap; }
.status-chip-ready { background: rgba(0, 168, 255, 0.16); color: var(--mvant-accent); }
.status-chip-incomplete { background: rgba(255, 255, 255, 0.08); color: var(--text-muted); }
.status-chip-out { background: rgba(255, 255, 255, 0.08); color: var(--text-muted); }
.status-chip-featured { background: var(--mvant-accent); color: #000; }
.status-chip-good { background: rgba(0, 168, 255, 0.16); color: var(--mvant-accent); }
.status-chip-warn { background: rgba(255, 255, 255, 0.08); color: var(--text-muted); }
.status-chip-bad { background: rgba(229, 72, 77, 0.16); color: #ff8a8a; }
.status-chip-neutral { background: rgba(255, 255, 255, 0.06); color: var(--text-muted); }

/* ---------- Fotos: dropzone + tarjetas ---------- */

.photo-dropzone {
  border: 2px dashed var(--border-strong); background: var(--bg); padding: 36px 20px;
  text-align: center; transition: border-color 0.2s ease, background 0.2s ease;
}
.photo-dropzone.is-dragover { border-color: var(--mvant-accent); background: rgba(0, 168, 255, 0.06); }
.photo-dropzone-title { font-size: 1rem; font-weight: 600; margin: 0 0 10px; }
.photo-main-note { margin: 14px 0 6px; }

.photo-manager { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; }
.photo-card { width: 130px; }
.photo-card-media { position: relative; width: 130px; height: 130px; background: var(--bg); display: flex; align-items: center; justify-content: center; overflow: hidden; border: 1px solid var(--border); }
.photo-card-media img { width: 100%; height: 100%; object-fit: cover; }
.photo-card-loading { font-size: 0.7rem; color: var(--text-muted); }
.photo-card-badge { position: absolute; top: 6px; left: 6px; background: var(--mvant-accent); color: #000; font-size: 0.6rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; padding: 3px 7px; }
.photo-card-remove {
  position: absolute; top: 6px; right: 6px; width: 22px; height: 22px; border: none; border-radius: 50%;
  background: rgba(0, 0, 0, 0.65); color: #fff; font-size: 0.7rem; cursor: pointer; line-height: 1;
}
.photo-card-remove:hover { background: #e5484d; }
.photo-card-controls { display: flex; align-items: center; gap: 4px; margin-top: 6px; }
.photo-card-controls .btn-sm { padding: 5px 9px; }
.photo-card-status { font-size: 0.66rem; color: var(--text-muted); margin-left: auto; }
.photo-card-status.is-error { color: #ff8a8a; }

/* ---------- Tallas y stock ---------- */

.sizes-table { margin-top: 4px; }
.sizes-table-head {
  display: grid; grid-template-columns: 1fr 1fr 110px 40px; gap: 10px; padding: 0 4px 8px;
  font-size: 0.7rem; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-muted);
}
.size-row { display: grid; grid-template-columns: 1fr 1fr 110px 40px; gap: 10px; margin-bottom: 8px; align-items: center; }
.size-row-tag { font-size: 0.7rem; font-weight: 600; letter-spacing: 0.03em; text-transform: uppercase; text-align: center; padding: 6px 4px; }
.size-row-tag.is-available { color: var(--mvant-accent); }
.size-row-tag.is-out { color: var(--text-muted); }
.sizes-total { font-size: 0.9rem; font-weight: 600; margin: 14px 0 0; }

/* ---------- Revisión ---------- */

.review-card { display: flex; gap: 20px; padding: 18px; background: var(--bg); border: 1px solid var(--border); margin-bottom: 20px; }
.review-media { width: 110px; height: 110px; flex-shrink: 0; background: var(--bg-card); display: flex; align-items: center; justify-content: center; overflow: hidden; color: var(--text-muted); font-size: 0.7rem; }
.review-media img { width: 100%; height: 100%; object-fit: cover; }
.review-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.review-row { display: flex; justify-content: space-between; gap: 12px; font-size: 0.88rem; }
.review-label { color: var(--text-muted); font-size: 0.7rem; letter-spacing: 0.05em; text-transform: uppercase; }
.review-sizes { padding: 16px; background: var(--bg); border: 1px solid var(--border); }
.review-sizes-list { display: flex; flex-direction: column; gap: 6px; margin: 10px 0; }
.review-size-row { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; font-size: 0.85rem; }
.review-size-row .is-available { color: var(--mvant-accent); }
.review-size-row .is-out { color: var(--text-muted); }

/* ---------- Asistente de producto (nuevo / editar) ---------- */

body.wizard-open { overflow: hidden; }

.wizard-overlay { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; padding: 24px; }
.wizard-overlay[hidden] { display: none; }
.wizard-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.7); }
.wizard-panel {
  position: relative; background: var(--bg-card); border: 1px solid var(--border);
  width: 100%; max-width: 720px; max-height: 90vh; display: flex; flex-direction: column;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
}
.wizard-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
.wizard-header h2 { font-size: 1.05rem; font-weight: 600; margin: 0; }
.wizard-close { background: none; border: none; color: var(--text-muted); font-size: 1.1rem; cursor: pointer; padding: 4px 8px; }
.wizard-close:hover { color: #fff; }

.wizard-steps { display: flex; list-style: none; margin: 0; padding: 16px 24px 0; gap: 6px; flex-shrink: 0; }
.wizard-step { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding-bottom: 14px; border-bottom: 3px solid var(--border); color: var(--text-muted); }
.wizard-step-num {
  width: 24px; height: 24px; border-radius: 50%; border: 1px solid var(--border-strong);
  display: flex; align-items: center; justify-content: center; font-size: 0.72rem; font-weight: 700;
}
.wizard-step-label { font-size: 0.68rem; letter-spacing: 0.02em; text-transform: uppercase; text-align: center; }
.wizard-step.is-active { border-bottom-color: var(--mvant-accent); color: #fff; }
.wizard-step.is-active .wizard-step-num { background: var(--mvant-accent); border-color: var(--mvant-accent); color: #000; }
.wizard-step.is-done { color: var(--text); }
.wizard-step.is-done .wizard-step-num { border-color: var(--mvant-accent); color: var(--mvant-accent); }

.wizard-body { padding: 24px; overflow-y: auto; flex: 1; }
.wizard-step-panel[hidden] { display: none; }

.wizard-footer { display: flex; align-items: center; gap: 10px; padding: 18px 24px; border-top: 1px solid var(--border); flex-shrink: 0; }
.wizard-footer-spacer { flex: 1; }

.wizard-success { text-align: center; padding: 30px 10px; }
.wizard-success-mark { font-size: 1.3rem; font-weight: 700; color: var(--mvant-accent); margin: 0 0 22px; }
.wizard-success-actions { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; }

@media (max-width: 640px) {
  .wizard-steps { flex-wrap: wrap; }
  .wizard-step-label { display: none; }
}

/* ---------- Modal de confirmación / guía rápida ---------- */

.confirm-overlay { position: fixed; inset: 0; z-index: 400; display: flex; align-items: center; justify-content: center; padding: 20px; }
.confirm-overlay[hidden] { display: none; }
.confirm-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.7); }
.confirm-card { position: relative; background: var(--bg-card); border: 1px solid var(--border); padding: 28px; width: 100%; max-width: 420px; }
.confirm-card h3 { font-size: 1.05rem; font-weight: 600; margin: 0 0 14px; }
.confirm-card p { font-size: 0.88rem; color: var(--text-muted); line-height: 1.6; margin: 0 0 22px; }
.confirm-actions { display: flex; gap: 10px; justify-content: flex-end; }
.help-card { max-width: 460px; }
.help-steps { margin: 0 0 22px; padding-left: 20px; display: flex; flex-direction: column; gap: 10px; font-size: 0.88rem; color: var(--text-muted); line-height: 1.5; }
.help-steps strong { color: #fff; }

/* ---------- Herramientas ---------- */

.tools-card { max-width: 560px; max-height: 85vh; overflow-y: auto; }
.tools-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
.tools-header h3 { margin: 0; }
.tools-group { border-top: 1px solid var(--border); padding: 18px 0; }
.tools-group:first-of-type { border-top: none; padding-top: 10px; }
.tools-group h4 { font-size: 0.78rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--mvant-accent); margin: 0 0 8px; }
.tools-group .hint-text { margin: 0 0 12px; }
.tools-row { display: flex; gap: 8px; flex-wrap: wrap; }

/* ---------- Asistente de importación ---------- */

.import-wizard-panel { max-width: 640px; }
.import-summary, .wizard-success .import-summary {
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-bottom: 18px;
}
@media (max-width: 640px) { .import-summary { grid-template-columns: repeat(2, 1fr); } }
.import-stat { background: var(--bg); border: 1px solid var(--border); padding: 12px 8px; text-align: center; }
.import-stat span { display: block; font-size: 1.3rem; font-weight: 700; }
.import-stat label { font-size: 0.62rem; letter-spacing: 0.03em; text-transform: uppercase; color: var(--text-muted); }
.import-stat.is-good span { color: var(--mvant-accent); }
.import-stat.is-warn span { color: var(--text); }
.import-stat.is-bad span { color: #ff8a8a; }

.import-rows { display: flex; flex-direction: column; gap: 8px; max-height: 320px; overflow-y: auto; }
.import-row { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--border); background: var(--bg); }
.import-row-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.import-row-ref { font-family: monospace; font-size: 0.8rem; color: var(--text); }
.import-row-name { font-size: 0.76rem; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.import-row-msg { font-size: 0.74rem; color: var(--text-muted); max-width: 220px; text-align: right; }

.toast {
  position: fixed;
  left: 50%;
  bottom: 28px;
  z-index: 200;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 20px;
  background: var(--bg-card);
  border: 1px solid var(--mvant-accent);
  color: #fff;
  font-size: 0.82rem;
  font-weight: 500;
  white-space: nowrap;
  box-shadow: 0 0 5px var(--mvant-accent), 0 0 16px rgba(0, 168, 255, 0.35), 0 10px 26px rgba(0, 0, 0, 0.5);
  opacity: 0;
  pointer-events: none;
  transform: translate(-50%, 10px);
  transition: opacity 0.3s ease, transform 0.3s ease;
}
.toast.is-visible { opacity: 1; transform: translate(-50%, 0); }
@media (max-width: 480px) {
  .toast { white-space: normal; text-align: center; width: calc(100% - 40px); }
}

/* ============================================================
   Página de contacto (contacto.html). Clases nuevas y exclusivas
   (.contact-*) — no toca .btn-outline / .section-* / .card* compartidos
   por el resto del sitio. Mismo sistema visual (fondo negro, tipo
   blanco, acento eléctrico) y mismo perfil ligero (sin JS de scroll).
   ============================================================ */

.contact-page { padding: 150px 0 120px; max-width: 720px; }
@media (max-width: 640px) {
  .contact-page { padding-top: 92px; }
}

.contact-hero { text-align: center; margin-bottom: 48px; }
.contact-hero .eyebrow { display: block; margin-bottom: 10px; }
.contact-title {
  font-size: clamp(2.2rem, 7vw, 3.2rem);
  font-weight: 600;
  letter-spacing: -0.01em;
  margin: 0 0 14px;
}
.contact-tagline {
  font-size: 0.98rem;
  color: var(--text-muted);
  max-width: 480px;
  margin: 0 auto;
  line-height: 1.5;
}

.contact-cards {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}
@media (min-width: 640px) {
  .contact-cards { grid-template-columns: 1fr 1fr; }
}

.contact-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 10px;
  padding: 36px 24px;
  border: 1px solid var(--border);
  background: var(--bg-card);
  color: var(--text);
  text-decoration: none;
  transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease;
}
.contact-card:hover {
  border-color: var(--mvant-accent);
  box-shadow: 0 0 5px var(--mvant-accent), 0 0 16px rgba(0, 168, 255, 0.25);
  transform: translateY(-2px);
}
.contact-card-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border: 1px solid var(--border-strong);
  border-radius: 50%;
  color: var(--mvant-accent);
  margin-bottom: 4px;
  transition: color 0.25s ease;
}
.contact-card-icon svg { width: 24px; height: 24px; }
.contact-card-title {
  font-size: 1.05rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.contact-card-desc { font-size: 0.85rem; color: var(--text-muted); }
.contact-card-cta {
  margin-top: 8px;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--mvant-accent);
  display: inline-flex;
  align-items: center;
  gap: 8px;
  transition: color 0.25s ease;
}
.contact-card.is-disabled { opacity: 0.5; pointer-events: none; }

/* Las dos tarjetas reales (WhatsApp/Instagram) reemplazan el glow azul genérico por el
   color de su propia plataforma solo en hover/focus/active — en reposo siguen usando el
   azul MVANT de .contact-card-icon/.contact-card-cta de arriba, sin cambios. */
#contactWhatsapp:hover,
#contactWhatsapp:focus-visible,
#contactWhatsapp:active {
  border-color: #25d366;
  box-shadow: 0 0 5px rgba(37, 211, 102, 0.5), 0 0 16px rgba(37, 211, 102, 0.22);
}
#contactWhatsapp:hover .contact-card-icon,
#contactWhatsapp:focus-visible .contact-card-icon,
#contactWhatsapp:active .contact-card-icon,
#contactWhatsapp:hover .contact-card-cta,
#contactWhatsapp:focus-visible .contact-card-cta,
#contactWhatsapp:active .contact-card-cta { color: #25d366; }

.contact-card[href*="instagram.com"]:hover,
.contact-card[href*="instagram.com"]:focus-visible,
.contact-card[href*="instagram.com"]:active {
  border-color: #dd2a7b;
  box-shadow: 0 0 5px rgba(221, 42, 123, 0.5), 0 0 16px rgba(245, 133, 41, 0.2);
}
.contact-card[href*="instagram.com"]:hover .contact-card-icon,
.contact-card[href*="instagram.com"]:focus-visible .contact-card-icon,
.contact-card[href*="instagram.com"]:active .contact-card-icon,
.contact-card[href*="instagram.com"]:hover .contact-card-cta,
.contact-card[href*="instagram.com"]:focus-visible .contact-card-cta,
.contact-card[href*="instagram.com"]:active .contact-card-cta { color: #dd2a7b; }

.contact-note {
  margin: 40px 0 0;
  text-align: center;
  font-size: 0.82rem;
  color: var(--text-muted);
  font-style: italic;
}
