/* ==================================================================
   VYSE STOREFRONT V3
   Sistema de diseno inspirado en MercadoLibre. Modo claro + modo noche.
   Sin framework: no hay Bootstrap. Todo el CSS del sitio esta aca.
   ================================================================== */

/* ---------- TOKENS ---------- */
:root {
  --gal-h: 460px;   /* alto de la foto grande en desktop */
  --bg:        #ebebeb;
  --surface:   #ffffff;
  --surface-2: #f5f5f5;
  /* Fondo de la miniatura en la grilla de rubros del pie. Va aparte de
     --surface-2 porque ahi la mitad gris tiene que LEERSE contra el
     blanco de la tarjeta: con #f5f5f5 la tarjeta se veia toda blanca y
     los productos con fondo claro desaparecian. */
  --catg-foto: #ebedef;
  --text:      #1a1a1a;
  --text-2:    #666666;
  --text-3:    #999999;
  --border:    rgba(0,0,0,.09);
  --shadow:    0 1px 2px rgba(0,0,0,.12);
  --shadow-h:  0 4px 14px rgba(0,0,0,.16);

  --brand:     #e7191f;   /* rojo VYSE (badges, categoria activa) */
  --brand-ink: #ffffff;
  --hd-bg:     #ffffff;   /* header BLANCO (se diferencia de MELI) */
  --hd-ink:    #333333;
  --action:    #3483fa;   /* azul accion (MELI) */
  --action-h:  #2968c8;
  --action-sf: rgba(52,131,250,.12);
  --ok:        #00a650;   /* verde envio gratis / cuotas sin interes */
  --warn:      #f5a623;

  --r-sm: 4px;
  --r:    6px;
  --r-lg: 10px;

  --hd-h:  56px;
  --maxw:  1200px;

  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
          "Open Sans", Arial, sans-serif;
}

:root[data-theme="dark"] {
  --catg-foto: #23262c;
  --bg:        #0f1115;
  --surface:   #191c22;
  --surface-2: #22262e;
  --text:      #e8eaed;
  --text-2:    #a3a9b5;
  --text-3:    #7b8291;
  --border:    rgba(255,255,255,.10);
  --shadow:    0 1px 2px rgba(0,0,0,.5);
  --shadow-h:  0 6px 20px rgba(0,0,0,.6);

  --brand:     #ff4d52;
  /* en modo noche el header va oscuro */
  --hd-bg:     #1c1f26;
  --hd-ink:    #e8eaed;
  --action:    #4d90ff;
  --action-h:  #6aa3ff;
  --action-sf: rgba(77,144,255,.16);
  --ok:        #00c853;
}

/* Si el usuario nunca eligio, respetamos el sistema */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --bg:#0f1115; --surface:#191c22; --surface-2:#22262e;
    --text:#e8eaed; --text-2:#a3a9b5; --text-3:#7b8291;
    --border:rgba(255,255,255,.10); --shadow:0 1px 2px rgba(0,0,0,.5);
    --shadow-h:0 6px 20px rgba(0,0,0,.6);
    --brand:#ff4d52; --action:#4d90ff; --action-h:#6aa3ff;
    --action-sf:rgba(77,144,255,.16); --ok:#00c853;
    --hd-bg:#1c1f26; --hd-ink:#e8eaed; --catg-foto:#23262c;
  }
}

/* ---------- RESET ---------- */
*, *::before, *::after { box-sizing: border-box; }
html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* El header es sticky: sin esto, al saltar a un ancla o al enfocar un
     campo el navegador deja el elemento JUSTO arriba y el header lo tapa.
     scroll-padding-top le reserva ese alto. */
  scroll-padding-top: 100px;
}
@media (max-width: 699px) { html { scroll-padding-top: 130px; } }
/* PIE SIEMPRE ABAJO
   El <body> es una columna flex y el <main> se estira: con poco contenido
   el pie queda apoyado en el borde inferior de la pantalla en vez de
   subirse hasta la mitad. Es mejor que un min-height con numeros a mano
   (100vh menos el alto del header) porque no hay que mantener esas
   restas cuando cambia el alto del header o del pie. */
html { min-height: 100%; }
body {
  margin: 0;
  min-height: 100vh;
  display: flex; flex-direction: column;
  font-family: var(--font);
  font-size: 14px;
  line-height: 1.45;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
}
body > main { flex: 1 0 auto; }
body > footer { flex: 0 0 auto; }
img { max-width: 100%; display: block; border: 0; }
a { color: var(--action); text-decoration: none; }
a:hover { text-decoration: underline; }
button { font: inherit; cursor: pointer; }
h1,h2,h3,h4 { margin: 0; font-weight: 600; line-height: 1.25; }
s { color: var(--text-3); }

:focus-visible { outline: 2px solid var(--action); outline-offset: 2px; border-radius: 3px; }

.skip {
  position: absolute; left: -9999px; top: 0; z-index: 999;
  background: var(--surface); color: var(--text); padding: 10px 16px;
}
.skip:focus { left: 8px; top: 8px; }

.wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 12px; }

/* ==================================================================
   HEADER
   ================================================================== */
.hd {
  background: var(--hd-bg);
  color: var(--hd-ink);
  box-shadow: var(--shadow);
  position: sticky; top: 0; z-index: 50;
}

/* ---------- header que se esconde al bajar (solo desktop) ---------- */
.hd { transition: transform .25s ease; }
.hd.hd-arriba { transform: translateY(-100%); }
@media (prefers-reduced-motion: reduce) { .hd { transition: none; } }

/* la lupa solo existe en mobile */
button.hd-lupa { display: none; }

/* Hamburguesa: oculta en desktop, visible solo en mobile.
   Va como button.hd-burger (especificidad 0,1,1) y no como .hd-burger
   (0,1,0): el boton tambien lleva la clase .ico-btn, que declara
   display:grid mas abajo en este archivo. Con la misma especificidad
   ganaba la regla de mas abajo y la hamburguesa se veia en desktop. */
button.hd-burger { display: none; margin-left: -6px; }
.hd-in {
  max-width: var(--maxw); margin: 0 auto;
  display: flex; align-items: center; gap: 14px;
  height: var(--hd-h); padding: 0 12px;
}
.hd-logo { flex: 0 0 auto; display: flex; align-items: center; }
.hd-logo img { height: 34px; width: auto; object-fit: contain; }
:root[data-theme="dark"] .hd-logo img { filter: brightness(1.35); }

.hd-search { flex: 1 1 auto; position: relative; display: flex; max-width: 620px; }
.hd-search input {
  width: 100%; height: 38px;
  border: 1px solid var(--border); border-radius: var(--r);
  background: var(--surface-2); color: var(--text);
  padding: 0 42px 0 14px; font-size: 14px; outline: none;
  transition: box-shadow .15s, border-color .15s, background .15s;
}
.hd-search input:hover { background: var(--surface); }
.hd-search input::placeholder { color: var(--text-3); }
.hd-search input:focus {
  border-color: var(--action); background: var(--surface);
  box-shadow: 0 0 0 3px var(--action-sf);
}
.hd-search button {
  position: absolute; right: 0; top: 0; height: 38px; width: 40px;
  background: none; border: 0; color: var(--text-3);
  display: grid; place-items: center; border-radius: 0 var(--r) var(--r) 0;
}
.hd-search button:hover { color: var(--action); }
.hd-search svg { fill: currentColor; }

/* ---------- desplegable de sugerencias del buscador ---------- */
.sug {
  position: absolute; top: calc(100% + 5px); left: 0; right: 0; z-index: 60;
  background: var(--surface); border-radius: var(--r);
  box-shadow: 0 8px 28px rgba(0,0,0,.22);
  border: 1px solid var(--border);
  max-height: min(70vh, 520px); overflow-y: auto; overscroll-behavior: contain;
  padding: 6px 0;
}
.sug-g + .sug-g { border-top: 1px solid var(--border); margin-top: 4px; padding-top: 4px; }
.sug-t {
  font-size: 11px; font-weight: 700; color: var(--text-3);
  text-transform: uppercase; letter-spacing: .4px; padding: 6px 14px 4px;
}
.sug a { display: flex; align-items: center; gap: 10px; padding: 9px 14px; color: var(--text); }
.sug a:hover, .sug a.sel { background: var(--surface-2); text-decoration: none; }
.sug a b { font-weight: 700; color: var(--text); }

.sug-cat svg { flex: 0 0 auto; color: var(--text-3); }
.sug-cat span { flex: 1; font-size: 13.5px; }
.sug-cat em { font-style: normal; font-size: 11px; color: var(--text-3); }

.sug-p img { flex: 0 0 auto; width: 40px; height: 40px; object-fit: contain; background: #fff; border-radius: var(--r-sm); }
.sug-p .ph-img { flex: 0 0 auto; width: 40px; height: 40px; border-radius: var(--r-sm); }
.sug-n { flex: 1; font-size: 13px; line-height: 1.3; }
.sug-pr { flex: 0 0 auto; font-size: 14px; font-weight: 600; white-space: nowrap; }

.sug-todo {
  border-top: 1px solid var(--border); margin-top: 4px;
  font-size: 13px; font-weight: 600; color: var(--action) !important; justify-content: center;
}
.sug-vacio { padding: 18px 14px; font-size: 13px; color: var(--text-2); text-align: center; }

.hd-acc { flex: 0 0 auto; display: flex; align-items: center; gap: 2px; }
.ico-btn {
  position: relative; width: 38px; height: 38px; border: 0; background: none;
  color: var(--hd-ink); border-radius: 50%;
  display: grid; place-items: center; text-decoration: none; opacity: .8;
}
.ico-btn:hover { background: rgba(0,0,0,.08); opacity: 1; text-decoration: none; }
:root[data-theme="dark"] .ico-btn:hover { background: rgba(255,255,255,.1); }
.ico-btn .badge {
  position: absolute; top: 2px; right: 0;
  background: var(--brand); color: #fff; font-size: 10px; font-weight: 700;
  min-width: 16px; height: 16px; border-radius: 8px;
  display: grid; place-items: center; padding: 0 4px;
}
/* iconos de tema: se muestra el que corresponde */
.i-moon { display: none; }
:root[data-theme="dark"] .i-sun  { display: none; }
:root[data-theme="dark"] .i-moon { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .i-sun  { display: none; }
  :root:not([data-theme="light"]) .i-moon { display: block; }
}

/* nav de categorias: mismo fondo que el header, separado por una linea sutil */
.hd-nav { border-top: 1px solid rgba(0,0,0,.08); background: var(--hd-bg); }
:root[data-theme="dark"] .hd-nav { border-top-color: rgba(255,255,255,.08); }
.hd-nav-in {
  max-width: var(--maxw); margin: 0 auto; padding: 0 12px;
  display: flex; gap: 4px; overflow-x: auto; scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.hd-nav-in::-webkit-scrollbar { display: none; }
.hd-nav-in a {
  flex: 0 0 auto; padding: 9px 11px; font-size: 13px;
  color: var(--hd-ink); opacity: .75; white-space: nowrap;
  border-bottom: 2px solid transparent;
}
.hd-nav-in a:hover { opacity: 1; text-decoration: none; }
.hd-nav-in a.on { opacity: 1; border-bottom-color: currentColor; font-weight: 700; }

/* Los dos extremos de la tira NO son rubros: uno vuelve al inicio y el
   otro abre el catalogo entero. Van en el color de accion para que se
   lean como lo que son -acciones- y no se confundan con una categoria
   mas de la lista. */
.hd-nav-in a.hd-nav-home,
.hd-nav-in a.hd-nav-mas { color: var(--action); opacity: 1; font-weight: 600; }

/* Una linea separa el "Ir a Home" del primer rubro, y otra el ultimo
   rubro del "Otras categorias": marcan donde empieza y termina la
   lista sin agregar markup. */
.hd-nav-in a.hd-nav-home { border-right: 1px solid var(--border); margin-right: 4px; }
.hd-nav-in a.hd-nav-mas  { border-left:  1px solid var(--border); margin-left: 4px; }

/* ==================================================================
   HERO / MARQUESINA  (scroll-snap: sin JS)
   ================================================================== */
/* Marquesina a todo el ancho (full bleed), como la de MELI. */
.hero { width: 100%; margin: 0; padding: 0; position: relative; }

.hero-t {
  display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
  /* scroll-behavior NO va: pelea con el snap y anula el scroll por JS */
  scroll-behavior: auto; scrollbar-width: none; gap: 0;
  background: var(--surface-2);
}
.hero-t::-webkit-scrollbar { display: none; }

.hero-s {
  flex: 0 0 100%; scroll-snap-align: center; position: relative;
  /* que el ancla no empuje la pagina hacia arriba al usar las flechas */
  scroll-margin-top: 0;
}
.hero-l { display: block; position: relative; }
.hero-s img {
  width: 100%;
  /* Alto generoso: la marquesina es lo que abre el home y abajo se le
     monta la fila de categorias, asi que buena parte de lo que se ve
     tiene que quedar por ENCIMA de las tarjetas. */
  height: clamp(210px, 34vw, 470px);
  object-fit: cover;
}

/* Degrade del pie de la marquesina hacia el color de fondo del sitio,
   para que la imagen no corte de golpe. Va como pseudo-elemento: no
   agrega markup ni pedidos de red.

   ARRANCA DONDE EMPIEZAN LAS TARJETAS, no a media foto. Estaba en 42%
   -145px de una marquesina de 346- y se comia el tercio inferior de la
   imagen: los banners traen el texto ahi y quedaba lavado. Ahora mide
   lo mismo que monta la fila de categorias, asi que solo desvanece la
   franja que igual queda tapada por las tarjetas.

   Sale de la misma variable que el solape: si se cambia una, la otra
   acompana sola y no pueden quedar desfasadas. */
.hero-l::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  height: var(--hero-solape); pointer-events: none;
  background: linear-gradient(to bottom, rgba(235,235,235,0) 0%, rgba(235,235,235,.55) 55%, var(--bg) 100%);
}
:root[data-theme="dark"] .hero-l::after {
  background: linear-gradient(to bottom, rgba(15,17,21,0) 0%, rgba(15,17,21,.55) 55%, var(--bg) 100%);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hero-l::after {
    background: linear-gradient(to bottom, rgba(15,17,21,0) 0%, rgba(15,17,21,.55) 55%, var(--bg) 100%);
  }
}

/* "Orejas": flechas circulares a los costados, estilo MELI.
   Son <a> a la slide anterior/siguiente: el scroll lo hace el navegador. */
.hero-ar {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 42px; height: 42px; border-radius: 50%;
  background: rgba(255,255,255,.92); color: #333;
  display: none; place-items: center; font-size: 17px;
  box-shadow: 0 2px 10px rgba(0,0,0,.22); text-decoration: none;
  transition: background .15s, transform .15s;
}
.hero-ar:hover { background: #fff; text-decoration: none; transform: translateY(-50%) scale(1.06); }
.hero-ar.prev { left: 14px; }
.hero-ar.next { right: 14px; }
@media (min-width: 760px) { .hero-ar { display: grid; } }
:root[data-theme="dark"] .hero-ar { background: rgba(30,34,42,.92); color: #e8eaed; }

/* Dots redondos (como MELI), superpuestos sobre la imagen */
.hero-dots {
  position: absolute; left: 0; right: 0; bottom: 74px;
  display: flex; justify-content: center; gap: 7px; z-index: 3;
}
.hero-dots a {
  width: 9px; height: 9px; border-radius: 50%;
  background: rgba(255,255,255,.62);
  box-shadow: 0 0 3px rgba(0,0,0,.35);
  transition: background .15s, transform .15s;
}
.hero-dots a:hover { background: #fff; transform: scale(1.25); }
@media (max-width: 759px) { .hero-dots { bottom: 62px; } }

/* ------------------------------------------------------------------
   FILA DE CATEGORIAS PREMIUM: monta sobre la marquesina
   ------------------------------------------------------------------ */
:root { --hero-solape: 92px; }   /* cuanto monta la fila sobre la foto */

.cats-top {
  max-width: var(--maxw); margin: 0 auto; padding: 0 12px;
  position: relative; z-index: 4;
  margin-top: calc(-1 * var(--hero-solape));   /* "flota un poquito por abajo" */
}
/* aire entre la fila de categorias y la primera tira de productos */
.cats-top { margin-bottom: 26px; }
@media (max-width: 699px) { .cats-top { margin-bottom: 18px; } }

/* H1 del home: presente para SEO pero discreto, no compite con la marquesina */
/* El H1 del home queda para Google pero NO se dibuja: encima de la
   marquesina metia una linea de texto suelta que ensuciaba la apertura.
   No se usa display:none -eso lo saca tambien del HTML que lee el
   buscador-, sino la tecnica de sacarlo del area visible dejandolo en
   el arbol de accesibilidad. */
.home-h1 {
  position: absolute; width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  overflow: hidden; white-space: nowrap;
}
/* En pantallas chicas la fila monta menos. Se cambia la VARIABLE y no
   el margen: asi el degrade de la marquesina se acomoda solo y no queda
   arrancando mas arriba que el borde de las tarjetas. */
@media (max-width: 759px) { :root { --hero-solape: 56px; } }

/* ==================================================================
   CARD DE PRODUCTO
   ================================================================== */
.card {
  background: var(--surface); border-radius: var(--r);
  box-shadow: var(--shadow); overflow: hidden;
  display: flex; flex-direction: column; height: 100%;
  transition: box-shadow .18s ease, transform .18s ease;
}
.card:hover { box-shadow: var(--shadow-h); transform: translateY(-2px); }

.card-img {
  display: block; position: relative; background: #fff;
  aspect-ratio: 1 / 1; overflow: hidden;
}
:root[data-theme="dark"] .card-img { background: #f2f2f2; }
.card-img img { width: 100%; height: 100%; object-fit: contain; padding: 8px; }
.card-off {
  position: absolute; left: 8px; top: 8px;
  background: var(--ok); color: #fff; font-size: 11px; font-weight: 700;
  padding: 2px 7px; border-radius: var(--r-sm);
}
.ph-img {
  width: 100%; height: 100%; display: grid; place-items: center;
  background: var(--surface-2); color: var(--text-3);
}

.card-b { padding: 10px 12px 12px; display: flex; flex-direction: column; gap: 3px; flex: 1; }
/* h3 sin estilos de titulo: es semantica para SEO, no jerarquia visual */
.card-h { margin: 0; font-weight: 400; font-size: inherit; }
.card-t {
  display: -webkit-box; color: var(--text); font-size: 13px; line-height: 1.35;
  font-weight: 400; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; min-height: 2.7em;
}
.card-t:hover { color: var(--action); text-decoration: none; }
/* line-height ajustado en cada renglon del bloque de precio: por
   defecto heredaban 1.45 del body y entre el tachado, el precio, las
   cuotas y el envio se iban casi 20px de aire muerto por card. */
.card-p { display: flex; flex-direction: column; gap: 0; margin-top: auto; }
.card-old { font-size: 12px; line-height: 1.25; }
.card-now { font-size: 21px; font-weight: 400; letter-spacing: -.4px; color: var(--text); line-height: 1.2; }
.card-now.sm { font-size: 15px; color: var(--text-2); }
.card-cuot { font-size: 12px; color: var(--ok); font-weight: 600; line-height: 1.35; }
.tag-envio { font-size: 12px; font-weight: 600; color: var(--ok); line-height: 1.3; }
.tag-envio img { display: inline-block; vertical-align: middle; height: 15px; width: auto; margin-right: 3px; }

/* grilla */
.grid {
  display: grid; gap: 12px;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
}
@media (min-width: 700px) { .grid { grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); } }

/* ==================================================================
   SLIDER HORIZONTAL  (scroll-snap + 2 flechas)
   ================================================================== */
.slider { max-width: var(--maxw); margin: 22px auto 0; padding: 0 12px; }
.slider-h { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 10px; }
.slider-h h2 { font-size: clamp(16px, 2.4vw, 21px); font-weight: 600; color: var(--text); }
.slider-h h2 a { font-size: 13px; font-weight: 500; margin-left: 10px; }
.verlink { font-size: 13px; font-weight: 500; white-space: nowrap; }

/* "Ver mas" al pie de la tira: en desktop no va (ya esta el del titulo) */
.sl-mas { display: none; }

.slider-w { position: relative; }
.slider-t {
  display: flex; gap: 12px; overflow-x: auto; scroll-snap-type: x proximity;
  scroll-behavior: auto; scrollbar-width: none; padding: 4px 2px 6px;
  -webkit-overflow-scrolling: touch;
  /* overflow-y explicito: con overflow-x:auto el navegador convierte el
     eje Y a auto tambien, y la tira pasa a ser un contenedor scrolleable
     vertical que compite con la pagina. Es el mismo cuidado que ya tenia
     la galeria del producto. */
  overflow-y: hidden;
  /* que al llegar al final de la tira el impulso no siga en la pagina */
  overscroll-behavior-x: contain;
}

/* EL SCROLL DE LA PAGINA NO SE FRENA SOBRE LAS TIRAS
   ------------------------------------------------------------------
   Chrome, cuando un contenedor SOLO puede moverse en horizontal,
   convierte el giro vertical de la rueda en desplazamiento lateral y
   se queda con el gesto: pasas el mouse sobre una tira, seguis
   girando y la pagina deja de bajar.

   Se probo interceptarlo por JS y fue peor: cancelar el evento obliga
   a mover la pagina a mano, y eso pierde la inercia del sistema. Medido:
   5 giros avanzaban exactamente 600px -120 por giro- contra bastante
   mas del scroll nativo. Se sentia lento y entrecortado.

   Asi que se ataca la causa: con mouse, la tira deja de scrollear por
   gesto y se mueve con las flechas, que ya estan. El scrollLeft por JS
   sigue andando con overflow-x:hidden, asi que las flechas no se ven
   afectadas. En tactil no se toca nada: el swipe sigue igual. */
@media (hover: hover) and (pointer: fine) {
  .slider-t { overflow-x: hidden; }
}
.slider-t::-webkit-scrollbar { display: none; }
.sl-i { flex: 0 0 auto; width: 168px; scroll-snap-align: start; }
@media (min-width: 700px)  { .sl-i { width: 200px; } }
@media (min-width: 1000px) { .sl-i { width: 214px; } }

.sl-nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 5;
  width: 38px; height: 38px; border-radius: 50%; border: 0;
  background: var(--surface); color: var(--text); box-shadow: var(--shadow-h);
  display: none; place-items: center; font-size: 15px;
}
.sl-nav:hover { background: var(--surface-2); }
.sl-nav.prev { left: 2px; }
.sl-nav.next { right: 2px; }
@media (min-width: 900px) and (hover: hover) { .sl-nav { display: grid; } }

/* ==================================================================
   TILES DE CATEGORIA  (foto circular + nombre, estilo MELI)
   ================================================================== */
/* Tarjetas tipo MELI: titulo arriba, foto del producto abajo.
   En mobile scrollean en horizontal; en desktop entran todas en la grilla. */
.cats {
  display: flex; gap: 10px; overflow-x: auto; scrollbar-width: none;
  padding-bottom: 4px; -webkit-overflow-scrolling: touch;
}
.cats::-webkit-scrollbar { display: none; }
@media (min-width: 900px) {
  .cats { display: grid; grid-template-columns: repeat(6, 1fr); overflow: visible; }
}

.cat {
  flex: 0 0 158px;
  background: var(--surface); border-radius: var(--r);
  box-shadow: var(--shadow); padding: 16px;
  display: flex; flex-direction: column; gap: 9px;
  color: var(--text); overflow: hidden;
  min-height: 300px;                 /* misma altura que las de MELI */
  transition: box-shadow .18s ease, transform .18s ease;
}
@media (min-width: 900px) { .cat { flex: 1 1 auto; } }
.cat:hover { box-shadow: var(--shadow-h); transform: translateY(-3px); text-decoration: none; }

/* OJO con estos dos:
   Los hijos DIRECTOS de un flex container se "blockifican": el
   display:-webkit-box se convierte en flow-root y -webkit-line-clamp deja
   de funcionar. Por eso el recorte a 2 lineas se hace con alto fijo +
   overflow, que ademas anda en todos los navegadores. */
.cat-t {
  width: 100%;
  font-size: 14px; font-weight: 600; line-height: 1.25;
  height: 2.5em; overflow: hidden;
}
.cat-d {
  width: 100%;
  font-size: 12px; color: var(--text-2); line-height: 1.35;
  height: 2.7em; overflow: hidden;
}

/* Y aca: con height:100% dentro de un grid la imagen ignoraba el alto del
   contenedor y salia a 160px tapando el texto. Con max-height si respeta. */
/* la foto ocupa el alto que sobra: asi la tarjeta llega a los 300px sin
   que quede un hueco vacio abajo */
.cat-img {
  display: grid; place-items: center; background: #fff;
  border-radius: var(--r-sm);
  /* flex-basis 0 (no auto): el contenedor se dimensiona por el espacio que
     sobra en la tarjeta, NO por el alto natural de la foto. Con "auto" una
     imagen vertical (ej. una botella) estiraba la card y, al ser grid, se
     llevaba puesta toda la fila. min-height:0 desarma el minimo automatico
     del flex item, que es lo que dejaba desbordar igual. */
  flex: 1 1 0; min-height: 0; height: 150px; max-height: 150px;
  overflow: hidden;
}
.cat-img img {
  /* width/height 100% + object-fit (mismo patron que .card-img img). NO usar
     max-height:100% con height:auto: los grid/flex items traen min-height:auto,
     que se resuelve al alto del contenido y le gana al max-height. Con una foto
     muy vertical (300x936) la imagen quedaba en 469px dentro de un box de 141
     y se veia recortada. */
  width: 100%; height: 100%; min-height: 0;
  object-fit: contain; padding: 4px;
}
.cat-b {
  margin-top: auto; font-size: 12.5px; font-weight: 600; color: var(--marca, #e7191f);
  background: rgba(var(--marca-rgb, 231,25,31), .10); border-radius: var(--r-sm);
  padding: 7px 10px; text-align: center;
  transition: background .15s;
}
.cat:hover .cat-b { background: rgba(var(--marca-rgb, 231,25,31), .18); }

/* ==================================================================
   APARICION AL SCROLLEAR
   El JS solo agrega la clase .in cuando el elemento entra en pantalla
   (IntersectionObserver). Toda la animacion se resuelve en CSS.
   ================================================================== */
/* IMPORTANTE: el estado oculto va bajo .js (la clase la pone el script del
   <head>). Sin JS el contenido se ve normal: nunca se puede dar el caso de
   que el catalogo quede invisible porque fallo el observer. */
.js .reveal {
  opacity: 0;
  transform: translateY(14px);
  will-change: opacity, transform;
}
.js .reveal.in {
  opacity: 1;
  transform: none;
  transition: opacity .45s ease-out, transform .45s cubic-bezier(.2,.7,.3,1);
}
/* escalonado: cada tarjeta entra apenas despues que la anterior */
.js .reveal.in:nth-child(2)  { transition-delay: .04s; }
.js .reveal.in:nth-child(3)  { transition-delay: .08s; }
.js .reveal.in:nth-child(4)  { transition-delay: .12s; }
.js .reveal.in:nth-child(5)  { transition-delay: .16s; }
.js .reveal.in:nth-child(6)  { transition-delay: .20s; }
.js .reveal.in:nth-child(7)  { transition-delay: .24s; }
.js .reveal.in:nth-child(8)  { transition-delay: .28s; }

/* Fallback explicito: navegador sin IntersectionObserver */
.no-reveal .reveal { opacity: 1 !important; transform: none !important; }

/* Fade-in de la foto cuando termina de bajar (lazy nativo).
   Se aplica sobre el <img> ya cargado via el atributo data-ok. */
.card-img img, .cat-img img {
  animation: vfade .35s ease-out both;
}
@keyframes vfade { from { opacity: 0; } to { opacity: 1; } }

/* banner html suelto del siteconfig */
.banner { max-width: var(--maxw); margin: 22px auto 0; padding: 0 12px; }
.banner img { width: 100%; height: auto; border-radius: var(--r-lg); }
.banner table { width: 100% !important; }

/* ==================================================================
   LISTADO / BUSQUEDA
   ================================================================== */
.lay { max-width: var(--maxw); margin: 14px auto; padding: 0 12px; display: grid; gap: 16px; }
@media (min-width: 900px) { .lay.con-side { grid-template-columns: 220px 1fr; } }

/* CLAVE PARA MOBILE:
   Los items de un grid/flex arrancan con min-width:auto, que equivale a
   min-content. Si adentro hay algo que no puede achicarse -por ejemplo la
   fila de chips con flex-wrap:nowrap, cuyo min-content son ~900px- la
   columna se estira a ese ancho y se lleva puesta toda la pagina: el
   documento terminaba midiendo 914px dentro de un viewport de 390.
   Con min-width:0 el item puede achicarse y el overflow-x:auto interno
   recien ahi hace su trabajo. */
.lay > * { min-width: 0; }

/* Paginas de poco contenido (carrito, checkout, mis pedidos).
   El alto ya lo resuelve el flex del <body> (ver arriba): aca solo se
   centra el contenido en el espacio que sobra y se deja aire abajo.
   Antes habia un min-height con restas a mano -100vh menos 92 del header
   menos 180 del pie- que se desajustaba cada vez que cambiaba alguno. */
.lay-alto {
  align-content: center;
  padding-top: 24px; padding-bottom: 56px;
}
@media (max-width: 699px) { .lay-alto { padding-bottom: 36px; } }
.grid > *, .slider-t > *, .cats > * { min-width: 0; }
.card-b > *, .card-p > * { min-width: 0; }

.side { display: none; }
@media (min-width: 900px) { .side { display: block; margin-top: 20px; } }
.side h3 { font-size: 14px; margin-bottom: 8px; color: var(--text); }
.side ul { list-style: none; margin: 0 0 20px; padding: 0; }
.side li { margin-bottom: 5px; }
.side a { font-size: 13px; color: var(--text-2); }
.side a:hover { color: var(--action); }
.side a.on { color: var(--marca, #e7191f); font-weight: 700; }

/* ==================================================================
   INTERRUPTORES DE ATRIBUTO   (Compra Internacional, Outlet)
   ------------------------------------------------------------------
   Son links con pinta de switch, como los de MercadoLibre. Van como
   <a> y no como checkbox a proposito: cada combinacion tiene su URL,
   se puede compartir, y funciona con el JavaScript apagado.

   La perilla es un pseudo-elemento del riel, asi que todo el control
   son dos cajas y no hace falta markup extra.
   ================================================================== */
.side-sw { list-style: none; margin: 0 0 18px; padding: 0; }
.side-sw li { margin-bottom: 8px; }

.side-sw .sw {
  display: flex; align-items: center; gap: 10px;
  padding: 11px 12px;
  background: var(--bg-card, #fff);
  border: 1px solid var(--linea, #e6e6e6);
  border-radius: 8px;
  font-size: 13px; color: var(--text);
  /* El interruptor es un <a>, asi que le pegaba la regla general
     "a:hover { text-decoration: underline }" y se subrayaba entero,
     titulo y bajada incluidos. Es un control, no un enlace de texto:
     el mismo reset que ya tienen .cat, .com y .card-t. */
  text-decoration: none;
  transition: border-color .15s, box-shadow .15s;
}
.side-sw .sw:hover { border-color: var(--text-3, #999); text-decoration: none; }

.side-sw .sw-t { flex: 1; min-width: 0; display: block; }
.side-sw .sw-t b { display: block; font-weight: 600; line-height: 1.3; }
.side-sw .sw-t i {
  display: block; font-style: normal; font-size: 12px;
  color: var(--text-2); line-height: 1.35; margin-top: 2px;
}

/* el riel */
.side-sw .sw-k {
  flex: none; position: relative;
  width: 38px; height: 22px; border-radius: 999px;
  background: var(--linea, #e0e0e0);
  transition: background .18s;
}
/* la perilla */
.side-sw .sw-k::after {
  content: ""; position: absolute; top: 2px; left: 2px;
  width: 18px; height: 18px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.3);
  transition: transform .18s;
}

.side-sw .sw.on { border-color: var(--action, #3483fa); }
.side-sw .sw.on .sw-k { background: var(--action, #3483fa); }
.side-sw .sw.on .sw-k::after { transform: translateX(16px); }

/* Sin animacion para quien la pidio apagada en el sistema */
@media (prefers-reduced-motion: reduce) {
  .side-sw .sw, .side-sw .sw-k, .side-sw .sw-k::after { transition: none; }
}

/* ------------------------------------------------------------------
   EN MOBILE: chips arriba de los resultados
   ------------------------------------------------------------------
   El lateral entero no se muestra en pantallas chicas, pero estos
   filtros SI tienen que estar: sin ellos, desde el telefono no hay
   forma de pedir "solo outlet". Se deja visible unicamente esta lista
   -el resto del lateral sigue oculto- y se acuesta en una tira
   horizontal, como hace MercadoLibre en el celular.

   El <aside> ya viene antes del listado en el HTML, asi que al pasar a
   una sola columna cae justo arriba de los productos sin mover nada.
   ------------------------------------------------------------------ */
@media (max-width: 899px) {
  /* sin margen propio: el gap del grid ya separa de los resultados */
  .side { display: block; margin: 0; }
  .side > *:not(.side-sw) { display: none; }

  /* .side .side-sw y no .side-sw solo: la regla general
     ".side ul { margin: 0 0 20px }" le gana por especificidad y deja un
     hueco de 20px entre los chips y los productos */
  .side .side-sw {
    display: flex; gap: 8px; margin: 0;
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    padding-bottom: 2px;
  }
  .side-sw::-webkit-scrollbar { display: none; }
  .side-sw li { margin: 0; flex: none; }

  .side-sw .sw { padding: 8px 12px; border-radius: 999px; white-space: nowrap; }
  .side-sw .sw-t b { font-size: 13px; }
  /* la bajada no entra en un chip y lo haria ilegible */
  .side-sw .sw-t i { display: none; }
  .side-sw .sw-k { width: 32px; height: 18px; }
  .side-sw .sw-k::after { width: 14px; height: 14px; }
  .side-sw .sw.on .sw-k::after { transform: translateX(14px); }
}

/* ==================================================================
   BLOQUES DE COMUNICACION DEL HOME
   ------------------------------------------------------------------
   Dos tarjetas anchas, texto a la izquierda y foto a la derecha, como
   las piezas grandes de MercadoLibre.

   Las dos variantes -oscura arriba, clara al pie- comparten TODO el
   markup y toda esta maqueta: lo unico que cambia son los colores, en
   las dos reglas del final. Agregar una tercera estetica es un bloque
   de color, no otra maqueta.
   ================================================================== */
.coms {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px;
  /* --maxw es el ancho del sitio (.wrap, .cats-top, los sliders).
     Con --wrap, que no existe, caia al fallback y quedaba mas angosto
     que todo lo demas. */
  max-width: var(--maxw); margin: 26px auto; padding: 0 12px;
}
@media (max-width: 780px) {
  .coms { grid-template-columns: 1fr; gap: 12px; margin: 18px auto; }

  /* En una columna la tarjeta es ancha pero baja: si se deja el titulo
     de escritorio se parte en tres renglones y la pieza crece hasta
     empujar los productos abajo del fold.

     La foto tambien cede espacio: en 375px, un 45% deja la columna de
     texto en 190px, que es donde se rompen las palabras. */
  .com { min-height: 132px; }
  .com-t { flex: 1 1 62%; padding: 14px 14px; gap: 4px; }
  .com-t b { font-size: 16px; }
  .com-t i { font-size: 12.5px; -webkit-line-clamp: 2; }
  .com-b { padding: 7px 13px; font-size: 12.5px; }
  .com-f { flex: 0 0 38%; }
}

/* Pantallas muy angostas: la foto pasa a ser un acento lateral. Menos
   de eso no aporta nada y solo le roba renglones al texto. */
@media (max-width: 400px) {
  .com-t { flex: 1 1 70%; }
  .com-f { flex: 0 0 30%; }
  .com-t b { font-size: 15px; }
}

.com {
  display: flex; align-items: stretch; overflow: hidden;
  text-decoration: none;
  border-radius: 10px; min-height: 168px;
  transition: transform .16s, box-shadow .16s;
}
.com:hover { transform: translateY(-2px); text-decoration: none; }
.com:hover .com-t b, .com:hover .com-t i { text-decoration: none; }

.com-t {
  flex: 1 1 55%; min-width: 0;
  display: flex; flex-direction: column; align-items: flex-start;
  justify-content: center; gap: 6px;
  padding: 20px 18px;
}
.com-t b { font-size: 19px; font-weight: 700; line-height: 1.2; }
.com-t i {
  font-style: normal; font-size: 13px; line-height: 1.4;
  /* dos renglones y corta: si el copete es largo no puede empujar la
     tarjeta y romper la grilla */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.com-b {
  margin-top: 6px; padding: 8px 16px; border-radius: 6px;
  font-size: 13px; font-weight: 600; white-space: nowrap;
}

.com-f { flex: 0 0 45%; position: relative; }
.com-f img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; display: block;
}

/* Los botones siguen el mismo patron que el resto del sitio: el color
   sale de --marca, no de --action. El azul se usa para los links, no
   para los botones (ver .btn-1 / .btn-2 / .cat-b). */

/* ---- variante OSCURA: fondo pleno de marca ---- */
/* Sobre el color pleno el boton se invierte: blanco con texto de
   marca. Es el mismo par de colores de .btn-1, dado vuelta. */
.coms-os .com { background: var(--marca, #e7191f); color: var(--marca-ink, #fff); }
.coms-os .com:hover { box-shadow: 0 6px 20px rgba(0,0,0,.22); }
.coms-os .com-t i { color: rgba(255,255,255,.85); }
.coms-os .com-b { background: #fff; color: var(--marca, #e7191f); }
.coms-os .com:hover .com-b { background: rgba(255,255,255,.88); }

/* ---- variante CLARA: para el pie, pesa menos ---- */
/* Aca el boton es .btn-1 tal cual: fondo de marca y texto claro. */
.coms-cl .com {
  background: var(--bg-card, #fff); color: var(--text);
  border: 1px solid var(--linea, #e6e6e6);
}
.coms-cl .com:hover { box-shadow: 0 4px 14px rgba(0,0,0,.10); }
.coms-cl .com-t i { color: var(--text-2); }
.coms-cl .com-b { background: var(--marca, #e7191f); color: var(--marca-ink, #fff); }
.coms-cl .com:hover .com-b { background: var(--marca-hover, #c41419); }

@media (prefers-reduced-motion: reduce) { .com { transition: none; } }


/* ==================================================================
   POPUP DE UNA NOTA   (sin JavaScript)
   ------------------------------------------------------------------
   Se abre con :target, o sea con el ancla de la URL. El navegador ya
   sabe hacerlo: se puede compartir el link con el popup abierto y el
   boton Atras lo cierra, que es lo que la gente espera. Cerrado no
   ocupa nada ni se puede tabular adentro.
   ================================================================== */
.modal { display: none; position: fixed; inset: 0; z-index: 10000; }
.modal:target { display: block; }

.modal-bg {
  position: absolute; inset: 0;
  background: rgba(0,0,0,.55);
}
.modal-c {
  position: relative; z-index: 1;
  max-width: 560px; max-height: 82vh; overflow-y: auto;
  margin: 8vh auto 0;
  background: var(--bg-card, #fff); color: var(--text);
  border-radius: 12px; padding: 26px 24px;
  box-shadow: 0 18px 50px rgba(0,0,0,.30);
}
.modal-c h2 { font-size: 20px; margin: 0 34px 12px 0; line-height: 1.25; }
.modal-b { font-size: 14px; line-height: 1.65; color: var(--text-2); }
.modal-b p { margin: 0 0 10px; }
.modal-b p:last-child { margin-bottom: 0; }

.modal-x {
  position: absolute; top: 12px; right: 14px;
  width: 32px; height: 32px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 22px; line-height: 1;
  color: var(--text-2); background: var(--bg, #ebebeb);
  /* Es un <a> -cierra con :target, sin JavaScript- asi que le pegaba la
     regla general "a:hover { text-decoration: underline }" y la cruz
     aparecia subrayada. */
  text-decoration: none;
}
.modal-x:hover { color: var(--text); text-decoration: none; }

@media (max-width: 620px) {
  .modal-c { margin: 0; max-width: none; min-height: 100vh; max-height: none; border-radius: 0; }
}

.crumbs { font-size: 12px; color: var(--text-2); margin: 12px 0 6px; }
.crumbs a { color: var(--text-2); }
.crumbs a:hover { color: var(--action); }

.res-h { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: 8px 14px; margin-bottom: 12px; }
.res-h h1 { font-size: clamp(17px, 2.6vw, 22px); }
.res-n { font-size: 13px; color: var(--text-2); white-space: nowrap; }
.res-r { display: flex; align-items: baseline; gap: 16px; flex-wrap: wrap; }

/* ==================================================================
   ORDENAR POR   (igual que MercadoLibre)
   ------------------------------------------------------------------
   Es un <details> con links adentro, no un <select>: asi cada orden
   tiene su propia URL -se puede compartir y Google la puede seguir- y
   no hace falta JavaScript para nada.
   ================================================================== */
.ord { position: relative; }
.ord > summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; gap: 5px;
  font-size: 13px; color: var(--text-2); white-space: nowrap;
  -webkit-user-select: none; user-select: none;
}
.ord > summary::-webkit-details-marker { display: none; }
.ord > summary b { color: var(--text); font-weight: 600; }
.ord > summary:hover b { color: var(--marca, #e7191f); }
.ord > summary::after {
  content: ""; width: 6px; height: 6px; margin-left: 2px;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px,-2px);
  transition: transform .15s;
}
.ord[open] > summary::after { transform: rotate(-135deg) translate(-1px,-1px); }
.ord > summary:focus-visible { outline: 2px solid var(--marca, #e7191f); outline-offset: 3px; border-radius: 3px; }

/* El menu flota: si empujara el contenido, la grilla entera saltaria
   para abajo al abrirlo. */
.ord-m {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 30;
  min-width: 190px; padding: 6px;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--r); box-shadow: 0 8px 24px rgba(0,0,0,.14);
}
.ord-m a {
  display: block; padding: 9px 12px; border-radius: 5px;
  font-size: 13.5px; color: var(--text-2); white-space: nowrap;
}
.ord-m a:hover { background: var(--surface-2); color: var(--text); text-decoration: none; }
.ord-m a.on { color: var(--marca, #e7191f); font-weight: 600; }

@media (max-width: 560px) {
  /* en mobile el titulo se lleva su renglon y abajo van contador y orden */
  .res-h { align-items: flex-start; }
  .res-r { width: 100%; justify-content: space-between; align-items: center; }
  .ord-m { right: 0; left: auto; }
}

/* aviso de "corregimos lo que escribiste" / "esto es lo mas parecido" */
.res-fix {
  margin: -4px 0 14px; padding: 10px 14px;
  background: var(--surface); border-radius: var(--r);
  border-left: 3px solid var(--marca, #e7191f);
  font-size: 13.5px; color: var(--text-2);
}
.res-fix b { color: var(--text); }
.res-fix a { color: var(--action); }

/* ---------- estados vacios / de error (componente compartido) ---------- */
.vacio {
  background: var(--surface); border-radius: var(--r-lg);
  box-shadow: var(--shadow);
  padding: 56px 32px 48px; text-align: center;
  max-width: 580px; margin: 0 auto;
  display: flex; flex-direction: column; align-items: center;
}

/* El icono lleva un halo detras para que no quede una figurita suelta
   flotando arriba del texto. El halo es un ::after y no un borde: asi el
   circulo del fondo puede ser mas grande que el icono sin empujar nada. */
.vacio-ico {
  position: relative;
  width: 76px; height: 76px; border-radius: 50%;
  display: grid; place-items: center; margin-bottom: 26px;
  background: var(--surface-2); color: var(--text-3);
}
.vacio-ico::after {
  content: ""; position: absolute; inset: -12px;
  border-radius: 50%; background: currentColor; opacity: .07;
}
.vacio-ico svg { position: relative; }

.vacio-aviso .vacio-ico { background: rgba(245,166,35,.12); color: var(--warn); }
.vacio-error .vacio-ico { background: rgba(var(--marca-rgb, 231,25,31), .10); color: var(--marca, #e7191f); }

.vacio h2 {
  font-size: clamp(19px, 2.4vw, 23px); line-height: 1.25;
  margin: 0 0 12px; max-width: 22ch;
}
.vacio p {
  color: var(--text-2); margin: 0;
  font-size: 15px; line-height: 1.65; max-width: 46ch;
}

/* El detalle es el dato concreto (el nombre del producto caido, por
   ejemplo): va en una pastilla para que se lea como un dato y no como
   otra linea mas de texto. */
.vacio-det {
  margin-top: 18px !important;
  padding: 9px 16px; border-radius: 999px;
  background: var(--surface-2);
  font-size: 13px !important; font-weight: 500;
  color: var(--text-2) !important;
  max-width: 100%; overflow-wrap: anywhere;
}

.vacio-acc {
  display: flex; gap: 12px; flex-wrap: wrap; justify-content: center;
  margin-top: 32px; width: 100%;
}
.vacio-acc .btn { width: auto; padding: 13px 26px; }

@media (max-width: 560px) {
  .vacio { padding: 44px 22px 38px; }
  .vacio-acc { flex-direction: column; gap: 10px; }
  .vacio-acc .btn { width: 100%; }
}

@media (max-width: 699px) {
  .vacio { padding: 36px 18px; }
  .vacio-ico { width: 70px; height: 70px; margin-bottom: 16px; }
  .vacio h2 { font-size: 19px; }
  .vacio-acc { width: 100%; }
  .vacio-acc .btn { flex: 1 1 100%; }
}

/* Banda con el texto de la categoria (campo `description` del ABM).
   Ancho completo, centrada, con espacio para emojis y algo de HTML. */
.cat-banda {
  width: 100%; background: var(--surface);
  border-bottom: 1px solid var(--border);
  padding: 22px 16px;
  display: flex; justify-content: center; align-items: center;
  text-align: center;
}
.cat-banda > div {
  max-width: 860px;
  font-size: clamp(15px, 2.2vw, 19px);
  line-height: 1.5; font-weight: 500; color: var(--text);
  letter-spacing: -.1px;
}
.cat-banda a { color: var(--action); }
@media (max-width: 699px) { .cat-banda { padding: 16px 14px; } }

/* subcategorias en la barra lateral, con contador */
.side-sub a {
  display: flex; justify-content: space-between; align-items: baseline; gap: 8px;
}
.side-sub a b { font-weight: 400; font-size: 11px; color: var(--text-3); }
.side-sub a.on b { color: var(--marca, #e7191f); }
/* "Ver todo" del lateral: va como boton para que no se confunda con una
   categoria mas de la lista. */
.side-sub a.side-vertodo {
  display: inline-block; text-align: center;
  background: rgba(var(--marca-rgb, 231,25,31), .10); color: var(--marca, #e7191f);
  border-radius: var(--r); padding: 5px 14px;
  font-size: 12px; font-weight: 600;
  margin-bottom: 6px;
  transition: background .15s;
}
.side-sub a.side-vertodo:hover { background: rgba(var(--marca-rgb, 231,25,31), .18); }
.side-sub li:has(.side-vertodo) { margin-bottom: 4px; }

/* "Ver todas las categorias" cuando se bajo un nivel: mismo criterio
   que arriba. Como link se leia como una categoria mas de la lista -y
   ademas la mas larga-, asi que se confundia con lo que hay que tocar
   para navegar. Como boton se entiende que es la salida.

   Va en gris y no en color de marca: es un paso atras, no la accion
   principal de la columna. */
.side-sub a.side-volver {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--surface-2); color: var(--text-2);
  border: 1px solid var(--border); border-radius: var(--r);
  padding: 5px 12px 5px 9px;
  font-size: 12px; font-weight: 600;
  margin-bottom: 6px;
  transition: background .15s, color .15s, border-color .15s;
}
.side-sub a.side-volver:hover {
  background: var(--surface); color: var(--text);
  border-color: var(--text-3, #999); text-decoration: none;
}
.side-sub a.side-volver span { font-size: 11px; line-height: 1; }
.side-sub li:has(.side-volver) { margin-bottom: 4px; }

/* placeholder animado mientras carga la pagina siguiente */
.skel {
  border-radius: var(--r); background: var(--surface);
  box-shadow: var(--shadow); min-height: 290px; position: relative; overflow: hidden;
}
.skel::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(90deg, transparent, rgba(128,128,128,.13), transparent);
  animation: skel 1.1s infinite;
}
@keyframes skel { from { transform: translateX(-100%); } to { transform: translateX(100%); } }

/* paginador */
.pager { display: flex; justify-content: center; align-items: center; gap: 6px; margin: 26px 0 8px; flex-wrap: wrap; }
.pager a, .pager span {
  min-width: 34px; height: 34px; padding: 0 10px; border-radius: var(--r);
  display: grid; place-items: center; font-size: 13px;
  background: var(--surface); color: var(--text-2); box-shadow: var(--shadow);
}
.pager a:hover { color: var(--action); text-decoration: none; }
.pager .on { background: var(--action); color: #fff; font-weight: 700; }
.pager .off { opacity: .4; }

/* ==================================================================
   FICHA DE PRODUCTO
   ================================================================== */
.pdp { max-width: var(--maxw); margin: 12px auto; padding: 0 12px; }
.pdp-box {
  background: var(--surface); border-radius: var(--r); box-shadow: var(--shadow);
  padding: 16px; display: grid; gap: 20px;
}
@media (min-width: 900px) {
  .pdp-box { grid-template-columns: minmax(0,1fr) 320px; padding: 24px; }

  /* La descripcion va DEBAJO DE LAS FOTOS, en la columna izquierda (como
     MELI). Antes iba en un bloque a todo el ancho y estiraba la pagina.

     Se hace con posicionamiento de grid y no moviendo el HTML: asi en
     mobile, donde todo se apila en una columna, queda en el orden natural
     del DOM (fotos -> compra -> descripcion), que es como estaba. */
  .gal      { grid-column: 1; grid-row: 1; }
  .pdp-der  { grid-column: 2; grid-row: 1 / span 2; }
  .pdp-desc { grid-column: 1; grid-row: 2; }
}

/* --- galeria: scroll-snap + miniaturas ancla (cero JS) --- */
/* align-self:start -> la galeria NO se estira.
   .pdp-box es un grid y la columna derecha (el panel de compra) es mas
   alta que la foto, asi que la fila tomaba SU alto y la galeria crecia
   con ella: medido, 518px de fila para una foto de 460, o sea 58px
   muertos entre la foto y la descripcion. */
.gal { display: grid; gap: 10px; align-self: start; }
@media (min-width: 640px) {
  .gal { grid-template-columns: 58px minmax(0,1fr); }
  /* Con una sola foto no hay columna de miniaturas: si se deja el grid de
     dos columnas, la foto cae en la de 58px y queda un hilo vertical. */
  .gal.gal-sola { grid-template-columns: minmax(0,1fr); }
}

.gal-th { display: flex; gap: 8px; overflow: auto; scrollbar-width: none; order: 2; }
.gal-th::-webkit-scrollbar { display: none; }
@media (min-width: 640px) { .gal-th { flex-direction: column; order: 1; max-height: 420px; } }
.gal-th a {
  flex: 0 0 auto; width: 50px; height: 50px; border-radius: var(--r-sm);
  border: 1px solid var(--border); background: #fff; overflow: hidden; padding: 3px;
}
.gal-th a:hover { border-color: var(--action); }
/* miniatura activa (la marca el script al hacer clic) */
.gal-th a.on { border-color: var(--marca, #e7191f); box-shadow: 0 0 0 1px var(--marca, #e7191f); }
.gal-th img { width: 100%; height: 100%; object-fit: contain; }

.gal-m {
  order: 1; display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
  scroll-behavior: auto; scrollbar-width: none; border-radius: var(--r);
  background: #fff;
}
@media (min-width: 640px) { .gal-m { order: 2; } }
/* overflow-y explicito: con overflow-x:auto el navegador convierte el
   eje Y a auto tambien, y cualquier pixel de mas genera scroll vertical
   dentro de la foto (se veian 5px de sobra en mobile). */
.gal-m { overflow-y: hidden; }
.gal-m::-webkit-scrollbar { display: none; }
.gal-m > div {
  flex: 0 0 100%; scroll-snap-align: center;
  /* FLEX y no GRID: con grid el track de la fila es auto, crece con la
     foto, y el max-height:100% de la foto se resuelve contra ese track
     ya crecido -es circular y el navegador la deja pasar-. En flex el
     porcentaje se resuelve contra la caja de verdad. */
  display: flex; align-items: center; justify-content: center;
  /* ALTO CONCRETO, no aspect-ratio + max-height.
     Con aspect-ratio el alto se deriva del ancho (800px) y el max-height
     recorta la CAJA, pero el max-height:100% de la foto se resuelve
     igual contra los 800 originales: la imagen se dibujaba 700x700 en
     una caja de 460 y la parte de abajo quedaba afuera. Medido:
     scrollHeight 726 contra clientHeight 518.
     Con un alto en pixeles el porcentaje tiene contra que resolverse. */
  height: var(--gal-h);
  /* Aire: varias fotos del catalogo vienen con el producto pegado al
     borde del archivo, y sin margen se leen como cortadas. */
  padding: 26px;
}
@media (max-width: 639px) {
  /* en mobile la caja es cuadrada: ahi el alto SI sale del ancho real,
     asi que el porcentaje de la foto se resuelve bien */
  .gal-m > div { height: auto; aspect-ratio: 1 / 1; padding: 16px; }
}
.gal-m img {
  max-width: 100%; max-height: 100%; width: auto; height: auto;
  object-fit: contain;
}
.gal-m iframe { width: 100%; height: 100%; border: 0; aspect-ratio: 16/9; }

/* --- columna de datos --- */
.pdp-cond { font-size: 12px; color: var(--text-2); margin-bottom: 6px; }

/* La referencia de costo va SIN estilo propio: hereda el color y la
   tipografia de .pdp-cond y se lee como una parte mas del renglon.
   El <span> se conserva por el title, que aclara que es ese numero. */

/* Tags de categoria destacada en la ficha, entre el codigo y el titulo.
   Es el lugar donde MercadoLibre pone el "MAS VENDIDO".

   Un punto mas grandes que los de la tarjeta: aca hay lugar de sobra y
   es el unico distintivo que tiene el producto arriba del nombre.
   El color y el fondo salen igual que en la card -del propio
   home_color, con color-mix sobre currentColor- para que un mismo tag
   se vea igual en la grilla y en la ficha. */
.pdp-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 8px; }

/* La descripcion ORIGINAL del proveedor, debajo de la version en
   castellano. Es material de consulta -medidas, compatibilidades,
   codigos que la version resumida pudo dejar afuera-, no algo para
   leer de corrido: va chica, gris y todo seguido, sin saltos. */
.pdp-orig {
  margin-top: 14px; padding-top: 12px;
  border-top: 1px solid var(--linea, #e6e6e6);
  font-size: 12px; line-height: 1.5;
  color: var(--text-3, #999);
}
.pdp-tag {
  display: inline-flex; align-items: center;
  padding: 4px 10px; border-radius: 6px;
  font-size: 12.5px; font-weight: 700; line-height: 1.35;
  letter-spacing: .01em;
  color: var(--marca, #e7191f);
  background: rgba(var(--marca-rgb, 231,25,31), .10);
}
@supports (background: color-mix(in srgb, red 10%, transparent)) {
  .pdp-tag { background: color-mix(in srgb, currentColor 13%, transparent); }
}
.pdp h1 { font-size: clamp(17px, 2.4vw, 22px); font-weight: 600; margin-bottom: 12px; }
.pdp-precio { font-size: clamp(30px, 5vw, 38px); font-weight: 300; letter-spacing: -1px; line-height: 1.1; }
.pdp-old { font-size: 15px; }
.pdp-off { color: var(--ok); font-size: 15px; font-weight: 600; margin-left: 8px; }
.pdp-cuot { color: var(--ok); font-size: 15px; font-weight: 500; margin-top: 4px; }
.pdp-envio { color: var(--ok); font-weight: 600; font-size: 14px; margin-top: 12px; }
.pdp-stock { font-size: 14px; font-weight: 600; margin-top: 14px; }
.pdp-demora { color: var(--warn); }
.pdp-demora span {
  display: block; font-weight: 400; font-size: 12.5px;
  color: var(--text-2); margin-top: 3px; line-height: 1.4;
}

.buybox { display: flex; flex-direction: column; gap: 10px; margin-top: 18px; }
.buybox form { margin: 0; }   /* el form de "agregar al carrito" no debe romper el stack */
.btn {
  display: block; width: 100%; text-align: center; border: 0; border-radius: var(--r);
  padding: 13px 16px; font-size: 15px; font-weight: 600; line-height: 1.2;
  transition: background .15s, opacity .15s;
}
.btn:hover { text-decoration: none; }
/* Los botones toman el color de marca de $CFG->color_barra_top, que
   vyse_head() publica como --marca / --marca-rgb / --marca-ink.
   El principal va a pleno; el secundario, letra del color sobre un fondo
   translucido del mismo tono. */
.btn-1 { background: var(--marca, #e7191f); color: var(--marca-ink, #fff); }
.btn-1:hover { background: var(--marca-hover, #c41419); color: var(--marca-ink, #fff); }
.btn-2 { background: rgba(var(--marca-rgb, 231,25,31), .10); color: var(--marca, #e7191f); }
.btn-2:hover { background: rgba(var(--marca-rgb, 231,25,31), .18); color: var(--marca, #e7191f); }
.btn-wa { background: #25d366; color: #fff; }
.btn-wa:hover { background: #1eb85a; color: #fff; }
.btn:disabled { opacity: .5; cursor: not-allowed; }

.pdp-vend { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--border); font-size: 13px; color: var(--text-2); }
.pdp-vend b { color: var(--text); }

.pdp-desc { margin-top: 26px; padding-top: 22px; border-top: 1px solid var(--border); }
.pdp-desc h2 { font-size: 26px; margin-bottom: 16px; }   /* titulo mas grande, como pediste */
@media (max-width: 899px) { .pdp-desc h2 { font-size: 22px; } }
.pdp-desc .txt { font-size: 14px; line-height: 1.7; color: var(--text-2); white-space: pre-line; overflow-wrap: anywhere; }
.pdp-desc .txt img { max-width: 100%; height: auto; }

.specs { width: 100%; border-collapse: collapse; margin-top: 12px; font-size: 13px; }
.specs td { padding: 9px 12px; border-bottom: 1px solid var(--border); }
.specs tr td:first-child { color: var(--text-2); width: 40%; }
.specs tr:nth-child(odd) { background: var(--surface-2); }

/* ---------- cantidad en la ficha ---------- */
.pdp-cant { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; margin-top: 16px; font-size: 14px; }
.pdp-cant label { color: var(--text-2); }
.pdp-cant select {
  height: 36px; padding: 0 10px; font-size: 14px; font-family: inherit;
  border: 1px solid var(--border); border-radius: var(--r);
  background: var(--surface); color: var(--text); outline: none;
}
.pdp-cant select:focus { border-color: var(--action); box-shadow: 0 0 0 3px var(--action-sf); }
.pdp-cant span { font-size: 13px; color: var(--text-2); font-weight: 600; }

/* ---------- cuadro de medios de pago ---------- */
.pagos { margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--border); }
.pagos h2 { font-size: 15px; margin-bottom: 10px; }
.pagos-t { width: 100%; border-collapse: collapse; font-size: 13px; }
.pagos-t tr { border-bottom: 1px solid var(--border); }
.pagos-t tr:last-child { border-bottom: 0; }
.pagos-t th {
  text-align: left; font-weight: 500; color: var(--text-2);
  padding: 8px 8px 8px 0; vertical-align: top;
}
.pagos-t td { text-align: right; padding: 8px 0; white-space: nowrap; }
.pagos-t td b { display: block; font-weight: 600; color: var(--text); font-size: 13.5px; }
.pagos-t td span { display: block; font-size: 11.5px; color: var(--text-3); margin-top: 1px; }
.pagos-t tr.mejor th, .pagos-t tr.mejor td b { color: var(--ok); }
.tag-ok {
  display: inline-block; margin-left: 6px; font-size: 10px; font-weight: 700;
  background: rgba(0,166,80,.12); color: var(--ok);
  padding: 1px 6px; border-radius: 3px; text-transform: uppercase; letter-spacing: .3px;
}

/* "La mas elegida": mismo peso visual que el verde del mas barato, pero
   en el color de marca, para que se lean como dos cosas distintas y no
   compitan. El fuego va en un <span> aparte, no como ::before, asi el
   emoji no hereda el uppercase ni el letter-spacing. */
.tag-top {
  display: inline-block; margin-left: 6px; font-size: 10px; font-weight: 700;
  background: rgba(var(--marca-rgb, 231,25,31), .10); color: var(--marca, #e7191f);
  padding: 1px 7px; border-radius: 3px; text-transform: uppercase; letter-spacing: .3px;
  white-space: nowrap;
}
.tag-top > span { font-size: 11px; letter-spacing: 0; }

/* la fila destacada de la ficha se marca en el color de marca */
.pagos-t tr.top th { color: var(--marca, #e7191f); font-weight: 600; }
.pagos-p { font-size: 11.5px; color: var(--text-3); margin: 10px 0 0; line-height: 1.4; }

.mdl-cant { font-size: 12px; color: var(--text-2); margin-top: 2px; }

/* ==================================================================
   MODAL (elemento <dialog> nativo)
   ================================================================== */
dialog.mdl {
  border: 0; border-radius: var(--r-lg); padding: 0; width: min(520px, calc(100vw - 24px));
  background: var(--surface); color: var(--text); box-shadow: 0 20px 60px rgba(0,0,0,.35);
}
dialog.mdl::backdrop { background: rgba(0,0,0,.55); backdrop-filter: blur(2px); }
.mdl-h { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 18px; border-bottom: 1px solid var(--border); }
.mdl-h h2 { font-size: 17px; }
.mdl-x { border: 0; background: none; color: var(--text-2); font-size: 24px; line-height: 1; width: 32px; height: 32px; border-radius: 50%; }
.mdl-x:hover { background: var(--surface-2); color: var(--text); }
.mdl-b { padding: 18px; max-height: min(70vh, 560px); overflow: auto; }
.mdl-f { padding: 14px 18px; border-top: 1px solid var(--border); display: flex; gap: 10px; }
.mdl-f .btn { width: auto; flex: 1; }

/* ------------------------------------------------------------------
   MENU LATERAL (drawer) - mobile, patron MercadoLibre
   Es el mismo <dialog> nativo, corrido a la izquierda y a pantalla completa.
   ------------------------------------------------------------------ */
dialog.drawer {
  border: 0; padding: 0; margin: 0;
  width: min(300px, 84vw); max-width: none;
  height: 100%; max-height: 100%;
  background: var(--surface); color: var(--text);
  box-shadow: 4px 0 24px rgba(0,0,0,.3);
  animation: drwIn .22s ease-out;
  /* El propio dialog NO scrollea: si scrollea el y ademas su contenido,
     aparecen dos barras laterales superpuestas. El unico que scrollea es
     .drw-b, y para eso se reparte el alto con flex (nada de calc(), que
     se desfasa si cambia el alto del encabezado). */
  overflow: hidden;
}

/* OJO: el display va SOLO en [open].
   El navegador oculta un <dialog> cerrado con su propio display:none; si
   se declara display:flex en la regla general se le pisa esa regla y el
   menu queda visible siempre, tambien en desktop. */
dialog.drawer[open] { display: flex; flex-direction: column; }
dialog.drawer::backdrop { background: rgba(0,0,0,.5); }
@keyframes drwIn { from { transform: translateX(-100%); } to { transform: none; } }

.drw-h {
  flex: 0 0 auto;
  display: flex; align-items: center; justify-content: space-between;
  padding: 15px 16px;
  /* color de marca: sale de $CFG->color_barra_top (ver vyse_head) */
  background: var(--marca, #e7191f);
  color: var(--marca-ink, #fff);
}
.drw-h .mdl-x { color: var(--marca-ink, #fff); }
.drw-h .mdl-x:hover { background: rgba(255,255,255,.18); }
.drw-h strong { font-size: 15px; }

.drw-b {
  flex: 1 1 auto; min-height: 0;      /* min-height:0 -> deja scrollear al hijo */
  display: flex; flex-direction: column; padding: 6px 0;
  overflow-y: auto; -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;        /* no arrastra el scroll de la pagina */
}
.drw-b a {
  padding: 13px 18px; font-size: 14.5px; color: var(--text);
  border-bottom: 1px solid var(--border);
}
.drw-b a:hover, .drw-b a.on { background: var(--surface-2); text-decoration: none; }
.drw-b a.on { color: var(--marca, #e7191f); font-weight: 600; }
.drw-b hr { border: 0; border-top: 1px solid var(--border); margin: 8px 0; }
.drw-t {
  padding: 12px 18px 6px; font-size: 11px; font-weight: 700;
  color: var(--text-3); text-transform: uppercase; letter-spacing: .4px;
}

/* "Otras categorias" cierra la lista del menu lateral. Va en el color
   de accion, como su gemelo de la tira de arriba: no es un rubro mas,
   es la puerta al catalogo entero. */
.drw-b a.drw-mas { color: var(--action); font-weight: 600; }
.drw-b a.drw-sub {
  display: flex; justify-content: space-between; align-items: baseline; gap: 8px;
  padding-left: 26px; font-size: 14px;
}
.drw-b a.drw-sub b { font-weight: 400; font-size: 11px; color: var(--text-3); }

/* resumen de producto dentro del modal */
.mini {
  display: flex; gap: 12px; align-items: center; padding: 12px;
  background: var(--surface-2); border-radius: var(--r); margin-bottom: 18px;
}
.mini img { width: 56px; height: 56px; object-fit: contain; background: #fff; border-radius: var(--r-sm); }
.mini .t { font-size: 13px; color: var(--text); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.mini .p { font-size: 17px; font-weight: 600; margin-top: 2px; }

/* ==================================================================
   FORMULARIOS
   ================================================================== */
.fld { margin-bottom: 14px; }
.fld label { display: block; font-size: 12px; font-weight: 600; color: var(--text-2); margin-bottom: 5px; }
.fld input, .fld select, .fld textarea {
  width: 100%; height: 42px; padding: 0 12px; font-size: 15px; font-family: inherit;
  border: 1px solid var(--border); border-radius: var(--r);
  background: var(--surface); color: var(--text); outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.fld textarea { height: auto; min-height: 84px; padding: 10px 12px; resize: vertical; }
.fld input:focus, .fld select:focus, .fld textarea:focus {
  border-color: var(--action); box-shadow: 0 0 0 3px var(--action-sf);
}
.fld .hint { font-size: 12px; color: var(--text-3); margin-top: 4px; }
.fld.err input, .fld.err select { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(231,25,31,.14); }
.fld.err .hint { color: var(--brand); }

/* --- campo con error de validacion --- */
/* La clase la pone el servidor al redibujar el form y tambien el JS al
   validar en vivo, asi que el aspecto es el mismo con o sin JS. */
.fld-mal input, .fld-mal select {
  border-color: var(--marca, #e7191f) !important;
  box-shadow: 0 0 0 3px rgba(231,25,31,.14);
}
/* Block y no flex: en flex el texto es un item anonimo y el navegador le
   come los espacios de los bordes, asi que la coma quedaba pegada a la
   palabra siguiente al cortar el renglon. */
.fld-e {
  margin: 5px 0 0; font-size: 12px; font-weight: 500; line-height: 1.45;
  color: var(--marca, #e7191f);
}
.fld-e::before {
  content: "!"; display: inline-block; vertical-align: -2px;
  width: 14px; height: 14px; margin-right: 5px;
  border-radius: 50%; background: var(--marca, #e7191f); color: #fff;
  font-size: 10px; font-weight: 700; text-align: center; line-height: 14px;
}
.fld-e[hidden] { display: none; }

/* aviso general arriba del formulario */
.ck-aviso {
  margin: 0 0 18px; padding: 12px 14px;
  background: rgba(231,25,31,.08); border-left: 3px solid var(--marca, #e7191f);
  border-radius: var(--r); font-size: 13.5px; color: var(--text);
}
.row2 { display: grid; gap: 0 12px; grid-template-columns: 1fr; }
@media (min-width: 480px) { .row2 { grid-template-columns: 1fr 1fr; } }

/* honeypot antispam: invisible para humanos, visible para bots */
.hp { position: absolute !important; left: -9999px !important; width: 1px; height: 1px; overflow: hidden; }

.alert { padding: 12px 14px; border-radius: var(--r); font-size: 13px; margin-bottom: 16px; }
.alert-err { background: rgba(231,25,31,.1); color: var(--brand); border: 1px solid rgba(231,25,31,.25); }
.alert-ok  { background: rgba(0,166,80,.1); color: var(--ok); border: 1px solid rgba(0,166,80,.25); }
.alert-inf { background: var(--action-sf); color: var(--action); border: 1px solid rgba(52,131,250,.25); }

/* pasos del checkout */
.pasos { display: flex; gap: 6px; margin-bottom: 18px; }
.pasos i {
  flex: 1; height: 3px; border-radius: 2px; background: var(--border); font-style: normal;
}
.pasos i.on { background: var(--marca, #e7191f); }

/* ==================================================================
   CHECKOUT
   ================================================================== */
.ck { display: grid; gap: 18px; max-width: 980px; margin: 0 auto; width: 100%; }
@media (min-width: 860px) { .ck { grid-template-columns: minmax(0,1fr) 300px; align-items: start; } }
.ck > * { min-width: 0; }

.ck-main { background: var(--surface); border-radius: var(--r); box-shadow: var(--shadow); padding: 26px; }
.ck-main h1 { font-size: 22px; margin-bottom: 4px; }
.ck-sub { color: var(--text-2); font-size: 14px; margin: 0 0 20px; }
.ck-main .btn { margin-top: 6px; }

/* resumen lateral */
.ck-res { background: var(--surface); border-radius: var(--r); box-shadow: var(--shadow); padding: 18px; }
.ck-res h2 { font-size: 15px; margin-bottom: 12px; }
.ck-l { display: grid; grid-template-columns: 44px 1fr auto; gap: 9px; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--border); }
.ck-img { width: 44px; height: 44px; background: #fff; border-radius: var(--r-sm); display: grid; place-items: center; overflow: hidden; }
.ck-img img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
.ck-n { font-size: 12.5px; line-height: 1.3; display: block; overflow: hidden; }
.ck-n em { display: block; font-style: normal; font-size: 11px; color: var(--text-3); margin-top: 2px; }
.ck-p { font-size: 13px; font-weight: 600; white-space: nowrap; }
.ck-tot { display: flex; justify-content: space-between; align-items: baseline; padding-top: 12px; }
.ck-tot span { font-size: 14px; color: var(--text-2); }
.ck-tot strong { font-size: 21px; font-weight: 600; }
.ck-nota { font-size: 11.5px; color: var(--text-3); margin: 10px 0 0; line-height: 1.4; }

/* lista de medios de pago */
.mp-lista { display: flex; flex-direction: column; gap: 9px; }
.mp-op {
  display: grid; grid-template-columns: auto 1fr auto; gap: 11px; align-items: center;
  border: 1px solid var(--border); border-radius: var(--r); padding: 13px 15px; cursor: pointer;
  transition: border-color .15s, background .15s;
}
.mp-op:hover { border-color: var(--marca, #e7191f); }
.mp-op input { accent-color: var(--marca, #e7191f); width: 18px; height: 18px; }
.mp-op:has(input:checked) {
  border-color: var(--marca, #e7191f);
  background: rgba(var(--marca-rgb, 231,25,31), .08);
}
.mp-b { display: block; min-width: 0; }
.mp-t { display: block; font-size: 14px; font-weight: 600; }
.mp-d { display: block; font-size: 11.5px; color: var(--text-2); margin-top: 2px; }
.mp-p { text-align: right; white-space: nowrap; }
.mp-p b { display: block; font-size: 14.5px; font-weight: 600; }
.mp-p span { display: block; font-size: 11.5px; color: var(--text-3); }
.mp-mejor .mp-t { color: var(--ok); }

/* La opcion "mas elegida" queda con el borde de marca aunque no este
   tildada, para que se note de entrada cual es la que la mayoria usa. */
.mp-top { border-color: rgba(var(--marca-rgb, 231,25,31), .45); }

/* pantalla final */
.ck-fin { max-width: 620px; margin: 0 auto; background: var(--surface); border-radius: var(--r); box-shadow: var(--shadow); padding: 30px; }
.ck-fin h1 { font-size: 23px; margin-bottom: 4px; }
.ck-cta { display: block; width: 100%; margin-top: 14px; }
.ck-datos { background: var(--surface-2); border-radius: var(--r); padding: 16px; margin-top: 16px; }
.ck-datos h2 { font-size: 15px; margin-bottom: 8px; }
.ck-cbu { font-size: 12.5px; line-height: 1.7; word-break: break-word; }
.ck-llave { background: var(--surface-2); border-radius: var(--r); padding: 14px; margin-top: 18px; }
.ck-llave span { display: block; font-size: 12px; font-weight: 600; color: var(--text-2); }
.ck-llave strong { display: block; font-size: 22px; letter-spacing: 2px; margin: 3px 0; }
.ck-llave em { display: block; font-style: normal; font-size: 11.5px; color: var(--text-3); line-height: 1.45; }
.ck-acc { display: flex; gap: 10px; margin-top: 16px; flex-wrap: wrap; }
.ck-acc .btn { flex: 1; }

@media (max-width: 699px) {
  .ck-main, .ck-fin { padding: 18px; }
  .mp-op { grid-template-columns: auto 1fr; row-gap: 6px; }
  .mp-p { grid-column: 2; text-align: left; }
}

/* ==================================================================
   CARRITO
   ================================================================== */
.cart-box { background: var(--surface); border-radius: var(--r); box-shadow: var(--shadow); overflow: hidden; }
.cart-l {
  display: grid; align-items: center; gap: 12px;
  grid-template-columns: 72px 1fr auto auto auto;
  padding: 14px; border-bottom: 1px solid var(--border);
}
.cart-l:last-child { border-bottom: 0; }
.cart-img { width: 72px; height: 72px; background: #fff; border-radius: var(--r-sm); overflow: hidden; display: grid; place-items: center; }
.cart-img img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; padding: 4px; }
.cart-d { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.cart-d a { color: var(--text); font-size: 14px; line-height: 1.35; }
.cart-d a:hover { color: var(--action); }
.cart-unit { font-size: 12px; color: var(--text-3); }
.cart-demora { font-size: 11.5px; color: var(--warn); font-weight: 600; }
.cart-cant select {
  height: 34px; padding: 0 8px; font-size: 14px; font-family: inherit;
  border: 1px solid var(--border); border-radius: var(--r);
  background: var(--surface); color: var(--text);
}
.cart-sub { font-size: 16px; font-weight: 600; white-space: nowrap; }
.cart-del button {
  border: 0; background: none; color: var(--text-3);
  font-size: 22px; line-height: 1; width: 32px; height: 32px; border-radius: 50%;
}
.cart-del button:hover { background: var(--surface-2); color: var(--brand); }

.cart-pie {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap; margin-top: 14px;
}
.cart-vaciar { border: 0; background: none; color: var(--text-3); font-size: 13px; text-decoration: underline; padding: 0; }
.cart-vaciar:hover { color: var(--brand); }
.cart-tot { display: flex; align-items: baseline; gap: 12px; }
.cart-tot span { font-size: 14px; color: var(--text-2); }
.cart-tot strong { font-size: 26px; font-weight: 600; }

.cart-acc { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; margin-top: 18px; }
.cart-acc .btn { width: auto; padding: 13px 28px; }

@media (max-width: 699px) {
  .cart-l { grid-template-columns: 60px 1fr auto; row-gap: 8px; padding: 12px; }
  .cart-img { width: 60px; height: 60px; }
  .cart-cant { grid-column: 2; }
  .cart-sub  { grid-column: 3; grid-row: 2; }
  .cart-del  { grid-column: 3; grid-row: 1; justify-self: end; }
  .cart-acc .btn { flex: 1; padding: 13px 12px; }
}

/* ==================================================================
   ENLACES INTERNOS SEO
   ================================================================== */
.seo-links { border-top: 1px solid var(--border); margin-top: 30px; }
.seo-in { max-width: var(--maxw); margin: 0 auto; padding: 22px 12px 6px; }
.seo-in h2 { font-size: 14px; color: var(--text-2); margin-bottom: 10px; font-weight: 600; }
.seo-l { display: flex; flex-wrap: wrap; gap: 6px 14px; }
.seo-l a { font-size: 12.5px; color: var(--text-3); }
.seo-l a:hover { color: var(--action); }

/* ==================================================================
   FOOTER + WHATSAPP
   ================================================================== */
.ft { background: var(--surface); margin-top: 34px; border-top: 1px solid var(--border); }
.ft-in {
  max-width: var(--maxw); margin: 0 auto; padding: 26px 12px 40px;
  display: grid; gap: 18px; font-size: 12px; color: var(--text-2);
}
@media (min-width: 760px) { .ft-in { grid-template-columns: repeat(3, 1fr); } }
.ft-in a { color: var(--text-2); }
.ft-in a:hover { color: var(--action); }
.ft-in img { display: inline-block; max-width: 100%; height: auto; }
.ft-in font { color: var(--text-2) !important; }

/* ==================================================================
   PIE COMPACTO Y EXPANDIBLE  (patron MercadoLibre)
   Usa <details>/<summary>: se abre sin JavaScript, anda con teclado y
   los buscadores leen el contenido aunque este plegado.

   Sin expandir se ven SOLO la marca y los datos de contacto.
   Todo lo demas (links, datos societarios, legal, copyright) esta
   adentro del desplegable.
   ================================================================== */
.ft { background: transparent; margin-top: 34px; border-top: 0; }

/* --- banda siempre visible: marca + contacto ---
   Sin borde arriba: la solapa apoya justo aca y una linea le pasaria por
   debajo cortandola. La separacion visual la da el gris de la pagina. */
.ft-top { background: var(--surface); }
.ft-top-in {
  max-width: var(--maxw); margin: 0 auto; padding: 20px 12px;
  display: flex; justify-content: space-between; align-items: flex-start;
  gap: 20px; flex-wrap: wrap;
}
.ft-marca strong { display: block; font-size: 15px; color: var(--text); }
.ft-marca span { display: block; font-size: 12.5px; color: var(--text-2); margin-top: 3px; max-width: 46ch; }

.ft-cont { display: flex; gap: 24px; flex-wrap: wrap; }
.ft-cont a { font-size: 14px; font-weight: 600; color: var(--text); white-space: nowrap; }
.ft-cont a:hover { color: var(--marca, #e7191f); text-decoration: none; }
.ft-cont a em { display: block; font-style: normal; font-size: 11.5px; font-weight: 400; color: var(--text-3); }

/* --- LA SOLAPA ---
   Va PRIMERA, arriba de todo el pie. Como abajo sigue la banda blanca
   (.ft-top), esa banda le hace de base sola: la solapa apoya sobre el
   blanco y su parte de arriba queda sobre el gris de la pagina. Por eso
   no hacen falta franjas grises extra ni margenes negativos: eso era lo
   que rompia el pie cada vez que se tocaba algo.

   El toggle NO es un <details>: ahi todo lo que abre tiene que ir pegado
   despues del <summary>, y aca en el medio va la banda de contacto que
   queda siempre visible. Con un checkbox oculto + selector de hermanos
   los cuatro bloques quedan sueltos en el orden real, y sigue siendo
   CSS puro (sin JS el pie funciona igual). */
.ft-chk { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }

.ft-solapa {
  cursor: pointer;
  width: max-content;
  margin: 0 auto;
  background: var(--surface);
  border-radius: var(--r) var(--r) 0 0;
  padding: 11px 26px;
  font-size: 13px; font-weight: 600; color: var(--marca, #e7191f);
  display: flex; align-items: center; gap: 8px;
  box-shadow: 0 -2px 6px rgba(0,0,0,.05);
  -webkit-user-select: none; user-select: none;
}
.ft-solapa:hover { background: var(--surface-2); }
/* el foco se dibuja sobre la etiqueta porque el checkbox real es invisible */
.ft-chk:focus-visible + .ft-solapa { outline: 2px solid var(--marca, #e7191f); outline-offset: 2px; }

.ft-solapa::after {
  content: ""; width: 7px; height: 7px;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px,-2px);
  transition: transform .2s;
}
.ft-chk:checked + .ft-solapa::after { transform: rotate(-135deg) translate(-2px,-2px); }

/* --- lo que se despliega: panel y copyright, los dos ocultos ---
   Se abre con el truco de grid 0fr -> 1fr: es la unica forma de animar
   un alto desconocido sin JS ni max-height inventado (un max-height fijo
   deja un retardo feo al cerrar cuando el contenido es mas bajo).
   La fila es UNA sola, por eso los dos bloques van dentro de .ft-desp-in.
   La visibilidad va en la misma transicion para que los links no queden
   tabulables mientras esta cerrado. */
.ft-chk ~ .ft-desp {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows .34s cubic-bezier(.4,0,.2,1);
}
.ft-chk:checked ~ .ft-desp { grid-template-rows: 1fr; }

.ft-desp > .ft-desp-in {
  overflow: hidden; min-height: 0;   /* min-height:0: sin esto la fila no baja de su alto minimo */
  visibility: hidden;
  transition: visibility .34s;
}
.ft-chk:checked ~ .ft-desp > .ft-desp-in { visibility: visible; }

@media (prefers-reduced-motion: reduce) {
  .ft-chk ~ .ft-desp,
  .ft-desp > .ft-desp-in { transition: none; }
}

/* El panel lleva su PROPIO fondo blanco: si lo hereda del padre queda gris. */
.ft-mas-in { background: var(--surface); padding-bottom: 18px; }
.ft-mas-in > * { max-width: var(--maxw); margin-left: auto; margin-right: auto; }

.ft-links { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 18px 12px 0; }
.ft-links a { font-size: 13px; color: var(--text-2); }
.ft-links a:hover { color: var(--marca, #e7191f); }

.ft-datos { display: flex; flex-wrap: wrap; gap: 4px 18px; font-size: 12.5px; color: var(--text-2); padding: 14px 12px 0; }
.ft-sellos { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 14px 12px 0; }
.ft-sellos img { height: 46px; width: auto; }
.ft-legal { font-size: 11.5px; color: var(--text-3); line-height: 1.5; padding: 12px 12px 0; max-width: 90ch; }

/* .ft-copy quedo como hijo directo del <footer>, asi que necesita su
   propio fondo blanco (antes lo heredaba del panel). */
.ft-copy {
  background: var(--surface);
  padding: 12px;
  font-size: 11.5px; color: var(--text-3); text-align: center;
}
.ft-copy::before {
  content: ""; display: block;
  max-width: var(--maxw); margin: 0 auto 12px;
  border-top: 1px solid var(--border);
}

@media (max-width: 699px) {
  .ft-top-in { flex-direction: column; gap: 14px; padding: 18px 12px; }
  .ft-cont { gap: 14px 22px; }
  .ft-solapa { padding: 11px 20px; }
  /* Aire para el globo de WhatsApp.
     NO va en el <footer>: el footer es transparente, asi que ese padding
     mostraba el gris de la pagina debajo del bloque blanco y quedaba una
     banda suelta contra el borde inferior. Se lo lleva el ULTIMO bloque
     blanco, que cambia segun este expandido o no. */
  .ft-chk:not(:checked) ~ .ft-top        { padding-bottom: 58px; }
  .ft-chk:checked ~ .ft-desp .ft-copy    { padding-bottom: 58px; }
  .ft-abierto ~ .ft-copy                 { padding-bottom: 58px; }
}
.wa-fab {
  position: fixed; right: 16px; bottom: 16px; z-index: 40;
  width: 52px; height: 52px; border-radius: 50%;
  background: #25d366; color: #fff;
  display: grid; place-items: center; box-shadow: 0 4px 14px rgba(0,0,0,.28);
}
.wa-fab:hover { background: #1eb85a; }

/* ==================================================================
   AVISO DE "CARGANDO" AL NAVEGAR
   El JS solo agrega clases; toda la animacion se resuelve aca.
   ================================================================== */

/* --- barra de progreso arriba de todo --- */
.cargando::before {
  content: "";
  position: fixed; top: 0; left: 0; height: 3px; width: 100%;
  z-index: 9999; pointer-events: none;
  background: var(--action);
  transform-origin: 0 50%;
  animation: navbar 1.6s cubic-bezier(.15,.85,.3,1) forwards;
}
@keyframes navbar {
  0%   { transform: scaleX(0);    opacity: 1; }
  40%  { transform: scaleX(.55);  opacity: 1; }
  75%  { transform: scaleX(.82);  opacity: 1; }
  100% { transform: scaleX(.95);  opacity: 1; }
}
/* el cursor tambien avisa */
.cargando, .cargando a { cursor: progress; }

/* --- cargador de pantalla completa --- */
#cargador {
  position: fixed; inset: 0; z-index: 9998;
  display: grid; place-items: center;
  background: rgba(255,255,255,.72);
  backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
  opacity: 0; visibility: hidden;
  transition: opacity .18s ease, visibility .18s;
}
:root[data-theme="dark"] #cargador { background: rgba(15,17,21,.75); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) #cargador { background: rgba(15,17,21,.75); }
}
#cargador.on { opacity: 1; visibility: visible; }

.cg-caja {
  display: flex; flex-direction: column; align-items: center; gap: 14px;
  background: var(--surface); border-radius: var(--r-lg);
  box-shadow: 0 10px 40px rgba(0,0,0,.22);
  padding: 30px 40px;
}
.cg-caja span { font-size: 14px; font-weight: 600; color: var(--text-2); }
.cg-rueda {
  width: 46px; height: 46px;
  border: 4px solid var(--border);
  border-top-color: var(--action);
  border-radius: 50%;
  animation: rueda .7s linear infinite;
}
@media (max-width: 699px) {
  .cg-caja { padding: 26px 34px; }
  .cg-rueda { width: 52px; height: 52px; border-width: 5px; }
  .cg-caja span { font-size: 15px; }
}
@media (prefers-reduced-motion: reduce) { .cg-rueda { animation-duration: 2s; } }

/* --- card de producto / categoria en estado cargando --- */
.card.is-load, .cat.is-load { position: relative; }
.card.is-load::after, .cat.is-load::after {
  content: "";
  position: absolute; inset: 0; z-index: 3;
  background: rgba(255,255,255,.62);
  border-radius: inherit;
}
:root[data-theme="dark"] .card.is-load::after,
:root[data-theme="dark"] .cat.is-load::after { background: rgba(20,23,28,.62); }

/* la rueda */
.card.is-load::before, .cat.is-load::before {
  content: "";
  position: absolute; z-index: 4;
  top: 50%; left: 50%; width: 28px; height: 28px; margin: -14px 0 0 -14px;
  border: 3px solid var(--border);
  border-top-color: var(--action);
  border-radius: 50%;
  animation: rueda .7s linear infinite;
}
@keyframes rueda { to { transform: rotate(360deg); } }

/* --- item de menu en estado cargando --- */
.side a.is-load, .hd-nav-in a.is-load, .drw-b a.is-load,
.chips a.is-load, .seo-l a.is-load, a.is-load {
  position: relative; opacity: .55;
}
/* rueda chica al final del texto del item */
.side a.is-load::after, .drw-b a.is-load::after, .chips a.is-load::after {
  content: ""; display: inline-block; vertical-align: middle;
  width: 12px; height: 12px; margin-left: 7px;
  border: 2px solid var(--border); border-top-color: var(--action);
  border-radius: 50%; animation: rueda .7s linear infinite;
}
/* en la tira del top la rueda va como subrayado animado, no rompe el alto */
.hd-nav-in a.is-load { opacity: 1; border-bottom-color: var(--action); }

@media (prefers-reduced-motion: reduce) {
  .cargando::before { animation: none; transform: scaleX(.9); }
  .card.is-load::before, .cat.is-load::before,
  .side a.is-load::after, .drw-b a.is-load::after, .chips a.is-load::after { animation: none; }
}

/* ==================================================================
   RESPONSIVE
   Mobile-first ya viene de arriba; aca van los ajustes finos.
   Breakpoints: 480 / 700 / 900 / 1200
   ================================================================== */

/* ---- MOBILE (< 700px) ---- */
@media (max-width: 699px) {

  /* Header patron MELI: hamburguesa + logo + iconos arriba, buscador abajo.
     La tira horizontal de categorias se reemplaza por el menu lateral. */
  .hd-in {
    height: auto; padding: 8px 12px;
    flex-wrap: wrap; row-gap: 8px; gap: 8px;
  }
  button.hd-burger { display: grid; order: 0; flex: 0 0 auto; }
  .hd-logo   { order: 1; flex: 1 1 auto; }
  .hd-logo img { height: 28px; }
  .hd-acc    { order: 2; flex: 0 0 auto; }
  /* El buscador NO ocupa una fila fija: se abre con la lupa.
     Se pliega solo si el JS marco .hd-js; sin JS queda visible. */
  button.hd-lupa { display: grid; }
  .hd-search { order: 3; flex: 1 0 100%; max-width: none; }
  .hd.hd-js .hd-search { display: none; }
  .hd.hd-js.hd-buscando .hd-search { display: flex; }
  .hd.hd-js.hd-buscando .hd-lupa { color: var(--marca, #e7191f); opacity: 1; }

  /* en mobile las categorias viven en el drawer, no en una tira que
     obliga a scrollear a ciegas */
  .hd-nav { display: none; }

  /* la marquesina no necesita tanto alto en mobile */
  .hero-s img { height: clamp(140px, 42vw, 210px); }
  .hero-dots { bottom: 54px; }

  /* categorias: carrusel horizontal, tarjetas mas chicas */
  :root { --hero-solape: 44px; }
    .cats-top { padding: 0 8px; }
  .home-h1 { font-size: 12px; line-height: 1.3; margin-bottom: 7px; }
  .cat { flex: 0 0 146px; padding: 12px; min-height: 232px; }
  .cat-t { font-size: 12.5px; }
  .cat-img { height: 96px; max-height: 96px; min-height: 0; }
  .cat-d { display: none; }              /* en mobile la descripcion sobra */
  .cat-b { font-size: 11.5px; padding: 6px 8px; }

  /* grilla de productos: 2 columnas justas */
  .grid { grid-template-columns: repeat(2, 1fr); gap: 8px; }
  .lay  { padding: 0 8px; }
  .card-b { padding: 8px 9px 11px; }
  .card-t { font-size: 12.5px; }
  .card-now { font-size: 18px; }

  /* ------------------------------------------------------------------
     TIRAS DE PRODUCTOS EN MOBILE
     En vez de scrollear en horizontal (donde el usuario no sabe cuanto
     hay ni llega al final), se rearman hacia abajo en formato lista:
     foto a la izquierda, datos a la derecha. Igual que MercadoLibre.

     Es 100% CSS: el HTML y el JS son exactamente los mismos que en
     desktop. Solo cambia el modo de layout del contenedor.

     La UNICA tira que sigue scrolleando en horizontal es la de
     categorias (.cats), que esta mas abajo en este mismo bloque.
     ------------------------------------------------------------------ */
  .slider { padding: 0 8px; margin-top: 18px; }
  .slider-h h2 { font-size: 16px; }

  .slider-t {
    display: grid;                 /* deja de ser flex horizontal */
    grid-template-columns: 1fr;    /* una fila por producto */
    gap: 0;
    overflow: visible;             /* se acabo el scroll lateral */
    scroll-snap-type: none;
    padding: 0;
    background: var(--surface);
    border-radius: var(--r);
    box-shadow: var(--shadow);
  }
  .sl-i { width: auto; scroll-snap-align: none; }

  /* la card pasa de vertical a horizontal (fila de lista) */
  .slider-t .card {
    flex-direction: row;
    align-items: center;
    gap: 12px;
    border-radius: 0;
    box-shadow: none;
    border-bottom: 1px solid var(--border);
    padding: 12px;
    height: auto;
  }
  .slider-t .sl-i:last-child .card { border-bottom: 0; }
  .slider-t .card:hover { transform: none; box-shadow: none; }

  .slider-t .card-img {
    flex: 0 0 96px; width: 96px; aspect-ratio: 1 / 1;
    border-radius: var(--r-sm); overflow: hidden;
  }
  .slider-t .card-b { padding: 0; gap: 3px; }
  .slider-t .card-t { min-height: 0; font-size: 13px; }
  .slider-t .card-now { font-size: 17px; }
  .slider-t .card-off { left: 4px; top: 4px; font-size: 10px; padding: 1px 5px; }

  /* Con 6 tiras de 12 productos serian 72 filas: se muestran las
     primeras 6 de cada una y el resto queda detras del "Ver todo". */
  .slider-t .sl-i:nth-child(n+7) { display: none; }

  /* las flechas no tienen sentido si ya no hay scroll horizontal */
  .sl-nav { display: none !important; }

  /* El "Ver todo" del titulo se oculta y pasa al pie de la lista, que es
     donde el usuario llega despues de recorrer los productos. */
  .slider-h a, .verlink { display: none; }

  .slider-t { border-radius: var(--r) var(--r) 0 0; }

  .sl-mas {
    display: flex; align-items: center; justify-content: space-between;
    background: var(--surface); color: var(--action);
    border-radius: 0 0 var(--r) var(--r);
    box-shadow: var(--shadow);
    padding: 15px 14px; font-size: 14.5px; font-weight: 500;
    border-top: 1px solid var(--border);
  }
  .sl-mas:hover { text-decoration: none; background: var(--surface-2); }

  /* ficha de producto */
  .pdp { padding: 0 8px; }
  .pdp-box { padding: 12px; gap: 14px; }
  .pdp-desc { padding: 0 8px; }
  .pdp-desc .in { padding: 16px; }
  /* Foto cuadrada en mobile. Antes tenia aspect-ratio:1/1 Y max-height:320px
     a la vez: el ancho (335) pedia 335 de alto y el max-height lo cortaba a
     320, asi que quedaba 335x320 (no cuadrada) y sobraba scroll. */
  .gal-m > div { max-height: none; overflow: hidden; }
  .gal-th a { width: 44px; height: 44px; }

  /* el modal ocupa casi toda la pantalla y se pega abajo (mas comodo) */
  dialog.mdl {
    width: 100%; max-width: 100%; margin: 0; margin-top: auto;
    border-radius: var(--r-lg) var(--r-lg) 0 0;
    max-height: 92vh;
  }
  .mdl-b { max-height: none; padding: 14px; }
  .mdl-h { padding: 13px 14px; }
  .mdl-f { padding: 12px 14px; padding-bottom: max(12px, env(safe-area-inset-bottom)); }

  /* el boton de WhatsApp no debe tapar el boton de comprar */
  .wa-fab { width: 46px; height: 46px; right: 12px; bottom: 12px; }
  .wa-fab svg { width: 24px; height: 24px; }

  .pager a, .pager span { min-width: 30px; height: 30px; font-size: 12px; padding: 0 7px; }

  .ft-in { padding: 20px 12px 32px; }
  .skel { min-height: 210px; }
}

/* ---- MOBILE CHICO (< 380px) ---- */
@media (max-width: 379px) {
  .grid { gap: 6px; }
  .card-now { font-size: 16px; }
  .hd-logo img { height: 24px; }
}

/* ---- TABLET (700-899px) ---- */
@media (min-width: 700px) and (max-width: 899px) {
  .grid { grid-template-columns: repeat(3, 1fr); }
  .cat  { flex: 0 0 150px; }
  :root { --hero-solape: 68px; }
}

/* ---- pantallas anchas ---- */
@media (min-width: 1400px) {
  :root {
  --gal-h: 460px;   /* alto de la foto grande en desktop */ --maxw: 1280px; }
}

/* ---- alto chico y apaisado (celu acostado) ---- */
@media (max-height: 480px) and (orientation: landscape) {
  .hero-s img { height: 150px; }
  dialog.mdl { max-height: 96vh; }
}

/* ---- pantallas tactiles: no tiene sentido el hover de las flechas ---- */
@media (hover: none) {
  .sl-nav { display: none !important; }
  .card:hover, .cat:hover { transform: none; box-shadow: var(--shadow); }
}

/* ---------- utilidades ---------- */
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.mt0 { margin-top: 0 !important; }

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
}

/* ==================================================================
   MIS PEDIDOS
   Acceso por link enviado al mail: no hay campo de "llave" ni nada que
   copiar a mano. La vista es de SOLO LECTURA.
   ================================================================== */
.ped-caja {
  max-width: 560px; margin: 0 auto; width: 100%;
  background: var(--surface); border-radius: var(--r-lg);
  box-shadow: var(--shadow); padding: 34px 30px;
}
.ped-ancha { max-width: 720px; }
.ped-caja h1 { font-size: 22px; margin: 0 0 8px; line-height: 1.25; }
.ped-sub { color: var(--text-2); font-size: 14px; line-height: 1.55; margin: 0 0 22px; max-width: 48ch; }
.ped-caja .btn { margin-top: 6px; }

/* la aclaracion de que no se puede hacer nada mas que mirar */
.ped-nota {
  margin: 20px 0 0; padding-top: 16px;
  border-top: 1px solid var(--border);
  font-size: 12.5px; color: var(--text-3); line-height: 1.55;
}

.ped-head {
  display: flex; justify-content: space-between; align-items: flex-start;
  gap: 14px; flex-wrap: wrap; margin-bottom: 20px;
}
.ped-head .ped-sub { margin: 0; }
.ped-salir { font-size: 13px; color: var(--text-2); white-space: nowrap; }
.ped-salir:hover { color: var(--marca, #e7191f); }

.ped-item { border: 1px solid var(--border); border-radius: var(--r); padding: 16px; margin-bottom: 12px; }
.ped-item-h { display: flex; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 6px; }
.ped-item-h span { font-size: 12px; color: var(--text-2); }
.ped-item-d { font-size: 13px; color: var(--text-2); margin-bottom: 10px; }
.ped-item-d strong { color: var(--text); }
.ped-l { font-size: 13px; padding: 7px 0; border-top: 1px solid var(--border); }

@media (max-width: 560px) {
  .ped-caja { padding: 26px 20px; }
}

/* estado del pedido, como cartelito de color */
.ped-item-d { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ped-est {
  display: inline-block; padding: 3px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 600;
}
.ped-est-ok  { background: rgba(0,166,80,.12);  color: var(--ok); }
.ped-est-esp { background: rgba(245,166,35,.14); color: var(--warn); }
.ped-est-mal { background: rgba(var(--marca-rgb, 231,25,31), .10); color: var(--marca, #e7191f); }
.ped-tot { font-size: 13px; font-weight: 600; color: var(--text); margin-left: auto; }

/* ==================================================================
   GUIA POR VOZ
   ------------------------------------------------------------------
   Globito abajo a la derecha, arriba del de WhatsApp. Sirve de tres
   cosas a la vez: avisa que va a hablar, muestra que esta hablando, y
   es el boton para callarlo. Sale con [hidden] y lo muestra el JS: si
   no hay JS no queda un globo de adorno que no hace nada.
   ================================================================== */
/* Va a la IZQUIERDA: a la derecha compartia esquina con el globo de
   WhatsApp y quedaban dos botones flotantes apilados. */
.voz {
  position: fixed; left: 16px; bottom: 16px; z-index: 41;
  display: flex; align-items: center; gap: 0;
  opacity: 0; transform: translateY(8px);
  transition: opacity .3s, transform .3s;
}
.voz[hidden] { display: none; }
.voz-vis { opacity: 1; transform: none; }

.voz-b {
  width: 52px; height: 52px; border: 0; border-radius: 50%;
  background: var(--marca, #e7191f); color: #fff; cursor: pointer;
  display: grid; place-items: center; padding: 0;
  box-shadow: 0 4px 14px rgba(0,0,0,.28);
  transition: background .15s, transform .15s;
}
.voz-b:hover { transform: scale(1.06); }
.voz-b:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }

/* las 4 barritas del ecualizador */
.voz-ondas { display: flex; align-items: center; gap: 3px; height: 20px; }
.voz-ondas i {
  width: 3px; height: 7px; border-radius: 2px; background: currentColor;
  animation: voz-eq 1s ease-in-out infinite;
}
.voz-ondas i:nth-child(2) { animation-delay: .15s; }
.voz-ondas i:nth-child(3) { animation-delay: .3s; }
.voz-ondas i:nth-child(4) { animation-delay: .45s; }
@keyframes voz-eq { 0%,100% { height: 7px; } 50% { height: 19px; } }

/* Mientras espera el gesto, las barras quedan quietas: moverse cuando
   no suena nada seria mentir sobre lo que esta pasando. */
.voz-espera .voz-ondas i { animation: none; height: 12px; opacity: .85; }

/* halo que late, para que el ojo lo encuentre sin ser molesto */
.voz-espera .voz-b::after,
.voz-sonando .voz-b::after {
  content: ""; position: absolute; width: 52px; height: 52px;
  border-radius: 50%; background: var(--marca, #e7191f);
  opacity: .35; animation: voz-halo 1.8s ease-out infinite; z-index: -1;
}
@keyframes voz-halo {
  0%   { transform: scale(1);   opacity: .35; }
  100% { transform: scale(1.9); opacity: 0; }
}
.voz-b { position: relative; isolation: isolate; }

/* cartelito con el texto, a la DERECHA del boton (el boton quedo
   pegado al borde izquierdo, no hay lugar para el texto de ese lado) */
.voz-t { max-width: 0; overflow: hidden; white-space: nowrap;
  background: var(--surface); color: var(--text);
  font-size: 12.5px; font-weight: 500; line-height: 1;
  border-radius: 999px; box-shadow: 0 3px 12px rgba(0,0,0,.16);
  transition: max-width .35s ease, padding .35s ease, margin .35s ease;
  padding: 0; margin: 0;
}
.voz-con-texto .voz-t { max-width: 230px; padding: 11px 14px; margin-left: 8px; }

/* El icono tachado se esconde por CLASE y no con el atributo hidden:
   la hoja del navegador declara [hidden]{display:none} dentro de un
   @namespace de HTML, asi que a un <svg> no le aplica y el icono se
   veia encima del ecualizador. */
.voz-mute { display: none; }

/* SILENCIADO: se queda en pantalla, en gris y con el parlante tachado.
   No se va: es el unico lugar desde donde se puede volver a prenderla.
   Discreto -mas chico y semitransparente- para que no moleste. */
.voz-off .voz-b {
  background: var(--text-3);
  width: 40px; height: 40px;
  opacity: .55;
  transition: opacity .18s, transform .18s;
}
.voz-off .voz-b:hover,
.voz-off .voz-b:focus-visible { opacity: 1; transform: scale(1.08); }
.voz-off .voz-b::after { display: none; }
.voz-off .voz-ondas { display: none; }
.voz-off .voz-mute { display: block; }

@media (max-width: 560px) {
  .voz { left: 12px; bottom: 12px; }
  .voz-b { width: 46px; height: 46px; }
  .voz-b::after { width: 46px; height: 46px; }
  .voz-con-texto .voz-t { max-width: 62vw; font-size: 12px; }
}

/* quien pidio menos animacion no ve el ecualizador ni el halo */
@media (prefers-reduced-motion: reduce) {
  .voz, .voz-t { transition: none; }
  .voz-ondas i { animation: none; height: 12px; }
  .voz-b::after { animation: none; opacity: 0; }
}

/* ==================================================================
   BLOQUE "SEGUI TU PEDIDO"  (pie del home)
   ------------------------------------------------------------------
   Reemplaza al iconito del header, que no lo encontraba nadie.
   ================================================================== */
.segui { max-width: var(--maxw); margin: 30px auto 0; padding: 0 12px; }
.segui-in {
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
  background: var(--surface); border-radius: var(--r-lg);
  box-shadow: var(--shadow); padding: 22px 26px;
}
.segui-ico {
  flex: 0 0 56px; width: 56px; height: 56px; border-radius: 50%;
  display: grid; place-items: center;
  background: rgba(var(--marca-rgb, 231,25,31), .09); color: var(--marca, #e7191f);
}
.segui-t { flex: 1 1 260px; min-width: 0; }
.segui-t strong { display: block; font-size: 16px; margin-bottom: 3px; }
.segui-t span { display: block; font-size: 13.5px; color: var(--text-2); line-height: 1.5; }
.segui-in .btn { width: auto; padding: 13px 26px; flex: 0 0 auto; }

@media (max-width: 600px) {
  .segui-in { padding: 20px; gap: 14px; }
  .segui-ico { flex-basis: 46px; width: 46px; height: 46px; }
  .segui-in .btn { width: 100%; }
}

/* ==================================================================
   MENU LATERAL: accesos de utilidad
   ------------------------------------------------------------------
   Inicio, Mis pedidos y Contacto no son categorias. Mezclados en la
   misma lista se leian como una mas, asi que van con icono, fondo
   propio y en negrita para que se distingan de un vistazo.
   ================================================================== */
.drw-b a.drw-u {
  display: flex; align-items: center; gap: 11px;
  margin: 6px 10px; padding: 12px 14px;
  background: var(--surface-2); border-radius: var(--r);
  font-weight: 600; color: var(--text);
}
.drw-b a.drw-u svg { flex: 0 0 18px; color: var(--marca, #e7191f); }
.drw-b a.drw-u:hover { background: rgba(var(--marca-rgb, 231,25,31), .09); color: var(--marca, #e7191f); }
.drw-b a.drw-wa svg { color: #25d366; }
.drw-b a.drw-wa:hover { background: rgba(37,211,102,.12); color: #1a9e4b; }

/* ==================================================================
   FICHA: sin blanco entre la foto y la descripcion  (solo desktop)
   ------------------------------------------------------------------
   .pdp-der abarca las dos filas y es mas alto que la foto mas la
   descripcion juntas. Sin atar la fila 1 a su contenido, el navegador
   reparte ese sobrante entre AMBAS filas: la primera pasaba de 460 a
   518 y esos 58px caian justo entre la foto y la descripcion. Atada,
   el sobrante queda al final de la columna, que no molesta.
   ================================================================== */
@media (min-width: 900px) {
  .pdp-box { grid-template-rows: var(--gal-h); }
}

/* ==================================================================
   FLECHAS DEL MENU DE CATEGORIAS   (solo desktop)
   ------------------------------------------------------------------
   La barra scrollea hace rato, pero no habia forma de darse cuenta:
   la ultima categoria queda cortada contra el borde y parece que ahi
   se termina. Las flechas aparecen SOLO del lado donde queda algo por
   ver, asi no ocupan lugar cuando entran todas.

   En mobile no van: ahi el gesto de arrastrar es obvio y el menu
   completo esta ademas en el drawer.
   ================================================================== */
.hd-nav { position: relative; }
.hd-fl { display: none; }

@media (min-width: 900px) {
  .hd-fl {
    position: absolute; top: 0; bottom: 0; width: 46px; z-index: 3;
    border: 0; cursor: pointer; padding: 0;
    display: grid; place-items: center;
    color: var(--text-2);
  }
  .hd-fl[hidden] { display: none; }
  .hd-fl:hover { color: var(--marca, #e7191f); }

  /* El degrade es parte del boton y no un elemento aparte: asi tapa el
     texto que pasa por debajo sin necesidad de otro div. */
  .hd-fl-izq { left: 0;  background: linear-gradient(90deg, var(--hd-bg) 55%, transparent); }
  .hd-fl-der { right: 0; background: linear-gradient(270deg, var(--hd-bg) 55%, transparent); }

  .hd-fl::before {
    content: ""; width: 9px; height: 9px;
    border-top: 2px solid currentColor; border-right: 2px solid currentColor;
  }
  .hd-fl-izq::before { transform: rotate(-135deg); margin-left: 4px; }
  .hd-fl-der::before { transform: rotate(45deg);   margin-right: 4px; }

  /* SIN scroll-behavior:smooth a proposito: en esta pagina el scroll
     suave se cancela solo y el menu no se movia. La animacion la hace
     el JS a mano (animarScrollX). */
}

/* ==================================================================
   DISTINTIVOS DE CATEGORIA EN LA CARD
   ------------------------------------------------------------------
   Salen de las categorias con tipo='categoria' y destacar=1: hoy
   Outlet y Compra Internacional. El color lo define home_color de la
   propia categoria; si esta vacio se usa el de marca.
   ================================================================== */
.card-tags { display: flex; flex-wrap: wrap; gap: 4px 6px; margin: 4px 0 2px; }

/* Pastilla con fondo suave, al estilo de "Llega gratis hoy" de MELI:
   con fondo se leen de un vistazo, en texto plano se perdian entre el
   precio y el envio.

   El fondo se deriva del PROPIO color con color-mix sobre currentColor,
   asi sirve para cualquier home_color que se cargue sin tener que
   definir tambien su version clara. La regla de rgba() de arriba es el
   respaldo para navegadores sin color-mix. */
.card-tag {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 9px; border-radius: 6px;
  font-size: 11.5px; font-weight: 600; line-height: 1.35;
  color: var(--marca, #e7191f);
  background: rgba(var(--marca-rgb, 231,25,31), .10);
}
@supports (background: color-mix(in srgb, red 10%, transparent)) {
  .card-tag { background: color-mix(in srgb, currentColor 13%, transparent); }
}

/* ==================================================================
   CATEGORIAS DEL PIE DEL HOME
   ------------------------------------------------------------------
   Dos disenos distintos, como MercadoLibre:

     escritorio   tarjeta ACOSTADA -foto a la izquierda, texto a la
                  derecha- en cuatro columnas, y el link "mostrar
                  todas" arriba, al lado del titulo.

     telefono     tarjeta PARADA -foto arriba, texto abajo y centrado-
                  en tres columnas, y el link al pie separado por una
                  linea, con flecha.

   El link es UNO SOLO en el HTML y lo mueve el CSS. Duplicarlo seria
   mas simple pero deja dos enlaces identicos en la pagina, que es
   ruido para el lector de pantalla y para Google.
   ================================================================== */
.catg {
  max-width: var(--maxw); margin: 26px auto; width: 100%;
  padding: 18px; position: relative;
  background: var(--surface); border-radius: var(--r); box-shadow: var(--shadow);
}
.catg-h { margin-bottom: 14px; }
.catg-h h2 { font-size: 19px; font-weight: 700; }

.catg-g {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;
}
.catg-g li { margin: 0; min-width: 0; }

.catg-i {
  display: flex; align-items: stretch; height: 100%;
  border: 1px solid var(--border); border-radius: var(--r);
  overflow: hidden; text-decoration: none; color: var(--text);
  transition: box-shadow .16s ease, border-color .16s ease;
}
.catg-i:hover {
  text-decoration: none; border-color: var(--text-3, #999);
  box-shadow: var(--shadow-h, 0 4px 14px rgba(0,0,0,.10));
}

/* La foto va sobre el gris suave y el texto sobre el blanco de la
   tarjeta: ese contraste es lo que separa las dos mitades sin tener
   que dibujar una linea. */
.catg-f {
  flex: 0 0 92px; display: grid; place-items: center;
  background: var(--catg-foto, #ebedef); padding: 8px;
}
.catg-f img {
  max-width: 100%; max-height: 64px; width: auto; height: auto;
  object-fit: contain; display: block;
}

/* Icono de "Otras categorias": tres renglones dibujados con CSS, para
   no pedir una imagen por un cuadrito que siempre es igual. */
.catg-f-lista { position: relative; }
.catg-f-lista::before {
  content: ""; display: block; width: 34px; height: 26px;
  background:
    linear-gradient(var(--text-3, #999) 0 0) 0 2px  / 9px 6px no-repeat,
    linear-gradient(var(--text-3, #999) 0 0) 0 12px / 9px 6px no-repeat,
    linear-gradient(var(--text-3, #999) 0 0) 0 22px / 9px 6px no-repeat,
    linear-gradient(var(--border) 0 0) 13px 3px  / 21px 4px no-repeat,
    linear-gradient(var(--border) 0 0) 13px 13px / 21px 4px no-repeat,
    linear-gradient(var(--border) 0 0) 13px 23px / 21px 4px no-repeat;
}

.catg-t {
  flex: 1; display: flex; align-items: center;
  padding: 10px 12px; font-size: 13.5px; line-height: 1.25;
  font-weight: 500; min-width: 0;
  background: var(--surface);
}
.catg-otras .catg-t { color: var(--action); font-weight: 600; }

/* ---- el link, arriba a la derecha en escritorio ---- */
.catg-todas {
  position: absolute; top: 20px; left: 152px;
  font-size: 13px; color: var(--action);
}
.catg-todas .catg-fl { display: none; }

/* ================= TELEFONO ================= */
@media (max-width: 899px) {
  .catg { padding: 16px 0 0; }
  .catg-h { padding: 0 16px 14px; margin: 0; border-bottom: 1px solid var(--border); }

  .catg-g { grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 14px 14px 4px; }

  /* La tarjeta se PARA: foto arriba y nombre abajo centrado. Acostada
     en tres columnas la foto queda de 40px y el nombre en cuatro
     renglones. */
  .catg-i { flex-direction: column; }
  .catg-f { flex: none; width: 100%; padding: 14px 8px; }
  .catg-f img { max-height: 66px; }
  .catg-t {
    justify-content: center; text-align: center;
    padding: 9px 6px; font-size: 12.5px; line-height: 1.2;
  }

  /* y el link baja al pie, con su linea y la flecha */
  .catg-todas {
    position: static; display: flex; align-items: center;
    justify-content: space-between; gap: 10px;
    margin-top: 10px; padding: 15px 16px;
    border-top: 1px solid var(--border);
    font-size: 14px; font-weight: 500;
  }
  .catg-todas .catg-fl { display: inline; font-size: 15px; }

  .catg-g li.catg-x { display: none; }
}

/* Tres columnas se sostienen hasta bien abajo: la tarjeta parada solo
   necesita lugar para la foto y un nombre de dos renglones. Recien en
   pantallas muy angostas se pasa a dos, si no el nombre se parte en
   cuatro. Estaba en 420px y en un telefono comun -375- ya mostraba dos,
   cuando el diseno pide tres. */
@media (max-width: 339px) {
  .catg-g { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 420px) {
  .catg-h h2 { font-size: 17px; }
  .catg-t { font-size: 11.5px; padding: 8px 4px; }
}


/* --- Importe a transferir (pantalla final) ---------------------
   Grande y en negro: es el dato que el comprador copia al
   homebanking. En gris chico, como estaba, se leia peor que los
   pasos que lo rodean. */
.ck-monto{
  text-align:center; background:#fff8e6; border:1px solid #f0d99b;
  border-radius:10px; padding:16px 18px; margin:0 0 16px;
}
.ck-monto-l{
  display:block; font-size:12px; font-weight:700; color:#8a6100;
  text-transform:uppercase; letter-spacing:.6px;
}
.ck-monto-v{
  display:block; font-size:34px; line-height:1.15; font-weight:800;
  color:#111; margin:4px 0 2px; letter-spacing:-.5px;
}
.ck-monto-r{ display:block; font-size:14px; color:#5a4a20; }
.ck-monto-r b{ color:#111; font-size:16px; }
@media (max-width:520px){ .ck-monto-v{ font-size:28px; } }


/* --- Ficha del pedido al volver del pago -----------------------
   Renglones del detalle en la pantalla de retorno de MercadoPago. */
.ck-rl{
  display:flex; justify-content:space-between; gap:12px;
  font-size:13.5px; line-height:1.5; padding:5px 0;
  border-bottom:1px solid var(--line);
}
.ck-rl:last-of-type{ border-bottom:none; }
.ck-rl-n{ color:var(--text-2); }
.ck-rl-p{ white-space:nowrap; font-variant-numeric:tabular-nums; }
.ck-rl-tot{
  border-top:1px solid var(--line); border-bottom:none;
  margin-top:4px; padding-top:9px; font-weight:700; font-size:15px;
}
.ck-rl-tot .ck-rl-n{ color:var(--text-1); }
.ck-mail{
  margin:12px 0 0; padding:10px 12px; border-radius:8px;
  background:var(--surface-1); font-size:12.5px; line-height:1.5;
  color:var(--text-2);
}


/* --- Info de la categoria en la ficha --------------------------
   Recuadro que sale ANTES de la descripcion, con lo que se carga en
   info_usuarios de la categoria: condiciones del rubro, garantia,
   voltaje. Se distingue de la descripcion a proposito -fondo y borde
   propios- porque no habla del producto sino de como se compra. */
.pdp-info{
  margin:0 0 18px; display:flex; flex-direction:column; gap:10px;
}
.pdp-info-t{
  background:var(--surface-2); border:1px solid var(--border);
  border-radius:10px; padding:14px 16px;
  font-size:13.5px; line-height:1.6; color:var(--text-2);
}
.pdp-info-t b, .pdp-info-t strong{ color:var(--text); }
.pdp-info-t p{ margin:0 0 8px; }
.pdp-info-t p:last-child{ margin-bottom:0; }
.pdp-info-t ul, .pdp-info-t ol{ margin:6px 0 0; padding-left:20px; }
.pdp-info-t li{ margin:3px 0; }
@media (max-width:520px){ .pdp-info-t{ padding:12px 13px; font-size:13px; } }


/* ================================================================
   ZOOM AL TOCAR UN CAMPO (iOS)
   ================================================================
   Safari en iPhone hace zoom automatico cuando se enfoca un campo
   con font-size MENOR a 16px, y despues no vuelve solo: la pagina
   queda corrida y hay que pellizcar para volver. Pasaba al tocar el
   buscador (14px) y los selectores de cantidad.

   La regla es del navegador y no se puede desactivar por CSS; lo
   unico que la evita es llegar a los 16px. Se hace SOLO en pantallas
   chicas, asi que en escritorio los campos siguen viendose como
   estaban.

   La otra salida seria maximum-scale=1 en el viewport, pero eso le
   prohibe al visitante hacer zoom en TODA la pagina, incluidas las
   fotos de producto. Un problema de accesibilidad a cambio de una
   comodidad: no vale la pena.
   ================================================================ */
@media (max-width: 699px) {
  .hd-search input,
  .pdp-cant select,
  .cart-cant select,
  .fld input, .fld select, .fld textarea,
  input[type=text], input[type=email], input[type=tel],
  input[type=number], input[type=search], input[type=password],
  select, textarea {
    font-size: 16px;
  }
}
