/* ====== Base ====== */
:root{
  --tinta:#20303c; --suave:#5b6b78; --linea:#e4e8ec; --fondo:#f7f8fa;
  --marca:#8a4a2b; --marca-osc:#6e3a22; --wa:#25d366; --peligro:#c0392b;
  --radio:12px; --sombra:0 1px 3px rgba(20,40,60,.08),0 8px 24px rgba(20,40,60,.06);
  /* Degradé suave del color de marca (izq->der en header/footer; body al revés) */
  --grad-a:#f4ece4; --grad-b:#ffffff;
  /* Colores del menu: estilos.php los pisa con los de Apariencia. */
  --menu-a:#f4ece4; --menu-txt:#5b6b78;
  --borde-card:#e7d7ca;   /* borde cálido para los boxes de artículos */
}
*{box-sizing:border-box}
body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  color:var(--tinta);background:linear-gradient(to right, var(--grad-b), var(--grad-a));line-height:1.5}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}

/* ====== Header público ====== */
.top{padding:1rem 1.25rem;
  border-bottom:1px solid var(--linea);position:sticky;top:0;z-index:10}
.top-inner{max-width:1500px;margin:0 auto;display:flex;align-items:center;gap:1rem;justify-content:space-between;flex-wrap:wrap}
.marca{display:inline-flex;align-items:center;gap:.6rem;font-weight:700;font-size:1.25rem;color:var(--menu-txt);text-decoration:none}
.marca-logo{max-height:52px;max-width:220px;height:auto;width:auto;object-fit:contain}
.marca-nombre{font-size:1.5rem;font-weight:700;color:var(--menu-txt);letter-spacing:.01em}
.top-burger{display:none;background:none;border:none;color:var(--menu-txt);font-size:1.6rem;line-height:1;cursor:pointer;padding:.2rem .4rem}
.top-movil-actions{display:flex;align-items:center;gap:.4rem}
.top-carrito-movil{display:none}   /* solo en mobile (ver media query) */
.top-nav{display:flex;align-items:center;gap:1rem;flex:1;justify-content:flex-end}
.buscar input{padding:.55rem .8rem;border:1px solid var(--linea);border-radius:999px;
  min-width:min(320px,60vw);font-size:.95rem;outline:none}
.buscar input:focus{border-color:var(--marca)}
.contenido{width:100%;max-width:1500px;margin:0 auto;padding:1.5rem 1.25rem}

@media (max-width:991px){
  .top{padding:.7rem 1rem}
  .marca-logo{max-height:40px;max-width:160px}
  .marca-nombre{font-size:1.25rem}
  .top-burger{display:block}
  /* Carrito al lado del sándwich (mobile): ícono visible siempre, con el badge pegado arriba a la derecha */
  .top-carrito-movil{display:inline-flex;align-items:center;position:relative;color:var(--menu-txt);
    font-size:1.5rem;line-height:1;padding:.2rem .35rem;text-decoration:none}
  .top-carrito-movil .cart-badge{position:absolute;top:-4px;right:-4px;margin:0;
    background:#fff;color:var(--marca);border:1px solid var(--marca)}
  .top-nav{display:none;flex:1 0 100%;flex-direction:column;align-items:stretch;gap:.5rem;margin-top:.7rem}
  .top-inner.open .top-nav{display:flex}
  .top-nav .buscar{width:100%}
  .top-nav .buscar input{min-width:0;width:100%}
  /* En mobile los links pierden la píldora y quedan como texto sobre el header. Entonces el color
     tiene que ser el de las LETRAS DEL MENÚ (--menu-txt), no el de marca: el header lo pinta el
     usuario en Apariencia y son dos colores distintos — quedaban dos azules peleando, o texto
     ilegible si eligió un menú oscuro. La regla venía de cuando el header siempre era claro.
     El separador y el hover son un velo neutro por lo mismo: funcionan sobre claro y sobre
     oscuro, un rgba(0,0,0,...) desaparece en un menú negro. */
  .top-nav .top-link{justify-content:flex-start;gap:.6rem;padding:.7rem .3rem;font-size:1rem;
    background:none;color:var(--menu-txt);border-radius:0;
    border-top:1px solid rgba(127,127,127,.25)}
  .top-nav .top-link:hover{background:rgba(127,127,127,.14);color:var(--menu-txt)}
}

/* ====== Filtros (chips, legacy) ====== */
.filtros{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem}
.filtros a{padding:.4rem .9rem;border:1px solid var(--linea);border-radius:999px;
  background:#fff;font-size:.9rem;color:var(--suave)}
.filtros a.activo{background:var(--marca);border-color:var(--marca);color:#fff}

/* ====== Catálogo con árbol lateral ====== */
.catalogo{align-items:flex-start}
/* Árbol propio, aparte de los productos: si es largo scrollea solo, sin arrastrar los 1000 artículos. */
.cat-arbol{position:sticky;top:90px;max-height:calc(100vh - 110px);overflow-y:auto;overflow-x:hidden;padding-right:.35rem;padding-bottom:50px}
.cat-arbol::-webkit-scrollbar{width:8px}
.cat-arbol::-webkit-scrollbar-thumb{background:var(--linea);border-radius:8px}
/* ---- Card del catálogo de la categoría ----
   Es una card más de la grilla (mismo alto y borde, hereda .card), pero deliberadamente SIN foto
   y con el color de marca: no es un producto y no tiene que parecerlo. Fondo tintado para que se
   lea distinta de un vistazo entre 20 fotos. */
.card-book{display:flex;flex-direction:column;justify-content:center;align-items:center;
  gap:.7rem;padding:1.4rem 1rem;text-align:center;text-decoration:none;
  color:var(--marca);background:var(--grad-a);border-color:var(--marca)}
.card-book:hover{color:var(--marca)}
.card-book-ico{font-size:2.4rem;line-height:1;opacity:.9}
.card-book-txt{display:flex;flex-direction:column;gap:.3rem}
.card-book-tit{font-weight:700;font-size:1rem;line-height:1.25}
.card-book-sub{font-size:.78rem;color:var(--suave);line-height:1.35}
.card-book-cta{display:inline-flex;align-items:center;gap:.35rem;margin-top:.2rem;
  font-size:.82rem;font-weight:600}
.card-book:hover .card-book-cta i{transform:translateX(3px)}
.card-book-cta i{transition:transform .12s}
@media(prefers-reduced-motion:reduce){ .card-book:hover .card-book-cta i{transform:none} }
.cat-arbol-tit{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--suave);margin:0 0 .6rem}
.cat-arbol-tit2{margin-top:1.4rem}
.arbol,.arbol-sub{list-style:none;margin:0;padding:0}
/* Card que encierra todo el menú: mismo fondo que el header (--bg-menu: degradé o plano según
   Apariencia), borde suave + sombra. Los ítems van como renglones adentro. */
.arbol-card{background:var(--bg-menu,#fff);border:1px solid var(--linea);border-radius:12px;
  box-shadow:0 2px 10px rgba(0,0,0,.05);padding:.4rem}
.arbol > li{margin-bottom:.1rem}
.arbol-fila{display:flex;align-items:center;gap:.1rem;border-radius:8px;transition:background .12s}
.arbol-fila:hover{background:var(--fondo)}
.arbol-cat{flex:1;min-width:0;display:flex;align-items:center;gap:.45rem;padding:.2rem .3rem;
  border-radius:7px;color:var(--tinta);font-size:.8rem;line-height:1.2}
.arbol-cat:hover{color:var(--marca)}
.arbol-nom{min-width:0;overflow-wrap:anywhere}
/* Miniatura = 1ª imagen de la categoría; cuadrada y recortada para no deformar el menú. */
.arbol-thumb{flex:none;width:22px;height:22px;border-radius:4px;object-fit:cover;
  background:var(--fondo);border:1px solid var(--linea)}
.arbol-thumb-vac{display:flex;align-items:center;justify-content:center;color:var(--suave);font-size:.8rem}
/* Activo = píldora marca en todo el renglón, con una leve sombra para despegarla del fondo. */
.arbol-cat.activo{background:var(--marca);color:#fff;font-weight:600;
  box-shadow:0 2px 6px rgba(20,40,60,.28)}
.arbol-cat.activo:hover{color:#fff}
.arbol-cat.activo .arbol-thumb-vac{color:#fff;border-color:rgba(255,255,255,.5);background:rgba(255,255,255,.15)}
/* Padre = botón que despliega, no link (apunta a sus hijos, no busca). Igual que las hojas: NO tocar
   font-size/weight acá (los gobierna .arbol-cat: .8rem, peso normal). Ojo: font:inherit rompía el
   tamaño (heredaba 1rem del contenedor). Solo se resetea el chrome del botón. */
.arbol-padre{border:none;background:none;font-family:inherit;text-align:left;cursor:pointer;width:100%}
/* Toggle = botón circular +/- a la derecha, separado del borde. */
.arbol-toggle{flex:none;width:22px;height:22px;margin:0 .15rem 0 .1rem;display:inline-flex;
  align-items:center;justify-content:center;border:1px solid var(--linea);background:var(--fondo);
  cursor:pointer;color:var(--marca);border-radius:50%;font-size:0;line-height:1;
  transition:background .15s,border-color .15s,color .15s}
.arbol-toggle::after{content:"+";font-size:.95rem;font-weight:700}
.arbol-toggle[aria-expanded="true"]::after{content:"\2212"}
.arbol-toggle:hover{background:var(--marca);border-color:var(--marca);color:#fff}
/* Subárbol: acento vertical + indentación; los hijos, un poco más chicos. */
.arbol-sub{margin:.05rem 0 .15rem .45rem;padding-left:.45rem;border-left:2px solid var(--linea)}
.arbol-sub[hidden]{display:none}
.arbol-sub > li{margin-bottom:.1rem}
.precio-box{margin-top:.2rem}
.precio-vals{font-size:.9rem;color:var(--tinta);font-weight:600;margin-bottom:.6rem}
.precio-slider{position:relative;height:28px}
.precio-track{position:absolute;top:12px;left:0;right:0;height:4px;background:var(--linea);border-radius:2px}
.precio-fill{position:absolute;top:12px;height:4px;background:var(--marca);border-radius:2px}
.precio-slider input[type=range]{position:absolute;top:0;left:0;width:100%;height:28px;margin:0;background:none;
  pointer-events:none;-webkit-appearance:none;appearance:none}
.precio-slider input[type=range]::-webkit-slider-thumb{pointer-events:auto;-webkit-appearance:none;appearance:none;
  width:16px;height:16px;border-radius:50%;background:var(--marca);border:2px solid #fff;cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.precio-slider input[type=range]::-moz-range-thumb{pointer-events:auto;width:16px;height:16px;border-radius:50%;
  background:var(--marca);border:2px solid #fff;cursor:pointer}
.precio-cuenta{font-size:.82rem;color:var(--suave);margin-top:.5rem}

/* ---- Breadcrumb del recorrido (arriba de la grilla): texto plano, chico, una sola línea ---- */
.cat-ruta{display:flex;flex-wrap:nowrap;align-items:center;gap:.3rem;font-size:.82rem;margin-bottom:1rem;
  color:var(--suave);white-space:nowrap;overflow-x:auto;line-height:1.4}
.cat-ruta::-webkit-scrollbar{height:0}
.cat-ruta a{color:var(--suave);text-decoration:none;transition:color .15s ease}
.cat-ruta a:hover,.cat-ruta a:focus-visible{color:var(--tinta);text-decoration:none;outline:none}
.cat-ruta-raiz{color:var(--suave)}
.cat-ruta-sep{color:var(--suave);opacity:.6}
.cat-ruta-act{color:var(--tinta);font-weight:600}

/* ---- Barra de filtros (Precio | Ordenar) arriba de los productos ---- */
.cat-filtros{background:var(--grad-a,#f6f8fb);border:1px solid var(--linea);border-radius:12px;
  padding:.85rem 1.1rem;margin-bottom:1.1rem}
/* Columna Precio */
.cat-filtros .precio-box{margin:0}
.cat-filtros .precio-head{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem 1rem;margin-bottom:.6rem;min-height:1.8rem}
.cat-filtros .precio-tit{font-weight:700;color:var(--tinta);font-size:.92rem;display:inline-flex;align-items:center;gap:.4rem}
.cat-filtros .precio-tit i{color:var(--marca)}
.cat-filtros .precio-vals{margin:0 0 0 auto;font-size:.9rem}
.cat-filtros .precio-slider{max-width:none}
/* Columna Ordenar (rótulo + cantidad arriba, selector abajo) */
.orden-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.4rem;margin-bottom:.6rem;min-height:1.8rem}
.orden-lbl{font-weight:700;color:var(--tinta);font-size:.92rem;display:inline-flex;align-items:center;gap:.4rem;white-space:nowrap}
.orden-lbl i{color:var(--marca)}
.orden-head .precio-cuenta{font-size:.85rem;font-weight:600;color:var(--tinta)}
/* select en modo form-control, tope 200px; inline-block para respetar text-start / text-lg-end */
.orden-sel{display:inline-block;width:100%;max-width:200px;font-size:.9rem;color:var(--tinta);cursor:pointer;
  -webkit-appearance:none;appearance:none;padding-right:2rem;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%234A96E6' d='M6 8L1.5 3.5h9z'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right .65rem center}
.orden-sel:focus{border-color:var(--marca);box-shadow:0 0 0 3px rgba(74,150,230,.15)}
/* Pantallas chicas: achica la tipografía de los filtros para que Precio | Ordenar entren en 2 columnas */
@media(max-width:575.98px){
  .cat-filtros{padding:.6rem .65rem}
  /* Oculta las palabras "Precio" / "Ordenar" (deja el icono): el espacio queda para los valores y la cantidad */
  .cat-filtros .precio-tit,.orden-lbl{font-size:0;gap:0}
  .cat-filtros .precio-tit i,.orden-lbl i{font-size:.95rem}
  .cat-filtros .precio-vals{font-size:.74rem}
  .orden-head .precio-cuenta{font-size:.74rem;margin-left:.4rem}
  .orden-sel{font-size:.75rem;padding-right:1.6rem;background-position:right .5rem center}
}
.cat-arbol-head{display:flex;align-items:center;justify-content:space-between}
.cat-cerrar,.cat-movil-btn{display:none}
@media(max-width:991.98px){
  /* Botón que abre el panel de categorías a pantalla completa */
  .cat-movil-btn{display:flex;align-items:center;gap:.5rem;width:100%;justify-content:center;
    background:#fff;border:1px solid var(--linea);color:var(--marca);font-weight:600;font-size:1rem;
    padding:.7rem 1rem;border-radius:10px;margin-bottom:1rem;cursor:pointer}
  /* Panel full-screen deslizante */
  .cat-arbol{position:fixed;inset:0;z-index:60;margin:0;max-width:none;max-height:none;background:#fff;
    overflow-y:auto;padding:1.2rem 1.3rem 50px;box-shadow:0 0 40px rgba(0,0,0,.25);
    transform:translateX(-100%);transition:transform .25s ease}
  .cat-arbol.abierto{transform:none}
  .cat-arbol-head{margin-top:1rem}
  .cat-cerrar{display:inline-flex;background:none;border:none;color:var(--suave);font-size:1.5rem;cursor:pointer;padding:.1rem .3rem}
  .cat-arbol-tit{font-size:1.1rem;margin:0}
}

/* ====== Galería de la ficha ====== */
.galeria-main{aspect-ratio:1/1;max-width:400px;max-height:400px;margin:0 auto;
  background:#fff;border-radius:var(--radio);overflow:hidden;
  display:flex;align-items:center;justify-content:center}
.galeria-main img{width:100%;height:100%;object-fit:contain}
.galeria-main iframe{width:100%;height:100%;border:0}
.galeria-thumbs{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.6rem}
.gal-thumb{width:60px;height:60px;padding:0;border:2px solid var(--linea);border-radius:8px;
  overflow:hidden;background:#fff;cursor:pointer}
.gal-thumb.activo{border-color:var(--marca)}
.gal-thumb img{width:100%;height:100%;object-fit:cover}
.gal-video{display:flex;align-items:center;justify-content:center;font-size:1.2rem;color:var(--marca)}

/* ====== Galería en el form (admin) ====== */
.medios-actual{margin:.3rem 0 1rem}
.medios-galeria{display:flex;flex-wrap:wrap;gap:.6rem;margin:.3rem 0 1rem}
.medio-thumb{position:relative}
.medio-del{position:absolute;top:-7px;right:-7px;width:20px;height:20px;border-radius:50%;
  background:var(--peligro);color:#fff;font-size:.9rem;line-height:20px;text-align:center;text-decoration:none}

/* ====== Grilla de productos ====== */
.card{width:100%;height:100%;display:flex;flex-direction:column;position:relative;
  background:#fff;border:1px solid var(--borde-card);border-radius:var(--radio);
  overflow:hidden;transition:transform .15s,box-shadow .15s,border-color .15s}
.card:hover{transform:translateY(-4px);box-shadow:0 12px 30px rgba(138,74,43,.16);border-color:var(--marca)}
.card-link{flex:1;display:flex;flex-direction:column;color:inherit;text-decoration:none}
/* Botón de acción (variantes / carrito / WhatsApp): mismo tamaño y estilo que los íconos de compartir,
   alineado en la misma fila, a la derecha. */
.card-wa{position:absolute;bottom:.5rem;right:.6rem;z-index:4;width:26px;height:26px;padding:0;cursor:pointer;border-radius:50%;
  border:1px solid rgba(255,255,255,.45);background:rgba(255,255,255,.16);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.82rem;
  transition:transform .12s,background .12s}
.card-wa:hover{transform:translateY(-2px);color:#fff;background:rgba(255,255,255,.3)}
.card-wa:focus{outline:none}
/* Cinta de novedad configurable (texto + color por artículo), esquina superior derecha.
   Ancho fijo + texto centrado: cualquier texto queda centrado y se recorta prolijo en la esquina. */
.card-nov{position:absolute;top:20px;right:-56px;width:180px;padding:.28rem 0;text-align:center;
  transform:rotate(45deg);color:#fff;font-size:.6rem;font-weight:700;letter-spacing:.03em;
  text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  box-shadow:0 1px 5px rgba(0,0,0,.25);z-index:2}
.det-nov{top:26px;right:-62px;width:210px;font-size:.72rem;padding:.32rem 0}
/* Pie de la card: compartir (a la izquierda; el botón flotante ocupa la derecha) */
.card-compartir{display:flex;gap:.5rem;justify-content:flex-start;align-items:center;padding:.55rem .6rem;padding-right:2.9rem;border-top:1px solid rgba(0,0,0,.08);
  background:var(--marca);background:color-mix(in srgb, var(--marca) 70%, #ffffff)}   /* color del sistema, vivo pero aclarado con blanco */
.card-compartir .comp-ico{width:26px;height:26px;font-size:.82rem}
/* Íconos monocromáticos (como en el catálogo): círculo blanco translúcido, sin multicolor */
.card-compartir a.comp-ico, .card-compartir button.comp-ico{background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.45);color:#fff;box-shadow:none}
.card-compartir a.comp-ico:hover, .card-compartir button.comp-ico:hover{transform:translateY(-2px);color:#fff;background:rgba(255,255,255,.3)}
.comp-ico.copiado{filter:brightness(.8)}
/* Hover-preview de la card: la 2ª imagen entra por el mismo <img>; el video se superpone. */
.card-img .cf-img{transition:opacity .2s}
.ci-video{background:#fff}
.card-badge{position:absolute;top:.6rem;left:.6rem;z-index:2;font-size:.7rem;font-weight:700;
  padding:.22rem .55rem;border-radius:999px;letter-spacing:.02em}
.card-badge.sin{background:#eceff1;color:#78909c}
.card-badge.ultimas{background:#fbe7d8;color:#b5651d}
.card-img{aspect-ratio:3/2;background:#fff;padding:1.1rem .6rem;display:flex;align-items:center;justify-content:center}
.card-img img,.card-img video{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;margin:auto}
.card-body{padding:.85rem;display:flex;flex-direction:column;flex:1}
.codigo{font-size:.72rem;letter-spacing:.04em;color:var(--suave);text-transform:uppercase}
.card-body h3{margin:.15rem 0 .35rem;font-size:1rem}
.desc{margin:0 0 .6rem;color:var(--suave);font-size:.85rem;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.precio{color:var(--marca);font-size:1.1rem;margin-top:auto}
.vacio{color:var(--suave);padding:2rem 0}

/* ====== Detalle ====== */
.detalle{display:grid;grid-template-columns:1fr 1fr;gap:2rem;background:#fff;
  border:1px solid var(--linea);border-radius:var(--radio);padding:1.5rem}
.detalle-img{background:#fff;border-radius:var(--radio);overflow:hidden}
.detalle-img img{width:100%;object-fit:contain}
.detalle-info h1{margin:.3rem 0}
.etiqueta{display:inline-block;background:var(--fondo);color:var(--suave);
  padding:.2rem .6rem;border-radius:999px;font-size:.8rem;margin-bottom:.5rem}
.desc-corta{color:var(--suave)}
.precio-grande{display:block;font-size:1.8rem;color:var(--marca);margin:.6rem 0 1rem}
.btn-wa{display:inline-block;background:var(--wa);color:#fff;font-weight:600;
  padding:.75rem 1.4rem;border-radius:999px}
.btn-wa:hover{filter:brightness(.95)}
.desc-larga{margin-top:1.25rem;padding-top:1.25rem;border-top:1px solid var(--linea);color:#3a4a56}
.volver{margin-top:1.25rem}
.volver a{color:var(--marca)}
/* Productos relacionados: bloque full-width con la misma grilla de cards del listado */
.relacionados{margin-top:2.5rem}
.carrito-rel .relacionados{margin-top:1.5rem}
.relacionados-tit{font-size:1.15rem;font-weight:700;color:var(--tinta);margin:0 0 1rem;
  padding-top:1.25rem;border-top:1px solid var(--linea)}
/* Sticky footer: el pie queda al fondo aunque haya poco contenido */
body.tienda{display:flex;flex-direction:column;min-height:100vh}
body.tienda .contenido{flex:1 0 auto}
body.tienda .pie{flex-shrink:0}
.pie{border-top:1px solid var(--linea);box-shadow:0 -6px 22px rgba(20,40,60,.07);margin-top:3rem}
.pie-inner{position:relative;max-width:1500px;margin:0 auto;padding:1.15rem 1.25rem;display:flex;align-items:center;justify-content:flex-end;gap:1rem;flex-wrap:wrap}
.pie-der{display:flex;align-items:center;gap:1rem}
.pie-logo{height:auto;width:auto;max-height:24px;max-width:110px;object-fit:contain}
.pie-dev{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--suave);font-size:.85rem;white-space:nowrap}
.pie-dev a{color:var(--marca);font-weight:600;text-decoration:none}
.pie-dev a:hover{text-decoration:underline}
.pie-mob{color:var(--marca);font-weight:600;font-size:.9rem;text-decoration:none}
.pie-mob:hover{text-decoration:underline}
.pie-wa{margin-left:auto;display:inline-flex;align-items:center;gap:.4rem;background:var(--wa);color:#fff;
  padding:.55rem 1.1rem;border-radius:999px;font-weight:600;font-size:.9rem}
.pie-wa:hover{filter:brightness(.95);color:#fff}
/* "Seguinos" en el footer */
.pie-redes{display:inline-flex;gap:.5rem;margin-left:1rem}
.pie-red{width:36px;height:36px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:1rem;transition:transform .12s,filter .12s}
.pie-red:hover{transform:translateY(-2px);color:#fff;filter:brightness(1.05)}
.pie-red.facebook{background:#1877f2}
.pie-red.instagram{background:radial-gradient(circle at 30% 110%,#fdf497 0%,#fd5949 45%,#d6249f 60%,#285AEB 90%)}
.pie-red.linkedin{background:#0a66c2}
.pie-red.whatsapp{background:var(--wa)}
/* Fila "Compartir" en la ficha de producto */
.compartir{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin:1rem 0 .25rem}
.compartir-lbl{font-size:.85rem;color:var(--suave);font-weight:600}
.comp-ico{width:34px;height:34px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:.95rem;border:0;cursor:pointer;transition:transform .12s,filter .12s}
.comp-ico:hover{transform:translateY(-2px);color:#fff;filter:brightness(1.05)}
.comp-ico.whatsapp{background:var(--wa)}
.comp-ico.facebook{background:#1877f2}
.comp-ico.linkedin{background:#0a66c2}
.comp-ico.instagram{background:radial-gradient(circle at 30% 110%,#fdf497 0%,#fd5949 45%,#d6249f 60%,#285AEB 90%)}
.comp-ico.copiar{background:#64748b}
.comp-ok{font-size:.8rem;color:var(--wa);font-weight:600}
/* Toast de "Publicar" en el admin */
.pub-toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,20px);background:#0f172a;color:#fff;padding:.7rem 1.1rem;border-radius:10px;font-size:.88rem;box-shadow:0 6px 22px rgba(0,0,0,.28);opacity:0;transition:opacity .28s,transform .28s;z-index:9999}
.pub-toast.show{opacity:1;transform:translate(-50%,0)}

/* Botones flotantes (FAB) */
.fab-wa{position:fixed;left:20px;bottom:20px;width:56px;height:56px;border-radius:50%;background:var(--wa);
  color:#fff;display:flex;align-items:center;justify-content:center;font-size:1.7rem;z-index:60;
  box-shadow:0 6px 18px rgba(0,0,0,.28);transition:transform .15s}
.fab-wa:hover{transform:scale(1.08);color:#fff}
.fab-top{position:fixed;right:20px;bottom:20px;width:48px;height:48px;border-radius:50%;background:var(--marca);
  color:#fff;border:none;cursor:pointer;font-size:1.1rem;z-index:60;box-shadow:0 6px 18px rgba(0,0,0,.28);
  opacity:0;visibility:hidden;transform:translateY(12px);transition:opacity .2s,transform .2s,visibility .2s}
.fab-top.show{opacity:1;visibility:visible;transform:translateY(0)}
.fab-top:hover{background:var(--marca-osc)}
@media(max-width:640px){ .fab-wa{width:50px;height:50px;font-size:1.5rem} }
@media(max-width:640px){ .detalle{grid-template-columns:1fr} }

/* ================= PANEL ADMIN ================= */
.admin{background:linear-gradient(to right, var(--grad-b), var(--grad-a))}

/* ---- Menú lateral ----
   Reemplaza al header horizontal: se quedaba sin ancho pasados los 7 ítems y el panel
   va a seguir sumando módulos. Vertical crece hacia abajo y no choca con nada.
   Desktop (>=992px): fija a la izquierda, el main se corre con margin-left.
   Mobile: drawer que entra desde la izquierda con fondo oscuro. */
:root{ --side-w:264px }
.admin-side{position:fixed;top:0;left:0;bottom:0;width:var(--side-w);z-index:1040;
  display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;
  border-right:1px solid rgba(127,127,127,.22)}
/* El logo lo carga el usuario y puede venir de cualquier tamaño: se encajona en el ancho de la
   barra o desborda y aparece scroll horizontal (el global .marca-logo llega a 220px y con el
   padding ya no entra). Sin logo cargado, cae al nombre para que la cabecera no quede vacía. */
.admin-side-marca{display:block;padding:.9rem .8rem;text-align:center;
  border-bottom:1px solid rgba(127,127,127,.22);text-decoration:none;flex:0 0 auto}
.admin-side-marca .marca-logo{display:block;margin:0 auto;max-width:100%;max-height:44px;
  width:auto;height:auto;object-fit:contain}
.admin-side-marca .marca-nombre{font-size:1.05rem;font-weight:700;color:var(--menu-txt);line-height:1.2}
.admin-side-nav{flex:1 1 auto;padding:.6rem 0}
.admin-side-grupo{margin:.9rem 0 .3rem;padding:0 1rem;font-size:.68rem;font-weight:700;
  letter-spacing:.09em;text-transform:uppercase;color:var(--menu-txt);opacity:.55}
/* Hover y activo son un velo GRIS NEUTRO, no un tinte de marca: el color del menú lo elige el
   usuario y puede ser claro u oscuro. Un gris translúcido oscurece sobre claro y aclara sobre
   oscuro, así que se ve en los dos casos. El ítem activo se distingue por opacidad + peso +
   borde en el mismo color de las letras, sin depender del contraste contra la marca. */
.admin-side-item{display:flex;align-items:center;gap:.7rem;padding:.6rem 1rem;
  color:var(--menu-txt);opacity:.72;font-size:.92rem;text-decoration:none;
  border-left:3px solid transparent}
.admin-side-item i{width:18px;text-align:center;font-size:.95rem;flex:0 0 auto}
.admin-side-item:hover{opacity:1;background:rgba(127,127,127,.15)}
.admin-side-item.es-activo{opacity:1;font-weight:700;
  background:rgba(127,127,127,.20);border-left-color:var(--menu-txt)}
.admin-side-item.es-salir:hover{color:var(--peligro);opacity:1;background:rgba(192,57,43,.10)}
.admin-side-pie{flex:0 0 auto;padding:.5rem 0 .8rem;border-top:1px solid rgba(127,127,127,.22)}
.admin-side-user{margin:.5rem 0 0;padding:0 1rem;font-size:.75rem;color:var(--menu-txt);opacity:.6}
.admin-side-user i{margin-right:.35rem}
.admin-side-fondo{position:fixed;inset:0;z-index:1035;background:rgba(32,48,60,.45)}
.admin-burger{position:fixed;top:.7rem;left:.7rem;z-index:1045;width:42px;height:42px;
  border:1px solid var(--linea);border-radius:9px;background:#fff;color:var(--tinta);
  font-size:1.05rem;cursor:pointer;box-shadow:0 2px 8px rgba(32,48,60,.10)}
/* Con el drawer abierto el hamburguesa se montaba sobre el logo: se esconde. Para cerrar,
   tocar fuera o Escape — no hace falta un botón dedicado. */
.admin-main{max-width:1500px;padding:1.5rem 1.25rem}
@media(min-width:992px){
  .admin-main{margin-left:var(--side-w)}
  .admin-pie{margin-left:var(--side-w)}
  .admin-side-fondo{display:none}
}
@media(max-width:991.98px){
  /* Fuera de pantalla hasta que el hamburguesa la abre. */
  .admin-side{transform:translateX(-100%);transition:transform .22s ease;box-shadow:0 0 24px rgba(32,48,60,.18)}
  .admin-side.es-abierto{transform:none}
  .admin-main{padding-top:4rem}
  .admin-menu-abierto{overflow:hidden}
  .admin-menu-abierto .admin-burger{display:none}
}
@media(prefers-reduced-motion:reduce){ .admin-side{transition:none} }

/* ---- Portada del panel: una tarjeta por módulo ---- */
.home-cards{display:grid;gap:1rem;grid-template-columns:repeat(auto-fill, minmax(255px, 1fr))}
.home-card{display:flex;align-items:center;gap:1rem;padding:1.1rem 1.2rem;
  background:#fff;border:1px solid var(--linea);border-radius:12px;text-decoration:none;
  box-shadow:0 1px 3px rgba(32,48,60,.05);transition:box-shadow .15s ease, transform .15s ease}
.home-card:hover{box-shadow:0 6px 18px rgba(32,48,60,.11);transform:translateY(-2px)}
.home-card-ico{flex:0 0 auto;width:46px;height:46px;border-radius:11px;
  display:flex;align-items:center;justify-content:center;font-size:1.2rem;
  background:var(--grad-a);color:var(--marca)}
.home-card-txt{display:flex;flex-direction:column;min-width:0}
.home-card-tit{font-size:.92rem;font-weight:700;color:var(--tinta)}
.home-card-num{font-size:1.7rem;font-weight:700;color:var(--tinta);line-height:1.15}
.home-card-pie{font-size:.78rem;color:var(--suave);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Pedidos sin atender: la portada tiene que gritarlo, es la razón de que exista. */
.home-card.es-alerta .home-card-ico{background:rgba(192,57,43,.10);color:var(--peligro)}
.home-card.es-alerta .home-card-pie{color:var(--peligro);font-weight:700}
@media(prefers-reduced-motion:reduce){ .home-card{transition:none} .home-card:hover{transform:none} }
.admin-head{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}
.admin-head h1 small{color:var(--suave);font-weight:400;font-size:1rem}
.admin-head-acciones{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}
.admin-head-acciones form{margin:0}
.admin-head-acciones #input-xlsx{display:none}
.btn-sec{padding:.55rem .9rem;border:1px solid var(--linea);border-radius:8px;
  background:#fff;color:var(--suave);font-size:.9rem;font-weight:600;cursor:pointer;white-space:nowrap}
.btn-sec:hover{border-color:var(--marca);color:var(--marca)}

/* Filtro de tabla */
.filtro-tabla{display:flex;align-items:center;gap:.8rem;margin-bottom:1rem}
/* Radio sutil (8px) y no píldora, y el mismo alto que los campos de fecha: los controles del
   filtro son una sola barra y tienen que leerse como una sola familia. */
.filtro-tabla input{flex:1;max-width:420px;padding:.4rem .6rem;border:1px solid var(--linea);
  border-radius:8px;font-size:.82rem;color:var(--tinta);outline:none}
.filtro-tabla input:focus{border-color:var(--marca)}
.filtro-tabla select{padding:.4rem .5rem;border:1px solid var(--linea);border-radius:8px;
  font-size:.82rem;color:var(--tinta);background:#fff;outline:none}
.filtro-tabla select:focus{border-color:var(--marca)}
/* .btn-filtro se eliminó: era una clase propia con el color del sistema. Los botones de las
   barras de filtro ahora son `btn btn-sm btn-primary border border-light`, como el resto. */

/* ---- Acciones de fila: tira negra con íconos blancos ----
   Copiado de Benfersoft (renew/composicionclientes.php): `btn-group btn-group-sm` +
   `btn btn-dark action-hover`. Al hacer hover se invierte a blanco con ícono negro y sube 2px.
   Los !important son de la fuente original y hacen falta: .btn-dark de Bootstrap define el
   hover por variables (--bs-btn-hover-bg) y sin ellos gana esa, no la inversión. */
.action-hover{position:relative;transition:background-color .15s, color .15s, transform .15s, box-shadow .15s}
/* -3px y no -2px: dentro de una tira pegada el salto se pierde, porque los vecinos quedan
   quietos y el movimiento es oscuro sobre oscuro. Es el valor original de Benfersoft.
   z-index alto: en un btn-group los bordes se solapan (margin-left:-1px) y el botón que sube
   quedaba parcialmente por debajo del siguiente, comiéndose la sombra. */
.btn.action-hover:hover{background-color:#fff !important;color:#212529 !important;
  border-color:#343a40 !important;transform:translateY(-3px) !important;
  box-shadow:0 6px 14px rgba(0,0,0,.35) !important;z-index:3 !important}
/* La inversión de arriba pisaría los text-* de Bootstrap (ambas son !important y esta gana por
   especificidad): el ícono perdía su color justo al apuntarle, que es cuando más importa.
   Conservan el color en los dos estados. */
.btn.action-hover.text-danger:hover{color:var(--bs-danger) !important;border-color:var(--bs-danger) !important}
.btn.action-hover.text-success:hover{color:var(--bs-success) !important;border-color:var(--bs-success) !important}
/* La tira se mantiene junta y no se estira en la celda de acciones. */
.acciones .btn-group{white-space:nowrap}

/* En Parámetros cada acción va envuelta en su propio <form method="post">, así que el botón es
   NIETO del btn-group y Bootstrap —que une con `.btn-group > .btn`— no lo pega ni le corrige las
   esquinas: la tira salía partida en botones sueltos.
   display:contents saca la caja del <form> del layout y su botón pasa a ser hijo flex del grupo.
   Las esquinas hay que corregirlas a mano igual: los :first/:last-child de Bootstrap miran el
   DOM, donde cada botón sigue siendo :only-child de su form. */
/* Sin acotar a .acciones: Categorías y Escalas usan <span class="cat-acc"> en vez de una celda,
   y el problema es el mismo. Un <form> dentro de un btn-group solo pasa en estos casos. */
.btn-group > form{display:contents}
.btn-group > form > .btn{border-radius:0;margin-left:calc(var(--bs-border-width) * -1)}
/* El tamaño tampoco les llega: la regla de Bootstrap es `.btn-group-sm > .btn` (hijo DIRECTO) y
   estos botones son nietos del grupo. Se replican las mismas variables, no valores propios. */
.btn-group-sm > form > .btn{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;
  --bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}
.btn-group > form:last-child > .btn{
  border-top-right-radius:var(--bs-btn-border-radius, .375rem);
  border-bottom-right-radius:var(--bs-btn-border-radius, .375rem)}
/* "en uso" reemplaza al botón de borrar cuando el registro no se puede eliminar: es una etiqueta,
   no un botón, y queda como hijo del grupo por el if/else del PHP. */
.btn-group > .param-uso{align-self:center;margin-left:.5rem;font-size:.78rem;color:var(--suave)}
@media(prefers-reduced-motion:reduce){ .btn.action-hover:hover{transform:none !important} }

/* Visor de logs. Fondo oscuro fijo (no sigue al color del menú): es una consola, y el texto
   monoespaciado sobre oscuro es lo que hace legible una traza larga. */
#log-txt{background:#0c0f13;color:#cfe3ff;margin:0;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
  font-size:.78rem;line-height:1.5;white-space:pre-wrap;word-break:break-word;
  height:62vh;overflow:auto;padding:1rem;border-radius:10px;border:1px solid #1c2733}
.filtro-limpiar{margin-left:.4rem;color:var(--marca);text-decoration:underline;font-size:.85em}
.filtro-cargando{color:var(--suave)}
/* Label ARRIBA del box (no al costado): así "Desde" y "Hasta" no empujan los campos a lo ancho
   y la barra entra completa. Solo lo usa admin/pedidos.php.
   Va con `.filtro-tabla` adelante y NO es decorativo: la pantalla está envuelta en `.form`, y
   `.form label{display:block}` (0,1,1) le ganaba a `.filtro-fecha` pelado (0,1,0) — le mataba el
   flex y el label volvía al costado. Con dos clases (0,2,0) gana sin depender del orden. */
.filtro-tabla .filtro-fecha{display:inline-flex;flex-direction:column;align-items:flex-start;
  gap:.15rem;color:var(--suave);font-size:.72rem;white-space:nowrap;margin:0;font-weight:400}
/* flex:0 0 auto es obligatorio: `.filtro-tabla input` (más general) les mete flex:1 y max-width
   a TODOS los inputs de la barra. Los de fecha se estiraban y quedaban más altos y desalineados
   que el buscador y el botón — `.filtro-fecha input` solo pisaba padding y color, no el flex. */
.filtro-fecha input{flex:0 0 auto;max-width:none;width:auto;
  padding:.4rem .5rem;border:1px solid var(--linea);border-radius:8px;
  font-size:.82rem;line-height:1.2;color:var(--tinta);background:#fff}
.filtro-fecha input:focus{border-color:var(--marca);outline:none}
/* Barra con campos de fecha: los de fecha llevan label arriba y el resto no, así que quedan más
   altos. Alinear al fondo deja todos los BOX en la misma línea, que es lo que se ve; con center
   los de fecha se iban para abajo. El texto de la derecha se sube para no quedar pegado al piso. */
.filtro-tabla-fechas{align-items:flex-end}
.filtro-tabla-fechas .filtro-cuenta,.filtro-tabla-fechas .filtro-cargando{padding-bottom:.42rem}
@media(max-width:767.98px){ .filtro-tabla{flex-wrap:wrap} .filtro-tabla input[type=search]{max-width:none} }
.filtro-cuenta{color:var(--suave);font-size:.85rem}

/* El loader global ÚNICO vive en src/loader.php (#bft-loader, con su CSS propio inline). Acá había el
   CSS de un segundo loader (#bf-loader) que se eliminó al unificar a uno solo. */

/* Aviso de importación OK */
.aviso-ok{background:#e9f6ec;color:#1e7e34;border:1px solid #cdeccf;
  padding:.7rem .9rem;border-radius:8px;font-size:.9rem;margin-bottom:1rem}
.aviso-ok b{font-weight:700}
.aviso-errores{margin:.5rem 0 0;padding-left:1.2rem;color:var(--peligro)}
.aviso-errores li{font-size:.85rem}
.import-fallidas{margin-top:.6rem;padding-top:.6rem;border-top:1px solid #cdeccf;
  color:var(--peligro);display:flex;align-items:center;gap:.7rem;flex-wrap:wrap}

/* Asistente de importación de imágenes (paso a paso) */
.impimg{max-width:900px}
.impimg-paso{border:1px solid var(--linea);border-left:4px solid var(--linea);border-radius:8px;
  padding:1rem 1.2rem;margin-bottom:1rem;background:#fff}
.impimg-paso.impimg-activo{border-left-color:var(--marca)}
.impimg-paso.impimg-ok{border-left-color:#198754;background:#fbfdfb}
.impimg-paso .form-sub{margin-top:0}
.impimg-paso label{display:block;margin-bottom:.6rem}
.impimg-fila-ok td{color:#198754}
.impimg-fila-prox td{background:#fff8e5;font-weight:600}
/* Bootstrap también define .btn y carga ANTES, así que esta regla lo pisa. Sus variantes de color
   (.btn-danger, etc.) solo declaran variables (--bs-btn-bg) que consume el .btn de Bootstrap: si
   este .btn se aplicara igual, `class="btn btn-danger"` saldría del color de marca en vez de rojo.
   Por eso cede ante una variante de color — y SOLO ante esas: `btn btn-sm` (que se usa en decenas
   de lugares en parametros.php) no es una variante de color y tiene que seguir con este estilo.
   display es obligatorio: .btn se usa en <button> (inline-block) y en <a> (inline), y un transform
   NO aplica sobre un elemento inline — el hover del <a> quedaba muerto salvo que un contenedor
   flex lo blockificara de casualidad. */
.btn:not(.btn-primary):not(.btn-secondary):not(.btn-success):not(.btn-danger):not(.btn-warning):not(.btn-info):not(.btn-light):not(.btn-dark):not(.btn-link):not([class*="btn-outline-"]){
  display:inline-flex;align-items:center;justify-content:center;gap:.4rem;
  background:var(--marca);color:#fff;border-radius:8px;
  font-weight:600;border:none;cursor:pointer;text-decoration:none;
  /* El TAMAÑO se lee de las variables de Bootstrap en vez de fijarlo acá. Así `btn-sm` funciona
     de verdad sobre este botón: esa clase solo declara --bs-btn-padding-* / --bs-btn-font-size,
     y antes no servía para nada porque esta regla escribía padding y font-size directos.
     Este .btn ahora solo cambia COLORES; el dimensionado queda en manos de Bootstrap. */
  padding:var(--bs-btn-padding-y, .6rem) var(--bs-btn-padding-x, 1.1rem);
  font-size:var(--bs-btn-font-size, .95rem)}
/* Antes el hover solo saltaba 2px, sin cambio de color: se movía y no respondía. */
.btn:not(.btn-primary):not(.btn-secondary):not(.btn-success):not(.btn-danger):not(.btn-warning):not(.btn-info):not(.btn-light):not(.btn-dark):not(.btn-link):not([class*="btn-outline-"]):hover{
  background:var(--marca-osc)}

/* ---- Movimiento común a TODOS los botones ----
   Va en reglas APARTE y de baja especificidad a propósito: la cadena de :not() de arriba solo
   decide COLOR, así que esto también alcanza a btn-primary / btn-danger / btn-light / outline.
   Un botón se ve igual en todo el panel aunque cada uno tenga su color. */
/* Va sobre .btn-sm y no sobre .btn: los botones SUELTOS del panel llevan todos `btn btn-sm`, y
   los de las tiras NO (heredan el tamaño del btn-group-sm) porque ya tienen su propio salto de
   -3px en .action-hover. Así cada uno tiene UNA sola regla de movimiento, sin competir.
   Especificidad baja y separada del color: alcanza a btn-primary, btn-danger, los de Excel, etc. */
/* Bootstrap declara `.btn{transition:...}` SIN transform (buttons.scss), y hay otra `.btn.btn-sm`
   más abajo en este mismo archivo. Con tanta regla compitiendo por lo mismo, el transform se
   aplicaba pero sin transición: el botón saltaba de golpe y no se percibía.
   `!important` acá es a propósito — es la regla de movimiento base de todo el panel y no puede
   depender del orden ni de que nadie declare `.btn{transition}` más abajo. Es el mismo criterio
   que ya usa `.action-hover`, heredado de Benfersoft. */
.btn.btn-sm{transition:color .12s, background-color .12s, border-color .12s, box-shadow .12s, transform .12s !important}
.btn.btn-sm:hover{transform:translateY(-2px) !important;box-shadow:0 4px 12px rgba(32,48,60,.18) !important}
.btn.btn-sm:active{transform:none !important;box-shadow:none !important}
@media(prefers-reduced-motion:reduce){ .btn.btn-sm:hover{transform:none !important} }
.btn-sec{padding:.6rem 1.1rem;color:var(--suave)}

/* Tabla */
.tabla-wrap{overflow-x:auto;background:#fff;border:1px solid var(--linea);border-radius:var(--radio)}
.tabla{width:100%;border-collapse:collapse;font-size:.92rem}
.tabla th,.tabla td{padding:.7rem .8rem;text-align:left;border-bottom:1px solid var(--linea)}
.tabla th{background:var(--menu-a);color:var(--menu-txt);font-weight:700;font-size:.76rem;
  text-transform:uppercase;letter-spacing:.05em}
.tabla tbody tr:nth-child(even){background:rgba(0,0,0,.022)}
.tabla tbody tr:hover{background:rgba(0,0,0,.045)}
.tabla .num{text-align:right;white-space:nowrap}
.qe{width:92px;padding:.28rem .4rem;border:1px solid var(--marca);border-radius:6px;
  font-size:.9rem;text-align:right;font-family:inherit}
.qe.qe-stock{width:60px}
.qe:focus{outline:none;box-shadow:0 0 0 .15rem rgba(138,74,43,.15)}
tr.editando{background:rgba(0,0,0,.045) !important}
.btn-ico{display:inline-block;background:none;border:none;cursor:pointer;color:var(--suave);
  font-size:.95rem;padding:.28rem .4rem;border-radius:6px;text-decoration:none;line-height:1}
.acciones .btn-ico{color:var(--suave);margin-right:.15rem}
.acciones .btn-ico:hover{color:var(--marca);background:rgba(0,0,0,.05)}
/* .btn-ico sigue en uso SOLO en parametros.php (57 usos). productos y pedidos pasaron a la tira
   `btn-group` + `btn btn-dark action-hover`; cuando se migre parametros, este bloque se va. */
.acciones .btn-ico.peligro{color:var(--peligro)}
.acciones .btn-ico.peligro:hover{background:#fdecea}
.acciones .qsave{color:#1e7e34}
.acciones .qcancel{color:var(--peligro)}
.mini{width:46px;height:46px;object-fit:cover;border-radius:8px;border:1px solid var(--linea)}
.fila-inactiva{opacity:.5}
.badge{padding:.15rem .55rem;border-radius:999px;font-size:.75rem;font-weight:600}
.badge.on{background:var(--menu-a);color:var(--menu-txt)}
.badge.off{background:#f0f2f4;color:var(--suave)}
/* :not(.btn) es obligatorio: este selector es para los enlaces de texto sueltos de la celda.
   Sin él le pegaba a los <a class="btn btn-dark"> de la tira de acciones — el margin-right los
   separaba (el btn-group no los podía unir) y el color de marca les pintaba el ícono de azul
   en vez de blanco, porque `.acciones a` (0,1,1) le gana al `.btn` de Bootstrap (0,1,0). */
.acciones a:not(.btn){margin-right:.7rem;color:var(--marca);font-size:.88rem}
.acciones a:not(.btn).peligro{color:var(--peligro)}
/* El `color` es obligatorio acá: Bootstrap carga ANTES y define code{color:var(--bs-code-color)}
   = #d63384 (rosa fucsia). Al fijar solo el fondo, los códigos de artículo salían rosados. */
code{background:#f0f2f4;color:var(--tinta);padding:.1rem .4rem;border-radius:4px;font-size:.85rem}

/* Formulario */
/* .form es el envoltorio de TODO el panel: producto_form, parametros, productos, pedidos y logs.
   1500 = el mismo ancho que .admin-main, así ninguna pantalla queda más angosta que otra. */
.form{background:#fff;border:1px solid var(--linea);border-radius:var(--radio);padding:1.75rem;max-width:1500px}
.form-sub{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--suave);
  font-weight:700;margin:0 0 1.1rem;padding-bottom:.55rem;border-bottom:1px solid var(--linea)}
@media(min-width:992px){ .form-media{border-left:1px solid var(--linea)} }
.chk-group{display:flex;flex-wrap:wrap;gap:.45rem .9rem;margin-top:.35rem;max-height:150px;overflow:auto;
  border:1px solid var(--linea);border-radius:8px;padding:.55rem .65rem;background:#fff}
.chk-group .chk{display:inline-flex;align-items:center;gap:.4rem;font-weight:400;font-size:.9rem;margin:0}
.chk-group .sub-chk-wrap[hidden]{display:none}
.form label{display:block;margin-bottom:1rem;font-weight:600;font-size:.9rem}
.form label .form-control,.form label .form-select{margin-top:.35rem}
.form .form-control:focus,.form .form-select:focus{border-color:var(--marca);box-shadow:0 0 0 .2rem rgba(138,74,43,.15)}
.form small{font-weight:400;color:var(--suave)}
.form .fila{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
.form .check{display:flex;align-items:center;gap:.5rem}
.form .check .form-check-input{margin:0;flex:0 0 auto}
/* Visible / En el catálogo: viven bajo el selector de portada para no alargar la columna de datos */
.pf-visibilidad{display:flex;gap:1.2rem;flex-wrap:wrap;margin:0 0 1rem;padding:.6rem .8rem;
  background:#f7f9fb;border:1px solid var(--linea);border-radius:8px}
.form-actions{display:flex;align-items:center;gap:1rem;margin-top:.5rem}
/* Campos readonly (el código en edición, que es INMUTABLE): apagados y opacos, para que se lea de
   un vistazo que no se modifican. Solo en el panel (body.admin) para no tocar formularios públicos. */
body.admin .form-control[readonly]{background-color:#eef1f4;color:var(--suave);opacity:.7;cursor:not-allowed}
/* Verificación de código en vivo (admin/_form_check.php): mensaje bajo el campo. */
.cod-msg{display:block;font-size:.76rem;margin-top:.2rem;min-height:1em;line-height:1.2}
.cod-msg.cod-ok{color:#1c7a3f}
.cod-msg.cod-err{color:#b23b3b}
.form-leyenda{font-size:.8rem;color:var(--suave);margin:1.2rem 0 0}
/* Alta/edición manual de pedido (admin/pedido_nuevo.php): buscadores de cliente y artículo. */
.pn-res{border:1px solid var(--linea);border-radius:8px;margin-top:.3rem;max-height:16rem;overflow:auto;background:#fff}
.pn-res-item{display:block;width:100%;text-align:left;border:0;background:none;padding:.5rem .7rem;cursor:pointer;border-bottom:1px solid var(--linea)}
.pn-res-item:last-child{border-bottom:0}
.pn-res-item:hover{background:#f2f6fb}
.pn-res-item small{color:var(--suave)}
.pn-res-vacio{padding:.5rem .7rem;color:var(--suave);font-size:.88rem}
.pn-sel{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem .7rem;border:1px solid var(--linea);border-radius:8px;background:#f7f9fb}
.pn-vacio{color:var(--suave);margin:.6rem 0 0}
.pn-resumen{margin-top:1rem;max-width:24rem;margin-left:auto;font-size:.92rem}
.pn-resumen > div{display:flex;justify-content:space-between;gap:1rem;padding:.28rem 0;border-bottom:1px solid var(--linea)}
.pn-resumen .pn-total-row{border-bottom:0;border-top:2px solid var(--linea);font-size:1.08rem;padding-top:.45rem;color:var(--tinta)}
.pn-resumen .pn-total-row b{color:var(--marca)}
/* Modal genérico de altas/ediciones de Parámetros (admin/_param_modal.php).
   z-index 1050: tapa la barra del panel (1040) y su hamburguesa (1045), y queda por DEBAJO del
   .modal de Bootstrap (bfdialog, 1055) para que el confirm de borrado caiga encima. */
.pm-modal{position:fixed;inset:0;z-index:1050;display:flex;align-items:flex-start;justify-content:center;
  background:rgba(15,23,42,.55);padding:2.5rem 1rem;overflow:auto}
.pm-modal[hidden]{display:none}
.pm-abierto{overflow:hidden}
.pm-box{position:relative;background:#fff;color:var(--tinta);border-radius:14px;
  width:100%;max-width:920px;margin:auto;box-shadow:0 18px 50px rgba(0,0,0,.35)}
.pm-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;
  padding:.8rem 1.2rem;border-bottom:1px solid var(--linea)}
.pm-tit{margin:0;font-size:1.05rem;font-weight:700;color:var(--marca)}
.pm-close{background:none;border:0;font-size:1.9rem;line-height:1;color:var(--suave);cursor:pointer;padding:0 .3rem}
.pm-close:hover{color:var(--tinta)}
.pm-body{padding:1.2rem}
/* El form movido al modal ya no es la tarjeta .form: adentro del modal va sin borde ni fondo. */
.pm-body .form,.pm-body form.form{border:0;padding:0;max-width:none;background:none}

/* Parámetros (proveedores / categorías) */
.params-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;align-items:start}
/* Envoltorio de Parámetros: reutiliza .form (el mismo contenedor de producto_form), así los dos
   se ven igual sin copiar el estilo. Solo cambia el ancho.
   Las .param-card de adentro se APLANAN: con el envoltorio ya hay una tarjeta, y anidar otra era
   marco sobre marco (las dos son background:#fff + borde) sin aportar nada. Fuera de .param-wrap
   la clase sigue intacta: la usan migrar.php y datos.php. */
.param-wrap{max-width:1500px}
.param-wrap .param-card{background:transparent;border:0;border-radius:0;padding:0;box-shadow:none}
.param-wrap .param-card + .param-card{margin-top:1.5rem;border-top:1px solid var(--linea);padding-top:1.5rem}
.param-card{background:#fff;border:1px solid var(--linea);border-radius:var(--radio);padding:1.25rem}
.param-card h2{margin:0 0 1rem;font-size:1.1rem}
.param-card-head{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}
.mig-log{background:#0f172a;color:#e2e8f0;border-radius:8px;padding:.9rem 1rem;font-size:.82rem;line-height:1.5;max-height:340px;overflow:auto;white-space:pre-wrap;margin:0}
.check-inline{display:flex;align-items:center;gap:.4rem;font-size:.85rem;color:#4a5763;cursor:pointer}
.check-inline input{margin:0}
.mig-tablas{margin-top:1rem;border:1px solid var(--linea);border-radius:10px;padding:.9rem 1rem;background:#fafbfc}
.mig-tablas-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:.6rem;padding-bottom:.5rem;border-bottom:1px solid var(--linea)}
.mig-grupos{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:.9rem}
.mig-grupo{display:flex;flex-direction:column;gap:.35rem}
.mig-grupo .check-inline.grupo{padding-bottom:.25rem;border-bottom:1px dashed var(--linea);margin-bottom:.15rem}
.mig-grupo .check-inline:not(.grupo){padding-left:.4rem}
.param-card-head h2{margin:0}
/* Barra de acciones de la cabecera de un maestro: Exportar / Subir XLSX + Alta. */
.param-card-acciones{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}
.param-card-acciones form{margin:0}

/* Centro de configuración (checklist de onboarding, ver src/setup.php) */
.setup-card{border:1px solid var(--linea);border-left:4px solid #6c8cff;border-radius:10px;background:#f8fafc;padding:1rem 1.1rem;margin-bottom:1.4rem}
.setup-card.setup-bloqueante{border-left-color:#e05656;background:#fdf6f6}
.setup-head{display:flex;align-items:flex-start;gap:.7rem;margin-bottom:.8rem}
.setup-head > i{font-size:1.3rem;color:#6c8cff;margin-top:.15rem}
.setup-bloqueante .setup-head > i{color:#e05656}
.setup-head b{display:block;font-size:1.02rem}
.setup-sub{color:var(--suave);font-size:.86rem}
.setup-lista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.setup-lista li{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap;padding:.5rem .7rem;border:1px solid var(--linea);border-radius:8px;background:#fff}
.setup-lista li > i{width:1.1rem;text-align:center}
.setup-req > i{color:#e05656}
.setup-opt > i{color:#c98a2b}
.setup-predet > i{color:#c98a2b}   /* cargado pero falta marcar el predeterminado: estrella ámbar */
.setup-ok{opacity:.7}
.setup-ok > i{color:#2e9e5b}
.setup-it-label{font-weight:600}
.setup-it-label em{font-weight:400;font-style:normal;color:var(--suave);font-size:.8rem}
.setup-it-hint{color:var(--suave);font-size:.82rem;flex:1;min-width:140px}
.setup-lista li .btn{margin-left:auto}
/* Card compacta cuando lo mínimo ya está listo (verde) + paso "cargá artículos" + opcionales colapsados */
.setup-ok-min{border-left-color:#2e9e5b;background:#f6fbf8}
.setup-ok-min .setup-head > i{color:#2e9e5b}
.setup-next > i{color:#3b6fd4}
.setup-detalles{margin-top:.3rem}
.setup-detalles > summary{cursor:pointer;color:var(--suave);font-size:.85rem;padding:.35rem .2rem;user-select:none}
.setup-detalles > summary:hover{color:var(--marca)}
.setup-detalles[open] > summary{margin-bottom:.5rem}
.param-card h2 small{color:var(--suave);font-weight:400;font-size:.9rem}
.param-add{display:flex;gap:.5rem;flex-wrap:wrap;align-items:center;margin-top:1rem}
.param-add .form-control{flex:1;min-width:120px}
.param-add .prefijo{flex:0 0 90px;text-transform:uppercase}
.param-add .form-control:focus{border-color:var(--marca);box-shadow:0 0 0 .2rem rgba(138,74,43,.15)}
.btn.btn-sm{padding:.35rem .8rem;font-size:.85rem}
.param-hint{color:var(--suave);font-size:.8rem;margin:.7rem 0 0}
.param-uso{color:var(--suave);font-size:.8rem}
.linkbtn{background:none;border:none;padding:0;margin-right:.7rem;cursor:pointer;
  font-family:inherit;font-size:.88rem}
.linkbtn.link{color:var(--marca)}
.linkbtn.peligro{color:var(--peligro)}
.param-checks{display:flex;flex-wrap:wrap;gap:.5rem 1.1rem;margin:.6rem 0 1rem}
.param-checks .check{display:inline-flex;align-items:center;gap:.4rem;font-size:.9rem}
.param-checks .form-check-input{margin:0}
.param-add .form-select{flex:1;min-width:140px}
/* Solapas */
.nav-tabs{border-bottom:1px solid var(--linea)}
.nav-tabs .nav-link{color:var(--suave);border:none;border-bottom:2px solid transparent;
  font-weight:600;padding:.6rem 1.1rem;background:none}
.nav-tabs .nav-link:hover{color:var(--marca);border-bottom-color:var(--borde-card)}
.nav-tabs .nav-link.active{color:var(--marca);border-bottom-color:var(--marca);background:none}
.tab-content{padding-top:1.4rem}
/* Edición inline en tablas de parámetros */
tr.row-edit > td{background:rgba(0,0,0,.045);padding:.7rem .8rem}
.edit-form{padding:.2rem 0}
.edit-actions{margin-top:.7rem;display:flex;gap:.6rem;align-items:center}
.param-alta{margin-top:1.4rem;border-top:1px solid var(--linea);padding-top:1.1rem}
@media(max-width:820px){ .params-grid{grid-template-columns:1fr} }

/* Login */
.login-body{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh}
.login-card{background:#fff;border:1px solid var(--linea);border-radius:var(--radio);
  padding:2rem;width:min(360px,90vw);box-shadow:var(--sombra)}
.login-logo{display:block;margin:0 auto .75rem;max-width:100%;max-height:96px;width:auto;height:auto;object-fit:contain}
.login-card h1{font-size:1.15rem;text-align:center;color:var(--suave);font-weight:600;margin:0 0 1.5rem}
.login-card label{display:block;margin-bottom:1rem;font-size:.9rem;font-weight:600}
.login-card input{display:block;width:100%;margin-top:.35rem;padding:.6rem .7rem;
  border:1px solid var(--linea);border-radius:8px;font-size:.95rem}
.login-card button{width:100%;background:var(--marca);color:#fff;border:none;
  padding:.7rem;border-radius:8px;font-weight:600;font-size:1rem;cursor:pointer}
.alerta{background:#fdecea;color:var(--peligro);padding:.6rem .8rem;border-radius:8px;
  font-size:.88rem;margin-bottom:1rem}
@media(max-width:640px){ .form .fila{grid-template-columns:1fr} }

/* ================= Catálogo book (public/catalogo.php) ================= */
/* El fondo, color de letra y tipografía de .book-pagina los define catalogo.php
   inline según la configuración (CAT_FONDO / CAT_TEXTO / CAT_FONT). */
/* El catálogo es UNA HOJA por vez, igual en celular y en desktop (antes eran pliegos de 2
   páginas con giro 3D: en mobile había que achicarlo todo y se leía mal). La hoja es vertical
   (8/11, proporción de una hoja carta) y se pasa con un aparecer/desaparecer.

   El tamaño NO es fijo: se limita por ancho Y por alto. Si solo se limitara por ancho, en un
   celular chico (375x667, con ~480px útiles) la hoja pediría ~515px de alto y habría que
   scrollear, que es justo lo que rompe la sensación de hojear. Con el min() la hoja se achica
   sola y queda centrada. 100dvh ya descuenta las barras del navegador móvil, que aparecen y
   desaparecen al scrollear. --bk-alto-libre = header + botones + márgenes. */
.book{--bk-alto-libre:260px;   /* fallback; el JS lo MIDE y lo pisa (ajustarAlto) */
  max-width:min(800px, calc((100dvh - var(--bk-alto-libre)) * 8 / 11));
  margin:1.5rem auto 0;container-type:inline-size}
.book-visor{position:relative;overflow:hidden;border-radius:16px;box-shadow:var(--sombra);
  aspect-ratio:8/11}
/* Las hojas van APILADAS: solo se ve la actual, las demás están debajo esperando.
   visibility (y no display:none) para que las ocultas conserven layout: posThumbs() necesita
   medir las fotos aunque la hoja no se vea. */
/* perspective acá y no en .book: solo alcanza a los HIJOS DIRECTOS, y el hijo directo de la
   tira es la hoja. Además la tira mide lo mismo que el visor, así que el punto de fuga cae
   justo en el centro de la hoja que se ve. */
.book-tira{position:relative;height:100%;perspective:1200px}
/* El padding derecho es mayor: ahí va la pestaña del capítulo (.book-cap, absolute a right:0) y
   sin hueco la grilla se le encima. Las hojas SIN capítulo pierden 1em de ancho útil, que a esta
   escala no se nota y evita que los artículos salten de posición entre una hoja y otra. */
.book-pagina{position:absolute;inset:0;display:flex;flex-direction:column;
  padding:1.15em 2.6em .9em 1.35em;overflow:hidden;visibility:hidden}
.book-pagina.bk-actual{visibility:visible;z-index:1}

/* Pasar hoja: SOLO se anima la que se va (se desvanece en 0.4s, por encima). La nueva no anima:
   ya está abajo, opaca, y se descubre.
   OJO — NO hacer que las dos animen a la vez (fundido cruzado): quedaba mal, porque durante el
   cruce se ven las DOS semitransparentes superpuestas y el texto de una se lee sobre el de la
   otra. Acá la de abajo está siempre al 100%, así que eso no pasa. */
/* La que SE VA: rápido (0.25s) y sin efecto, solo se apaga. Queda por DEBAJO. */
.book-pagina.bk-sale{visibility:visible;z-index:1;animation:bksale .25s ease-in both}
@keyframes bksale{from{opacity:1}to{opacity:0}}

/* La que VIENE: es la del efecto. Gira y se acomoda en 0.5s, por ENCIMA de la que se va.
   AVANZAR gira de derecha a izquierda -> pivota en su canto DERECHO y llega desde la derecha.
   RETROCEDER: espejado. */
.book-pagina.bk-entra{z-index:3;transform-origin:right center;
  animation:bkentra .5s ease-out both}
.book-pagina.bk-entra.bk-atras{transform-origin:left center;animation-name:bkentra-atras}
@keyframes bkentra      {from{transform:rotateY(90deg);opacity:0}  to{transform:rotateY(0);opacity:1}}
@keyframes bkentra-atras{from{transform:rotateY(-90deg);opacity:0} to{transform:rotateY(0);opacity:1}}
/* NO poner acá un "prefers-reduced-motion { animation:none }": el JS limpia la clase por TIEMPO,
   pero si además se anula la animación la hoja vieja se queda opaca esos 0.4s y tapa a la nueva.
   Si hace falta respetar reduced-motion, acortar la animación, no eliminarla. */
/* z-index alto: sin él, la foto del artículo —que viene después en el DOM— le pasaba por encima
   y el logo desaparecía debajo de la imagen. Es la firma de la hoja, va sobre todo lo demás. */
.book-corner{z-index:4;position:absolute;top:.9em;right:1em;max-width:5em;max-height:2.5em;height:auto;width:auto;opacity:.9;pointer-events:none;object-fit:contain}
/* Portada */
/* Centrado HORIZONTAL sí (align-items + text-align), vertical NO: sin `justify-content:center`
   el contenido arranca arriba y lo acomoda en altura el propio usuario con los enters de su
   mensaje (Configuración → Catálogo). Con el centrado forzado, el flex repartía igual y los
   enters no movían nada. El "Powered by" no entra en esto: es `position:absolute`. */
.book-portada,.book-cierre{align-items:center;justify-content:flex-start;text-align:center;gap:.9rem}
/* Contratapa: solo se renderiza si hay mensaje de cierre cargado (lo decide catalogo.php). */
/* Los mensajes son HTML del editor: puede traer <p>, <ul>, <a>... por eso se estilan los hijos. */
.book-msg{font-size:1.05em;line-height:1.5;max-width:82%;margin:.2rem 0 0;opacity:.92}
.book-msg > *:first-child{margin-top:0}
.book-msg > *:last-child{margin-bottom:0}
.book-msg p{margin:0 0 .5em}
/* Los saltos del editor se respetan TAL CUAL: un <p> vacío no tiene contenido, así que medía 0
   de alto y el enter no bajaba nada. min-height le da el alto de una línea, que es lo que el
   usuario ve en el editor y espera ver en la hoja.
   :empty no alcanza — TinyMCE deja `<p>&nbsp;</p>` o `<p><br></p>`, que NO son :empty. */
.book-msg p:empty,
.book-msg p:has(> br:only-child){min-height:1em}
.book-msg br{line-height:inherit}
.book-msg ul,.book-msg ol{margin:0 0 .5em;padding-left:1.2em;text-align:left;display:inline-block}
.book-msg a{color:inherit;text-decoration:underline}
/* La imagen la elige el usuario y puede venir de cualquier tamaño: se encajona en la hoja o la
   desborda. El catálogo calcula su alto con ajustarAlto() y no sabe de esto — una img suelta
   devolvía el scroll que sacamos. max-height en % de la hoja, no en px: la hoja escala con el
   ancho (cqw) y un tope fijo se vería enorme en el celular. */
.book-msg img{max-width:100%;max-height:38vh;height:auto;object-fit:contain;
  display:block;margin:.4em auto;border-radius:8px}
@media print{ .book-msg img{max-height:none} }
.book-msg-final{font-size:1.25em;font-weight:600;margin-bottom:.6rem}
.book-portada-titulo{text-transform:uppercase;letter-spacing:.32em;font-size:1em;font-weight:700;opacity:.9}
.book-portada-pie{margin-top:auto;padding-top:1.6rem;display:flex;flex-direction:column;align-items:center;gap:.7rem}
.book-portada-wa{color:inherit;text-decoration:none;font-weight:700;font-size:1.05em;display:inline-flex;align-items:center;gap:.5rem}
.book-portada-wa:hover{color:inherit;opacity:.85}
/* Las redes llevan el ÍCONO + EL USUARIO: en el PDF impreso el ícono no se puede tocar, así que
   sin el nombre al lado la red no sirve. Por eso son pastillas y no círculos, y van en columna
   (con el nombre al lado, en fila no entrarían tres). */
/* align-items:flex-start (y no center) para que los CÍRCULOS queden alineados entre sí: con
   center, cada fila se centraría por su cuenta y los nombres de distinto largo los escalonarían.
   El bloque entero igual se centra, porque el contenedor padre es una columna centrada. */
.book-portada-redes{display:inline-flex;flex-direction:column;gap:.45em;align-items:flex-start}
.book-seguinos{font-size:.78em;letter-spacing:.14em;text-transform:uppercase;opacity:.75;margin-top:.3rem}
.book-red-user{font-weight:400;font-size:.92em;opacity:.85;letter-spacing:.01em;white-space:nowrap}
/* Íconos con el color del texto del catálogo (contrastan sobre fondos claros u oscuros) */
/* El círculo es el que lleva el fondo y el borde; el nombre va SUELTO al lado, sutil.
   El <a> envuelve a los dos (toda la fila es clickeable) pero no se pinta. */
.book-red{display:inline-flex;align-items:center;gap:.6em;color:inherit;text-decoration:none;
  background:none;border:0;padding:0;transition:transform .12s}
.book-red:hover{transform:translateY(-2px);color:inherit}
.book-red-ico{width:1.75em;height:1.75em;font-size:.9em;flex:none;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;transition:background .12s;
  background:color-mix(in srgb, currentColor 14%, transparent);border:1px solid color-mix(in srgb, currentColor 45%, transparent)}
.book-red:hover .book-red-ico{background:color-mix(in srgb, currentColor 28%, transparent)}
.book-portada-cr{font-size:.72em;opacity:.8;max-width:85%;line-height:1.4}
.book-portada-cr .cr-tienda{display:block}
/* Crédito del producto: esquina inferior derecha de la portada, discreto. Va posicionado sobre
   la hoja (no en el pie) para que no compita con el nombre de la tienda ni con las redes. */
.book-powered{position:absolute;right:1.2em;bottom:.8em;z-index:4;
  font-size:.52em;letter-spacing:.04em;opacity:.55;color:inherit;text-decoration:none}
.book-powered:hover{opacity:.9;color:inherit;text-decoration:none}
.book-portada-cr .cr-benfer{display:block;font-size:.9em;opacity:.75;margin-top:.15em}
/* Índice lateral: el capítulo va en el margen DERECHO, vertical, como las pestañas de un cuaderno.
   Antes era un título arriba a la izquierda que le comía una línea de alto a la hoja y competía
   con los artículos. Acá orienta sin robar espacio: la hoja arranca directo en la grilla.
   `position:absolute` y no un elemento en el flujo, justamente para que no ocupe alto — el de la
   hoja lo calcula ajustarAlto() y no tiene margen para regalar.
   writing-mode + rotate: el texto se lee de abajo hacia arriba, como en el lomo de un libro. */
/* Índice de la portada: las solapas de capítulo apiladas, como el índice con pestañas de una
   agenda. Mismos colores invertidos que .book-cap, así la que ves en la portada es la misma que
   después te recibe arriba de la hoja.
   alto FIJO (no max-height): la zona del índice mide siempre lo mismo, aunque se muestren menos de
   5 solapas, así el JS puede partirla en 5 partes iguales sin que el alto se realimente. */
.book-idx{position:absolute;top:1.2em;right:0;z-index:5;
  display:flex;flex-direction:column;align-items:flex-end;gap:.18em;
  height:calc(100% - 2.4em);overflow:hidden}
/* Chicas y de letra fina: es un índice, no un título — tiene que estar sin pelear con la portada.
   El peso 500 (y no 300) es el piso para que en .52em siga leyéndose: más fino, a ese tamaño y
   sobre un fondo saturado, los palos de la letra se cortan. El letter-spacing hace el laburo que
   haría la negrita: separa y deja leer sin engordar. */
.book-idx-tab{
  writing-mode:vertical-rl;transform:rotate(180deg);transform-origin:center;
  font-size:.52em;letter-spacing:.14em;text-transform:uppercase;font-weight:500;
  padding:.75em .42em;border:0;cursor:pointer;
  background:var(--bk-texto, #111);
  color:var(--bk-fondo, #fff);
  border-radius:0 6px 6px 0;
  /* Alto uniforme fijado por el JS (--bk-tab-h = zona / 5). El nombre largo se recorta con
     ellipsis; así todas las solapas miden lo mismo sin importar el largo del texto. */
  flex:0 0 auto;height:var(--bk-tab-h, auto);
  overflow:hidden;white-space:nowrap;text-overflow:ellipsis;
  transition:background-color .15s, color .15s, box-shadow .15s}
/* Invierte al pasar, como los .action-hover del panel. El inset le deja el borde del color de la
   solapa: sin él, invertida se confunde con la hoja. */
.book-idx-tab:hover{
  background:var(--bk-fondo, #fff);
  color:var(--bk-texto, #111);
  box-shadow:0 0 0 2px var(--bk-texto, #111) inset}
/* Los controles −/+: horizontales y chiquitos, para que no se lean como un capítulo más. El "−" va
   arriba (tanda anterior) y el "+" abajo (tanda siguiente). Mismos colores invertidos que la solapa.
   Redondeados del lado de ADENTRO (izquierda) y rectos contra el canto — igual que las solapas, que
   quedan así por el rotate(180deg) —, si no se ven "al revés" respecto de ellas.
   visibility:hidden de base: reservan su lugar (para el alto uniforme) sin verse. Solo aparecen con
   la clase .on Y sobre la portada ACTIVA; así no se filtran sobre las otras hojas, que heredan el
   visibility:hidden de la portada apagada (antes el JS les ponía visibility:visible inline, que le
   ganaba a ese hidden heredado y los dejaba colgados en cada hoja). */
.book-idx-nav{writing-mode:horizontal-tb;transform:none;border:0;cursor:pointer;visibility:hidden;
  font-size:.8em;letter-spacing:0;font-weight:700;line-height:1;padding:.3em .7em;
  background:var(--bk-texto, #111);color:var(--bk-fondo, #fff);border-radius:6px 0 0 6px;
  transition:background-color .15s, color .15s, box-shadow .15s}
.book-portada.bk-actual .book-idx-nav.on{visibility:visible}
.book-idx-nav:hover{background:var(--bk-fondo, #fff);color:var(--bk-texto, #111);
  box-shadow:0 0 0 2px var(--bk-texto, #111) inset}
/* Impreso: la portada NO lleva el índice de solapas. En papel no se clickea, tapa el margen y no
   suma nada (para ubicarse ya están las pestañas de capítulo .book-cap de cada hoja, que SÍ van —
   son otro elemento y esta regla no las toca). El !important le gana al reparto en tandas. */
@media print{
  .book-idx{display:none !important}
}

/* Arriba pero DEBAJO del logo: `top` en em (no en %) para que se mida contra la misma escala que
   el logo (max-height:2.5em desde top:.9em, o sea que termina en ~3.4em). En % dependería del
   alto de la hoja y en una pantalla baja se le montaría encima. */
.book-cap{position:absolute;top:5.6em;right:0;z-index:2;
  writing-mode:vertical-rl;transform:rotate(180deg);transform-origin:center;
  font-size:.62em;letter-spacing:.18em;text-transform:uppercase;font-weight:700;
  padding:.9em .55em;
  /* INVERTIDA: fondo del color de la LETRA del catálogo, letra del color del FONDO. Los dos salen
     de Apariencia → Catálogo, así que la pestaña sigue tu paleta sola.
     Con var y no currentColor: currentColor tomaría el `color` de esta misma regla y fondo y letra
     saldrían iguales — un bloque de color sin texto.
     Sin opacity: mezclaba la pestaña con el fondo y en una hoja clara no se leía. */
  background:var(--bk-texto, #111);
  color:var(--bk-fondo, #fff);
  /* Redondeada del lado del BORDE (derecha) y recta hacia adentro: así se lee como una pestaña
     pegada al canto de la hoja, no como una etiqueta suelta apuntando al contenido. */
  border-radius:0 6px 6px 0;pointer-events:none;
  max-height:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media(max-width:640px){ .book-cap{font-size:.55em;padding:.7em .35em} }
/* Grilla tipo libro: llena la página IZQUIERDA primero y luego la derecha (grid-auto-flow:column).
   Columnas/filas fijas según cantidad por página; en pantallas chicas achica todo, no reflowea. */
/* Grillas: 2 → 1 col × 2 filas · 4 → 2×2 · 9 → 3×3. Van SIEMPRE completas: si la hoja no llega
   a la cantidad, las celdas que faltan quedan vacías (solo puede pasar en la última). Así el
   artículo mide igual en todas las hojas.
   Sin grid-auto-flow:column: eso era para llenar primero la página izquierda del pliego, que
   ya no existe; ahora se lee de corrido. */
.book-grid{position:relative;z-index:1;flex:1;min-height:0;display:grid;align-items:stretch}
/* La letra acompaña la densidad. Importa MÁS de lo que parece: la foto se lleva "lo que sobra"
   del ítem (.book-img{flex:1}), así que si el texto no achica al apretar la grilla, la foto se
   queda en cero y DESAPARECE (fue lo que pasó con la grilla de 8). */
.book-grid[data-per="2"]{grid-template-columns:1fr;grid-template-rows:repeat(2,1fr);
  gap:1.1em 1em;font-size:.88em}
.book-grid[data-per="4"]{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);
  gap:1.4em 1em;font-size:.72em}
.book-grid[data-per="9"]{grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);
  gap:.85em .55em;font-size:.5em}
.book-grid[data-per="9"] .book-desc{display:none}
/* Con 3 columnas las fotos se tocan de una a otra: aire propio dentro de cada ítem. Va acá y
   no en el gap para que el respiro sea del contenido y no solo entre celdas. */
.book-grid[data-per="9"] .book-item{padding:0 .9em}
.book-item{min-width:0;min-height:0;display:flex;flex-direction:column;overflow:visible;text-align:center}
/* Separador suave entre filas. La clase la pone catalogo.php y SOLO si abajo hay otra fila con
   artículos: en la última no va, para no cerrar la hoja con una raya suelta.
   Pseudo-elemento y no border-bottom: así se mete hacia adentro (12% a cada lado) y queda como
   un <hr> centrado en vez de una línea de borde a borde. currentColor para que siga el color
   de letra del catálogo, que es configurable. */
.book-item.con-sep{position:relative;padding-bottom:.75em}
.book-item.con-sep::after{content:'';position:absolute;left:12%;right:12%;bottom:0;height:1px;
  background:currentColor;opacity:.16;pointer-events:none}
/* La imagen manda: ocupa casi todo el alto del ítem. min-height:45% es su PISO: como se lleva
   "lo que sobra" (flex:1), sin ese piso un nombre largo (ahora el título no se trunca) la
   reduciría a nada y la foto desaparecería. */
.book-img{position:relative;flex:1;min-height:45%;display:flex;align-items:center;justify-content:center;margin-bottom:.8em}
/* La sombra va en la <img> y no en .book-img: el contenedor ocupa toda la celda, así que la
   sombra caería en el aire. La imagen, en cambio, se achica a su propio tamaño (max-width /
   max-height sobre un elemento con proporción propia), así el borde de la sombra es el de la foto. */
.book-foto{max-width:100%;max-height:100%;object-fit:contain;display:block;cursor:zoom-in;
  box-shadow:0 .5em 1.4em rgba(0,0,0,.45)}
.book-mark{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);max-width:42%;max-height:42%;opacity:.15;pointer-events:none;filter:grayscale(.2)}
/* Precio + WhatsApp en la misma línea, centrados */
.book-precio-row{display:flex;align-items:flex-end;justify-content:center;gap:.5em;margin:.05em 0 .1em}
.book-precio-wrap{display:inline-block}
.book-wa{width:1.9em;height:1.9em;flex:none;border-radius:50%;color:inherit;display:inline-flex;align-items:center;justify-content:center;
  background:color-mix(in srgb, currentColor 14%, transparent);border:1px solid color-mix(in srgb, currentColor 45%, transparent);
  font-size:.9em;text-decoration:none;transition:transform .15s,background .12s}
.book-wa:hover{transform:translateY(-2px);color:inherit;background:color-mix(in srgb, currentColor 28%, transparent)}
/* Hermano del WhatsApp: mismo círculo, mismo tamaño, mismo hover. Hereda el color de la hoja
   (currentColor) como todo el catálogo, así sigue al fondo que configures. */
/* "Desde" del Base: discreto, no compite con el precio. */
.book-desde{font-size:.62em;text-transform:uppercase;letter-spacing:.08em;opacity:.7;margin-right:.15em}
.book-cart{width:1.9em;height:1.9em;flex:none;border-radius:50%;color:inherit;
  display:inline-flex;align-items:center;justify-content:center;
  background:color-mix(in srgb, currentColor 14%, transparent);
  border:1px solid color-mix(in srgb, currentColor 22%, transparent);
  font-size:.9em;text-decoration:none;cursor:pointer;padding:0;
  transition:transform .15s,background .12s}
.book-cart:hover{transform:translateY(-2px);color:inherit;background:color-mix(in srgb, currentColor 28%, transparent)}
/* Confirmación de que entró al carrito, sin sacarte de la hoja. */
.book-cart.added{background:color-mix(in srgb, #1c7a3f 55%, transparent);border-color:transparent;color:#fff}
/* En papel no se puede tocar: fuera, igual que el WhatsApp de cada artículo. */
@media print{ .book-cart{display:none !important} }

/* ---- Modal de compra del catálogo ----
   Propio y no el lightbox: aquel es fondo negro para mirar fotos. Este es una tarjeta blanca con
   un formulario, y NO hereda los colores del catálogo (currentColor): es una capa del sitio, no
   una hoja del libro — con un catálogo de fondo oscuro, el texto se perdería. */
.shop-modal{position:fixed;inset:0;z-index:1200;display:flex;align-items:center;justify-content:center;
  background:rgba(15,23,42,.55);padding:1rem}
.shop-modal[hidden]{display:none}
.shop-abierto{overflow:hidden}
.shop-box{position:relative;background:#fff;color:var(--tinta);border-radius:14px;
  max-width:640px;width:100%;max-height:88vh;overflow:auto;
  box-shadow:0 18px 50px rgba(0,0,0,.35)}
.shop-close{position:absolute;top:.4rem;right:.6rem;z-index:2;background:none;border:0;
  font-size:1.8rem;line-height:1;color:var(--suave);cursor:pointer;padding:.2rem .4rem}
.shop-close:hover{color:var(--tinta)}
.shop-cargando{padding:3rem;text-align:center;color:var(--suave);font-size:1.4rem}
.shop-cont{display:flex;gap:1.2rem;padding:1.4rem}
.shop-img{width:40%;max-width:230px;aspect-ratio:1;object-fit:contain;border-radius:10px;
  background:#f7f8fa;flex:none}
.shop-datos{flex:1;min-width:0;display:flex;flex-direction:column;gap:.6rem}
.shop-tit{margin:0;font-size:1.1rem;line-height:1.3;padding-right:1.5rem}
.shop-desc{margin:0;font-size:.88rem;color:var(--suave);line-height:1.45}
.shop-lbl{display:block;font-size:.78rem;color:var(--suave);font-weight:600;margin-bottom:.25rem}
.shop-sel{width:100%;padding:.5rem .6rem;border:1px solid var(--linea);border-radius:8px;
  font-size:.92rem;background:#fff;color:var(--tinta)}
.shop-precio{font-size:1.5rem;font-weight:700;color:var(--marca)}
.shop-nota{margin:.6rem 0 .2rem}
.shop-nota-txt{width:100%;padding:.45rem .6rem;border:1px solid var(--linea);border-radius:8px;
  font-size:.9rem;background:#fff;color:var(--tinta);resize:vertical;min-height:2.4rem;font-family:inherit}
.shop-pie{display:flex;align-items:center;gap:.7rem;flex-wrap:wrap;margin-top:auto}
.shop-cant{display:inline-flex;align-items:center;border:1px solid var(--linea);border-radius:999px;overflow:hidden}
.shop-cant-btn{width:34px;height:34px;border:0;background:#fff;color:var(--tinta);
  font-size:1.1rem;line-height:1;cursor:pointer}
.shop-cant-btn:hover{background:rgba(0,0,0,.05)}
/* Sin spinners del navegador: al lado de los botones - / + son ruido y desalinean la caja. */
.shop-cant input{width:44px;height:34px;border:0;text-align:center;font-size:.95rem;
  color:var(--tinta);-moz-appearance:textfield}
.shop-cant input::-webkit-outer-spin-button,.shop-cant input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.shop-add{display:inline-flex;align-items:center;gap:.45rem;background:var(--marca);color:#fff;
  border:0;border-radius:999px;padding:.6rem 1.3rem;font-weight:600;font-size:.95rem;cursor:pointer;
  transition:background .12s,transform .12s}
.shop-add:hover:not(:disabled){background:var(--marca-osc);transform:translateY(-2px)}
.shop-add:disabled{opacity:.5;cursor:not-allowed}
.shop-add.added{background:#1c7a3f}
.shop-aviso{margin:0;font-size:.8rem;color:var(--peligro);font-weight:600}
@media(max-width:560px){
  .shop-cont{flex-direction:column;padding:1.1rem}
  .shop-img{width:100%;max-width:none;aspect-ratio:16/10}
}
@media print{ .shop-modal{display:none !important} }
@media(prefers-reduced-motion:reduce){ .shop-add:hover:not(:disabled){transform:none} }

/* ---- Modales de aviso (Configuración → Mensajes: bienvenida, checkout) ----
   UN solo juego de clases para todos: lo que cambia entre un aviso y otro son los colores, y esos
   los pone configuración inline (son datos, no diseño de la hoja). Por eso la ✕ y los links van con
   currentColor: sobre un fondo oscuro elegido por el cliente, un gris fijo desaparecía. */
.aviso-modal{position:fixed;inset:0;z-index:1300;display:flex;align-items:center;justify-content:center;
  background:rgba(15,23,42,.6);padding:1rem}
.aviso-modal[hidden]{display:none}
.aviso-abierto{overflow:hidden}
/* El que scrollea es .aviso-cont, NO la caja: el ✕ está absolute respecto de la caja, así que si la
   caja fuera el scroller un mensaje alto (una imagen grande) se lo llevaría fuera de la vista justo
   cuando el cliente baja a leer el final. Con flex + min-height:0 el ✕ queda clavado en la esquina. */
/* Padding PAREJO en los cuatro lados. Antes arriba llevaba 2.1rem contra 1.7/1.8 del resto: eran
   0.4rem reservados para que el ✕ no pisara el contenido, y con una imagen a todo el ancho el marco
   de color se veía más grueso arriba que abajo. El ✕ es absolute (fuera del flujo), así que no
   necesita que nadie le haga lugar: flota en la esquina y el marco queda simétrico. */
.aviso-box{position:relative;width:100%;border-radius:16px;padding:1.7rem;
  max-height:88vh;display:flex;flex-direction:column;text-align:center;
  box-shadow:0 18px 50px rgba(0,0,0,.4);animation:aviso-in .22s ease-out}
/* Absolute respecto de la CAJA (que no scrollea) y no de .aviso-cont (que sí): así queda fijo en la
   esquina mientras el cliente baja a leer el final de un mensaje largo. */
.aviso-close{position:absolute;top:.15rem;right:.4rem;z-index:2;background:none;border:0;
  font-size:1.9rem;line-height:1;color:currentColor;opacity:.55;cursor:pointer;padding:.1rem .35rem}
.aviso-close:hover{opacity:1}
/* La caja recibe el foco al abrir (ver aviso_modal.php) y no es un control: su anillo de foco sería
   un recuadro que el visitante no pidió. El del ✕ NO se toca — cuando se llega ahí con Tab, el
   anillo es justamente lo que dice dónde estás parado. */
.aviso-box:focus{outline:none}
.aviso-cont{font-size:1rem;line-height:1.5;overflow:auto;min-height:0}
/* El editor siempre envuelve en <p>: sin esto la caja queda con un aire de más arriba y abajo. */
.aviso-cont>:first-child{margin-top:0}
.aviso-cont>:last-child{margin-bottom:0}
.aviso-cont a{color:inherit;text-decoration:underline}
.aviso-cont img{max-width:100%;height:auto}
@keyframes aviso-in{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){ .aviso-box{animation:none} }
@media print{ .aviso-modal{display:none !important} }
/* Miniaturas: montadas sobre el borde izquierdo de la foto (más adentro que afuera), circulares, con sombra marcada.
   La posición (left/top) la calcula el JS según el ancho real de cada foto centrada. */
.book-thumbs{position:absolute;transform:translateX(-40%);display:flex;flex-direction:column;gap:.35em;z-index:3}
.book-thumb{width:1.9em;height:1.9em;border-radius:50%;border:2px solid rgba(255,255,255,.95);
  background-size:cover;background-position:center;background-repeat:no-repeat;padding:0;
  cursor:pointer;box-shadow:0 4px 12px rgba(0,0,0,.5);transition:transform .12s}
.book-thumb:hover{transform:scale(1.18)}
/* Miniaturas de más: se ocultan para no tapar la foto, pero siguen en el DOM y el lightbox
   las recorre (arma su lista con querySelectorAll, que también ve las ocultas). */
.book-thumb-oculta{display:none}
/* El "+N" NO es un botón aparte: ES la foto siguiente, dibujada como contador. Por eso lleva
   su data-full y el lightbox no la duplica. Abrirlo entra justo en esa foto. */
.book-thumb-mas{background:rgba(20,25,30,.72);color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:.62em;font-weight:700;line-height:1;letter-spacing:-.02em}
.book-thumb-mas:hover{background:rgba(20,25,30,.88)}
/* ===== Catálogo en PDF: lo genera el navegador al imprimir =====
   En pantalla las hojas están APILADAS (absolute + visibility) y solo se ve una. Para el PDF hay
   que desapilarlas, que ocupen una página cada una y cortar entre medio. Se hace con el motor del
   navegador y no con una librería PHP porque el catálogo usa grid/flex/container queries: mPDF no
   los soporta y habría que mantener un segundo diseño. Así el PDF sale igual a la pantalla.
   Para que salgan los fondos y las fotos, el usuario tiene que dejar tildado "Gráficos de fondo"
   en el diálogo de impresión (Chrome lo trae en "Más configuraciones"). */
@page{size:A4 portrait;margin:0}
@media print{
  /* Fuera todo lo que no es el libro. Los flotantes (position:fixed) importan especialmente:
     además de ensuciar, varios navegadores los REPITEN en cada página del PDF. */
  .top,.pie,.book-nav,.loader{display:none !important}
  .fab-wa,.fab-top,.pub-toast,.book-lb,.img-modal,.cat-arbol{display:none !important}
  body.tienda{background:#fff !important;margin:0}
  .contenido{padding:0 !important;margin:0 !important;max-width:none !important}

  /* El libro deja de ser un visor de una hoja y pasa a ser la lista completa. */
  .book{max-width:none !important;width:100%;margin:0;--bk-alto-libre:0px}
  .book-visor{aspect-ratio:auto !important;overflow:visible !important;
    border-radius:0 !important;box-shadow:none !important;perspective:none !important}
  .book-tira{position:static !important;height:auto !important;perspective:none !important}

  /* Cada hoja = una página. visibility:visible pisa el apilado; las animaciones se anulan
     (si quedara una a medias, la hoja saldría girada o transparente en el PDF).
     ⚠️ position:RELATIVE, no static: la hoja tiene hijos `absolute` (el logo de la esquina y el
     "Powered by"). Con static la hoja deja de ser su ancestro posicionado y esos hijos se anclan
     al contenedor de arriba: TODOS los logos terminaban apilados en la esquina de la PRIMERA
     página del PDF, y las hojas salían sin ninguno. relative también entra en el flujo normal
     (que es lo que se buscaba al sacar el absolute del apilado en pantalla). */
  .book-pagina{position:relative !important;visibility:visible !important;
    width:100%;height:100vh;break-after:page;page-break-after:always;
    z-index:auto !important;opacity:1 !important;transform:none !important;animation:none !important;
    border-radius:0 !important;
    -webkit-print-color-adjust:exact;print-color-adjust:exact}
  .book-pagina:last-child{break-after:auto;page-break-after:auto}

  /* La foto pierde la sombra (en papel ensucia) y las miniaturas no van: en el PDF no hay
     lightbox que abrir, así que solo taparían la imagen. */
  .book-foto{box-shadow:none !important}
  .book-thumbs{display:none !important}
  /* El WhatsApp de cada artículo es solo un ícono, sin número: en papel no se puede tocar y
     solo le roba lugar al precio. El de la portada/contratapa SÍ queda: ese muestra el número
     escrito, que es justamente cómo te contactan desde un PDF impreso. */
  .book-wa{display:none !important}
}

/* Lightbox */
.book-lb{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.86);padding:2rem}
.book-lb[hidden]{display:none}
.book-lb-img{max-width:92vw;max-height:88vh;object-fit:contain;border-radius:10px;box-shadow:0 12px 48px rgba(0,0,0,.5)}
.book-lb-close{position:absolute;top:14px;right:22px;background:none;border:0;color:#fff;
  font-size:2.6rem;line-height:1;cursor:pointer}
.book-lb-nav{position:absolute;top:50%;transform:translateY(-50%);background:rgba(255,255,255,.16);
  border:0;color:#fff;width:52px;height:52px;border-radius:50%;font-size:1.3rem;cursor:pointer}
.book-lb-nav:hover{background:rgba(255,255,255,.3)}
.book-lb-nav.prev{left:18px}
.book-lb-nav.next{right:18px}
@media(max-width:560px){.book-lb-nav{width:44px;height:44px}}
/* Texto compacto (em: escala con el zoom de la página); la imagen es la protagonista */
/* Peso 600/700 y no 800: en catálogo el bold pleno satura, sobre todo con la grilla de 9.
   El precio queda un escalón por encima del título para que siga siendo lo que más pesa.
   SIN line-clamp: el nombre se lee entero, nunca con "...". Lo que lo hace posible es el
   min-height de .book-img: si no, un título largo le comería el alto a la foto (flex:1). */
.book-title{font-size:.95em;font-weight:600;margin:0 0 .1em;line-height:1.15;overflow-wrap:anywhere}
.book-rule{width:2.2em;height:.12em;background:currentColor;opacity:.4;border:0;margin:.06em auto .28em}
.book-desc{font-size:.74em;line-height:1.25;margin:0 0 .28em;opacity:.9;
  display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}
.book-precio{font-size:1.2em;font-weight:700;display:block;line-height:1;margin-bottom:.1em}
.book-cod{font-size:.64em;opacity:.7}
.book-nav{display:flex;align-items:center;justify-content:center;gap:1.3rem;margin:1.3rem 0 2.2rem}
.book-nav button{border:none;background:var(--marca);color:#fff;width:48px;height:48px;border-radius:50%;
  font-size:1.05rem;cursor:pointer;transition:transform .12s}
.book-nav button:hover:not(:disabled){transform:translateY(-2px)}
.book-nav button:disabled{opacity:.3;cursor:default}
.book-cont{font-weight:700;color:var(--suave);min-width:82px;text-align:center}

/* Link "Catálogo" en el header público */
.top-link{display:inline-flex;align-items:center;gap:.4rem;background:var(--marca);color:#fff;
  padding:.5rem .9rem;border-radius:999px;font-weight:600;font-size:.9rem;text-decoration:none;white-space:nowrap;transition:transform .12s}
.top-link:hover{transform:translateY(-2px);color:#fff}


/* Precio con descuento: original tachado */
.precio-antes,.book-antes{text-decoration:line-through;opacity:.55;font-size:.82em;margin-right:.4rem;font-weight:600}
.precio-bloque{margin:.6rem 0 1rem}

/* Solapas del form de producto */
.pf-content{padding-top:1.3rem}

/* Desglose de stock en el listado admin */
.stock-detalle{display:block;font-size:.72rem;color:var(--suave);font-weight:400;margin-top:.1rem}

/* Árbol de categorías (Parámetros) */
.cat-tree{font-size:.92rem;border:1px solid var(--linea);border-radius:8px;overflow:hidden}
.cat-box{border:1px solid var(--linea,#e4e8ee);border-radius:10px;margin-bottom:.8rem;overflow:hidden;background:#fff}
.cat-box:last-child{margin-bottom:0}
.cat-nodo{display:flex;align-items:center;gap:.5rem;padding:.4rem .6rem;border-bottom:1px solid #eef0f3;background:#fff}
.cat-nodo:last-child{border-bottom:0}
.cat-nodo.cat-raiz{background:#f4f6f8;border-bottom:1px solid var(--linea,#e4e8ee)}
.cat-nodo.cat-raiz .cat-nombre{color:var(--marca);font-size:1rem}
.cat-nombre{font-weight:600}
.cat-tipo{font-size:.68rem;padding:.1rem .5rem;border-radius:999px;text-transform:uppercase;letter-spacing:.03em}
.cat-tipo.hoja{background:#e9f6ec;color:#1e7e34}
.cat-tipo.cont{background:#eef2f6;color:#5b6b78}
.cat-acc{margin-left:auto;display:flex;gap:.15rem;align-items:center}
.cat-edit,.cat-addsub{padding:.5rem .6rem;background:rgba(0,0,0,.022);border-bottom:1px solid var(--linea)}

/* Árbol de selección de categorías en el form de producto */
.cat-sel-box{border:1px solid var(--linea);border-radius:8px;padding:.6rem .8rem;max-height:420px;overflow:auto}
.cat-sel,.cat-sel ul{list-style:none;margin:0;padding:0}
.cat-sel ul{padding-left:1.1rem;border-left:1px dashed var(--linea);margin-left:.3rem}
.cat-sel li{margin:.15rem 0}
.cat-sel-cont{font-weight:700;color:var(--suave);font-size:.9rem}

/* Árbol COLAPSABLE (Parámetros y form de producto): caret ▶/▼, todo cerrado al inicio.
   El nodo hoja usa un espaciador del mismo ancho que el caret para que quede alineado. */
.cat-collapsed{display:none !important}
.cat-caret{border:0;background:transparent;cursor:pointer;padding:0;width:1.1rem;height:1.1rem;flex:0 0 1.1rem;color:var(--suave);font-size:.7rem;line-height:1.1;text-align:center}
.cat-caret::before{content:'\25B6'}                 /* ▶ colapsado */
.cat-caret.cat-open{color:var(--marca)}
.cat-caret.cat-open::before{content:'\25BC'}        /* ▼ abierto */
.cat-caret-sp{display:inline-block;width:1.1rem;flex:0 0 1.1rem}
.cat-sel-cont .cat-caret{margin-right:.2rem;vertical-align:middle}
.cat-children{background:transparent}
/* Resaltado breve del nodo recién dado de alta/editado (foco tras el POST). Usa un box-shadow
   interior para teñir la fila sin pelear con el fondo propio de .cat-raiz. */
.cat-nodo.cat-foco{animation:catFoco 2.2s ease-out}
@keyframes catFoco{0%,35%{box-shadow:inset 0 0 0 999px rgba(74,150,230,.20)}100%{box-shadow:none}}

/* Escalas (Base/Fijo) en Parámetros */
.esc-bloque{border:1px solid var(--linea);border-radius:8px;padding:.7rem .9rem;margin-bottom:1rem}
.esc-head{display:flex;align-items:center;gap:.7rem}
.esc-nombre{font-weight:700;font-size:1.02rem}
.esc-acc{margin-left:auto;display:flex;gap:.2rem;align-items:center}
.esc-edit{margin-top:.6rem}
.esc-valores{margin-top:.6rem}
.esc-valadd{margin-top:.4rem}

/* Listado: fila de artículo Fijo bajo su Base */
.fila-hijo > td{background:rgba(0,0,0,.025)}
.fila-hijo .hijo-flecha{color:var(--suave);margin-right:.15rem}
.badge.tipo-base{background:#6d28d9;color:#fff}
.badge.tipo-fijo{background:#0e7490;color:#fff}
.base-toggle i{transition:transform .15s ease}
.base-toggle.abierto i{transform:rotate(90deg)}

/* Tienda: card de Base (variantes / desde) + estado de stock */
.card-img{position:relative;overflow:hidden}
.card-variantes{position:absolute;top:.5rem;left:.5rem;background:rgba(20,20,20,.72);color:#fff;font-size:.68rem;font-weight:600;padding:.15rem .5rem;border-radius:20px;backdrop-filter:blur(2px)}
.precio-desde .desde{font-size:.72rem;color:var(--suave);text-transform:uppercase;letter-spacing:.05em;margin-right:.2rem}
/* Banda "Agotado" — cinta diagonal en la esquina, roja muted, delicada */
.card.agotado .card-img img{filter:grayscale(.55);opacity:.85}
.card-band{position:absolute;top:13px;right:-38px;transform:rotate(45deg);background:rgba(150,66,60,.9);color:#fff;font-size:.66rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;padding:.24rem 3rem;box-shadow:0 1px 5px rgba(0,0,0,.2);z-index:2}
.det-band{top:22px;right:-46px;font-size:.8rem;padding:.3rem 3.6rem}
.galeria-main{position:relative;overflow:hidden}
.galeria-main.agotado img{filter:grayscale(.5);opacity:.9}

/* Estado de stock (badge de texto) — solo "Agotado", rojo muted */
.stock-estado{display:inline-block;font-size:.72rem;font-weight:700;padding:.1rem .5rem;border-radius:20px;vertical-align:middle}
.stock-estado.agotado{background:#f0e3e2;color:#9b4a44}

/* Variantes en la ficha del Base */
.variantes{margin-top:1rem}
.variantes-tit{font-size:1rem;margin:0 0 .5rem}
.variantes-tabla{width:100%;border-collapse:collapse}
.variantes-tabla td{padding:.55rem .5rem;border-top:1px solid var(--linea);vertical-align:middle}
.variantes-tabla .v-nom small{color:var(--suave);display:inline-block;margin-left:.3rem}
.variantes-tabla .v-precio{text-align:right;white-space:nowrap}
.variantes-tabla .v-wa{text-align:right;width:1%;white-space:nowrap}
.variantes-tabla .v-img{width:56px;padding-right:0}
.variantes-tabla .v-img img{width:44px;height:44px;max-width:none;object-fit:cover;border-radius:6px;border:1px solid var(--linea)}
.variantes-tabla tr.v-agotado{opacity:.55}
.btn-wa-sm{padding:.3rem .7rem;font-size:.82rem}
.btn-wa-ico{padding:.4rem .55rem;border-radius:8px}
.btn-wa-ico i{margin:0}

/* Leyenda "+ IVA" cuando la tienda muestra precios netos */
.iva-nota{color:var(--suave);font-weight:600;font-size:.7em;white-space:nowrap}

/* Carrito: badge en el header */
.top-carrito{position:relative}
.cart-badge{position:absolute;top:-6px;right:-6px;background:#fff;color:var(--marca);font-size:.7rem;font-weight:700;
  min-width:18px;height:18px;line-height:18px;text-align:center;border-radius:999px;padding:0 4px;border:1px solid var(--marca)}
/* En mobile el badge sale de la píldora y queda suelto sobre el header, así que se invierte: el
   fondo es el color de las LETRAS del menú y el número el fondo del menú. Antes era var(--marca)
   —el color de los botones, no el del header— y quedaba de un tono distinto al link de al lado. */
@media(max-width:991px){ .cart-badge{position:static;margin-left:auto;
  background:var(--menu-txt);color:var(--menu-a);border-color:transparent} }
.add-cart.added{background:#1a7f37 !important}

/* Botón "Agregar al carrito" con cantidad (ficha de producto) */
.pf-add{display:flex;gap:.6rem;align-items:stretch;margin:.6rem 0 1.4rem;flex-wrap:wrap}
.pf-add .btn-wa{margin:0;display:inline-flex;align-items:center}
.pf-add .qty-input{margin:0;height:auto}
.qty-input{width:70px;padding:.5rem;border:1px solid var(--linea);border-radius:8px;font-size:1rem;text-align:center}
.pf-add .btn-cuenta{margin-top:0;border-radius:10px}

/* Página del carrito */
/* Tarjeta blanca a 1500, como el resto. Antes eran 820px sin fondo: el contenido flotaba suelto
   sobre el degradé de la página. El margin:auto SÍ va: en la tienda el contenido va centrado
   (no hay barra lateral que lo alinee, como en el panel). */
.carrito-wrap{max-width:1500px;margin:1.4rem auto;padding:1.5rem;
  background:#fff;border:1px solid var(--linea);border-radius:var(--radio);
  box-shadow:0 6px 18px rgba(20,40,60,.06)}
.carrito-tit{color:var(--marca);margin:0 0 1.2rem}
@media(max-width:640px){ .carrito-wrap{margin:1rem .6rem;padding:1rem} }
.carrito-vacio{color:var(--suave)}.carrito-vacio a{color:var(--marca)}
.carrito-lista{display:flex;flex-direction:column;gap:.6rem}
.ci{display:flex;align-items:center;gap:.8rem;padding:.7rem;border:1px solid var(--linea);border-radius:10px}
.ci-img-link{flex:none;display:block;line-height:0}
.ci-img{width:56px;height:56px;object-fit:cover;border-radius:8px;flex:none;background:#fff;cursor:pointer}
.ci-info{flex:1;min-width:0}
.ci-nom{font-weight:600}.ci-cod{color:var(--suave);font-size:.82rem}.ci-precio{color:var(--suave);font-size:.82rem}
.ci-nota{width:100%;max-width:32rem;margin-top:.35rem;padding:.35rem .5rem;border:1px solid var(--linea);
  border-radius:6px;font-size:.82rem;color:var(--tinta);background:#fff;resize:vertical;min-height:2rem;font-family:inherit}
.ped-det-obs{color:#6b7280;font-style:italic}
.ci-cant{display:flex;align-items:center;gap:.2rem}
.ci-cant button{width:30px;height:30px;border:1px solid var(--linea);background:#fff;border-radius:8px;cursor:pointer;font-size:1.1rem;line-height:1}
.ci-qty{width:52px;height:30px;text-align:center;border:1px solid var(--linea);border-radius:8px}
.ci-sub{width:110px;text-align:right;font-weight:600;white-space:nowrap}
.ci-del{background:none;border:none;color:var(--peligro);font-size:1.4rem;cursor:pointer;line-height:1;padding:0 .2rem}
.carrito-pie{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;margin-top:1.2rem;padding-top:1rem;border-top:2px solid var(--linea)}
.carrito-total{font-size:1.2rem}
.carrito-desglose{min-width:220px}
.carrito-desglose>div{display:flex;justify-content:space-between;gap:1.5rem;padding:.2rem 0;color:var(--suave)}
.carrito-desglose .dsg-total{border-top:1px solid var(--linea);margin-top:.3rem;padding-top:.4rem;color:inherit;font-size:1.2rem}
.carrito-desglose b{color:#20303c}
.carrito-acc{display:flex;gap:.6rem;flex-wrap:wrap}
@media(max-width:600px){
  .ci{flex-wrap:wrap}.ci-info{flex:1 0 60%}.ci-sub{width:auto}
  .carrito-acc{width:100%}.carrito-acc .btn-cuenta{flex:1;text-align:center}
}

/* Checkout */
/* Misma tarjeta que el carrito: es el paso siguiente y tienen que leerse como la misma pieza. */
.checkout-wrap{max-width:1500px;margin:1.4rem auto;padding:1.5rem;
  background:#fff;border:1px solid var(--linea);border-radius:var(--radio);
  box-shadow:0 6px 18px rgba(20,40,60,.06)}
/* El contenido NO se estira a 1500: es un formulario y una lista de ítems, y a esa distancia los
   campos quedan desparramados y el ojo se pierde de una punta a la otra. La tarjeta da el marco;
   adentro el contenido sigue en su ancho legible, como en el carrito. */
.checkout-wrap > *{max-width:820px;margin-left:auto;margin-right:auto}
@media(max-width:640px){ .checkout-wrap{margin:1rem .6rem;padding:1rem} }
.checkout-cliente{background:#fff;border:1px solid var(--linea);border-radius:10px;padding:.9rem 1rem;margin-bottom:1rem;line-height:1.5}
.checkout-tabla{width:100%;border-collapse:collapse;margin-bottom:1rem}
.checkout-tabla td{padding:.55rem .3rem;border-top:1px solid var(--linea)}
.checkout-tabla .num{text-align:right;white-space:nowrap}
.checkout-tabla tfoot td{border-top:2px solid var(--linea);font-size:1.05rem}
.checkout-coment{display:block;font-size:.85rem;color:var(--suave);font-weight:600;margin-bottom:1rem}
.checkout-coment textarea,.checkout-coment select{display:block;width:100%;margin-top:.3rem;padding:.6rem .7rem;border:1px solid var(--linea);border-radius:8px;font-family:inherit;font-size:.95rem;resize:vertical;background:#fff;color:inherit}
.checkout-datos-falta{text-align:center;background:#fff;border:1px solid var(--linea);border-radius:12px;padding:1.6rem}
.checkout-ok{text-align:center;background:#fff;border:1px solid var(--linea);border-radius:12px;padding:1.6rem}
.btn-wa-grande{background:var(--wa) !important;color:#fff;font-size:1.05rem;padding:.8rem 1.6rem;margin:.6rem 0}
.btn-wa-grande:hover{background:#1fb457 !important}
.checkout-links{margin-top:1rem;font-size:.9rem}.checkout-links a{color:var(--marca)}
/* Métodos de pago (checkout) */
.checkout-metodo-tit{font-size:.9rem;font-weight:700;color:var(--suave);margin:.4rem 0 .2rem}
.btn-mp{background:#009ee3 !important;color:#fff;font-size:1.02rem;padding:.8rem 1.4rem;margin:.5rem 0}
.btn-mp:hover{background:#0089c7 !important}
.btn-wa-checkout{background:var(--wa) !important;color:#fff;font-size:1.02rem;padding:.8rem 1.4rem;margin:.5rem 0}
.btn-wa-checkout:hover{background:#1fb457 !important}
/* Página de estado del pago (retorno de Mercado Pago) */
.pago-estado{text-align:center;background:#fff;border:1px solid var(--linea);border-radius:12px;padding:1.8rem 1.4rem}
.pago-ico{font-size:3.4rem;line-height:1;margin-bottom:.6rem}
.pago-ico.ok{color:#2e9e4f}.pago-ico.pend{color:#e0a800}.pago-ico.err{color:#d64545}
/* Estados de pedido (badge) + filas de detalle (admin y cuenta del cliente) */
.ped-badge{display:inline-block;padding:.12rem .55rem;border-radius:11px;font-size:.72rem;font-weight:700;white-space:nowrap}
.ped-badge.ok{background:#d8f3e0;color:#1c7a3f}
.ped-badge.pend{background:#fdf0cf;color:#8a6d1a}
.ped-badge.err{background:#fbdcdc;color:#a62b2b}
.ped-badge.nuevo{background:#dfe9fb;color:#2b4a8a}
.ped-badge.cta{background:#e9e2f7;color:#5a3a8a}
.ped-pdf{color:#b23b3b;font-size:1.05rem}.ped-pdf:hover{color:#8a2a2a}
.ped-ver{background:none;border:0;cursor:pointer;color:inherit;padding:.1rem .25rem}
.ped-ver:hover{color:var(--marca)}
.ped-det-tabla{width:100%;border-collapse:collapse;font-size:.88rem}
.ped-det-tabla td,.ped-det-tabla th{padding:.28rem .4rem;border-bottom:1px solid var(--linea,#eee)}
/* Propia y no heredada: el detalle vivía anidado adentro de .tabla (panel) y de .cuenta-pedidos
   (cuenta), y le llegaba el alineado por descendencia. Ahora vive en el modal, fuera de las dos. */
.ped-det-tabla .num{text-align:right;white-space:nowrap}
/* Cobro dentro del detalle del pedido (solo el panel: el cliente no marca cobrado). Mismo box que
   el de despacho, para que se lean como dos acciones hermanas — pero sin campos: es un solo botón. */
.ped-cobro{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem;margin:0 0 .7rem;
  padding:.55rem .6rem;border:1px solid var(--linea,#eee);border-radius:8px;background:#fafbfc}
.ped-cobro-tit{font-size:.86rem;white-space:nowrap}
.ped-cobro-txt{font-size:.8rem;color:var(--suave);margin-right:auto}   /* empuja el botón a la derecha */
/* Form de despacho (tracking) dentro del detalle del pedido. */
.ped-envio-form{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.5rem;margin:0 0 .7rem;
  padding:.55rem .6rem;border:1px solid var(--linea,#eee);border-radius:8px;background:#fafbfc}
.ped-envio-tit{font-size:.86rem;align-self:center;white-space:nowrap}
.ped-envio-form label{display:flex;flex-direction:column;gap:.15rem;font-size:.74rem;color:#6b7280}
.ped-envio-form input,.ped-envio-form select{font-size:.82rem;padding:.22rem .4rem;
  border:1px solid var(--linea,#ddd);border-radius:5px;min-width:9rem}
.ped-envio-form input[type=url]{min-width:14rem}
.ped-envio-fecha{font-size:.74rem;color:#6b7280;align-self:center}
/* Datos del envío en "Mis pedidos" (cuenta del cliente). */
.cuenta-envio{font-size:.84rem;margin:.1rem 0 .5rem;padding:.35rem .5rem;border-radius:6px;
  background:#f5f7fa;border:1px solid var(--linea,#eee)}
.cuenta-envio code{background:#fff;padding:.05rem .3rem;border-radius:4px}
@media(max-width:820px){
  .ped-envio-form label,.ped-envio-form input,.ped-envio-form select{width:100%;min-width:0}
}
.ped-det-datos{font-size:.86rem;margin-bottom:.6rem;line-height:1.7}
.ped-det-datos code{background:#f2f2f2;padding:.05rem .3rem;border-radius:4px}
/* ---- Modal del detalle de pedido (src/ped_modal.php): panel y "Mis pedidos" ----
   z-index 1050: tapa la barra lateral del panel (1040) y su hamburguesa (1045), y queda POR DEBAJO
   del .modal de Bootstrap (1055) — así el confirm del despacho (bfdialog) sale ENCIMA y no atrás.
   El [hidden] explícito no es opcional: display:flex le gana al display:none del atributo. */
.ped-modal{position:fixed;inset:0;z-index:1050;display:flex;align-items:center;justify-content:center;
  background:rgba(15,23,42,.55);padding:1rem}
.ped-modal[hidden]{display:none}
.ped-modal-abierto{overflow:hidden}
.ped-modal-box{position:relative;background:#fff;color:var(--tinta);border-radius:14px;
  width:100%;max-width:780px;max-height:88vh;display:flex;flex-direction:column;overflow:hidden;
  box-shadow:0 18px 50px rgba(0,0,0,.35)}
.ped-modal-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex:none;
  padding:.7rem 1.1rem;border-bottom:1px solid var(--linea)}
.ped-modal-tit{margin:0;font-size:1rem;font-weight:700}
.ped-modal-close{background:none;border:0;font-size:1.8rem;line-height:1;color:var(--suave);
  cursor:pointer;padding:0 .3rem}
.ped-modal-close:hover{color:var(--tinta)}
/* El body scrollea y la cabecera queda fija: el detalle de un pedido largo no puede empujar el
   título ni la X fuera de la caja. */
.ped-modal-body{padding:1rem 1.1rem 1.2rem;overflow:auto}
/* Ajuste de stock (admin/stock.php) */
.stock-cols{display:grid;grid-template-columns:1fr 1fr;gap:1rem;align-items:start}
@media(max-width:820px){.stock-cols{grid-template-columns:1fr}}
/* Pie con identidad del producto (Benfersoft Tiendas vX) */
.admin-pie{text-align:center;color:#9aa5b1;font-size:.78rem;padding:1.4rem 0 1rem;letter-spacing:.02em}
.admin-pie span{opacity:.7}

/* Cuenta del cliente (ingresar / registro / mi cuenta) */
.cuenta-wrap{max-width:520px;margin:1.6rem auto;padding:0 1rem}
.cuenta-wrap-ancho{max-width:860px}
.cuenta-card{background:#fff;border:1px solid var(--linea);border-radius:12px;padding:1.5rem}
.cuenta-tit{color:var(--marca);margin:0 0 1rem;font-size:1.4rem}
.cuenta-sub{color:var(--marca);margin:1.4rem 0 .6rem;font-size:1.05rem}
.cuenta-datos{color:var(--suave);margin:-.6rem 0 1rem}
.cuenta-card label{display:block;font-size:.85rem;color:var(--suave);font-weight:600;margin-bottom:.8rem}
.cuenta-card input,.cuenta-card select{display:block;width:100%;margin-top:.3rem;padding:.6rem .7rem;border:1px solid var(--linea);border-radius:8px;font-size:.95rem;font-family:inherit;color:inherit;background:#fff}
.cuenta-card input:focus,.cuenta-card select:focus{outline:none;border-color:var(--marca)}
.cuenta-nota{font-size:.85rem;color:var(--suave);margin:.2rem 0 .8rem}
.cuenta-datos-form{margin-bottom:1rem}
.dir-lista{list-style:none;padding:0;margin:.2rem 0 .8rem}
.dir-lista li{padding:.45rem .1rem;border-bottom:1px solid var(--linea);font-size:.9rem}
.dir-badge{display:inline-block;background:var(--marca);color:#fff;font-size:.68rem;font-weight:700;padding:.05rem .4rem;border-radius:8px;margin-right:.3rem}
.dir-del{background:none;border:0;color:#c0392b;font-size:1.1rem;cursor:pointer;line-height:1;padding:0 .3rem;float:right}
.dir-nueva{margin-bottom:1rem}.dir-nueva summary{cursor:pointer;color:var(--marca);font-size:.9rem;font-weight:600}
.cta-row{display:flex;gap:1rem}
.cta-row label{flex:1}
.btn-cuenta{display:inline-block;background:var(--marca);color:#fff;border:none;border-radius:999px;padding:.7rem 1.9rem;font-weight:600;font-size:.98rem;cursor:pointer;text-decoration:none;margin-top:.3rem;transition:transform .12s}
.btn-cuenta:hover{transform:translateY(-2px);color:#fff}
.btn-cuenta-sec{background:#efe6dd;color:var(--marca)}
.btn-cuenta-sec:hover{color:var(--marca)}   /* solo se sube (el lift lo da .btn-cuenta:hover), sin volverse blanco */
.cuenta-sep{display:flex;align-items:center;text-align:center;color:var(--suave);font-size:.82rem;margin:1.1rem 0 .9rem}
.cuenta-sep::before,.cuenta-sep::after{content:"";flex:1;border-top:1px solid var(--linea)}
.cuenta-sep span{padding:0 .8rem}
.cuenta-google{display:flex;justify-content:center}
.cuenta-check{display:flex;align-items:center;gap:.5rem;font-weight:400;font-size:.88rem;color:var(--suave);margin-bottom:1rem}
.cuenta-check input{width:auto;margin:0}
.cuenta-alt{margin-top:1rem;font-size:.9rem;color:var(--suave)}
.cuenta-alt a,.cuenta-datos a{color:var(--marca)}
.cuenta-ok{background:#e6f4ea;color:#1a7f37;padding:1rem 1.1rem;border-radius:10px;margin-bottom:1rem}
.cuenta-err{background:#f0e3e2;color:#9b4a44;padding:.8rem 1rem;border-radius:10px;margin-bottom:1rem}
.cuenta-vacio{color:var(--suave)}
/* ---- "Mis pedidos" (public/cuenta.php) ----
   Divs y no <table>: el detalle se fue al modal y la lista quedó con 6 datos por pedido, que en el
   teléfono no entran en una fila. Con divs, cada dato lo reubica grid-area — y eso hace innecesaria
   la copia mobile del badge de envío que exigía la <table> (una celda no se puede mover de columna:
   había que dibujarla dos veces y esconder una).
   Las columnas salen de --pi-cols, declarada UNA vez: el encabezado y las filas la comparten, así
   no se pueden desalinear. La variante sin-envío es real: la columna tracking puede no existir. */
.ped-lista{--pi-cols:minmax(6rem,auto) auto minmax(7rem,1fr) minmax(7rem,1fr) auto 1.6rem;
  font-size:.92rem}
.ped-lista.sin-envio{--pi-cols:minmax(6rem,auto) auto minmax(7rem,1fr) auto 1.6rem}
.ped-lista-head,.ped-item{display:grid;grid-template-columns:var(--pi-cols);
  align-items:center;gap:.6rem;padding:.5rem .1rem;border-top:1px solid var(--linea)}
.ped-lista-head{border-top:0;font-size:.78rem;font-weight:600;color:var(--suave)}
.pi-fecha{white-space:nowrap}
.pi-total{text-align:right;white-space:nowrap}
.pi-pdf{text-align:right}
/* En el teléfono cada pedido es una TARJETA: en fila no entra y el PDF quedaba cortado contra el
   borde, sin manera de llegar. Estado y Envío comparten el último renglón (uno a cada lado). */
@media(max-width:640px){
  .ped-lista-head{display:none}
  .ped-item{grid-template-columns:1fr auto;
    grid-template-areas:"cod total" "fecha pdf" "est envio";
    gap:.1rem .6rem;padding:.6rem .1rem}
  .pi-cod{grid-area:cod}
  .pi-fecha{grid-area:fecha;color:var(--suave);font-size:.82rem}
  .pi-est{grid-area:est;margin-top:.4rem}
  .pi-envio{grid-area:envio;justify-self:end;margin-top:.4rem}
  .pi-total{grid-area:total;font-weight:700}
  .pi-pdf{grid-area:pdf}
}
.g-recaptcha{margin:.3rem 0 1rem}
@media (max-width:560px){ .cta-row{flex-direction:column;gap:0} .cuenta-card{padding:1.1rem} }

/* Página de contacto */
.contacto-wrap{max-width:640px;margin:1.6rem auto;padding:0 1rem}
.contacto-tit{color:var(--marca);margin:0 0 .2rem}
.contacto-sub{color:var(--suave);margin:0 0 1.2rem}
.contacto-ok{background:#e6f4ea;color:#1a7f37;padding:1rem 1.1rem;border-radius:10px;font-weight:600}
.contacto-err{background:#f0e3e2;color:#9b4a44;padding:.8rem 1rem;border-radius:10px;margin-bottom:1rem}
.form-contacto label{display:block;font-size:.85rem;color:var(--suave);font-weight:600;margin-bottom:.9rem}
.form-contacto input,.form-contacto textarea{display:block;width:100%;margin-top:.3rem;padding:.6rem .7rem;border:1px solid var(--linea);border-radius:8px;font-size:.95rem;font-family:inherit;color:inherit}
.form-contacto input:focus,.form-contacto textarea:focus{outline:none;border-color:var(--marca)}
.form-contacto textarea{resize:vertical}
.fc-row{display:flex;gap:1rem}
.fc-row label{flex:1}
.btn-enviar{background:var(--marca);color:#fff;border:none;border-radius:999px;padding:.7rem 1.9rem;font-weight:600;font-size:.98rem;cursor:pointer;transition:transform .12s}
.btn-enviar:hover{transform:translateY(-2px)}
.g-recaptcha{margin:.3rem 0 1.1rem}
@media (max-width:600px){.fc-row{flex-direction:column;gap:0}}

/* Aparición en cascada de las cards (scroll infinito / carga por tandas) */
@keyframes colEnter{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.col-enter{animation:colEnter .8s ease both}
@media (prefers-reduced-motion: reduce){.col-enter{animation:none}}

/* Scroll infinito: sentinel + botón "Ver más" */
.scroll-sentinel{display:flex;justify-content:center;padding:1.4rem 0 .5rem}
.scroll-sentinel[hidden]{display:none}
.btn-vermas{background:#fff;color:var(--marca);border:1px solid var(--marca);border-radius:999px;
  padding:.6rem 1.6rem;font-weight:600;font-size:.95rem;cursor:pointer;transition:background .15s,color .15s}
.btn-vermas:hover{background:var(--marca);color:#fff}

/* Imagen ampliable: doble-click abre el modal */
.img-small{cursor:zoom-in}
.img-modal{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:2rem}
.img-modal[hidden]{display:none}
.img-modal-bg{position:absolute;inset:0;background:rgba(0,0,0,.82)}
.img-modal-pic{position:relative;max-width:92vw;max-height:88vh;object-fit:contain;border-radius:8px;box-shadow:0 8px 40px rgba(0,0,0,.5);background:#fff}
.img-modal-close{position:absolute;top:1rem;right:1.4rem;background:none;border:none;color:#fff;font-size:2.6rem;line-height:1;cursor:pointer}
.ver-variantes{margin:.6rem 0 0}
.ver-variantes a{color:var(--suave);text-decoration:none;font-size:.88rem}
.ver-variantes a:hover{text-decoration:underline}
.medida-rel{margin:-.4rem 0 1rem;color:var(--suave);font-size:.9rem}
.medida-rel i{opacity:.7;margin-right:.25rem}

/* Grilla de combinaciones de escala (generar Fijos) */
.escala-grid{max-width:640px}
.escala-tabla td .chk{display:flex;align-items:center;gap:.5rem;margin:0}
.escala-tabla code{font-size:.86rem}
.escala-tabla small{color:var(--suave)}
.pf-tipo-lock{padding:.35rem 0}

/* Alta rápida de maestros dentro del formulario de producto */
.quick-add{margin-top:.9rem}
.quick-add .qa-form{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;margin-top:.5rem;padding:.7rem;border:1px dashed var(--linea);border-radius:8px;background:var(--fondo2,#fafafa)}
.quick-add .qa-form .qa-nombre{flex:1 1 180px;min-width:150px}

/* ====== Color de marca (configurable — pisa el :root de arriba) ====== */
:root{
  --marca: #4a96e2;
  --marca-osc: #3a75b0;
  --grad-a: #edf5fc;
}

/* ====== Menú y fondo (configurables en Apariencia) ======
   --bg-menu / --bg-fondo son un VALOR DE FONDO completo: pueden ser un degradado o un color
   plano según cómo esté cargado, por eso van con `background:` y no dentro de un gradient().
   --menu-a es el color plano del menú, para superficies chicas (encabezado de tabla, badges). */
:root{
  --bg-menu: linear-gradient(to bottom right,#4a96e2,#f2f2f2);
  --bg-fondo: linear-gradient(to bottom left,#d3d3d3,#f2f2f2);
  --menu-txt: #282768;
  --menu-a: #4a96e2;
  --tinta: #4037be;
}
body{ background: var(--bg-fondo); color: var(--tinta); }
.admin{ background: var(--bg-fondo); }
.top, .pie, .admin-side{ background: var(--bg-menu); }

