/**
 * main.css — Hoja de estilos única de la home (Mercado Vibrante).
 * Organizada por secciones: tokens, base, navbar, hero, categorías,
 * productos destacados, distribuidores, footer, responsive.
 * Sin CSS por componente separado (KISS): un solo archivo, un solo <link>.
 */

  html{ scroll-behavior:smooth; }
  @media (prefers-reduced-motion: reduce){ html{ scroll-behavior:auto; } }

  /* El atributo hidden deja de funcionar en cualquier elemento que tenga
     su propio "display" explícito en el CSS (empata en especificidad con
     la regla nativa [hidden]{display:none} del navegador, y gana la más
     reciente en la cascada — o sea, la nuestra). Esta regla, bien arriba
     del archivo y con !important, garantiza que hidden siempre gane sin
     tener que acordarse de pisarlo a mano en cada componente nuevo. */
  [hidden]{ display:none !important; }

  /* Transición nativa entre páginas (crossfade). Solo la entienden
     Chrome/Edge recientes — en el resto no hace nada y cae a la
     navegación normal del navegador, sin romper nada. */
  @view-transition{ navigation:auto; }

  /* Respaldo que funciona en cualquier navegador: fundido de entrada al
     cargar cada página, para que el salto entre una y otra no se sienta
     como un corte seco. */
  body{ animation:pageFadeIn 0.3s ease; }
  @keyframes pageFadeIn{ from{ opacity:0; } to{ opacity:1; } }

  /* El header/footer se arman por JS (Web Components) apenas carga la
     página — en vez de que "aparezcan de golpe", entran con un fundido
     corto una vez que ya están armados. */
  /* display:contents en el wrapper: el custom element no genera su propia
     "caja" de layout, así el <header>/<footer> de adentro queda como si
     fuera hijo directo del <body> — necesario para que position:sticky
     funcione (con el wrapper como display:block, el navegador rompía el
     sticky del header aunque el CSS estuviera bien). El fade de entrada
     se mueve al elemento real de adentro (.site-header4 / footer), que sí
     tiene caja propia. */
  drf-header, drf-footer{ display:contents; }
  .site-header4, footer.site-footer{ opacity:0; transition:opacity 0.2s ease; }
  drf-header.is-ready .site-header4, drf-footer.is-ready footer.site-footer{ opacity:1; }
  drf-header.is-ready, drf-footer.is-ready{ opacity:1; }

  @media (prefers-reduced-motion: reduce){
    body{ animation:none; }
    drf-header, drf-footer{ opacity:1; transition:none; }
    .site-header4, footer.site-footer{ opacity:1; transition:none; }
  }

  /* Compensa el header sticky para que la sección no quede tapada al saltar */
  #shop, #distributors, #about, #distApplyForm{ scroll-margin-top:var(--header-height); }

  :root{
    --white:#FFFFFF; --blue:#1D80D5; --blue-dk:#16609F;
    --gray:#AFAFAF; --gray-lt:#EBEBEB; --ink:#414141;
    /* Alto real aproximado del navbar sticky (logo 64px + padding propio) —
       un solo lugar para no repetir el valor a mano en cada regla que
       necesite descontarlo (scroll-margin-top, secciones a pantalla
       completa, etc.). */
    --header-height:88px;
    /* Gris específico para texto — el --gray de arriba (el que pidió la
       jefa) da 2.19:1 de contraste sobre blanco, muy por debajo del
       mínimo legible de 4.5:1. Este oscurecido da 4.67:1. --gray se
       sigue usando para bordes/decoración (no tienen requisito de
       contraste de texto), este --gray-text es solo para texto real. */
    --gray-text:#676767;
    /* Acento: el azul que antes era el principal, ahora reemplaza al
       verde en toda la paleta general (fuera de categorías). */
    --accent:#09BDF0; --accent-dk:#067FA1;

    /* Tipografía: Poppins para títulos/display, Inter para cuerpo y
       etiquetas — dos familias en vez de las tres que había antes
       (Anton + Nunito Sans + IBM Plex Mono), variables para no repetir
       nombres de fuente a mano en cada regla. */
    --font-display:'Poppins', sans-serif;
    --font-body:'Inter', sans-serif;
    --fw-regular:400; --fw-medium:500; --fw-semibold:600;
    --fw-bold:700; --fw-extrabold:800; --fw-black:900;

    /* Azul oscuro derivado del azul real de marca, solo para el footer:
       el azul base (#09BDF0) con texto blanco encima da 2.2:1 de
       contraste (no pasa el mínimo legible de 4.5:1) — este tono, misma
       familia de color, da 8.85:1. */
    --footer-bg:var(--blue); --footer-bg-dk:#0687AB;

    /* Excepción puntual, igual que las categorías: un semáforo de
       disponibilidad (verde/ámbar/gris) necesita un tono de "atención"
       propio — usar el mismo verde de "en stock" para "quedan pocas"
       confundiría al usuario. No es parte de la paleta general de marca. */
    --stock-low:#E3A23B; --stock-low-dk:#BD7E2E;
    /* Variantes oscurecidas SOLO para texto de los badges de stock — los
       tonos de arriba se siguen usando para el puntito/borde decorativo
       (no tienen requisito de contraste), pero como texto no llegaban a
       4.5:1 contra blanco. */
    --stock-in-text:#398452; --stock-low-text:#8F5E20; /* v17.19.0: un poco más oscuro, contraste AA sobre el fondo crema */
    /* v17.11.0: verde de "agregado / en stock" y rojo de error propios —
       antes tomaban el color de Limpieza y de Carnes; al cambiar la
       paleta de categorías (turquesa / rojo nuevo) no deben cambiar. */
    --ok:#4CAF6D; --error-red:#B23A48;

    /* Colores por categoría — fuera de la paleta de marca a propósito:
       cada uno representa el producto real, no la identidad visual del sitio. */
    --cat-grocery:#8C9A3C; /* verde olivo: canasta básica */
    --cat-beverages:#1E90E0; /* azul refrescante */
    --cat-frozen:#5BB8E6; /* celeste hielo (oscuro: azul marino) */
    --cat-dairy:#8FD3B0;  /* verde menta: leche fresca */
    --cat-bakery:#C8843F; /* marrón cálido / trigo */
    --cat-snacks:#F68B1F; /* naranja */
    --cat-spices:#2F7A5A; /* verde pino: hierbas */
    --cat-sweets:#E0218A; /* fucsia / magenta */
    --cat-meats:#C62828;  /* rojo intenso */
    --cat-pinatas:#8E44C9; /* morado vibrante: fiesta */
    --cat-cleaning:#16B5C2; /* turquesa: limpio y fresco */
    /* v17.11.0 — paleta nueva aprobada por América (2026-10-08) y 5 categorías nuevas */
    --cat-mixes:#F2A2B8;  /* rosa suave: repostería */
    --cat-rice:#D9B23C;   /* dorado: el grano */
    --cat-sauces:#EE5A2B; /* naranja rojizo */
    --cat-noodles:#FFC629; /* amarillo (oscuro: casi negro) */
    --cat-coffee:#7A4B30; /* marrón tostado */

    /* Variantes oscuras de cada color de categoría — dan ≥4.5:1 de
       contraste con texto blanco encima (verificado una por una), a
       diferencia del tono base de arriba, que en varios casos no
       alcanza el mínimo AA. Se usan en cualquier fondo grande/full-bleed
       teñido por categoría (antes vivían sueltas dentro de cada regla
       body.catalog-theme--*, ahora es un solo lugar). */
    --cat-grocery-dk:#5E6A22;
    --cat-beverages-dk:#1565A8;
    --cat-frozen-dk:#1B3F6B;
    --cat-dairy-dk:#2E7A55;
    --cat-bakery-dk:#8B5A2B;
    --cat-snacks-dk:#A8560A;
    --cat-spices-dk:#23604A;
    --cat-sweets-dk:#B8136F;
    --cat-meats-dk:#A31F1F;
    --cat-pinatas-dk:#7334A8;
    --cat-cleaning-dk:#0B7C86;
    --cat-mixes-dk:#A8476A;
    --cat-rice-dk:#7D6A2E;
    --cat-sauces-dk:#C2410C;
    --cat-noodles-dk:#3A3226;
    --cat-coffee-dk:#5B3826;
  }
  *{box-sizing:border-box;}
  body{ margin:0; background:var(--white); color:var(--ink); font-family:var(--font-body); font-size:17px; line-height:1.55; }
  h1,h2{ font-family:var(--font-display); font-weight:800; text-transform:uppercase; margin:0; letter-spacing:0.01em; }
  a{ color:inherit; }
  img{ max-width:100%; display:block; }
  .skip-link{ position:absolute; left:-999px; top:0; background:var(--ink); color:var(--white); padding:0.8rem 1.2rem; z-index:100; font-weight:700; }
  .skip-link:focus{ left:0; }
  a:focus-visible, button:focus-visible{ outline:3px solid var(--accent-dk); outline-offset:2px; }
  /* Frente 6: texto solo para lectores de pantalla (ej. "(se abre en una pestaña nueva)"). */
  .sr-only{ position:absolute !important; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }
  .wrap{ width:100%; max-width:1180px; margin:0 auto; padding:0 1.5rem; }
  /* Wrap más ancho, solo para el hero + chips + tira de marcas — sigue
     siendo una tarjeta centrada (no full-bleed), pero con bastante
     menos margen blanco a los costados que el resto del contenido. */
  .wrap--hero{ max-width:1180px; padding: 0px;}
  .wrap-wide{ max-width:1360px; margin:0 auto; padding:0 1.5rem; }

  /* ============ NAVBAR ============ */
  .site-header4{
    position:sticky; top:0; z-index:60; background:rgba(255,255,255,0.82);
    -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
    border-bottom:1px solid var(--gray-lt);
    transition:box-shadow 0.3s ease;
  }
  .site-header4.is-scrolled{ box-shadow:0 8px 24px rgba(65,65,65,0.10); }
  .header-row{ display:flex; justify-content:space-between; align-items:center; padding-top:1.15rem; padding-bottom:1.15rem; transition:padding 0.25s ease; }
  .site-header4.is-scrolled .header-row{ padding-top:0.75rem; padding-bottom:0.75rem; }

  .brand{ display:inline-flex; text-decoration:none; }
  .brand-img{ height: 64px; width:auto; display:block; transition:transform 0.3s ease; }
  .brand:hover .brand-img{ transform:scale(1.05) rotate(-1.5deg); }

  .main-nav4 > ul{ list-style:none; display:flex; gap:1.9rem; margin:0; padding:0; font-weight:800; font-size:0.85rem; align-items:center; }
  .main-nav4 a{ text-decoration:none; color:var(--ink); position:relative; padding-bottom:4px; display:inline-flex; align-items:center; gap:0.3rem; }
  .main-nav4 > ul > li > a::after{
    content:""; position:absolute; left:0; right:0; bottom:-2px; height:3px; border-radius:2px;
    background:var(--accent); transform:scaleX(0); transform-origin:left; transition:transform 0.25s ease;
  }
  .main-nav4 > ul > li > a:hover::after{ transform:scaleX(1); }
  .main-nav4 .chev{ transition:transform 0.2s ease; }
  .has-mega:hover .chev, .has-mega:focus-within .chev{ transform:rotate(180deg); }

  .has-mega{ position:relative; }
  .mega-menu{
    position:absolute; top:calc(100% + 14px); left:50%; transform:translateX(-50%) translateY(6px);
    background:var(--white); border:1px solid var(--gray-lt); border-radius:10px;
    box-shadow:0 20px 40px rgba(65,65,65,0.16); padding:0.9rem; display:grid; grid-template-columns:repeat(3, minmax(0,1fr));
    gap:0.3rem; min-width:560px;
    opacity:0; visibility:hidden; transition:opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
  }
  .has-mega:hover .mega-menu, .has-mega:focus-within .mega-menu{
    opacity:1; visibility:visible; transform:translateX(-50%) translateY(0);
  }
  .mega-item{
    display:flex; align-items:center; gap:0.6rem; padding:0.55rem 0.7rem; border-radius:6px;
    font-weight:600; font-size:0.85rem; color:var(--ink) !important;
  }
  .mega-item:hover{ background:var(--gray-lt); }
  .mega-item::after{ content:none !important; }
  .mega-dot{
    width:9px; height:9px; border-radius:50%; flex-shrink:0; background:var(--blue);
    border:1px solid rgba(65,65,65,0.12);
    transition:background-color 0.25s ease, transform 0.25s cubic-bezier(.34,1.56,.64,1), box-shadow 0.25s ease;
  }
  .mega-item:hover .mega-dot{ transform:scale(1.7); }
  .mega-item--grocery:hover .mega-dot{ background:var(--cat-grocery); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-grocery) 60%, transparent); }
  .mega-item--beverages:hover .mega-dot{ background:var(--cat-beverages); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-beverages) 60%, transparent); }
  .mega-item--frozen:hover .mega-dot{ background:var(--cat-frozen); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-frozen) 60%, transparent); }
  .mega-item--dairy:hover .mega-dot{ background:var(--cat-dairy); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-dairy) 60%, transparent); }
  .mega-item--bakery:hover .mega-dot{ background:var(--cat-bakery); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-bakery) 60%, transparent); }
  .mega-item--snacks:hover .mega-dot{ background:var(--cat-snacks); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-snacks) 60%, transparent); }
  .mega-item--spices:hover .mega-dot{ background:var(--cat-spices); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-spices) 60%, transparent); }
  .mega-item--sweets:hover .mega-dot{ background:var(--cat-sweets); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-sweets) 60%, transparent); }
  .mega-item--meats:hover .mega-dot{ background:var(--cat-meats); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-meats) 60%, transparent); }
  .mega-item--pinatas:hover .mega-dot{ background:var(--cat-pinatas); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-pinatas) 60%, transparent); }
  .mega-item--cleaning:hover .mega-dot{ background:var(--cat-cleaning); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-cleaning) 60%, transparent); }
  .mega-item--mixes:hover .mega-dot{ background:var(--cat-mixes); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-mixes) 60%, transparent); }
  .mega-item--rice:hover .mega-dot{ background:var(--cat-rice); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-rice) 60%, transparent); }
  .mega-item--sauces:hover .mega-dot{ background:var(--cat-sauces); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-sauces) 60%, transparent); }
  .mega-item--noodles:hover .mega-dot{ background:var(--cat-noodles); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-noodles) 60%, transparent); }
  .mega-item--coffee:hover .mega-dot{ background:var(--cat-coffee); box-shadow:0 0 10px 2px color-mix(in srgb, var(--cat-coffee) 60%, transparent); }
  @media (prefers-reduced-motion: reduce){ .mega-item:hover .mega-dot{ transform:none; } }

  .header-actions{ display:flex; gap:0.7rem; align-items:center; }
  .lang-toggle{
    font-family:var(--font-body); font-size:0.72rem; font-weight:600; background:transparent;
    border:2px solid var(--ink); border-radius:999px; padding:0.35rem 0.8rem; cursor:pointer;
    transition:background 0.15s ease, color 0.15s ease;
  }
  .lang-toggle:hover{ background:var(--ink); color:var(--white); }
  .lang-option{ opacity:0.75; transition:opacity 0.15s ease; }
  .lang-option.is-active{ opacity:1; font-weight:800; }
  /* v17.23.4 (maqueta 2026-10-15): selector EN | ES de dos partes, el
     idioma activo en negro — antes casi no se notaba cuál estaba. El
     mismo estilo en el menú del celular (.mobile-lang-toggle). */
  .lang-toggle, .mobile-lang-toggle{
    display:inline-flex; align-items:center; gap:2px; padding:3px; background:var(--white);
    border:1.5px solid rgba(65,65,65,0.35); border-radius:999px;
  }
  .lang-toggle:hover{ background:var(--white); color:inherit; border-color:var(--ink); }
  .lang-sep, .mobile-lang-sep{ display:none; }
  .lang-toggle .lang-option, .mobile-lang-toggle .lang-option{
    display:inline-flex; align-items:center; justify-content:center; border-radius:999px;
    opacity:1; color:#5a5a5a; font-weight:700; transition:background 0.15s ease, color 0.15s ease;
  }
  .lang-toggle .lang-option{ min-width:34px; padding:0.25rem 0.55rem; font-size:0.72rem; }
  .mobile-lang-toggle .lang-option{ min-width:44px; min-height:34px; padding:0 0.8rem; font-size:0.85rem; }
  .lang-toggle .lang-option.is-active, .mobile-lang-toggle .lang-option.is-active{ background:var(--ink); color:var(--white); font-weight:800; }
  .lang-toggle .lang-option:not(.is-active):hover{ background:rgba(65,65,65,0.1); color:var(--ink); }
  .lang-toggle:focus-visible, .mobile-lang-toggle:focus-visible{ outline:2px solid var(--blue-dk); outline-offset:2px; }

  .login-toggle{
    font-family:var(--font-body); font-size:0.72rem; font-weight:600; background:transparent;
    border:2px solid var(--blue-dk); color:var(--blue-dk); border-radius:999px; padding:0.35rem 0.9rem;
    cursor:pointer; white-space:nowrap; transition:background 0.15s ease, color 0.15s ease;
  }
  .login-toggle:hover{ background:var(--blue-dk); color:var(--white); }
  /* Breakpoint de este botón movido a responsive.css (ver ahí el motivo). */

  /* Aviso junto al botón de login: error de login o cuenta pendiente
     de aprobación (ver customer-auth.js, renderLoginNotice). Dropdown
     chico debajo del botón, mismo criterio visual que el mega-menu —
     no empuja el resto del header ni rompe el layout en una sola línea. */
  .login-toggle-wrap{ position:relative; display:inline-flex; align-items:center; gap:0.8rem; }

  /* Frente 6 (sesión 2026-09-28): menú de cuenta. Reemplaza al viejo
     link suelto de My Quotes + "Nombre · Log out" en el mismo botón.
     Con sesión se ve el nombre (compañía o cliente) y un menú chico con
     Mis pedidos / Mis cotizaciones / Cerrar sesión (ver customer-auth.js). */
  .account-wrap{ position:relative; }
  .account-wrap[hidden], .login-toggle[hidden]{ display:none; }
  .account-toggle{
    display:inline-flex; align-items:center; gap:0.4rem; max-width:14rem;
    font-family:var(--font-body); font-size:0.75rem; font-weight:700; color:var(--ink);
    background:transparent; border:2px solid var(--ink); border-radius:999px;
    padding:0.3rem 0.75rem 0.3rem 0.55rem; cursor:pointer; white-space:nowrap;
    transition:background 0.15s ease, color 0.15s ease;
  }
  .account-toggle:hover, .account-toggle[aria-expanded="true"]{ background:var(--ink); color:var(--white); }
  .account-icon{ flex-shrink:0; }
  .account-name{ overflow:hidden; text-overflow:ellipsis; min-width:0; }
  .account-chev{ flex-shrink:0; transition:transform 0.2s ease; }
  .account-toggle[aria-expanded="true"] .account-chev{ transform:rotate(180deg); }
  .account-menu{
    position:absolute; top:calc(100% + 0.5rem); right:0; z-index:75; min-width:12rem;
    display:flex; flex-direction:column; padding:0.4rem;
    background:var(--white); border:1px solid var(--gray-lt); border-radius:10px;
    box-shadow:0 16px 32px rgba(65,65,65,0.16);
  }
  .account-menu[hidden]{ display:none; }
  .account-menu-item{
    display:block; width:100%; text-align:left; padding:0.6rem 0.75rem; border-radius:6px;
    font-family:var(--font-body); font-size:0.85rem; font-weight:600; color:var(--ink);
    text-decoration:none; background:none; border:none; cursor:pointer;
  }
  .account-menu-item[hidden]{ display:none; }
  .account-menu-item:hover, .account-menu-item:focus-visible{ background:var(--gray-lt); }
  .account-menu-item--logout{ border-top:1px solid var(--gray-lt); border-radius:0 0 6px 6px; margin-top:0.25rem; color:var(--gray-text, #5a5a5a); }
  @media (prefers-reduced-motion: reduce){ .account-chev{ transition:none; } }

  /* Frente 8 (v16.0.0): novedades del cliente. El punto rojo es solo un
     refuerzo visual; la cantidad va en texto en el menú ("2 novedades")
     y en el aria-label del botón de cuenta. */
  .account-toggle, .menu-toggle{ position:relative; }
  .news-dot{
    position:absolute; top:-3px; right:-3px; width:0.7rem; height:0.7rem; border-radius:50%;
    background:#C62828; box-shadow:0 0 0 2px var(--white); pointer-events:none;
  }
  .menu-news-dot{ top:0; right:0; }
  .news-dot[hidden], .news-pill[hidden]{ display:none; }
  .news-pill{
    display:inline-block; margin-left:0.5rem; padding:0.05rem 0.5rem; border-radius:999px;
    background:#FDECEA; color:#9B1C1C; font-family:var(--font-body); font-size:0.7rem; font-weight:700;
    line-height:1.5; white-space:nowrap; vertical-align:middle;
  }
  .account-menu{ min-width:14rem; }
  .account-menu-item{ white-space:nowrap; }

  .login-toggle-notice{
    position:absolute; top:calc(100% + 0.5rem); right:0; z-index:20; width:max-content; max-width:15rem;
    background:var(--white); border:1px solid var(--gray-border, #e2e2e2); border-radius:0.6rem;
    padding:0.6rem 0.8rem; font-size:0.76rem; line-height:1.4; color:var(--ink);
    box-shadow:0 6px 20px rgba(0,0,0,0.1);
  }
  .login-toggle-notice::before{
    content:''; position:absolute; top:-0.4rem; right:1rem; width:0.8rem; height:0.8rem;
    background:var(--white); border-left:1px solid var(--gray-border, #e2e2e2); border-top:1px solid var(--gray-border, #e2e2e2);
    transform:rotate(45deg);
  }
  /* Estado "pendiente" no es un error — usa el acento de marca en vez
     de rojo, para no alarmar a alguien que simplemente todavía no fue
     asignado a un nivel de distribuidor. */
  .login-toggle-notice:not(.login-toggle-notice--pending){ border-color:#e0a0a0; }
  .login-toggle-notice--pending{ border-color:var(--blue-dk); }

  .mobile-lang-toggle{
    cursor:pointer; font-family:var(--font-body); color:var(--ink);
    opacity:0; transform:translateY(-6px); transition:opacity 0.3s ease, transform 0.3s ease;
  }
  .mobile-menu.is-open .mobile-lang-toggle{ opacity:1; transform:translateY(0); }
  .cart-wrap{ position:relative; }
  /* Frente 6: carrito como ícono redondo con el conteo en un globito
     (antes "Cart 0" en texto). El conteo completo va en el aria-label
     del botón (main.js updateCartUI); el globito es aria-hidden. */
  .cart-btn{
    position:relative; width:42px; height:42px; padding:0; flex-shrink:0;
    background:var(--ink); color:var(--white); border:none; border-radius:50%;
    cursor:pointer; display:inline-flex; align-items:center; justify-content:center;
    transition:transform 0.15s ease;
  }
  .cart-btn:hover{ transform:translateY(-2px); }
  .cart-badge{
    position:absolute; top:-4px; right:-6px; min-width:20px; height:20px; padding:0 5px;
    display:inline-flex; align-items:center; justify-content:center; box-sizing:border-box;
    background:var(--accent); color:var(--ink); border:2px solid var(--white); border-radius:999px;
    font-family:var(--font-body); font-size:0.68rem; font-weight:800; line-height:1;
  }
  .cart-btn:not(.has-items) .cart-badge{ display:none; }
  @media (prefers-reduced-motion: reduce){ .cart-btn:hover{ transform:none; } }

  /* Panel desplegable del carrito */
  .cart-panel{
    position:absolute; top:calc(100% + 12px); right:0; width:300px;
    background:var(--white); border:1px solid var(--gray-lt); border-radius:10px;
    box-shadow:0 20px 40px rgba(65,65,65,0.16); padding:1rem;
    opacity:0; visibility:hidden; transform:translateY(6px);
    transition:opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
    z-index:70;
  }
  .cart-panel.is-open{ opacity:1; visibility:visible; transform:translateY(0); }
  .cart-panel-empty{ font-family:var(--font-body); font-weight:600; font-size:0.8rem; color:var(--gray-text); text-align:center; margin:0.4rem 0; }

  .cart-panel-header{ display:flex; justify-content:space-between; align-items:center; margin-bottom:0.8rem; }
  .cart-panel-count{ font-family:var(--font-body); font-weight:600; font-size:0.7rem; letter-spacing:0.04em; text-transform:uppercase; color:var(--gray-text); }
  .cart-panel-clear{
    background:none; border:none; font-family:var(--font-body); font-weight:600; font-size:0.7rem; color:var(--gray-text);
    text-decoration:underline; cursor:pointer; padding:0;
  }
  .cart-panel-clear:hover{ color:var(--ink); }

  .cart-panel-list{ list-style:none; margin:0; padding:0; display:grid; gap:0.7rem; max-height:280px; overflow-y:auto; }
  .cart-panel-item{ display:flex; align-items:center; gap:0.6rem; border-bottom:1px solid var(--gray-lt); padding-bottom:0.7rem; }
  .cart-panel-item-info{ display:flex; flex-direction:column; gap:0.25rem; min-width:0; }
  .cart-panel-item-title{
    font-family:var(--font-body); font-weight:700; font-size:0.82rem; margin:0; line-height:1.3; color:var(--ink);
    overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  }
  /* Popover del carrito ahora es solo visual (handoff 2026-09-21,
     Frente 1 punto 2) — miniatura de producto + "Qty N" en texto, sin
     controles editables. Toda la edición real vive en cart.html. */
  .cart-panel-item-thumb{
    width:44px; height:44px; flex-shrink:0; border-radius:8px; overflow:hidden; background:var(--gray-lt);
    display:flex; align-items:center; justify-content:center;
  }
  .cart-panel-item-thumb img{ width:100%; height:100%; object-fit:cover; }
  .cart-panel-item-thumb svg{ width:50%; height:50%; color:var(--gray); }
  .cart-panel-item-qty{ font-family:var(--font-body); font-weight:600; font-size:0.74rem; color:var(--gray-text); }

  .cart-panel-note{
    font-family:var(--font-body); font-weight:600; font-size:0.68rem; color:var(--gray-text); text-align:center;
    margin:0.9rem 0 0; padding-top:0.8rem; border-top:1px solid var(--gray-lt);
  }
  /* Reusa --stock-low-text: ya está auditado con axe-core sobre este
     mismo fondo (ver pasada de accesibilidad), no hace falta un color
     nuevo para esta advertencia. */
  .cart-panel-note--warning{ color:var(--stock-low-text); border-top:none; padding-top:0; margin-top:0.6rem; }

  /* cart-panel-checkout ahora es un <a> (botón único "Ir al carrito" —
     ver renderCartPanel() en main.js), no un <button disabled> — la
     regla :disabled de abajo queda inerte a propósito, sin quitarla:
     si el día de mañana este mismo estilo se reusa en un <button> real
     dentro de cart.html, el comportamiento ya está listo. */
  .cart-panel-checkout{
    display:block; width:100%; margin-top:0.8rem; padding:0.75rem 1rem; border:none; border-radius:999px;
    background:var(--ink); color:var(--white); font-family:var(--font-body); font-weight:700; font-size:0.82rem;
    letter-spacing:0.01em; cursor:pointer; text-align:center; text-decoration:none; transition:background 0.15s ease;
  }
  .cart-panel-checkout:hover:not(:disabled){ background:var(--catalog-accent, var(--blue-dk)); }
  .cart-panel-checkout:disabled{ background:var(--gray-lt); color:var(--gray-text); cursor:wait; }
  @media (max-width:420px){ .cart-panel{ width:calc(100vw - 3rem); right:-0.5rem; } }

  .menu-toggle{ display:none; background:none; border:none; padding:0.4rem; cursor:pointer; }
  .burger{ display:flex; flex-direction:column; gap:5px; width:22px; }
  .burger i{ display:block; height:2.5px; background:var(--ink); border-radius:2px; transition:transform 0.25s ease, opacity 0.25s ease; }
  .menu-toggle[aria-expanded="true"] .burger i:nth-child(1){ transform:translateY(7.5px) rotate(45deg); }
  .menu-toggle[aria-expanded="true"] .burger i:nth-child(2){ opacity:0; }
  .menu-toggle[aria-expanded="true"] .burger i:nth-child(3){ transform:translateY(-7.5px) rotate(-45deg); }

  .mobile-menu{
    display:none; flex-direction:column; max-height:0; overflow:hidden;
    background:var(--white); border-top:1px solid var(--gray-lt);
    transition:max-height 0.35s ease;
  }
  .mobile-menu.is-open{ max-height:520px; }
  .mobile-menu a{
    padding:0.95rem 1.5rem; text-decoration:none; color:var(--ink); font-weight:700; font-size:0.95rem;
    border-bottom:1px solid var(--gray-lt); opacity:0; transform:translateY(-6px);
    transition:opacity 0.3s ease, transform 0.3s ease;
  }
  .mobile-menu.is-open a{ opacity:1; transform:translateY(0); }

  /* El colapso del nav a hamburguesa y el breakpoint de .about-grid/
     .about-stats viven ahora en responsive.css (cargado después de
     este archivo) — ver ese archivo para el motivo del breakpoint. */
  @media (prefers-reduced-motion: reduce){
    .brand:hover .brand-img{ transform:none; }
    .mega-menu, .mobile-menu, .mobile-menu a, .burger i{ transition:none; }
  }

  /* Hero + chips + tira de marcas, juntos, ocupan el 100% del alto
     visible al cargar la home (descontando el navbar) — así no se
     asoma el color de la sección siguiente antes de hacer scroll.
     Centrado vertical simple (sin agrandar nada): si sobra alto, se
     reparte como aire arriba/abajo/entre bloques en vez de dejarlo
     vacío al fondo. */
  .hero-screen{
    min-height:calc(100vh - var(--header-height));
    display:flex; flex-direction:column; justify-content:center;
  }
  .burst-hero{ background:var(--blue); color:var(--white); border-radius:8px; padding:3.8rem 2.6rem; margin:1rem 0 2.5rem; position:relative; overflow:hidden; }
  .burst-hero h1{ font-size:clamp(2.6rem,6vw,4.6rem); line-height:0.95; max-width:15ch; position:relative; z-index:1; }
  .burst-hero p{ font-weight:700; margin-top:1.1rem; max-width:36ch; font-size:1.2rem; position:relative; z-index:1; }
  .burst-btn{ display:inline-block; background:var(--white); color:var(--blue-dk); font-weight:800; padding:0.85rem 1.6rem; border-radius:999px; text-decoration:none; margin-top:1.6rem; position:relative; z-index:1; }
  .dot{ position:absolute; border-radius:50%; opacity:0.9; }
  .dot.d1{ width:150px; height:150px; top:-50px; right:-30px; background:var(--accent); }
  .dot.d2{ width:75px; height:75px; bottom:15px; right:130px; background:var(--white); opacity:0.18; }

  .chip-row{ display:flex; gap:0.9rem; flex-wrap:wrap; padding-bottom:3rem; }
  .chip{ background:var(--ink); color:var(--white); font-weight:800; padding:0.9rem 1.4rem; border-radius:999px; font-size:0.95rem; text-decoration:none; }
  .chip:nth-child(3n+2){ background:var(--blue-dk); color:var(--white); }
  /* Texto oscuro sobre el amarillo (sesión 2026-09-28): blanco sobre
     #fbba3d daba 1.7:1, muy por debajo del 4.5:1 de WCAG AA. --ink
     sobre el mismo amarillo da 5.9:1 — el chip conserva su color. */
  .chip:nth-child(3n){ background:#fbba3d; color:var(--ink); }

  /* padding-top/bottom en vez del shorthand 'padding' a propósito: .section
     se combina en el HTML con .wrap (class="section wrap") para heredar su
     padding horizontal de 1.5rem. El shorthand pisaba las 4 direcciones y
     dejaba el padding horizontal en 0 — invisible en desktop porque el
     max-width de .wrap centra el bloque igual (el aire queda afuera, en el
     margin:auto), pero en mobile .wrap ocupa el 100% del viewport y ese
     padding es la única fuente de aire a los costados. Encontrado revisando
     #about y el footer a 375px: el texto quedaba pegado al borde. */
  .section{ padding-top:2rem; padding-bottom:3.5rem; }
  .section--tight{ padding-top:0; }
  .section-head{ margin-bottom:1.8rem; }
  .section-head--with-action{ display:flex; justify-content:space-between; align-items:flex-end; gap:1.5rem; flex-wrap:wrap; }
  .see-all{
    font-family:var(--font-body); font-weight:600; font-size:0.82rem; text-decoration:none;
    color:var(--blue-dk); border-bottom:2px solid var(--blue); padding-bottom:2px; white-space:nowrap;
  }
  .see-all:hover{ color:var(--ink); border-bottom-color:var(--ink); }
  .section-head p.eyebrow{ font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color:var(--blue-dk); }
  .section-head h2{ font-size:clamp(1.8rem,2.8vw,2.4rem); margin-top:0.4rem; }

  /* ---- Banda de color full-width en "Pick your pantry" ----
     El fondo va en .section-band (ancho completo de pantalla, sin
     max-width). El contenido adentro sigue centrado con el .wrap de
     siempre. Ocupa el 100% de la altura visible descontando el navbar
     (min-height, no height, para que si el contenido es más alto que
     la pantalla no se corte), contenido centrado verticalmente con
     flex. Sin degradado — color sólido, a pedido.
     El color de fondo es DINÁMICO: category-showcase.js actualiza
     --active-cat-color acá mismo (en #shop) según la pestaña activa,
     usando siempre la variante oscura --cat-*-dk de esa categoría, que
     ya está verificada ≥4.5:1 de contraste con texto blanco. About Us
     ya no lleva banda de color — todo el color de la home vive acá. */
  .section-band--shop{
    min-height:calc(100vh - var(--header-height));
    display:flex; align-items:center; color:var(--white);
    background-color:var(--active-cat-color, var(--blue-dk));
    transition:background-color 0.6s cubic-bezier(.4,0,.2,1);
  }
  .section-band--shop > .wrap{ width:100%; }
  .section-band--shop .section-head p.eyebrow{ color:var(--white); opacity:0.85; }
  .section-band--shop h2{ color:var(--white); }


  /* ---- Showcase de categorías (home, dentro de "Pick your pantry") ----
     Pestañas (una por categoría) que cambian el video y el carrusel de
     productos de la derecha. Van SIEMPRE en una sola línea (nunca
     wrap): compactas (solo ícono) por default, la activa se expande y
     ocupa casi todo el ancho disponible, y una inactiva se previsualiza
     un poco al pasar el mouse. Fondo blanco sólido + texto en el color
     oscuro de la categoría cuando está activa — funciona sobre
     cualquiera de los 16 colores de fondo dinámicos sin perder contraste. */
  .category-showcase{ margin-top:2.2rem; }
  .category-tabs-row{ display:flex; align-items:center; gap:1rem; margin-bottom:1.4rem; }
  .category-tabs{
    display:flex; flex:1 1 auto; min-width:0; gap:0.4rem; overflow-x:auto;
    scrollbar-width:none; -ms-overflow-style:none;
  }
  .category-tabs::-webkit-scrollbar{ display:none; }
  .category-tab{
    flex:0 0 auto; display:inline-flex; align-items:center; gap:0.5rem; height:46px; max-width:46px;
    padding:0 0.9rem; overflow:hidden; white-space:nowrap; font-family:var(--font-body); font-weight:700; font-size:0.82rem;
    border-radius:999px; border:1.5px solid rgba(255,255,255,0.4); background:rgba(255,255,255,0.08); color:var(--white);
    cursor:pointer; transition:max-width 0.45s cubic-bezier(.4,0,.2,1), flex-grow 0.45s cubic-bezier(.4,0,.2,1),
      background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease;
  }
  .category-tab:hover{ max-width:220px; border-color:rgba(255,255,255,0.75); background:rgba(255,255,255,0.16); }
  .category-tab:focus-visible{ outline:2px solid var(--white); outline-offset:2px; }
  .category-tab.is-active{
    flex-grow:1; max-width:640px; background:var(--white); border-color:var(--white); color:var(--active-cat-color, var(--blue-dk));
  }
  .category-tab-icon{ width:18px; height:18px; flex-shrink:0; display:inline-flex; }
  .category-tab-icon svg{ width:100%; height:100%; display:block; fill:currentColor; }
  .category-tab-label{ opacity:0; transition:opacity 0.2s ease; }
  .category-tab.is-active .category-tab-label, .category-tab:hover .category-tab-label{ opacity:1; }

  .category-showcase-toggle{
    flex-shrink:0; font-family:var(--font-body); font-weight:700; font-size:0.78rem; border:1.5px solid rgba(255,255,255,0.4);
    border-radius:999px; background:rgba(255,255,255,0.08); color:var(--white); padding:0.5rem 1.1rem; cursor:pointer;
    transition:background 0.15s ease;
  }
  .category-showcase-toggle:hover{ background:rgba(255,255,255,0.18); }

  /* min-width:0 en los dos hijos es lo que evita que el ancho "natural"
     del <video> (o de cualquier contenido reemplazado) empuje su
     columna del grid más allá de la proporción 1.4fr/1fr pedida — sin
     esto, el video se ve más ancho de lo que debería al cambiar de
     categoría (el bug que reportaste). */
  .category-showcase-stage{ display:grid; grid-template-columns:3fr 1fr; gap:1.6rem; height:480px; }
  .category-showcase-media{ position:relative; min-width:0; height:100%; border-radius:10px; overflow:hidden; background:var(--ink); }
  .category-showcase-media video{ display:block; width:100%; height:100%; object-fit:cover; }
  .category-showcase-media::after{
    content:""; position:absolute; inset:0; background:linear-gradient(0deg, rgba(0,0,0,0.55), transparent 45%); pointer-events:none;
  }
  .category-showcase-cta{
    position:absolute; left:1.2rem; bottom:1.2rem; z-index:1; display:inline-flex; font-family:var(--font-body); font-weight:800;
    font-size:0.85rem; color:var(--white); background:var(--active-cat-color, var(--blue-dk)); text-decoration:none;
    padding:0.7rem 1.3rem; border-radius:999px; transition:transform 0.15s ease, background-color 0.6s cubic-bezier(.4,0,.2,1);
  }
  .category-showcase-cta:hover{ transform:translateY(-2px); }

  /* Producto estrella — una sola tarjeta grande al lado del video.
     Imagen 1:1 arriba (deja de ser full-bleed) + panel de info abajo
     con harto aire para logo/nombre/precio/botón — mismo criterio
     "glass" que .site-header4 (rgba + blur), pero ahora como panel real
     en vez de franja angosta encima de la foto, porque el 1:1 deja
     mucho más alto libre para trabajar. El panel se apoya visualmente
     sobre el color dinámico de la sección (se ve translúcido contra
     --active-cat-color), por eso el texto pasa a blanco acá adentro.
     --card-accent se fija en #categoryStarProduct (el contenedor
     entero) desde JS: llega tanto a la foto como al panel de info. */
  .star-product{ display:flex; flex-direction:column; height:100%; border-radius:14px; overflow:hidden; box-shadow:0 14px 30px rgba(0,0,0,0.18); }
  .star-product-media{
    position:relative; width:100%; aspect-ratio:1/1; flex-shrink:0; display:flex; align-items:center; justify-content:center;
    text-decoration:none; background:color-mix(in srgb, var(--card-accent, var(--gray)) 26%, white);
  }
  .star-product-photo{ width:100%; height:100%; object-fit:cover; display:block; }
  .star-product-icon{ width:42%; max-width:120px; color:var(--card-accent, var(--gray)); opacity:0.85; }
  .star-product-icon svg{ width:100%; height:100%; display:block; fill:currentColor; }
  .star-product.is-out-of-stock .star-product-media{ filter:grayscale(60%); opacity:0.75; }

  .star-product-info{
    flex:1; min-height:0; display:flex; flex-direction:column; justify-content:space-between; gap:0.9rem;
    padding:1.1rem 1.1rem 1.2rem; background:rgba(255,255,255,0.16); border-top:1px solid rgba(255,255,255,0.3);
    -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px);
  }
  .star-product-top{ display:flex; flex-direction:column; gap:0.55rem; min-height:0; }
  .star-product-logo-wrap{
    align-self:flex-start; display:inline-flex; align-items:center; background:rgba(255,255,255,0.92);
    border-radius:7px; padding:0.35rem 0.55rem;
  }
  .star-product-logo{ height:16px; width:auto; object-fit:contain; display:block; }
  .star-product-vendor{
    font-family:var(--font-body); font-weight:700; font-size:0.66rem; letter-spacing:0.06em; text-transform:uppercase;
    color:var(--white); opacity:0.85; margin:0;
  }
  .star-product-title{
    font-family:var(--font-body); font-weight:800; font-size:1.02rem; line-height:1.32; margin:0; color:var(--white);
    display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden;
  }
  .star-product-title a{ color:inherit; text-decoration:none; }
  .star-product-title a:hover{ text-decoration:underline; }

  .star-product-buy{
    flex-shrink:0; display:flex; align-items:center; justify-content:space-between; gap:0.6rem;
    padding-top:0.8rem; border-top:1px solid rgba(255,255,255,0.28);
  }
  .star-product-price, .star-product-price-slot{
    flex-shrink:1; min-width:0; overflow:hidden; white-space:nowrap;
    transition:opacity 0.2s ease, max-width 0.3s ease;
  }
  .star-product-price{ font-family:var(--font-body); font-weight:800; font-size:1.2rem; color:var(--white); }
  .star-product-price-slot{ display:inline-block; width:48px; height:14px; border-radius:4px; background:rgba(255,255,255,0.35); }

  /* El botón mide su ancho expandido a partir de su propio contenido
     (grid 40px + 0fr → 40px + 1fr), no de un número inventado — así el
     texto "Add to cart" / "Agregar al carrito" nunca queda ni corto ni
     con espacio de más. Como en esta columna angosta no siempre entran
     precio + botón expandido al mismo tiempo, el precio se retira con
     un fade cuando el mouse está sobre el botón (:has), así el botón
     jamás lo tapa ni lo empuja — vuelve solo al sacar el mouse. */
  .star-product-buy:has(.star-product-add:hover) .star-product-price,
  .star-product-buy:has(.star-product-add:hover) .star-product-price-slot{ opacity:0; max-width:0; }

  .star-product-add{
    flex-shrink:0; display:grid; grid-template-columns:40px minmax(0,0fr); align-items:center; height:40px;
    border-radius:999px; border:none; background:var(--white); color:var(--card-accent, var(--blue-dk)); cursor:pointer;
    overflow:hidden; transition:grid-template-columns 0.35s cubic-bezier(.4,0,.2,1), background-color 0.3s ease, color 0.3s ease;
  }
  .star-product-add-icons{ width:40px; height:40px; display:flex; align-items:center; justify-content:center; }
  .star-product-add-icons svg{ width:17px; height:17px; }
  .star-product-add-label{
    display:block; min-width:0; overflow:hidden; white-space:nowrap; padding-right:1.1rem;
    font-family:var(--font-body); font-weight:700; font-size:0.8rem; opacity:0; transition:opacity 0.2s ease;
  }
  .star-product-add:hover:not(.is-disabled):not(.is-added){ grid-template-columns:40px minmax(0,1fr); transform:scale(1.03); }
  .star-product-add:hover:not(.is-disabled):not(.is-added) .star-product-add-label{ opacity:1; transition-delay:0.12s; }
  .star-product-add.is-added{ color:var(--stock-in-text); }
  .star-product-add.is-disabled{ background:rgba(255,255,255,0.5); color:var(--gray-text); cursor:not-allowed; }
  .star-product-add .icon-cart, .star-product-add .icon-check{ display:none; }
  .star-product-add:hover:not(.is-disabled):not(.is-added) .icon-plus{ display:none; }
  .star-product-add:hover:not(.is-disabled):not(.is-added) .icon-cart{ display:block; }
  .star-product-add.is-added .icon-plus, .star-product-add.is-added .icon-cart{ display:none; }
  .star-product-add.is-added .icon-check{ display:block; }

  /* Selector de cantidad (handoff 2026-09-21, Frente 1 punto 1 —
     faltaba en esta tarjeta): propia fila arriba de .star-product-buy,
     mismo criterio que .catalog-card-qty-row en las tarjetas del
     catálogo. Estilo propio (no reusa .catalog-card-qty) porque acá el
     fondo es oscuro/glass — blanco translúcido en vez de --gray-lt,
     texto blanco en vez de --ink. */
  .star-product-qty-row{ display:flex; }
  .star-product-qty{
    display:inline-flex; align-items:center; gap:0.4rem; background:rgba(255,255,255,0.18);
    border-radius:999px; padding:0.2rem 0.3rem;
  }
  .star-product-qty-btn{
    width:22px; height:22px; border-radius:50%; border:none; cursor:pointer;
    background:rgba(255,255,255,0.92); color:var(--card-accent, var(--ink)); font-size:0.8rem; line-height:1;
    display:flex; align-items:center; justify-content:center; transition:background 0.15s ease;
  }
  .star-product-qty-btn:hover{ background:var(--white); }
  .star-product-qty-value{ font-family:var(--font-body); font-weight:700; font-size:0.78rem; color:var(--white); min-width:1.2em; text-align:center; }

  @media (max-width:900px){
    .category-showcase-stage{ grid-template-columns:1fr; height:auto; }
    .category-showcase-media{ height:auto; aspect-ratio:16/9; }
    .star-product{ height:auto; flex-direction:row; }
    .star-product-media{ width:38%; aspect-ratio:1/1; }
    .star-product-info{ flex:1; }
  }
  @media (max-width:600px){
    .category-tab.is-active{ max-width:220px; }
    .star-product{ flex-direction:column; }
    .star-product-media{ width:100%; }
  }

  .distributor-burst{ background:var(--ink); color:var(--white); border-radius:8px; padding:3rem; display:grid; grid-template-columns:1.3fr 1fr; gap:2.5rem; align-items:center; }
  .eyebrow--on-dark{
    font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.1em;
    text-transform:uppercase; color:var(--accent);
  }
  .distributor-burst h2{ color:var(--white); font-size:clamp(1.7rem,2.6vw,2.3rem); }
  .distributor-burst p{ margin-top:0.9rem; color:rgba(255,255,255,0.75); max-width:44ch; font-weight:400; font-family:var(--font-body); }
  .distributor-burst .burst-btn{ background:var(--accent-dk); color:var(--white); }
  .badge-stack{ display:flex; flex-direction:column; gap:0.8rem; }
  .badge{ background:rgba(255,255,255,0.08); border-radius:999px; padding:0.7rem 1.2rem; font-weight:800; font-size:0.9rem; display:flex; align-items:center; gap:0.6rem; }
  .badge::before{ content:""; width:10px; height:10px; border-radius:50%; background:var(--accent); }

  footer{ background:color-mix(in srgb, var(--footer-bg) 50%, black); color:rgba(255,255,255,0.96); font-size:0.85rem; padding:0 0 2rem; }
  .footer-row{ display:flex; justify-content:space-between; flex-wrap:wrap; gap:1rem; padding-top:2rem; border-top:1px solid rgba(255,255,255,0.16); margin-top:0.5rem; }

  .footer-grid4{ display:grid; grid-template-columns:1.6fr 1fr 1fr 1fr; gap:2.5rem; padding-top:3.5rem; padding-bottom:2.5rem; }
  .footer-brand p{ max-width:30ch; margin:0.9rem 0 1.2rem; line-height:1.5; color:rgba(255,255,255,0.92); }
  .footer-logo{ height:148px; width:auto; }
  .footer-social{ display:flex; gap:0.6rem; flex-wrap:wrap; }
  .social-link{
    display:inline-flex; align-items:center; justify-content:center; width:36px; height:36px;
    border-radius:999px; background:rgba(255,255,255,0.12); color:var(--white);
    transition:background 0.2s ease, color 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;
  }
  .social-link:hover{ transform:translateY(-3px) scale(1.06); }

  /* Cada red social toma su propio color de marca al pasar el mouse —
     mismo criterio que en americalogistic.com. */
  .social-link--facebook:hover{ background:#1877F2; color:var(--white); box-shadow:0 6px 14px rgba(0,0,0,0.45); }
  .social-link--instagram:hover{
    background:linear-gradient(45deg,#f09433 0%,#e6683c 25%,#dc2743 50%,#cc2366 75%,#bc1888 100%);
    color:var(--white); box-shadow:0 6px 14px rgba(220,39,67,0.4);
  }
  .social-link--youtube:hover{ background:#FF0000; color:var(--white); box-shadow:0 6px 14px rgba(255,0,0,0.4); }
  .social-link--tiktok:hover{ background:#010101; color:var(--white); box-shadow: -2px 0 0 0 #25F4EE, 2px 0 0 0 #FE2C55; }
  .social-link--linkedin:hover{ background:#0A66C2; color:var(--white); box-shadow:0 6px 14px rgba(0,0,0,0.45); }
  .social-link--x:hover{ background:#000000; color:var(--white); box-shadow:0 6px 14px rgba(0,0,0,0.45); }
  .social-link--whatsapp:hover{ background:#25D366; color:var(--white); box-shadow:0 6px 14px rgba(37,211,102,0.45); }

  @media (prefers-reduced-motion: reduce){ .social-link:hover{ transform:none; } }

  .footer-col{ align-self: center;}

  .footer-col h4{
    font-family:var(--font-display); font-weight:800; text-transform:uppercase; font-size:0.85rem; letter-spacing:0.03em;
    margin:0 0 1rem; color:var(--white);
  }
  .footer-col ul{ list-style:none; margin:0; padding:0; display:grid; gap:0.6rem; }
  .footer-col a{ text-decoration:none; color:rgba(255,255,255,0.95); }
  .footer-col a:hover{ color:var(--white); text-decoration:underline; text-decoration-color:var(--footer-bg-dk); text-underline-offset:3px; }
  .footer-col address{ font-style:normal; line-height:1.5; color:rgba(255,255,255,0.92); }
  .footer-hours{ margin:0.9rem 0 0; line-height:1.6; color:rgba(255,255,255,0.92); }

  @media (max-width:880px){
    .footer-grid4{ grid-template-columns:1fr 1fr; }
    .footer-brand{ grid-column:1 / -1;}
  }
  @media (max-width:520px){
    .footer-grid4{ grid-template-columns:1fr; }
  }

  @media (max-width:880px){
    nav ul{ display:none; }
    .distributor-burst{ grid-template-columns:1fr; padding:2rem; }
  }

  /* Logo real */
  /* Foto recortada dentro del burst hero */
  .burst-photo{
    position:absolute; right:0; bottom:0; top:0; width:42%;
    clip-path:polygon(18% 0, 100% 0, 100% 100%, 0% 100%);
    overflow:hidden;
  }
  .burst-photo video{
    position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:0;
    opacity:0; transition:opacity 0.9s ease;
  }
  .burst-photo video.is-active{ opacity:1; }
  @media (prefers-reduced-motion: reduce){ .burst-photo video{ transition:none; } }
  .burst-photo::after{
    content:""; position:absolute; inset:0; z-index:1;
    background:linear-gradient(90deg, var(--blue) 0%, rgba(29,128,213,0.12) 32%, transparent 62%);
  }
  @media (max-width:900px){ .burst-photo{ display:none; } }

  /* Panel distribuidores con foto */
  .badge-photo{
    aspect-ratio:4/3; border-radius:8px; background-size:cover; background-position:center;
    position:relative; overflow:hidden; margin-bottom:1rem;
    background-image:url('../assets/images/izalco-cubetas-mayoreo.jpg');
  }
  .badge-photo::after{ content:""; position:absolute; inset:0; background:linear-gradient(0deg, rgba(65,65,65,0.55) 0%, transparent 55%); }

  /* Animaciones limpias */
  .reveal{ opacity:0; transform:translateY(18px); transition:opacity 0.55s ease, transform 0.55s ease; }
  .reveal.is-visible{ opacity:1; transform:translateY(0); }
  .chip{ transition:transform 0.15s ease; }
  .chip:hover{ transform:translateY(-3px); }

  @keyframes floatSlow{ 0%,100%{ transform:translateY(0);} 50%{ transform:translateY(-10px);} }
  .dot.d1{ animation:floatSlow 7s ease-in-out infinite; }
  .dot.d2{ animation:floatSlow 9s ease-in-out infinite 1s; }

  @keyframes fadeUp{ from{opacity:0; transform:translateY(14px);} to{opacity:1; transform:translateY(0);} }
  .burst-hero > *{ animation:fadeUp 0.7s ease both; }
  .burst-hero h1{ animation-delay:0.05s; }
  .burst-hero p{ animation-delay:0.14s; }
  .burst-btn{ animation-delay:0.22s; }

  @media (prefers-reduced-motion: reduce){
    .reveal{ opacity:1; transform:none; transition:none; }
    .dot.d1, .dot.d2{ animation:none; }
    .burst-hero > *{ animation:none; }
  }

  /* Ken Burns eliminado: el panel ahora usa video real */

  /* Elementos flotantes que aparecen sobre el hero */

  /* Franja de marcas */
  .brands-strip4{ background:var(--white); border-radius:8px; padding:2rem 1.8rem; margin-bottom:3rem; overflow:hidden; }
  .brands-strip4 .eyebrow4{ font-family:var(--font-body); font-weight:600; font-size:0.68rem; letter-spacing:0.1em; text-transform:uppercase; color:var(--gray-text); text-align:center; display:block; margin-bottom:1.2rem; }
  .brands-track4-outer{ overflow:hidden; width:100%; }
  .brands-track4{ display:flex; justify-content:flex-start; align-items:center; gap:5rem; white-space:nowrap; width:max-content; margin:0; padding:0; animation:brandsScroll4 22s linear infinite; animation-play-state:paused; will-change:transform; }
  .brands-track4.is-measured{ animation-play-state:running; }
  .brands-track4 img{ height:46px; width:auto; flex-shrink:0; }
  @keyframes brandsScroll4{ from{ transform:translateX(0);} to{ transform:translateX(calc(-1 * var(--marquee-distance, 50%))); } }

  @media (prefers-reduced-motion: reduce){
    .brands-track4{ animation:none; }
  }

  /* Fade en bordes del marquee de marcas */
  .brands-track4-outer{
    -webkit-mask-image:linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
    mask-image:linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
  }

  /* Nav con subrayado animado */
  nav ul a{ position:relative; padding-bottom:3px; text-decoration:none; }
  nav ul a::after{
    content:""; position:absolute; left:0; right:0; bottom:-2px; height:3px; border-radius:2px;
    background:var(--accent); transform:scaleX(0); transform-origin:left; transition:transform 0.25s ease;
  }
  nav ul a:hover::after{ transform:scaleX(1); }

  .burst-btn, .btn{ transition:transform 0.15s ease, box-shadow 0.15s ease; }
  .burst-btn:hover{ transform:translateY(-2px); box-shadow:0 10px 18px rgba(65,65,65,0.22); }

  /* Nosotros */
  .about-grid{ display:grid; grid-template-columns:1.5fr 1fr; gap:3.5rem; align-items:center; }
  .about-grid h2{ font-size:clamp(1.7rem,2.6vw,2.3rem); margin:0.5rem 0 1.2rem; }
  .about-grid p{ color:rgba(65,65,65,0.72); line-height:1.6; margin:0 0 1rem; max-width:52ch; }
  .about-states{
    font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.02em;
    color:var(--gray-text); border-top:1px solid var(--gray-lt); padding-top:1rem; margin-top:1.4rem !important;
  }
  .about-stats{ display:grid; gap:1.6rem; }
  .about-stats > div{ border-left:3px solid var(--blue); padding-left:1.1rem; }
  .about-stats strong{ font-family:var(--font-display); font-weight:800; font-size:2.2rem; display:block; color:var(--ink); }
  .about-stats span{ font-family:var(--font-body); font-weight:600; font-size:0.7rem; letter-spacing:0.06em; text-transform:uppercase; color:var(--gray-text); }
  .about-stats > div:nth-child(2){ border-left-color:var(--accent); }
  .about-stats > div:nth-child(3){ border-left-color:var(--accent-dk); }

  /* ============ Página de catálogo ============ */
  /* Acento del catálogo: azul por default (estado general). Cuando se
     filtra por una sola categoría, JS agrega una clase acá abajo que lo
     pisa por el color de esa categoría — todo lo que use esta variable
     (hero, botones clave) sigue el cambio solo. */
  body{ --catalog-accent:var(--blue); --catalog-accent-dk:var(--blue-dk); }
  body.catalog-theme--grocery{ --catalog-accent:var(--cat-grocery); --catalog-accent-dk:var(--cat-grocery-dk); }
  body.catalog-theme--beverages{ --catalog-accent:var(--cat-beverages); --catalog-accent-dk:var(--cat-beverages-dk); }
  body.catalog-theme--frozen{ --catalog-accent:var(--cat-frozen); --catalog-accent-dk:var(--cat-frozen-dk); }
  body.catalog-theme--dairy{ --catalog-accent:var(--cat-dairy); --catalog-accent-dk:var(--cat-dairy-dk); }
  body.catalog-theme--bakery{ --catalog-accent:var(--cat-bakery); --catalog-accent-dk:var(--cat-bakery-dk); }
  body.catalog-theme--snacks{ --catalog-accent:var(--cat-snacks); --catalog-accent-dk:var(--cat-snacks-dk); }
  body.catalog-theme--spices{ --catalog-accent:var(--cat-spices); --catalog-accent-dk:var(--cat-spices-dk); }
  body.catalog-theme--sweets{ --catalog-accent:var(--cat-sweets); --catalog-accent-dk:var(--cat-sweets-dk); }
  body.catalog-theme--meats{ --catalog-accent:var(--cat-meats); --catalog-accent-dk:var(--cat-meats-dk); }
  body.catalog-theme--pinatas{ --catalog-accent:var(--cat-pinatas); --catalog-accent-dk:var(--cat-pinatas-dk); }
  body.catalog-theme--cleaning{ --catalog-accent:var(--cat-cleaning); --catalog-accent-dk:var(--cat-cleaning-dk); }
  body.catalog-theme--mixes{ --catalog-accent:var(--cat-mixes); --catalog-accent-dk:var(--cat-mixes-dk); }
  body.catalog-theme--rice{ --catalog-accent:var(--cat-rice); --catalog-accent-dk:var(--cat-rice-dk); }
  body.catalog-theme--sauces{ --catalog-accent:var(--cat-sauces); --catalog-accent-dk:var(--cat-sauces-dk); }
  body.catalog-theme--noodles{ --catalog-accent:var(--cat-noodles); --catalog-accent-dk:var(--cat-noodles-dk); }
  body.catalog-theme--coffee{ --catalog-accent:var(--cat-coffee); --catalog-accent-dk:var(--cat-coffee-dk); }

  /* "Ambientado" — cuando hay una categoría activa (cualquiera de las 11
     clases catalog-theme--*), toda la página se tiñe suave con ese
     color. El selector por atributo evita repetir la regla 11 veces.
     Transición larga y con easing propio (no la default "ease") para
     que el cambio de categoría se sienta gradual, no un salto. */
  body[class*="catalog-theme--"]{
    background-color:color-mix(in srgb, var(--catalog-accent) 6%, white);
    transition:background-color 0.7s cubic-bezier(.4,0,.2,1);
  }
  body[class*="catalog-theme--"] footer.site-footer{
    background:color-mix(in srgb, var(--catalog-accent) 50%, black);
    transition:background 0.7s cubic-bezier(.4,0,.2,1);
  }

  @media (prefers-reduced-motion: reduce){
    body[class*="catalog-theme--"], body[class*="catalog-theme--"] footer.site-footer{ transition:none; }
  }

  .catalog-hero{
    position:relative; border-radius:10px; overflow:hidden; margin-top:1.6rem;
    aspect-ratio:21/8; display:flex; align-items:flex-end; color:var(--white);
  }
  .catalog-hero-media{ position:absolute; inset:0; z-index:0; background:var(--ink); }
  .catalog-hero-media video{ width:100%; height:100%; object-fit:cover; display:block; }
  .catalog-hero-media::after{
    content:""; position:absolute; inset:0;
    background:linear-gradient(0deg, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0.15) 55%, transparent 100%),
               linear-gradient(100deg, var(--catalog-accent) 0%, transparent 60%);
    opacity:0.85; transition:background 0.4s ease;
  }
  .catalog-hero-content{ position:relative; z-index:1; padding:1.8rem 2rem; max-width:60ch; }
  .catalog-hero-content .eyebrow{ color:var(--white); opacity:0.9; }
  .catalog-hero-content h1{ font-size:clamp(1.6rem,2.6vw,2.3rem); margin:0.4rem 0 0; color:var(--white); }
  @media (max-width:700px){ .catalog-hero{ aspect-ratio:4/3; } }
  @media (prefers-reduced-motion: reduce){ .catalog-hero-media::after{ transition:none; } }

  .catalog-search-row{ display:flex; justify-content:space-between; align-items:center; gap:1.5rem; flex-wrap:wrap; margin-bottom:1.6rem; margin-top: 1.6rem; }
  .catalog-search-group{ display:flex; align-items:center; gap:0.8rem; flex-wrap:wrap; }
  .catalog-search{
    font-family:var(--font-body); font-size:0.9rem; border:1px solid var(--gray-lt); border-radius:999px;
    padding:0.6rem 1.1rem; min-width:280px; background:var(--white); color:var(--ink);
  }
  .catalog-search:focus{ outline:2px solid var(--catalog-accent); outline-offset:1px; transition:outline-color 0.3s ease; }
  .catalog-summary{ font-family:var(--font-body); font-weight:600; font-size:0.75rem; color:var(--gray-text); margin:0; }

  .catalog-pdf-download{
    display:inline-flex; align-items:center; gap:0.5rem; font-family:var(--font-body); font-weight:700; font-size:0.85rem;
    color:var(--catalog-accent-dk); text-decoration:none; border:1.5px solid var(--catalog-accent); border-radius:999px;
    padding:0.55rem 1.1rem; white-space:nowrap; transition:background 0.2s ease, color 0.2s ease, transform 0.15s ease;
  }
  .catalog-pdf-download:hover{ background:var(--catalog-accent); color:var(--white); transform:translateY(-2px); }
  .catalog-pdf-download svg{ flex-shrink:0; }

  /* ---- Layout: sidebar de filtros + resultados ---- */
  .catalog-layout{ display:grid; grid-template-columns:240px 1fr; gap:2.5rem; align-items:start; padding-bottom:1rem; }

  .catalog-filters{ position:sticky; top:96px; }
  .filter-group-head{ display:flex; justify-content:space-between; align-items:baseline; margin-bottom:1rem; }
  .filter-group-head h2{ font-family:var(--font-display); font-weight:800; text-transform:uppercase; font-size:1rem; margin:0; }
  .catalog-filters-clear{
    background:none; border:none; font-family:var(--font-body); font-weight:600; font-size:0.68rem; color:var(--blue-dk);
    text-decoration:underline; cursor:pointer; padding:0;
  }
  .catalog-filters-clear:hover{ color:var(--ink); }

  .filter-group{ padding:0; border-top:1px solid var(--gray-lt); }
  .filter-group:first-of-type{ border-top:1px solid var(--gray-lt); }

  .filter-accordion-toggle{
    display:flex; justify-content:space-between; align-items:center; width:100%;
    background:none; border:none; padding:1.1rem 0 0.9rem; margin:0; cursor:pointer; text-align:left;
  }
  .filter-accordion-toggle h3{
    font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.05em; text-transform:uppercase;
    color:var(--gray-text); margin:0;
  }
  .filter-accordion-toggle:hover h3{ color:var(--ink); }
  .accordion-chevron{ color:var(--gray-text); flex-shrink:0; transition:transform 0.25s ease; }
  .filter-accordion-toggle[aria-expanded="true"] .accordion-chevron{ transform:rotate(180deg); }

  /* Truco de grid-template-rows para animar a "altura automática" sin
     medir nada por JS: 0fr cuando está cerrado, 1fr cuando está abierto. */
  .filter-options-wrap{ display:grid; grid-template-rows:0fr; transition:grid-template-rows 0.3s ease; }
  .filter-options-wrap.is-open{ grid-template-rows:1fr; }
  .filter-options-wrap > .filter-options{ overflow:hidden; min-height:0; }
  .filter-options-wrap.is-open > .filter-options{ padding-bottom:1.1rem; }

  .filter-options{ display:grid; gap:0.55rem; }
  .filter-options--scroll{ padding-right:0.3rem; }
  /* Más específica a propósito que ".filter-options-wrap > .filter-options"
     (que fija overflow:hidden para la animación de colapso) — si no, esa
     regla le gana por especificidad y el scroll de marcas queda tapado. */
  .filter-options-wrap > .filter-options.filter-options--scroll{ max-height:220px; overflow-y:auto; overflow-x:hidden; }

  @media (prefers-reduced-motion: reduce){
    .filter-options-wrap{ transition:none; }
    .accordion-chevron{ transition:none; }
  }

  .filter-radio{
    display:flex; align-items:center; gap:0.5rem; background:none; border:none; padding:0.2rem 0; width:100%;
    text-align:left; cursor:pointer; font-family:var(--font-body); font-size:0.85rem; color:var(--ink);
  }
  .filter-radio:hover{ color:var(--blue-dk); }
  .filter-radio.is-active{ font-weight:800; color:var(--catalog-accent-dk); }
  .filter-radio .filter-count{ margin-left:auto; font-family:var(--font-body); font-size:0.72rem; color:var(--gray-text); font-weight:400; }
  .filter-dot{ width:8px; height:8px; border-radius:50%; flex-shrink:0; background:var(--gray); }
  .filter-dot--grocery{ background:var(--cat-grocery); }
  .filter-dot--beverages{ background:var(--cat-beverages); }
  .filter-dot--frozen{ background:var(--cat-frozen); }
  .filter-dot--dairy{ background:var(--cat-dairy); }
  .filter-dot--bakery{ background:var(--cat-bakery); }
  .filter-dot--snacks{ background:var(--cat-snacks); }
  .filter-dot--spices{ background:var(--cat-spices); }
  .filter-dot--sweets{ background:var(--cat-sweets); }
  .filter-dot--meats{ background:var(--cat-meats); }
  .filter-dot--pinatas{ background:var(--cat-pinatas); }
  .filter-dot--cleaning{ background:var(--cat-cleaning); }
  .filter-dot--mixes{ background:var(--cat-mixes); }
  .filter-dot--rice{ background:var(--cat-rice); }
  .filter-dot--sauces{ background:var(--cat-sauces); }
  .filter-dot--noodles{ background:var(--cat-noodles); }
  .filter-dot--coffee{ background:var(--cat-coffee); }

  .filter-checkbox{
    display:flex; align-items:center; gap:0.55rem; font-family:var(--font-body); font-size:0.85rem;
    color:var(--ink); cursor:pointer; padding:0.15rem 0; position:relative;
  }
  .filter-checkbox input{
    position:absolute; inset:0; width:100%; height:100%; margin:0; opacity:0; cursor:pointer;
  }
  .filter-check-visual{
    width:16px; height:16px; border:1.5px solid var(--gray-lt); border-radius:4px; flex-shrink:0; position:relative;
    transition:background 0.15s ease, border-color 0.15s ease;
  }
  .filter-checkbox input:checked + .filter-check-visual{ background:var(--ink); border-color:var(--ink); }
  .filter-checkbox input:checked + .filter-check-visual::after{
    content:""; position:absolute; left:4px; top:1px; width:4px; height:8px;
    border:solid var(--white); border-width:0 2px 2px 0; transform:rotate(45deg);
  }
  .filter-checkbox input:focus-visible + .filter-check-visual{ outline:2px solid var(--blue); outline-offset:2px; }
  .filter-check-visual--low_stock{ border-color:var(--stock-low-dk); }
  .filter-check-visual--out_of_stock{ border-color:var(--gray); }
  .filter-checkbox .filter-count{ margin-left:auto; font-family:var(--font-body); font-weight:600; font-size:0.7rem; color:var(--gray-text); }

  .catalog-active-filters{ display:flex; flex-wrap:wrap; gap:0.5rem; margin-bottom:1.2rem; }
  .active-filter-pill{
    display:inline-flex; align-items:center; gap:0.4rem; background:var(--gray-lt); border:none; border-radius:999px;
    padding:0.35rem 0.7rem; font-family:var(--font-body); font-weight:600; font-size:0.72rem; color:var(--ink); cursor:pointer;
    transition:background 0.15s ease;
  }
  .active-filter-pill:hover{ background:var(--ink); color:var(--white); }

  @media (max-width:900px){
    .catalog-layout{ grid-template-columns:minmax(0,1fr); }
    .catalog-filters{ position:static; border-bottom:1px solid var(--gray-lt); padding-bottom:1.2rem; margin-bottom:1rem; }
  }

  .catalog-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:1rem; padding-bottom:1rem; }

  /* Tarjetas de catálogo — mismo lenguaje "premium" que la tarjeta de
     Pick your Pantry (.star-product): esquinas redondeadas + sombra en
     vez del borde superior de color plano, ícono grande con el color
     de su categoría (no gris genérico), y el panel de info como un
     "glass simulado": blanco translúcido + blur, solapado unos px
     sobre la imagen en vez de una línea recta entre las dos — como acá
     no hay un fondo de sección de color detrás para que el blur real
     se note (a diferencia del showcase del home), el efecto se simula
     con el solape + la transición de color que da el translúcido sobre
     el tinte de la imagen. Colores de imagen siguen siendo claros (no
     saturados) — pedido explícito: nada de fondo oscuro acá. */
  .catalog-card{
    position:relative; border:none; border-radius:14px; overflow:hidden; background:var(--white);
    box-shadow:0 6px 16px rgba(0,0,0,0.10); display:flex; flex-direction:column;
    transition:transform 0.2s ease, box-shadow 0.2s ease;
  }
  .catalog-card:hover{ transform:translateY(-3px); box-shadow:0 12px 26px rgba(0,0,0,0.16); }

  /* Espacio de foto: placeholder prolijo hasta que haya fotos reales.
     El día que las haya, esto pasa a ser <img class="catalog-card-image" src="...">
     con object-fit:cover — el contenedor (aspect-ratio, tamaño) ya queda listo,
     no hace falta rediseñar la tarjeta. */
  .catalog-card-image{
    position:relative; aspect-ratio:1/1; display:flex; align-items:center; justify-content:center;
    background:var(--gray-lt); text-decoration:none;
  }
  .catalog-card-image svg{ width:25%; max-width:52px; height:auto; fill:currentColor; color:var(--gray); opacity:0.65; }
  .catalog-card-photo{ width:100%; height:100%; object-fit:cover; }
  .catalog-card--grocery .catalog-card-image{ background:color-mix(in srgb, var(--cat-grocery) 24%, white); }
  .catalog-card--beverages .catalog-card-image{ background:color-mix(in srgb, var(--cat-beverages) 24%, white); }
  .catalog-card--frozen .catalog-card-image{ background:color-mix(in srgb, var(--cat-frozen) 24%, white); }
  .catalog-card--dairy .catalog-card-image{ background:color-mix(in srgb, var(--cat-dairy) 30%, white); }
  .catalog-card--bakery .catalog-card-image{ background:color-mix(in srgb, var(--cat-bakery) 24%, white); }
  .catalog-card--snacks .catalog-card-image{ background:color-mix(in srgb, var(--cat-snacks) 24%, white); }
  .catalog-card--spices .catalog-card-image{ background:color-mix(in srgb, var(--cat-spices) 20%, white); }
  .catalog-card--sweets .catalog-card-image{ background:color-mix(in srgb, var(--cat-sweets) 20%, white); }
  .catalog-card--meats .catalog-card-image{ background:color-mix(in srgb, var(--cat-meats) 20%, white); }
  .catalog-card--pinatas .catalog-card-image{ background:color-mix(in srgb, var(--cat-pinatas) 20%, white); }
  .catalog-card--cleaning .catalog-card-image{ background:color-mix(in srgb, var(--cat-cleaning) 22%, white); }
  .catalog-card--mixes .catalog-card-image{ background:color-mix(in srgb, var(--cat-mixes) 24%, white); }
  .catalog-card--rice .catalog-card-image{ background:color-mix(in srgb, var(--cat-rice) 24%, white); }
  .catalog-card--sauces .catalog-card-image{ background:color-mix(in srgb, var(--cat-sauces) 24%, white); }
  .catalog-card--noodles .catalog-card-image{ background:color-mix(in srgb, var(--cat-noodles) 24%, white); }
  .catalog-card--coffee .catalog-card-image{ background:color-mix(in srgb, var(--cat-coffee) 24%, white); }
  .catalog-card--grocery .catalog-card-image svg{ color:var(--cat-grocery); opacity:0.85; }
  .catalog-card--beverages .catalog-card-image svg{ color:var(--cat-beverages); opacity:0.85; }
  .catalog-card--frozen .catalog-card-image svg{ color:var(--cat-frozen); opacity:0.85; }
  .catalog-card--dairy .catalog-card-image svg{ color:var(--cat-dairy-dk); opacity:0.85; }
  .catalog-card--bakery .catalog-card-image svg{ color:var(--cat-bakery); opacity:0.85; }
  .catalog-card--snacks .catalog-card-image svg{ color:var(--cat-snacks); opacity:0.85; }
  .catalog-card--spices .catalog-card-image svg{ color:var(--cat-spices); opacity:0.85; }
  .catalog-card--sweets .catalog-card-image svg{ color:var(--cat-sweets); opacity:0.85; }
  .catalog-card--meats .catalog-card-image svg{ color:var(--cat-meats); opacity:0.85; }
  .catalog-card--pinatas .catalog-card-image svg{ color:var(--cat-pinatas); opacity:0.85; }
  .catalog-card--cleaning .catalog-card-image svg{ color:var(--cat-cleaning); opacity:0.85; }
  .catalog-card--mixes .catalog-card-image svg{ color:var(--cat-mixes-dk); opacity:0.85; }
  .catalog-card--rice .catalog-card-image svg{ color:var(--cat-rice-dk); opacity:0.85; }
  .catalog-card--sauces .catalog-card-image svg{ color:var(--cat-sauces); opacity:0.85; }
  .catalog-card--noodles .catalog-card-image svg{ color:var(--cat-noodles-dk); opacity:0.85; }
  .catalog-card--coffee .catalog-card-image svg{ color:var(--cat-coffee); opacity:0.85; }

  /* Badge de logo de marca — vuelve adentro del panel de info, en el
     mismo lugar donde iba el texto de vendor (nunca los dos juntos:
     ver vendorBadgeHtml en catalog.js). */
  .catalog-card-logo-wrap{
    display:inline-flex; align-items:center; align-self:flex-start; background:var(--gray-lt);
    border-radius:6px; padding:0.3rem 0.5rem;
  }
  .catalog-card-logo{ height:14px; width:auto; object-fit:contain; display:block; }

  .catalog-card-body{
    position:relative; z-index:1; margin-top:-14px; border-radius:12px 12px 0 0;
    padding:1.15rem 1.1rem 1.1rem; display:flex; flex-direction:column; gap:0.5rem; flex:1;
    background:rgba(255,255,255,0.82); border-top:1px solid rgba(255,255,255,0.65);
    -webkit-backdrop-filter:blur(8px); backdrop-filter:blur(8px);
  }
  .catalog-card-top{ display:flex; justify-content:space-between; align-items:center; }
  .catalog-card-category{
    font-family:var(--font-body); font-weight:600; font-size:0.65rem; letter-spacing:0.05em; text-transform:uppercase; color:var(--gray-text);
  }
  .catalog-card-sku{ font-family:var(--font-body); font-weight:600; font-size:0.65rem; color:var(--gray-text); }
  .catalog-card-title{ font-family:var(--font-body); font-weight:800; font-size:0.97rem; line-height:1.32; margin:0; color:var(--ink); }
  .catalog-card-title a{ color:inherit; text-decoration:none; }
  .catalog-card-title a:hover{ text-decoration:underline; }
  .catalog-card-vendor{ font-family:var(--font-body); font-weight:600; font-size:0.72rem; color:var(--blue-dk); margin:0; }

  /* Estados de stock — sin inventario real todavía, ver nota en catalog-data.js */
  .stock-badge{
    display:inline-flex; align-items:center; gap:0.35rem; font-family:var(--font-body); font-weight:600;
    font-size:0.68rem; font-weight:600; letter-spacing:0.02em; width:fit-content;
  }
  .stock-badge::before{ content:""; width:6px; height:6px; border-radius:50%; flex-shrink:0; }
  .stock-badge--in{ color:var(--stock-in-text); }
  .stock-badge--in::before{ background:var(--ok); }
  .stock-badge--low{ color:var(--stock-low-text); }
  .stock-badge--low::before{ background:var(--stock-low-dk); }
  .stock-badge--out{ color:var(--gray-text); }
  .stock-badge--out::before{ background:var(--gray); }

  /* Antes esto bajaba la opacidad de TODA la tarjeta (texto incluido),
     lo que aclaraba el color efectivo y volvía a romper el contraste
     que ya habíamos corregido. El degradado de la foto + el badge +
     el botón deshabilitado ya avisan que está agotado, no hace falta
     aclarar el texto también. */
  .catalog-card.is-out-of-stock .catalog-card-image{ filter:grayscale(70%); opacity:0.72; }

  /* Selector de cantidad en la tarjeta de catálogo (handoff 2026-09-21,
     Frente 1 punto 1) — fila propia entre el bloque de vendor/stock y
     el precio+botón, con el mismo lenguaje visual que el qty-stepper
     de product.html (.qty-stepper/.qty-btn en este mismo archivo) pero
     más chico, para caber en tarjeta. No se muestra si el producto está
     agotado (ver qtyStepperHtml() en catalog.js). En la vista "list" se
     reubica adentro de .catalog-card-list-meta — ver catalog-view.css. */
  .catalog-card-qty-row{ display:flex; justify-content:flex-start; }
  .catalog-card-qty{
    display:inline-flex; align-items:center; gap:0.4rem; border:1px solid var(--gray-lt); border-radius:999px;
    padding:0.15rem; background:var(--white);
  }
  .catalog-card-qty-btn{
    width:22px; height:22px; border-radius:50%; border:none; background:none; color:var(--ink);
    font-family:var(--font-body); font-weight:700; font-size:0.85rem; line-height:1; cursor:pointer;
    display:flex; align-items:center; justify-content:center; transition:background 0.15s ease, color 0.15s ease;
  }
  .catalog-card-qty-btn:hover{ background:var(--gray-lt); }
  .catalog-card-qty-value{ font-family:var(--font-body); font-weight:600; font-size:0.78rem; color:var(--ink); min-width:1.3em; text-align:center; }

  /* Espacio de precio: barra neutra hasta que haya precios reales. Cuando
     los haya, este <span> pasa a ser el precio real (ej. "$4.99") con esta
     misma clase — el lugar y el tamaño en la tarjeta ya están resueltos. */
  .catalog-card-price-row{ margin-top:auto; padding-top:0.6rem; display:flex; align-items:center; justify-content:space-between; gap:0.6rem; }
  .catalog-card-price-slot{
    display:inline-block; width:52px; height:14px; border-radius:4px;
    background:var(--gray-lt); flex-shrink:0;
  }
  .catalog-card-price{
    font-family:var(--font-body); font-weight:800; font-size:0.9rem; color:var(--ink); flex-shrink:0;
  }

  /* Botón "Add to cart" animado — mismo mecanismo que .star-product-add
     (grid 34px → 34px+1fr en hover, ícono + / carrito / check
     intercambiados por CSS, nunca por JS). El ancho expandido lo mide
     el propio contenido del botón, no un número inventado. */
  .catalog-card-add{
    flex-shrink:0; display:grid; grid-template-columns:34px minmax(0,0fr); align-items:center; height:34px;
    border-radius:999px; border:none; background:var(--ink); color:var(--white); cursor:pointer;
    overflow:hidden; transition:grid-template-columns 0.35s cubic-bezier(.4,0,.2,1), background-color 0.3s ease, transform 0.15s ease;
  }
  .catalog-card-add-icons{ width:34px; height:34px; display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .catalog-card-add-icons svg{ width:14px; height:14px; }
  .catalog-card-add-label{
    display:block; min-width:0; overflow:hidden; white-space:nowrap; padding-right:0.95rem;
    font-family:var(--font-body); font-weight:700; font-size:0.7rem; opacity:0; transition:opacity 0.2s ease;
  }
  .catalog-card-add:hover:not(.is-disabled):not(.is-added){ grid-template-columns:34px minmax(0,1fr); transform:scale(1.04); }
  .catalog-card-add:hover:not(.is-disabled):not(.is-added) .catalog-card-add-label{ opacity:1; transition-delay:0.1s; }
  .catalog-card-add.is-added{ background:var(--ok); color:var(--white); }
  .catalog-card-add.is-disabled{
    background:var(--gray-lt); color:var(--gray-text); cursor:not-allowed;
    display:inline-flex; align-items:center; height:auto; padding:0.4rem 0.75rem; font-size:0.68rem; font-weight:600;
  }
  .catalog-card-add .icon-cart, .catalog-card-add .icon-check{ display:none; }
  .catalog-card-add:hover:not(.is-disabled):not(.is-added) .icon-plus{ display:none; }
  .catalog-card-add:hover:not(.is-disabled):not(.is-added) .icon-cart{ display:block; }
  .catalog-card-add.is-added .icon-plus, .catalog-card-add.is-added .icon-cart{ display:none; }
  .catalog-card-add.is-added .icon-check{ display:block; }

  /* v17.18.0 — Presentaciones en la tarjeta: botoncitos (1 lb · 5 lb ·
     Caja). La elegida va rellena; la agotada, tachada y con "Agotada"
     en su nombre accesible (no solo el color). */
  .catalog-card-sizes{ display:flex; flex-wrap:wrap; gap:0.3rem; margin:0.15rem 0 0.35rem; }
  .catalog-card-size{
    font-family:var(--font-body); font-weight:600; font-size:0.7rem; line-height:1.2; color:var(--ink);
    background:var(--white); border:1.5px solid var(--gray-lt); border-radius:8px; padding:0.22rem 0.5rem; cursor:pointer;
  }
  .catalog-card-size:hover{ border-color:var(--gray); }
  .catalog-card-size.is-on{ background:var(--ink); border-color:var(--ink); color:var(--white); }
  .catalog-card-size.is-out{ color:var(--gray-text); text-decoration:line-through; }
  .catalog-card-size.is-on.is-out{ color:var(--white); }
  .catalog-card-size:focus-visible{ outline:2px solid var(--blue-dk); outline-offset:2px; }
  .catalog-card-price-from{ font-weight:500; font-size:0.72em; color:var(--gray-text); margin-right:0.15rem; }
  /* Donde no hay selector (relacionados): enlace "Elegir presentación". */
  a.catalog-card-choose{
    display:inline-flex; align-items:center; height:34px; padding:0 0.9rem; grid-template-columns:none;
    font-family:var(--font-body); font-weight:700; font-size:0.72rem; text-decoration:none; white-space:nowrap;
  }
  a.catalog-card-choose:hover{ background:var(--blue-dk); }
  .star-product-choose{
    display:inline-flex; align-items:center; height:40px; padding:0 1rem; border-radius:999px; background:var(--white);
    color:var(--card-accent, var(--blue-dk)); font-family:var(--font-body); font-weight:700; font-size:0.78rem;
    text-decoration:none; white-space:nowrap;
  }
  .star-product-price small{ font-weight:600; font-size:0.65em; opacity:0.85; }

  @media (prefers-reduced-motion: reduce){
    .catalog-card{ transition:none; }
    .catalog-card-add{ transition:background-color 0.3s ease; }
  }

  .catalog-empty{ text-align:center; padding:3rem 0; color:var(--gray-text); font-family:var(--font-body); font-weight:600; font-size:0.9rem; }

  .catalog-loadmore-wrap{ text-align:center; padding:1rem 0 3.5rem; }
  .catalog-loadmore{
    font-family:var(--font-body); font-weight:800; font-size:0.9rem; background:var(--catalog-accent-dk); color:var(--white);
    border:none; border-radius:999px; padding:0.8rem 1.8rem; cursor:pointer; transition:transform 0.15s ease, background 0.3s ease;
  }
  .catalog-loadmore:hover{ transform:translateY(-2px); }

  @media (max-width:900px){ .catalog-grid{ grid-template-columns:repeat(3,1fr); } }
  @media (max-width:620px){ .catalog-grid{ grid-template-columns:repeat(2,1fr); } }
  @media (max-width:420px){ .catalog-grid{ grid-template-columns:1fr; } .catalog-search{ min-width:0; width:100%; } }

  /* ============ Página de producto ============ */
  .breadcrumb{
    font-family:var(--font-body); font-weight:600; font-size:0.75rem; color:var(--gray-text);
    padding:1.6rem 0 0.5rem;
  }
  .breadcrumb a{ color:var(--gray-text); text-decoration:none; }
  .breadcrumb a:hover{ color:var(--blue-dk); text-decoration:underline; }
  .breadcrumb span{ color:var(--ink); }

  .product-detail{ display:grid; grid-template-columns:1fr 1.2fr; gap:3rem; padding:2rem 0 3.5rem; align-items:start; }
  .product-gallery-main{
    aspect-ratio:1/1; border-radius:8px;
    display:flex; align-items:center; justify-content:center; color:var(--gray);
  }
  .product-gallery-main.has-placeholder{
    background:color-mix(in srgb, var(--catalog-accent, var(--blue)) 16%, white);
  }
  .product-gallery-main svg{ width:64px; height:64px; }
  .product-gallery-photo{ width:100%; height:100%; object-fit:cover; border-radius:8px; }
  .product-gallery-thumbs{ display:flex; gap:0.6rem; margin-top:0.8rem; }
  .product-thumb{
    width:56px; height:56px; border-radius:6px; border:2px solid var(--gray-lt); background:var(--white);
    display:flex; align-items:center; justify-content:center; color:var(--gray); cursor:pointer;
    transition:border-color 0.15s ease;
  }
  .product-thumb svg{ width:20px; height:20px; }
  .product-thumb-photo{ width:100%; height:100%; object-fit:cover; border-radius:4px; }
  .product-thumb:hover{ border-color:var(--blue); }
  .product-thumb.is-active{ border-color:var(--ink); color:var(--ink); }
  .product-category{
    font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.05em; text-transform:uppercase;
    color:var(--blue-dk);
  }
  .product-info h1{ font-size:clamp(1.5rem,2.4vw,2rem); margin:0.5rem 0 0.3rem; line-height:1.25; }
  .product-vendor-row{ display:flex; align-items:center; gap:0.5rem; margin:0 0 0.9rem; }
  .product-vendor{ font-family:var(--font-body); font-weight:600; font-size:0.85rem; color:var(--gray-text); margin:0; }
  .product-vendor-logo{ height:24px; width:auto; max-width:96px; object-fit:contain; border-radius:3px; }
  .product-stock .stock-badge{ font-size:0.78rem; }
  .product-stock .stock-badge::before{ width:8px; height:8px; }

  .product-price-slot{
    display:block; width:120px; height:28px; border-radius:6px; background:var(--gray-lt); margin:1.3rem 0;
  }
  .product-price{
    display:block; font-family:var(--font-body); font-weight:800; font-size:1.6rem; color:var(--ink); margin:1.3rem 0;
  }

  /* v17.18.0 — Selector de presentación (1 lb, 5 lb, Caja x 12…). Radios
     reales (teclado y lector de pantalla), con el círculo oculto: se ve
     como una tarjeta por presentación. "Agotada" se dice con texto, no
     solo con el color. */
  .product-variants{ border:0; padding:0; margin:0 0 1.4rem; min-width:0; }
  .product-variants-legend{
    padding:0; margin-bottom:0.65rem; font-family:var(--font-body); font-weight:700; font-size:0.74rem;
    letter-spacing:0.08em; text-transform:uppercase; color:var(--ink);
  }
  .product-variants-chosen{ font-weight:600; letter-spacing:0; text-transform:none; color:var(--gray-text); }
  /* v17.18.1: una sola fila — 3 visibles; con más, flechas ‹ › (y se
     puede deslizar en el celular). */
  .product-variants-row{ display:flex; align-items:stretch; gap:0.45rem; }
  .product-variants-options{
    display:grid; grid-auto-flow:column; grid-auto-columns:calc((100% - 1.2rem) / 3); gap:0.6rem;
    flex:1 1 auto; min-width:0; overflow-x:auto; scroll-snap-type:x mandatory; scrollbar-width:none;
    padding:3px; margin:-3px;
  }
  .product-variants-options::-webkit-scrollbar{ display:none; }
  .product-variants-arrow{
    flex:0 0 34px; display:grid; place-items:center; border:1.5px solid var(--gray-lt); border-radius:12px;
    background:var(--white); color:var(--ink); font-size:1.3rem; line-height:1; cursor:pointer; padding:0;
  }
  .product-variants-arrow[hidden]{ display:none; }
  .product-variants-arrow:hover:not(:disabled){ border-color:var(--ink); }
  .product-variants-arrow:disabled{ opacity:0.35; cursor:default; }
  .product-variants-arrow:focus-visible{ outline:2px solid var(--blue-dk); outline-offset:2px; }
  .product-variant{ position:relative; display:block; cursor:pointer; scroll-snap-align:start; min-width:0; }
  .product-variant-name{ overflow-wrap:anywhere; }
  .product-variant input{ position:absolute; opacity:0; width:1px; height:1px; }
  .product-variant-box{
    display:flex; flex-direction:column; gap:0.15rem; height:100%; padding:0.65rem 0.8rem;
    border:1.5px solid var(--gray-lt); border-radius:12px; background:var(--white);
    transition:border-color 0.15s ease, box-shadow 0.15s ease;
  }
  .product-variant-name{ font-family:var(--font-body); font-weight:700; font-size:0.92rem; color:var(--ink); }
  .product-variant-price{ font-family:var(--font-body); font-size:0.82rem; color:var(--gray-text); }
  .product-variant:hover .product-variant-box{ border-color:var(--gray); }
  .product-variant input:checked + .product-variant-box{ border:2px solid var(--ink); box-shadow:0 0 0 3px rgba(65,65,65,0.08); }
  .product-variant input:focus-visible + .product-variant-box{ outline:2px solid var(--blue-dk); outline-offset:2px; }
  .product-variant.is-out .product-variant-box{ background:#FAFAFA; }
  .product-variant.is-out .product-variant-name{ color:var(--gray-text); text-decoration:line-through; }

  .product-buy-row{ display:flex; align-items:center; gap:1rem; margin-bottom:2rem; flex-wrap:wrap; }
  .qty-stepper{
    display:inline-flex; align-items:center; gap:0; border:1px solid var(--gray-lt); border-radius:999px; overflow:hidden; background-color: var(--white);
  }
  .qty-btn{
    width:38px; height:38px; border:none; background:var(--white); color:var(--ink); font-size:1.1rem; cursor:pointer;
    transition:background 0.15s ease;
  }
  .qty-btn:hover{ background:var(--gray-lt); }
  .qty-value{ min-width:36px; text-align:center; font-family:var(--font-body); font-weight:600; font-size:0.95rem; }
  /* v17.18.1 — El número del selector − / + es un campo: se puede escribir
     la cantidad. Se ve igual que antes (sin caja), con un subrayado al
     enfocarlo para que se note que se puede editar. */
  .qty-input{
    border:0; background:transparent; padding:0; margin:0; color:inherit; font:inherit; text-align:center;
    width:3.2ch; min-width:0; border-radius:4px; -moz-appearance:textfield; appearance:textfield;
  }
  input.qty-value{ width:44px; }
  input.catalog-card-qty-value{ width:2.8ch; }
  input.star-product-qty-value{ width:2.8ch; }
  .qty-input:hover{ background:rgba(65,65,65,0.06); }
  .qty-input:focus{ outline:none; background:var(--white); box-shadow:inset 0 -2px 0 var(--blue-dk); color:var(--ink); }
  .qty-input:focus-visible{ outline:2px solid var(--blue-dk); outline-offset:1px; }
  .qty-notice{ display:block; margin-top:0.3rem; font-family:var(--font-body); font-size:0.74rem; font-weight:600; color:#8A5A00; }
  .qty-notice:empty{ display:none; }
  .product-add-btn{
    font-family:var(--font-body); font-weight:800; font-size:0.95rem; background:var(--ink); color:var(--white);
    border:none; border-radius:999px; padding:0.85rem 2rem; cursor:pointer; transition:transform 0.15s ease, background 0.15s ease;
  }
  .product-add-btn:hover{ background:var(--blue-dk); transform:translateY(-2px); }
  .product-add-btn.is-added{ background:var(--ok); color:var(--ink); }
  .product-add-btn.is-disabled, .product-add-btn:disabled{ background:var(--gray-lt); color:var(--gray-text); cursor:not-allowed; transform:none; }

  .product-details-table{ width:100%; border-collapse:collapse; font-size:0.88rem; }
  .product-details-table th, .product-details-table td{
    text-align:left; padding:0.7rem 0.5rem; border-top:1px solid var(--gray-lt);
  }
  .product-details-table th{
    font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.04em; text-transform:uppercase;
    color:var(--gray-text); font-weight:500; width:40%;
  }
  .product-details-table td{ color:var(--ink); font-weight:600; }

  /* Ficha técnica: mismo look que la tabla de arriba, pero con más
     espacio para el valor (las etiquetas — "Instrucciones de
     preparación", etc. — son más largas) y texto multilínea real para
     los campos que vienen como párrafo (ingredientes, info nutricional). */
  /* Ficha técnica: mismo lenguaje visual que el acordeón de filtros del
     catálogo (.filter-accordion-toggle / .filter-options-wrap), pero con
     grupos independientes en vez de excluyentes — ver comentario en
     initSpecAccordion() en product.js.

     Fondo tenue (8% del acento de categoría activa, mezclado con blanco)
     para que no se sienta "texto flotando" — contraste verificado contra
     este fondo específico, no asumido: en el peor caso (Meats, el tono
     más saturado) el texto secundario --gray-text queda en ~5:1, por
     encima del mínimo WCAG AA de 4.5:1. Usa --catalog-accent porque esa
     variable ya cambia sola según la categoría activa (ver body.catalog-theme--*
     más abajo) — no hace falta declarar 11 reglas repetidas por categoría. */
  .product-spec-sheet{
    padding:0.3rem 2rem 0.3rem; margin-top:1rem; border-radius:12px;
    background:color-mix(in srgb, var(--catalog-accent, var(--blue)) 8%, white);
  }
  .spec-sheet-toggle{
    display:flex; align-items:center; justify-content:space-between; gap:1rem; width:100%;
    background:none; border:none; padding:1.5rem 0; margin:0; cursor:pointer; text-align:left;
  }
  .spec-sheet-toggle h2{ font-size:clamp(1.2rem,1.8vw,1.5rem); margin:0; }
  .spec-sheet-toggle .accordion-chevron{ color:var(--gray-text); flex-shrink:0; transition:transform 0.25s ease; }
  .spec-sheet-toggle[aria-expanded="true"] .accordion-chevron{ transform:rotate(180deg); }

  /* Mismo truco de grid-template-rows 0fr/1fr que .filter-options-wrap:
     anima a "altura automática" sin medir nada por JS. Acá se aplica una
     sola vez, a toda la ficha, no grupo por grupo. */
  .spec-sheet-wrap{ display:grid; grid-template-rows:0fr; transition:grid-template-rows 0.3s ease; }
  .spec-sheet-wrap.is-open{ grid-template-rows:1fr; }
  .spec-sheet-wrap > .spec-groups{ overflow:hidden; min-height:0; }
  .spec-sheet-wrap.is-open > .spec-groups{ padding-bottom:1.8rem; }

  /* Los 3 grupos usan el ancho completo del layout, en columnas en
     desktop y apilados en mobile — todos visibles de una cuando la
     ficha está abierta, sin sub-acordeón por grupo. */
  .spec-groups{ display:grid; grid-template-columns:repeat(3, 1fr); gap:0 2rem; }
  .spec-group-head{ display:flex; align-items:center; gap:0.6rem; margin-bottom:0.9rem; }
  .spec-group-icon{ color:var(--catalog-accent-dk, var(--blue-dk)); flex-shrink:0; }
  .spec-group-head h3{ font-family:var(--font-body); font-weight:700; font-size:0.92rem; margin:0; color:var(--ink); }
  .spec-content{ display:grid; gap:1rem; }

  .spec-row{ display:flex; flex-direction:column; gap:0.15rem; font-size:0.85rem; }
  .spec-row-label{ color:var(--gray-text); font-weight:600; }
  .spec-row-value{ color:var(--ink); font-weight:600; }

  .spec-block-label{
    display:block; font-family:var(--font-body); font-weight:600; font-size:0.68rem; letter-spacing:0.05em;
    text-transform:uppercase; color:var(--gray-text); margin-bottom:0.3rem;
  }
  .spec-block-value{ margin:0; font-size:0.88rem; line-height:1.6; color:var(--ink); white-space:pre-line; }

  /* Lista de alérgenos ("Contiene: ..."): lista real, no un párrafo con
     comas — un lector de pantalla anuncia cada ítem por separado (ver
     product.js, tipo 'list'). El marcador de color usa el mismo acento
     de categoría que el resto de la ficha, para que no se vea como un
     elemento fuera de lugar dentro del acordeón. */
  .spec-allergens-list{
    margin:0; padding:0; list-style:none; display:flex; flex-wrap:wrap; gap:0.4rem 0.6rem;
  }
  .spec-allergens-list li{
    font-size:0.85rem; font-weight:600; color:var(--ink); background:color-mix(in srgb, var(--catalog-accent-dk, var(--blue-dk)) 10%, var(--white));
    padding:0.2rem 0.6rem; border-radius:999px; line-height:1.4;
  }

  .spec-image-trigger{
    display:inline-flex; align-items:center; gap:0.55rem; background:var(--white);
    border:1px solid var(--gray-lt); border-radius:999px; padding:0.25rem 1rem 0.25rem 0.25rem;
    cursor:pointer; font-family:var(--font-body); font-weight:700; font-size:0.8rem; color:var(--blue-dk);
  }
  .spec-image-trigger:hover{ background:var(--gray-lt); }
  .spec-image-trigger:focus-visible{ outline:3px solid var(--blue); outline-offset:2px; }
  .spec-image-thumb{ width:26px; height:26px; border-radius:6px; object-fit:cover; flex-shrink:0; }

  body.no-scroll{ overflow:hidden; }
  .lightbox-overlay{
    display:none; position:fixed; inset:0; background:rgba(20,20,20,0.9); z-index:1000;
    align-items:center; justify-content:center; padding:2rem;
  }
  .lightbox-overlay.is-open{ display:flex; }
  .lightbox-img{ max-width:90vw; max-height:85vh; border-radius:8px; }
  .lightbox-close{
    position:absolute; top:1rem; right:1.2rem; width:42px; height:42px; border-radius:50%; border:none;
    background:var(--white); color:var(--ink); font-size:1.6rem; line-height:1; cursor:pointer;
    display:flex; align-items:center; justify-content:center;
  }
  .lightbox-close:hover{ background:var(--gray-lt); }
  .lightbox-close:focus-visible{ outline:3px solid var(--blue); outline-offset:2px; }

  @media (max-width:900px){ .spec-groups{ grid-template-columns:1fr; gap:1.6rem; } }
  @media (max-width:640px){ .product-spec-sheet{ padding:0.2rem 1.3rem 0.2rem; border-radius:8px; } }

  .product-not-found{ text-align:center; padding:5rem 0; max-width:48ch; margin:0 auto; }
  .product-not-found h1{ font-size:clamp(1.6rem,2.4vw,2.1rem); margin:0.8rem 0; }
  .product-not-found p{ color:rgba(65,65,65,0.68); margin-bottom:1.5rem; }
  .product-not-found-cta{ background:var(--blue); color:var(--white); display:inline-block; }

  .product-related{ padding:2.5rem 0 4rem; border-top:1px solid var(--gray-lt); }
  .product-related .section-head{ display:flex; justify-content:space-between; align-items:center; }

  .carousel-arrows{ display:flex; gap:0.5rem; }
  .carousel-arrow{
    width:36px; height:36px; border-radius:50%; border:1px solid var(--gray-lt); background:var(--white);
    color:var(--ink); cursor:pointer; display:flex; align-items:center; justify-content:center;
    transition:background 0.15s ease, color 0.15s ease;
  }
  .carousel-arrow:hover{ background:var(--ink); color:var(--white); }

  .carousel-track{
    display:grid; grid-auto-flow:column; grid-auto-columns:calc((100% - 2rem) / 3);
    gap:1rem; overflow-x:auto; scroll-snap-type:x mandatory; padding-bottom:0.5rem;
    scrollbar-width:thin;
  }
  .carousel-track .carousel-card{ scroll-snap-align:start; }

  @media (max-width:820px){
    .product-detail{ grid-template-columns:1fr; }
    .product-gallery-main{ max-width:360px; margin:0 auto; }
    .product-gallery-thumbs{ max-width:360px; margin:0.8rem auto 0; }
    .carousel-track{ grid-auto-columns:calc((100% - 1rem) / 2); }
  }
  @media (max-width:520px){
    .carousel-track{ grid-auto-columns:85%; }
  }

  /* ============ Página de Distribuidores ============ */
  .dist-hero{
    display:grid; grid-template-columns:1.15fr 1fr; gap:0; align-items:stretch;
    background:linear-gradient(120deg, var(--blue) 0%, var(--blue-dk) 100%);
    border-radius:10px; overflow:hidden; margin-top:1.6rem; color:var(--white);
  }
  .dist-hero-content{ padding:3rem 2.5rem; display:flex; flex-direction:column; justify-content:center; }
  .dist-hero-content h1{ font-size:clamp(1.8rem,2.6vw,2.4rem); margin:0.6rem 0 0.9rem; color:var(--white); }
  .dist-hero-content p{ color:rgba(255,255,255,0.92); font-size:1.02rem; max-width:44ch; }
  .dist-hero-cta{ margin-top:1.6rem; align-self:flex-start; }
  /* Antes con height fija (420px) la imagen se quedaba corta cuando el
     texto necesitaba más alto que eso (títulos largos que envuelven 3
     líneas) — quedaba un hueco vacío abajo de la foto, mostrando el
     fondo celeste liso en vez de imagen (visto en vivo con devtools:
     .dist-hero medía 494.9px pero .dist-hero-media se quedaba en 420px
     fijos). Mismo arreglo que la imagen de la vista "chica" del
     catálogo: position:absolute saca la imagen del cálculo de altura
     del grid — la fila la termina definiendo solo el texto, y la
     imagen (con height:100%) sigue automáticamente esa altura real,
     sea cual sea, sin quedar corta ni sobrar. */
  .dist-hero-media{ position:relative; }
  .dist-hero-media img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block; }

  .dist-badges{ display:flex; gap:1.2rem; flex-wrap:wrap; padding:2.2rem 0; }
  .dist-badge{
    display:flex; align-items:center; gap:0.8rem; font-family:var(--font-body); font-weight:700; font-size:0.92rem;
    background:color-mix(in srgb, var(--blue) 8%, white); border-radius:12px; padding:1rem 1.3rem; flex:1; min-width:200px;
  }
  .dist-badge-icon{
    width:42px; height:42px; border-radius:50%; background:var(--white); color:var(--blue-dk);
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
  }

  .dist-coverage{
    display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.15fr); gap:2.5rem; align-items:center;
    padding:2.5rem 0; border-top:1px solid var(--gray-lt); border-bottom:1px solid var(--gray-lt); margin-bottom:2.5rem;
  }
  .dist-coverage h2{ font-family:var(--font-display); font-weight:800; text-transform:uppercase; font-size:1.15rem; margin:0 0 0.6rem; }
  .dist-coverage p{ font-family:var(--font-body); font-weight:600; font-size:0.85rem; color:var(--gray-text); margin:0 0 1.1rem; }
  /* v17.6.0 — Mapa interactivo de cobertura (src/js/coverage-map.js).
     Prefijo cov- a propósito: .chip y .dot ya existen en este archivo
     (home) con otro estilo. */
  .cov-chips{ display:flex; flex-wrap:wrap; gap:0.5rem; margin:0; padding:0; list-style:none; }
  .cov-chip{
    font-family:var(--font-body); font-weight:700; font-size:0.75rem; color:var(--blue-dk);
    background:color-mix(in srgb, var(--blue) 10%, white); border:none; border-radius:6px; padding:0.45rem 0.7rem;
    cursor:pointer; transition:background 0.15s ease, color 0.15s ease;
  }
  .cov-chip:hover, .cov-chip.is-on{ background:var(--blue-dk); color:var(--white); }
  .cov-chip:focus-visible{ outline:3px solid var(--blue-dk); outline-offset:2px; }

  .cov-zip{
    margin-top:1.6rem; padding:1.1rem 1.2rem; border:1px solid var(--gray-lt); border-radius:12px;
    background:color-mix(in srgb, var(--blue) 3%, white);
  }
  .cov-zip label{ display:block; font-family:var(--font-body); font-weight:700; font-size:0.85rem; color:var(--ink); margin-bottom:0.5rem; }
  .cov-zip-row{ display:flex; gap:0.5rem; }
  .cov-zip input{
    flex:1 1 auto; min-width:0; font-family:var(--font-body); font-size:0.95rem; padding:0.6rem 0.8rem;
    border:1px solid var(--gray-lt); border-radius:8px; background:var(--white); color:var(--ink);
  }
  .cov-zip input:focus{ outline:2px solid var(--blue); outline-offset:1px; border-color:var(--blue); }
  .cov-zip button{
    flex-shrink:0; font-family:var(--font-body); font-weight:800; font-size:0.85rem; color:var(--white);
    background:var(--blue-dk); border:none; border-radius:8px; padding:0.6rem 1.1rem; cursor:pointer;
    transition:background 0.15s ease;
  }
  .cov-zip button:hover{ background:var(--ink); }
  /* .dist-coverage p pone margen y color gris: acá se pisa. */
  .dist-coverage .cov-zip-result{ margin:0.7rem 0 0; font-size:0.85rem; color:var(--ink); }
  .dist-coverage .cov-zip-result:empty{ display:none; }
  .dist-coverage .cov-zip-result.is-yes{ color:var(--stock-in-text); }
  .dist-coverage .cov-zip-result.is-no{ color:var(--stock-low-text); }
  .dist-coverage .cov-zip-result.is-error{ color:var(--error-red); }
  .cov-zip-result a{ display:inline-block; margin-top:0.35rem; margin-left:0.35rem; font-weight:700; color:var(--blue-dk); }

  .cov-map-card{
    position:relative; border-radius:16px; padding:0.5rem; overflow:hidden;
    background:linear-gradient(180deg, #F4F8FC 0%, color-mix(in srgb, var(--blue) 9%, white) 100%);
  }
  .cov-map{ display:block; width:100%; height:auto; }
  .cov-state{ fill:#EEF1F4; stroke:var(--white); stroke-width:1.2; transition:fill 0.18s ease; }
  .cov-state--on{ fill:#9CC8EE; cursor:pointer; }
  .cov-state--on.is-on{ fill:var(--blue-dk); }
  .cov-dc{ fill:#9CC8EE; stroke:var(--white); stroke-width:1.5; cursor:pointer; transition:fill 0.18s ease; }
  .cov-dc.is-on{ fill:var(--blue-dk); }
  .cov-route{ fill:none; stroke:var(--blue); stroke-width:1.6; stroke-dasharray:4 5; opacity:0.55; }
  .cov-route.is-on{ stroke:var(--blue-dk); stroke-width:2.2; opacity:1; }
  .cov-dot{ fill:var(--white); stroke:var(--blue); stroke-width:2; }
  .cov-dot.is-on{ fill:var(--accent); stroke:var(--blue-dk); }
  .cov-label{
    font:700 12px var(--font-body); fill:var(--blue-dk); pointer-events:none;
    paint-order:stroke; stroke:var(--white); stroke-width:3px;
  }
  .cov-label.is-on{ fill:var(--white); stroke:none; }
  .cov-pulse{ fill:var(--accent); opacity:0.35; transform-box:fill-box; transform-origin:center; animation:covPulse 2.2s ease-out infinite; }
  @keyframes covPulse{ 0%{ transform:scale(0.4); opacity:0.55; } 100%{ transform:scale(2.6); opacity:0; } }
  .cov-map.is-drawn .cov-route{ animation:covDraw 1.4s ease-out both; }
  @keyframes covDraw{ from{ stroke-dashoffset:300; opacity:0; } to{ stroke-dashoffset:0; opacity:0.55; } }
  .cov-map.is-drawn .cov-route.is-on{ animation:none; }

  .cov-legend{ display:flex; flex-wrap:wrap; gap:0.35rem 1.1rem; padding:0.5rem 0.6rem 0.2rem; font-family:var(--font-body); font-size:0.72rem; font-weight:600; color:var(--gray-text); }
  .cov-legend > span{ display:inline-flex; align-items:center; gap:0.45rem; }
  .cov-swatch{ width:13px; height:13px; border-radius:4px; display:inline-block; }
  .cov-swatch--on{ background:#9CC8EE; }
  .cov-swatch--selected{ background:var(--blue-dk); }
  .cov-swatch--off{ background:#EEF1F4; border:1px solid #D5DBE1; }

  .cov-tip{
    position:absolute; z-index:2; min-width:190px; padding:0.6rem 0.85rem; pointer-events:none;
    background:var(--white); border-radius:10px; box-shadow:0 10px 24px rgba(11,47,82,0.18);
    font-family:var(--font-body); font-size:0.78rem; color:var(--ink);
    transform:translate(-50%, calc(-100% - 14px)); opacity:0; transition:opacity 0.15s ease;
  }
  .cov-tip.is-visible{ opacity:1; }
  .cov-tip strong{ display:block; font-family:var(--font-display); font-size:0.92rem; color:var(--blue-dk); }

  @media (prefers-reduced-motion: reduce){
    .cov-pulse, .cov-map.is-drawn .cov-route{ animation:none; }
    .cov-state, .cov-dc, .cov-chip, .cov-tip{ transition:none; }
  }

  .dist-form-section{ padding-bottom:4.5rem; }
  .dist-form-card{
    background:color-mix(in srgb, var(--blue) 4%, white);
    border:1px solid var(--gray-lt); border-radius:14px; padding:2.5rem 3rem;
  }
  .dist-form-card h2{ font-size:clamp(1.4rem,2.2vw,1.8rem); margin:0 0 0.5rem; text-align:center; }
  .dist-form-intro{ color:var(--gray-text); margin:0 0 2rem; text-align:center; }

  .dist-form{ display:grid; gap:1.3rem; }

  /* Separador visual entre los datos de contacto y la dirección — el
     form ya venía sin fieldsets/legends, así que un h3 chico cumple
     la misma función de "acá empieza otra sección" sin reestructurar
     el resto del markup existente. */
  .dist-form-subheading{
    font-family:var(--font-display); font-weight:700; font-size:1rem;
    color:var(--ink); margin:0.5rem 0 -0.4rem; padding-top:0.8rem;
    border-top:1px solid var(--gray-lt);
  }

  /* Honeypot: oculto para una persona, pero sigue presente en el HTML —
     los bots que auto-completan formularios suelen llenarlo igual.
     position:absolute + fuera de pantalla en vez de display:none, porque
     algunos bots ignoran los campos con display:none. */
  .hp-field{ position:absolute; left:-9999px; top:-9999px; width:1px; height:1px; overflow:hidden; }
  .form-row-group{ display:grid; grid-template-columns:1fr 1fr; gap:1.3rem; }
  .form-row-group--3{ grid-template-columns:1fr 1fr 1fr; }
  .form-row{ display:grid; gap:0.4rem; }
  .form-row label{ font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.03em; text-transform:uppercase; color:var(--gray-text); }
  .form-row input, .form-row select, .form-row textarea{
    font-family:var(--font-body); font-size:0.95rem; padding:0.7rem 0.9rem; border:1px solid var(--gray-lt);
    border-radius:6px; background:var(--white); color:var(--ink); width:100%;
  }
  .form-row input:focus, .form-row select:focus, .form-row textarea:focus{
    outline:2px solid var(--blue); outline-offset:1px; border-color:var(--blue);
  }
  .form-row.has-error label{ color:var(--error-red); }
  .form-row.has-error input, .form-row.has-error select{ border-color:var(--error-red); }
  .form-row textarea{ resize:vertical; font-family:inherit; }
  /* v17.15.0: casilla de avisos por WhatsApp del formulario de distribuidores. */
  .dist-consent{ display:flex; align-items:flex-start; gap:0.6rem; margin-top:0.4rem; }
  .dist-consent input{ flex:0 0 auto; width:1.15rem; height:1.15rem; margin-top:0.15rem; accent-color:var(--blue, #1D80D5); }
  .dist-consent label{ font-family:var(--font-body); font-size:0.92rem; line-height:1.45; color:var(--gray-text); cursor:pointer; }

  .dist-form-note{ font-family:var(--font-body); font-weight:600; font-size:0.72rem; color:var(--gray-text); margin:0; }
  .dist-form-submit{
    justify-self:center; font-family:var(--font-body); font-weight:800; font-size:0.95rem;
    background:var(--blue-dk); color:var(--white); border:none; border-radius:999px; padding:0.9rem 2.6rem;
    cursor:pointer; transition:background 0.15s ease, transform 0.15s ease;
  }
  .dist-form-submit:hover{ background:var(--ink); transform:translateY(-2px); }
  .dist-form-success{
    background:color-mix(in srgb, var(--ok) 14%, white); color:var(--ink);
    border-radius:6px; padding:0.9rem 1.1rem; font-size:0.88rem; margin:0; text-align:center;
  }
  .dist-form-error{
    background:color-mix(in srgb, var(--error-red) 14%, white); color:var(--ink);
    border-radius:6px; padding:0.9rem 1.1rem; font-size:0.88rem; margin:0; text-align:center;
    font-weight:600;
  }

  @media (max-width:820px){
    .dist-hero{ grid-template-columns:1fr; }
    .dist-hero-media{ height:240px; order:-1; }
    .dist-coverage{ grid-template-columns:minmax(0,1fr); }
  }
  @media (max-width:620px){
    .form-row-group{ grid-template-columns:1fr; }
    .dist-form-card{ padding:1.6rem; }
  }

  /* ============ Carrusel "Nuevos productos" (v17.7.0, src/js/new-products.js) ============
     En la home (entre Nosotros y Vuélvete distribuidor) y en Distribuidores
     (entre el mapa y el formulario). Prefijo np- propio. */
  .np{ padding-top:2.4rem; padding-bottom:2.6rem; }
  /* Distribuidores: va debajo del formulario (primero cobertura y solicitud). */
  .dist-form-section + .np{ padding-top:0; padding-bottom:4rem; }
  .np-head{ display:flex; justify-content:space-between; align-items:flex-end; gap:1rem; flex-wrap:wrap; margin-bottom:1.3rem; }
  .np-eyebrow{ font-family:var(--font-body); font-weight:600; font-size:0.72rem; letter-spacing:0.1em; text-transform:uppercase; color:var(--blue-dk); margin:0; }
  .np h2{ font-size:clamp(1.5rem,2.4vw,2rem); margin-top:0.35rem; }
  .np-actions{ display:flex; gap:0.6rem; align-items:center; }
  .np-pause{
    width:38px; height:38px; border-radius:50%; border:1.5px solid var(--gray-lt); background:var(--white); color:var(--ink);
    cursor:pointer; display:inline-flex; align-items:center; justify-content:center; transition:background 0.15s ease, color 0.15s ease;
  }
  .np-pause:hover{ background:var(--ink); color:var(--white); }
  .np-all{
    font-family:var(--font-body); font-weight:800; font-size:0.85rem; color:var(--white); background:var(--blue-dk);
    text-decoration:none; border-radius:999px; padding:0.7rem 1.3rem; white-space:nowrap; transition:background 0.15s ease;
  }
  .np-all:hover{ background:var(--ink); }
  .np-outer{ overflow-x:auto; scrollbar-width:none; }
  .np-outer::-webkit-scrollbar{ display:none; }
  .np-track{ display:flex; gap:1.1rem; width:max-content; margin:0; padding:0.4rem 0.2rem 1rem; list-style:none; }
  /* Solo cuando no entra en el ancho (lo decide new-products.js). */
  .np.is-moving .np-outer{
    overflow:hidden;
    -webkit-mask-image:linear-gradient(90deg, transparent, black 5%, black 95%, transparent);
    mask-image:linear-gradient(90deg, transparent, black 5%, black 95%, transparent);
  }
  .np.is-moving .np-track{ animation:npScroll var(--np-duration, 40s) linear infinite; }
  .np.is-moving .np-outer:hover .np-track,
  .np.is-moving .np-outer:focus-within .np-track,
  .np.is-paused .np-track{ animation-play-state:paused; }
  @keyframes npScroll{ to{ transform:translateX(-50%); } }
  .np-item{ flex:0 0 220px; display:flex; }
  .np-card{
    flex:1; display:flex; flex-direction:column; border-radius:14px; overflow:hidden; background:var(--white);
    box-shadow:0 6px 16px rgba(0,0,0,0.10); text-decoration:none; color:var(--ink);
    transition:transform 0.2s ease, box-shadow 0.2s ease;
  }
  .np-card:hover, .np-card:focus-visible{ transform:translateY(-4px); box-shadow:0 14px 28px rgba(0,0,0,0.16); }
  .np-card:focus-visible{ outline:3px solid var(--blue-dk); outline-offset:3px; }
  .np-img{ position:relative; aspect-ratio:1/1; display:flex; align-items:center; justify-content:center; background:var(--white); }
  .np-img img{ width:100%; height:100%; object-fit:cover; display:block; }
  .np-img--empty{ background:color-mix(in srgb, var(--blue) 10%, white); color:var(--blue-dk); }
  .np-img--empty svg{ width:30%; max-width:64px; height:auto; }
  /* Sin foto: mismo color e ícono de categoría que las tarjetas del catálogo
     (.catalog-card--*). El nombre de la categoría lleva su punto de color. */
  .np-card--grocery .np-img--empty svg, .np-card--beverages .np-img--empty svg, .np-card--frozen .np-img--empty svg, .np-card--dairy .np-img--empty svg, .np-card--bakery .np-img--empty svg, .np-card--snacks .np-img--empty svg, .np-card--spices .np-img--empty svg, .np-card--sweets .np-img--empty svg, .np-card--meats .np-img--empty svg, .np-card--pinatas .np-img--empty svg, .np-card--cleaning .np-img--empty svg, .np-card--mixes .np-img--empty svg, .np-card--rice .np-img--empty svg, .np-card--sauces .np-img--empty svg, .np-card--noodles .np-img--empty svg, .np-card--coffee .np-img--empty svg{ fill:currentColor; }
  .np-card--grocery .np-img--empty{ background:color-mix(in srgb, var(--cat-grocery) 24%, white); color:var(--cat-grocery); }
  .np-card--grocery .np-category::before{ background:var(--cat-grocery); }
  .np-card--beverages .np-img--empty{ background:color-mix(in srgb, var(--cat-beverages) 24%, white); color:var(--cat-beverages); }
  .np-card--beverages .np-category::before{ background:var(--cat-beverages); }
  .np-card--frozen .np-img--empty{ background:color-mix(in srgb, var(--cat-frozen) 24%, white); color:var(--cat-frozen); }
  .np-card--frozen .np-category::before{ background:var(--cat-frozen); }
  .np-card--dairy .np-img--empty{ background:color-mix(in srgb, var(--cat-dairy) 30%, white); color:var(--cat-dairy-dk); }
  .np-card--dairy .np-category::before{ background:var(--cat-dairy); }
  .np-card--bakery .np-img--empty{ background:color-mix(in srgb, var(--cat-bakery) 24%, white); color:var(--cat-bakery); }
  .np-card--bakery .np-category::before{ background:var(--cat-bakery); }
  .np-card--snacks .np-img--empty{ background:color-mix(in srgb, var(--cat-snacks) 24%, white); color:var(--cat-snacks); }
  .np-card--snacks .np-category::before{ background:var(--cat-snacks); }
  .np-card--spices .np-img--empty{ background:color-mix(in srgb, var(--cat-spices) 20%, white); color:var(--cat-spices); }
  .np-card--spices .np-category::before{ background:var(--cat-spices); }
  .np-card--sweets .np-img--empty{ background:color-mix(in srgb, var(--cat-sweets) 20%, white); color:var(--cat-sweets); }
  .np-card--sweets .np-category::before{ background:var(--cat-sweets); }
  .np-card--meats .np-img--empty{ background:color-mix(in srgb, var(--cat-meats) 20%, white); color:var(--cat-meats); }
  .np-card--meats .np-category::before{ background:var(--cat-meats); }
  .np-card--pinatas .np-img--empty{ background:color-mix(in srgb, var(--cat-pinatas) 20%, white); color:var(--cat-pinatas); }
  .np-card--pinatas .np-category::before{ background:var(--cat-pinatas); }
  .np-card--cleaning .np-img--empty{ background:color-mix(in srgb, var(--cat-cleaning) 22%, white); color:var(--cat-cleaning); }
  .np-card--cleaning .np-category::before{ background:var(--cat-cleaning); }
  .np-card--mixes .np-img--empty{ background:color-mix(in srgb, var(--cat-mixes) 24%, white); color:var(--cat-mixes-dk); }
  .np-card--mixes .np-category::before{ background:var(--cat-mixes); }
  .np-card--rice .np-img--empty{ background:color-mix(in srgb, var(--cat-rice) 24%, white); color:var(--cat-rice-dk); }
  .np-card--rice .np-category::before{ background:var(--cat-rice); }
  .np-card--sauces .np-img--empty{ background:color-mix(in srgb, var(--cat-sauces) 24%, white); color:var(--cat-sauces); }
  .np-card--sauces .np-category::before{ background:var(--cat-sauces); }
  .np-card--noodles .np-img--empty{ background:color-mix(in srgb, var(--cat-noodles) 24%, white); color:var(--cat-noodles-dk); }
  .np-card--noodles .np-category::before{ background:var(--cat-noodles); }
  .np-card--coffee .np-img--empty{ background:color-mix(in srgb, var(--cat-coffee) 24%, white); color:var(--cat-coffee); }
  .np-card--coffee .np-category::before{ background:var(--cat-coffee); }
  .np-badge{
    position:absolute; top:10px; left:10px; z-index:1; background:var(--accent); color:var(--ink);
    font-family:var(--font-body); font-weight:800; font-size:0.66rem; letter-spacing:0.06em; text-transform:uppercase;
    border-radius:999px; padding:0.25rem 0.6rem;
  }
  .np-body{ display:flex; flex-direction:column; gap:0.3rem; flex:1; padding:0.85rem 0.95rem 1rem; }
  .np-category{
    display:inline-flex; align-items:center; gap:0.4rem; font-family:var(--font-body); font-weight:600;
    font-size:0.65rem; letter-spacing:0.05em; text-transform:uppercase; color:var(--gray-text);
  }
  .np-category::before{ content:""; width:8px; height:8px; border-radius:50%; background:var(--gray); flex-shrink:0; }
  /* Marca: logo (como .catalog-card-logo-wrap) o el nombre en texto. */
  .np-logo-wrap{ display:inline-flex; align-items:center; align-self:flex-start; background:var(--gray-lt); border-radius:6px; padding:0.3rem 0.5rem; }
  .np-logo{ height:14px; width:auto; object-fit:contain; display:block; }
  .np-vendor{ font-family:var(--font-body); font-weight:600; font-size:0.72rem; color:var(--blue-dk); }
  .np-title{
    font-family:var(--font-body); font-weight:800; font-size:0.9rem; line-height:1.3;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
  }
  .np-more{ margin-top:auto; padding-top:0.4rem; font-family:var(--font-body); font-weight:700; font-size:0.78rem; color:var(--blue-dk); }
  @media (max-width:620px){
    .np-item{ flex-basis:180px; }
    .np-actions{ width:100%; justify-content:flex-end; }
  }
  @media (prefers-reduced-motion: reduce){
    .np.is-moving .np-track{ animation:none; }
    .np-card, .np-pause{ transition:none; }
  }

  /* ============ Página de Contacto ============ */
  .contact-hero{ margin-bottom:0; }
  .contact-info-row{ display:grid; grid-template-columns:repeat(4,1fr); gap:1.1rem; padding:2.2rem 0 3rem; }
  .contact-info-card{
    display:flex; flex-direction:column; gap:0.3rem; text-decoration:none; color:var(--ink);
    background:color-mix(in srgb, var(--blue) 6%, white); border-radius:12px; padding:1.4rem;
    transition:transform 0.15s ease, box-shadow 0.15s ease;
  }
  a.contact-info-card:hover{ transform:translateY(-3px); box-shadow:0 10px 24px rgba(29,128,213,0.16); }
  .contact-info-card--static{ background:var(--gray-lt); }
  .contact-info-icon{
    width:38px; height:38px; border-radius:50%; background:var(--white); color:var(--blue-dk);
    display:flex; align-items:center; justify-content:center; margin-bottom:0.4rem;
  }
  .contact-info-card h3{
    font-family:var(--font-display); font-weight:800; text-transform:uppercase; font-size:0.85rem; margin:0;
  }
  .contact-info-card p{ font-family:var(--font-body); font-size:0.85rem; color:var(--gray-text); margin:0; line-height:1.5; }
  .contact-info-link{ font-family:var(--font-body); font-weight:700; font-size:0.78rem; color:var(--blue-dk); margin-top:0.3rem; }

  @media (max-width:900px){ .contact-info-row{ grid-template-columns:repeat(2,1fr); } }
  @media (max-width:520px){ .contact-info-row{ grid-template-columns:1fr; } }

  /* ============ Página de Declaración de Accesibilidad ============ */
  .a11y-hero{
    background:linear-gradient(120deg, var(--blue) 0%, var(--blue-dk) 100%); color:var(--white);
    border-radius:10px; padding:2.6rem 2.5rem; margin-top:1.6rem;
  }
  .a11y-hero .eyebrow{ color:var(--white); opacity:0.9; }
  .a11y-hero h1{ font-size:clamp(1.9rem,3vw,2.5rem); margin:0.5rem 0 0.6rem; color:var(--white); }
  .a11y-hero p:last-child{ color:rgba(255,255,255,0.85); font-weight:600; font-size:0.9rem; margin:0; }

  .a11y-content{ max-width:76ch; margin:0 auto; padding:2.6rem 0 4rem; }
  .a11y-block{ margin-bottom:2.4rem; }
  .a11y-block h2{ font-family:var(--font-display); font-weight:800; font-size:1.3rem; margin:0 0 0.9rem; }
  .a11y-block > p{ line-height:1.65; margin:0 0 0.6rem; }
  .a11y-list{ display:grid; gap:0.7rem; padding-left:1.3rem; margin:0.8rem 0 0; }
  .a11y-list li{ line-height:1.6; }

  .a11y-feedback-actions{ display:flex; align-items:center; gap:1.4rem; flex-wrap:wrap; margin-top:1.2rem; }
  .a11y-feedback-btn{ background:var(--blue-dk); color:var(--white); margin-top:0; }
  .a11y-feedback-btn:hover{ background:var(--ink); }
  .a11y-feedback-email{ color:var(--blue-dk); font-weight:700; text-decoration:none; }
  .a11y-feedback-email:hover{ text-decoration:underline; }

  .footer-a11y-link{ color:inherit; opacity:0.85; text-decoration:underline; font-size:0.8rem; }
  .footer-a11y-link:hover{ opacity:1; }
/* v17.19.0 — Página del producto: aviso de envío debajo de "Agregar al carrito". */
.product-shipping-note{
  display:flex; align-items:center; gap:0.6rem; margin:0.9rem 0 0; padding:0.7rem 0.9rem; border-radius:10px;
  background:#F2F2F2; color:var(--ink); font-family:var(--font-body); font-size:0.85rem; line-height:1.4;
}
.product-shipping-note svg{ flex-shrink:0; color:var(--blue-dk); }
