/* ===========================================================================
   MSP NOA · B2B
   Hoja unica. Todas las pantallas se visten desde aca.

   POR QUE EL ROJO
   El rojo es el color de la empresa y en esta pantalla significa UNA sola
   cosa: accion. Comprar, entrar, cargar, buscar. El peligro --deuda vencida,
   pedido rechazado-- usa el MISMO rojo pero nunca relleno: solo borde y
   tinte. Un boton rojo se toca; un cartel de borde rojo se lee.

   POR QUE NO SE RENOMBRO NINGUNA CLASE
   Las clases que ya usaban Carrito, Pedidos, Login, Tablero, Articulo y Mi
   cuenta siguen existiendo con el mismo nombre. Cambio como se ven, no como
   se llaman: asi ninguna de esas pantallas se rompe al cambiar el diseno.

   REGLA DE ANCHO
   Ningun bloque puede empujar la pagina a lo ancho. Lo que no entra --tablas,
   la barra de navegacion-- se desplaza dentro de su propia caja, nunca
   arrastrando el cuerpo. Si alguna vez la pagina se corre para el costado en
   un celular, el culpable es un bloque que se salteo esta regla.
   =========================================================================== */

:root {
    --fondo:        #F7F7F8;
    --superficie:   #FFFFFF;
    --superficie-2: #F2F3F5;
    --texto:        #18181B;
    --texto-2:      #3F3F46;
    --texto-suave:  #71717A;
    --texto-tenue:  #A1A1AA;
    --borde:        #E4E4E7;
    --borde-2:      #D4D4D8;

    /* El rojo de la marca. --acento existe porque asi se llamaba antes y lo
       usan todas las pantallas viejas; ahora apunta al rojo. */
    --rojo:         #DC2626;
    --rojo-h:       #B91C1C;
    --rojo-suave:   rgba(220,38,38,.09);
    --acento:       #DC2626;
    --acento-oscuro:#B91C1C;
    --peligro:      #DC2626;

    --verde:        #059669;
    --verde-tinte:  rgba(5,150,105,.09);
    --verde-borde:  rgba(5,150,105,.26);
    --ok:           #059669;

    --ambar:        #B45309;
    --ambar-tinte:  rgba(180,83,9,.09);
    --ambar-borde:  rgba(180,83,9,.26);
    --alerta:       #B45309;

    /* Las fotos van SIEMPRE sobre blanco, tambien en modo oscuro. Sobre gris
       el recorte del producto se ve sucio. */
    --foto:         #FFFFFF;

    /* La barra de navegacion es oscura en los dos modos: es lo que le da
       identidad a la cabecera y no depende del tema del sistema. */
    --nav-fondo:    #18181B;
    --nav-borde:    #27272A;
    --nav-texto:    #D4D4D8;

    --tinta:        #18181B;
    --tinta-txt:    #FFFFFF;

    --tit: "Chakra Petch", "Segoe UI", system-ui, sans-serif;

    --radio: 10px;
    --r-lg: 14px;
    --r-xl: 18px;
    --sombra:   0 1px 2px rgba(15,23,42,.05), 0 4px 12px rgba(15,23,42,.05);
    --sombra-a: 0 2px 6px rgba(15,23,42,.07), 0 14px 30px rgba(15,23,42,.09);
}

/* EL TEMA SE PUEDE ELEGIR, Y SON TRES ESTADOS, NO DOS.
   claro / oscuro / el que use el sistema. El tercero no es relleno: es el que
   respeta el modo noche del telefono sin que nadie tenga que acordarse de
   cambiarlo dos veces por dia.

   Por eso los mismos tokens aparecen en dos bloques. El primero atiende al
   sistema pero se rinde si el cliente eligio claro a mano; el segundo es la
   eleccion explicita de oscuro y gana siempre. Sin el segundo, elegir oscuro
   en una maquina con el sistema en claro no haria absolutamente nada. */
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
        --fondo:        #0F1115;
        --superficie:   #14171D;
        --superficie-2: #181B22;
        --texto:        #FAFAFA;
        --texto-2:      #D4D4D8;
        --texto-suave:  #A1A1AA;
        --texto-tenue:  #71717A;
        --borde:        #27272A;
        --borde-2:      #3F3F46;

        --rojo:         #EF4444;
        --rojo-h:       #DC2626;
        --rojo-suave:   rgba(239,68,68,.14);
        --acento:       #EF4444;
        --acento-oscuro:#F87171;
        --peligro:      #F87171;

        --verde:        #34D399;
        --verde-tinte:  rgba(52,211,153,.10);
        --verde-borde:  rgba(52,211,153,.28);
        --ok:           #34D399;

        --ambar:        #FBBF24;
        --ambar-tinte:  rgba(251,191,36,.10);
        --ambar-borde:  rgba(251,191,36,.30);
        --alerta:       #FBBF24;

        --nav-fondo:    #0B0D11;
        --nav-borde:    #1F2126;

        --tinta:        #2A2E37;
        --tinta-txt:    #FAFAFA;

        --sombra:   0 1px 2px rgba(0,0,0,.4), 0 4px 14px rgba(0,0,0,.3);
        --sombra-a: 0 2px 6px rgba(0,0,0,.5), 0 16px 36px rgba(0,0,0,.45);
    }
}
:root[data-theme="dark"] {
        --fondo:        #0F1115;
        --superficie:   #14171D;
        --superficie-2: #181B22;
        --texto:        #FAFAFA;
        --texto-2:      #D4D4D8;
        --texto-suave:  #A1A1AA;
        --texto-tenue:  #71717A;
        --borde:        #27272A;
        --borde-2:      #3F3F46;

        --rojo:         #EF4444;
        --rojo-h:       #DC2626;
        --rojo-suave:   rgba(239,68,68,.14);
        --acento:       #EF4444;
        --acento-oscuro:#F87171;
        --peligro:      #F87171;

        --verde:        #34D399;
        --verde-tinte:  rgba(52,211,153,.10);
        --verde-borde:  rgba(52,211,153,.28);
        --ok:           #34D399;

        --ambar:        #FBBF24;
        --ambar-tinte:  rgba(251,191,36,.10);
        --ambar-borde:  rgba(251,191,36,.30);
        --alerta:       #FBBF24;

        --nav-fondo:    #0B0D11;
        --nav-borde:    #1F2126;

        --tinta:        #2A2E37;
        --tinta-txt:    #FAFAFA;

        --sombra:   0 1px 2px rgba(0,0,0,.4), 0 4px 14px rgba(0,0,0,.3);
        --sombra-a: 0 2px 6px rgba(0,0,0,.5), 0 16px 36px rgba(0,0,0,.45);
    }

* { box-sizing: border-box; }

/* OJO CON ESTO: ACA ESTUVO ROTA LA CABECERA PEGAJOSA.
   Habia un "overflow-x: hidden" en html y body como red de seguridad contra
   el desborde horizontal. El problema es que overflow:hidden convierte al
   elemento en un contenedor de desplazamiento, y position:sticky se pega
   respecto de ESE contenedor, no de la ventana. Resultado: la cabecera se
   iba para arriba al bajar, como si no fuera pegajosa.

   overflow-x: clip recorta igual pero NO crea contenedor de desplazamiento,
   asi que sticky vuelve a funcionar. Y de todas formas la red de seguridad
   sobra: las pruebas en siete anchos dan cero desborde. Queda solo en <html>
   y solo como clip. */
html { overflow-x: clip; }

body {
    margin: 0;
    background: var(--fondo);
    color: var(--texto);
    font: 15px/1.5 "Plus Jakarta Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    -webkit-font-smoothing: antialiased;
}

a { color: inherit; text-decoration: none; }
img { max-width: 100%; }

h1, h2, h3, .marca, .valor, .cc-saldo .valor { font-family: var(--tit); }

/* ===========================================================================
   ENCABEZADO
   Tres pisos, y cada uno tiene un motivo:
   1. Horarios y telefono: el mayorista llama, no solo compra.
   2. Marca, buscador, saldo y carrito: lo que se usa todo el tiempo.
   3. Navegacion oscura: adonde se puede ir.
   =========================================================================== */
.wrap { max-width: 1400px; margin: 0 auto; padding: 0 20px; }

.top {
    background: var(--superficie-2);
    border-bottom: 1px solid var(--borde);
    font-size: 12.5px; color: var(--texto-suave);
}
.top .wrap { display: flex; align-items: center; gap: 18px; min-height: 34px; flex-wrap: wrap; }
.top .der { margin-left: auto; display: flex; gap: 18px; flex-wrap: wrap; }
.top b { color: var(--texto-2); font-weight: 600; }

/* La cabecera queda fija arriba con el fondo apenas translucido y desenfocado:
   al desplazar, lo que pasa por debajo se insinua sin competir con el texto.

   El color de respaldo es OPACO a proposito. backdrop-filter no existe en
   todos los navegadores; donde no existe, un fondo semitransparente dejaria
   ver los articulos pasando por atras del buscador y seria ilegible. Recien
   cuando el navegador confirma que sabe desenfocar se baja la opacidad. */
/* SOLO EL ENCABEZADO SE PEGA. LA NAVEGACION BAJA CON LA PAGINA.
   El buscador y el carrito se usan en cualquier momento, asi que quedan
   siempre a mano. Cambiar de seccion, en cambio, se hace al principio: dejar
   tambien esa franja fija come cien pixeles de alto en todas las pantallas, y
   en un celular eso es un tercio de lo que se ve. */
.cabecera { position: sticky; top: 0; z-index: 30; }
.barra { background: var(--superficie); border-bottom: 1px solid var(--borde); }

/* El vidrio esmerilado va en el contenedor, no en cada franja, para que el
   catalogo se vea pasar por debajo de las dos.
   El color de respaldo es OPACO a proposito: donde el navegador no sabe
   desenfocar, un fondo translucido dejaria ver los articulos corriendo por
   atras del buscador y seria ilegible. Recien cuando confirma que sabe, se
   baja la opacidad. */
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    .cabecera {
        -webkit-backdrop-filter: blur(16px) saturate(1.5);
        backdrop-filter: blur(16px) saturate(1.5);
    }
    .cabecera .barra { background: color-mix(in srgb, var(--superficie) 72%, transparent); }
}
.barra-in {
    max-width: 1400px; margin: 0 auto; padding: 12px 20px;
    display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
}
.marca { font-weight: 700; letter-spacing: -.02em; font-size: 20px; line-height: 1; }
.marca span { color: var(--rojo); }
.marca small { display: block; font-family: "Plus Jakarta Sans", sans-serif;
               font-size: 9.5px; letter-spacing: .22em; color: var(--texto-tenue);
               font-weight: 700; margin-top: 2px; }

/* El buscador vive en la cabecera y esta en todas las pantallas: es la
   herramienta principal de un mayorista con el codigo en la mano. */
/* El buscador ya no se estira sin limite. Pegado al saldo, y con medio
   metro de campo vacio, el cliente no sabe donde termina uno y empieza el
   otro. Ahora tiene un tope y un margen propio a la derecha. */
.buscador-cab { flex: 1 1 300px; max-width: 620px; display: flex; min-width: 0;
                margin-right: 8px; }
/* El unico desplegable del buscador es "donde buscar". El de rubro se saco:
   el arbol de categorias ya esta a la izquierda y repetirlo aca duplicaba el
   control y se comia el ancho del campo de texto.

   Va pegado al campo de texto, sin curva en el medio, y con la MISMA flecha
   dibujada que los filtros del catalogo: buscar y filtrar tienen que verse
   como dos partes de la misma herramienta, no como dos aplicaciones. */
.buscador-cab .sel-cab { flex: 0 1 auto; min-width: 96px; max-width: 176px; }
.buscador-cab .sel-cab select {
    width: 100%; height: auto; min-width: 0; padding: 10px 30px 10px 11px;
    font: inherit; font-size: 13.5px; font-weight: 600;
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    border: 1px solid var(--borde); border-right: 0;
    border-radius: var(--radio) 0 0 var(--radio);
    background: var(--superficie-2); color: var(--texto-2); cursor: pointer;
    transition: color .15s, background .15s;
}
.buscador-cab .sel-cab select:hover { color: var(--texto); background: var(--superficie); }
.buscador-cab .sel-cab select:focus-visible { outline: none; color: var(--texto); }
.buscador-cab .sel-cab .chev { right: 9px; }
.buscador-cab input[type=search] {
    flex: 1; min-width: 0; padding: 10px 14px; font: inherit; font-size: 14px;
    border: 1px solid var(--borde); border-right: 0; border-left: 0;
    background: var(--superficie); color: var(--texto);
}
/* El campo de texto nunca lleva la curva de la izquierda: siempre tiene un
   desplegable delante --el de "donde buscar", que esta en todas las
   pantallas-- y la curva la lleva ese. */
.buscador-cab .sel-cab + input[type=search] { border-radius: 0; }
.buscador-cab input[type=search]:focus { outline: none; border-color: var(--rojo); }
.buscador-cab button {
    display: flex; align-items: center; gap: 7px; border: 0; cursor: pointer;
    padding: 0 18px; font: inherit; font-weight: 700; font-size: 14px;
    background: var(--rojo); color: #fff;
    border-radius: 0 var(--radio) var(--radio) 0;
}
.buscador-cab button:hover { background: var(--rojo-h); }

/* EL NOMBRE DEL CLIENTE ES UN MENU.
   Es un <details>, asi que abre y cierra sin JavaScript. Salir vivia suelto
   en la barra oscura, que es un lugar raro para algo que se usa una vez por
   dia: el gesto natural es tocar el nombre propio. */
.barra .quien { position: relative; }
.barra .quien > summary {
    list-style: none; cursor: pointer; display: flex; align-items: center; gap: 8px;
    padding: 5px 8px; border-radius: var(--radio); color: var(--texto-suave);
    font-size: 12.5px; line-height: 1.3; text-align: right;
}
.barra .quien > summary::-webkit-details-marker { display: none; }
.barra .quien > summary:hover { background: var(--superficie-2); }
.barra .quien .txt strong { display: block; color: var(--texto); font-size: 13.5px; font-weight: 700;
                            max-width: 24ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.barra .quien .flecha { flex: none; color: var(--texto-tenue); transition: transform .2s; }
.barra .quien[open] > summary .flecha { transform: rotate(180deg); }
.barra .quien[open] > summary { background: var(--superficie-2); }

/* Cerrado, el panel se saca del calculo con display:none. Los navegadores
   nuevos le siguen dando caja a lo que hay dentro de un <details> cerrado, y
   un panel de 250px anclado a la derecha empujaba la pagina a lo ancho
   estando invisible. Un desborde que no se ve es peor que uno que se ve.
   El tope de ancho es para el celular: el panel nunca puede ser mas ancho
   que la pantalla. */
.barra .quien:not([open]) .panel { display: none; }
.barra .quien .panel {
    position: absolute; right: 0; top: calc(100% + 8px); z-index: 40;
    min-width: 250px; max-width: calc(100vw - 28px);
    background: var(--superficie); border: 1px solid var(--borde);
    border-radius: var(--r-lg); box-shadow: var(--sombra-a); padding: 6px;
    display: flex; flex-direction: column; gap: 1px;
}
.barra .quien .quien-cab { padding: 9px 11px 11px; border-bottom: 1px solid var(--borde);
                           margin-bottom: 5px; }
.barra .quien .quien-cab strong { display: block; font-size: 13.5px; }
.barra .quien .quien-cab span { font-size: 12px; color: var(--texto-suave); }
.barra .quien .panel a,
.barra .quien .panel .salir {
    display: block; width: 100%; text-align: left; padding: 9px 11px; border-radius: 8px;
    font: inherit; font-size: 13.5px; color: var(--texto-2);
    border: 0; background: none; cursor: pointer;
}
.barra .quien .panel a:hover { background: var(--superficie-2); color: var(--texto); }
.barra .quien .panel .salir { color: var(--rojo); font-weight: 700;
                              border-top: 1px solid var(--borde); margin-top: 5px; border-radius: 0 0 8px 8px; }
.barra .quien .panel .salir:hover { background: var(--rojo-suave); }


/* El carrito con su globo. Es un blanco de toque en celular: 42px de lado. */
.cab-carrito {
    position: relative; display: flex; align-items: center; justify-content: center;
    width: 42px; height: 42px; border-radius: var(--radio);
    background: var(--rojo); color: #fff; flex: none;
}
.cab-carrito:hover { background: var(--rojo-h); }
.cab-carrito .globo {
    position: absolute; top: -5px; right: -5px; min-width: 19px; height: 19px;
    padding: 0 5px; border-radius: 99px; background: var(--tinta); color: var(--tinta-txt);
    border: 2px solid var(--superficie);
    font-size: 10.5px; font-weight: 800; line-height: 15px; text-align: center;
    font-variant-numeric: tabular-nums;
}

/* ---- Barra de navegacion oscura ---------------------------------------- */
.menu-b { background: var(--nav-fondo); border-bottom: 1px solid var(--nav-borde); }
/* Si los items no entran, se desplazan DENTRO de la barra. La pagina no se
   mueve. Por eso el overflow va aca y no en el cuerpo. */
.menu-b .wrap {
    display: flex; align-items: stretch; gap: 2px; min-height: 46px;
    overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
}
.menu-b .wrap::-webkit-scrollbar { display: none; }
.menu-b a {
    display: flex; align-items: center; gap: 8px; padding: 0 16px;
    font-size: 13.5px; font-weight: 600; color: var(--nav-texto); white-space: nowrap;
}
.menu-b a:hover { background: var(--nav-borde); color: #fff; }
.menu-b a.on { background: var(--rojo); color: #fff; }
.menu-b .nav-der {
    margin-left: auto; display: flex; align-items: center; gap: 14px;
    padding-left: 16px; flex: none;
}
.menu-b .tel {
    display: flex; align-items: center; gap: 8px; color: #fff;
    font-family: var(--tit); font-weight: 700; font-size: 15px; white-space: nowrap;
}
.menu-b .nav-quien { display: none; color: var(--nav-texto); font-size: 12.5px;
                     white-space: nowrap; max-width: 34vw; overflow: hidden;
                     text-overflow: ellipsis; }
.nav-salir { border: 1px solid var(--nav-borde); background: none; cursor: pointer;
             color: var(--nav-texto); font: inherit; font-size: 12.5px; font-weight: 600;
             padding: 5px 12px; border-radius: 7px; white-space: nowrap; }
.nav-salir:hover { border-color: var(--rojo); color: #fff; background: var(--rojo); }

/* El saldo acompana al nombre en TODAS las pantallas: si el cliente tiene
   deuda vencida deberia verlo mientras arma el carrito, no recien cuando
   entra a mirar su cuenta. */
/* EL SALDO EN LA CABECERA, COMO EN LA MAQUETA.
   El vencido va en AMBAR aca y en ROJO en Mi cuenta, y la diferencia es a
   proposito: esta franja se ve en todas las pantallas todo el tiempo, y un
   numero rojo permanente arriba de la cabeza deja de alarmar a los tres dias.
   El ambar avisa; el rojo, que aparece cuando el cliente entra a mirar su
   cuenta, alarma. Si los dos gritaran igual, ninguno se escucharia.
   La rayita de la derecha lo separa del nombre: son dos datos distintos. */
.saldo-barra { text-align: right; line-height: 1.25; padding: 0 16px 0 4px;
               border-right: 1px solid var(--borde); flex: none; }
.saldo-barra .e { display: block; font-size: 10px; letter-spacing: .08em;
                  text-transform: uppercase; font-weight: 700; color: var(--texto-tenue); }
.saldo-barra .v { font-family: var(--tit); font-size: 16px; font-weight: 700;
                  color: var(--texto); font-variant-numeric: tabular-nums; }
.saldo-barra.debe .v { color: var(--ambar); }
.saldo-barra:hover .v { text-decoration: underline; }

.contenido { max-width: 1400px; margin: 0 auto; padding: 22px 20px 60px; }

/* ===========================================================================
   BOTONES
   =========================================================================== */
.boton {
    background: var(--rojo); color: #fff; border: 0; cursor: pointer;
    padding: 10px 20px; border-radius: var(--radio); font: inherit; font-weight: 700;
}
.boton:hover { background: var(--rojo-h); }
.boton:disabled { background: var(--superficie-2); color: var(--texto-tenue); cursor: not-allowed; }
.boton-suave, .boton-secundario {
    background: var(--superficie); color: var(--texto);
    border: 1px solid var(--borde); border-radius: var(--radio);
    padding: 10px 18px; font: inherit; font-weight: 600; cursor: pointer;
}
.boton-suave:hover, .boton-secundario:hover { border-color: var(--rojo); color: var(--rojo); }
.boton-chico { padding: 7px 11px; font-size: 13px; border-radius: 7px;
               border: 1px solid var(--borde); background: var(--superficie);
               color: var(--texto-suave); cursor: pointer; font-family: inherit; }
.boton-chico:hover { color: var(--rojo); border-color: var(--rojo); }
.boton-texto { background: none; border: 0; padding: 6px 2px; cursor: pointer;
               color: var(--texto-suave); font-size: 13px; font-family: inherit; }
.boton-texto:hover { color: var(--rojo); text-decoration: underline; }

:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }

/* ===========================================================================
   BUSCADOR DE LA PAGINA Y BARRA DE RESULTADOS
   =========================================================================== */
.buscador { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-bottom: 16px; }
.buscador input[type=search], .buscador select {
    padding: 10px 14px; border: 1px solid var(--borde); border-radius: var(--radio);
    background: var(--superficie); color: var(--texto); font: inherit; font-size: 14px;
    min-width: 0;
}
.buscador input[type=search] { flex: 1 1 300px; }
.buscador label { display: flex; align-items: center; gap: 7px;
                  color: var(--texto-suave); font-size: 13.5px; }

/* La casilla que acota la busqueda a la categoria abierta. Va apagada: el
   cliente busca en todo el catalogo salvo que pida lo contrario. */
.acotar { max-width: 340px; }
.acotar strong { color: var(--texto); font-weight: 700; }

/* ===========================================================================
   LA CAJA QUE SE REEMPLAZA AL FILTRAR
   Ordenar o cambiar de pagina cambia SOLO esto, sin recargar la pantalla.
   Mientras llega la lista nueva se atenua y deja de aceptar clics: sin esa
   senal, con la respuesta demorando medio segundo, parece que el filtro no
   hizo nada y el cliente lo vuelve a tocar.
   =========================================================================== */
#lista { transition: opacity .14s ease; }
#lista.cargando { opacity: .42; pointer-events: none; }

.resultados {
    color: var(--texto-suave); font-size: 13px; margin-bottom: 14px;
    display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
.resultados .ambito { margin-left: auto; padding-left: 12px; border-left: 1px solid var(--borde); }
.resultados .ambito strong { color: var(--texto); font-weight: 700; }
.resultados .ambito a { color: var(--rojo); font-weight: 600; }
@media (max-width: 760px) {
    .resultados .ambito { margin-left: 0; padding-left: 0; border-left: 0; }
}
.miga { color: var(--texto); font-weight: 700; margin-right: 8px; }

/* ===========================================================================
   GRILLA Y TARJETA DE ARTICULO
   El orden de la tarjeta no es estetico, es de lectura:
   1. Estado: si no se puede comprar, no hace falta leer el resto.
   2. Codigo: es lo que el cliente tiene anotado en la mano.
   3. Descripcion.
   4. Precio.
   5. Cantidad y cargar.
   =========================================================================== */
/* 228px es el ancho minimo en el que el precio de lista y el de contado
   siguen entrando en una linea cada uno sin cortarse. Por debajo de eso la
   cifra se parte y deja de leerse de un vistazo. */
.grilla { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(228px, 1fr)); }

/* ---------------------------------------------------------------------------
   LA MISMA TARJETA, ACOSTADA
   No hay una segunda tarjeta para la vista de lista: es la de siempre puesta
   en dos columnas, foto a la izquierda y todo lo demas apilado a la derecha.
   Una sola tarjeta significa que un arreglo vale para las dos vistas; dos
   tarjetas distintas significa arreglar todo dos veces y olvidarse una.

   El reparto es explicito --cada hijo dice en que columna va-- porque si se
   deja que la grilla acomode sola, el segundo hijo cae en la columna de la
   foto y la tarjeta queda dada vuelta.
   --------------------------------------------------------------------------- */
/* TODO ESTO VA COLGADO DE #lista, Y NO ES PRECAUCION: ES UN ARREGLO.
   "Ofertas de la semana" tambien usa la clase .grilla --es <div class="grilla
   of-g">-- y esta ANTES en la pagina. Sin este prefijo, elegir "lista"
   acostaba las ofertas y dejaba el catalogo igual, que es justo al reves de
   lo que se pedia. Los packs mayoristas usan .packs y nunca estuvieron en
   juego. */
#lista .grilla.lista {
    grid-template-columns: 1fr; gap: 0;
    border: 1px solid var(--borde); border-radius: var(--r-lg);
    overflow: hidden; background: var(--superficie); box-shadow: var(--sombra);
}

/* LA FILA.
   No es una tarjeta mas chica: es un renglon de tabla. Columnas de ancho
   FIJO --menos la descripcion-- para que el codigo de un renglon quede
   alineado con el del de arriba. Si cada fila midiera sus columnas por su
   cuenta, el ojo no podria recorrer una columna en vertical, que es
   exactamente para lo que sirve una lista.

   Cinco columnas: codigo | descripcion | stock | precios | cantidad.
   La de precios va partida por dentro en dos de ancho fijo (lista y
   contado), asi que tambien quedan alineadas entre filas.

   Cuatro renglones de grilla: 1fr, descripcion, descripcion adicional, 1fr.
   Los dos 1fr de los bordes se reparten el alto que sobra, asi que la
   descripcion (con o sin adicional) queda centrada igual que el codigo y el
   precio, que ocupan los cuatro. Sin adicional, ese renglon mide cero.

   Los cortes van por ancho del CATALOGO y no de la pantalla (container
   query): el menu de la izquierda se pliega abajo de 900px de pantalla, y
   con el el catalogo se ENSANCHA aunque la pantalla se achique. Medido: a
   1024px de pantalla el catalogo tiene 752px, y a 860px tiene 820. */
#lista { container-type: inline-size; container-name: catalogo; }

#lista .grilla.lista .ficha,
#lista .grilla.lista .l-cab {
    display: grid;
    grid-template-columns: 112px minmax(0, 1fr) 92px 274px 188px;
    column-gap: 14px;
    padding: 4px 14px;
}
#lista .grilla.lista .ficha {
    border: 0; border-bottom: 1px solid var(--borde); border-radius: 0;
    box-shadow: none; background: none;
    grid-template-rows: 1fr auto auto 1fr; row-gap: 0;
    align-items: center; min-height: 40px;
    animation: none;
}
#lista .grilla.lista .ficha:last-child { border-bottom: 0; }
#lista .grilla.lista .ficha:hover { transform: none; background: var(--superficie-2); }

/* LA CABECERA. En tarjetas no existe. */
.grilla .l-cab { display: none; }
#lista .grilla.lista .l-cab {
    align-items: center; min-height: 32px;
    background: var(--superficie-2); border-bottom: 1px solid var(--borde);
    font-size: 10.5px; font-weight: 700; letter-spacing: .06em;
    text-transform: uppercase; color: var(--texto-tenue);
}
#lista .grilla.lista .l-cab > span { min-width: 0; overflow: hidden;
                                     text-overflow: ellipsis; white-space: nowrap; }
#lista .grilla.lista .l-cab .l-cab-der { text-align: center; }
#lista .grilla.lista .l-cab .l-cab-precios {
    display: grid; grid-template-columns: 116px 146px; column-gap: 12px;
    text-align: right;
}
/* La etiqueta de contado la escribe el cliente en appsettings y puede ser
   larga ("Oferta pagando de contado"): en la cabecera va en dos renglones
   antes que cortarse. */
#lista .grilla.lista .l-cab .l-cab-precios > * { white-space: normal; line-height: 1.2;
                                                 padding: 3px 0; justify-content: flex-end; }

/* display:contents saca al cuerpo del medio sin tocar el HTML: sus hijos
   pasan a ser celdas de la fila. Es la unica forma de que el codigo, la
   descripcion y el precio caigan en columnas propias estando anidados. */
#lista .grilla.lista .f-cuerpo { display: contents; }

/* EL STOCK, SOLO. El -30% ya no va aca: se muda al lado del precio de
   contado, que es el numero al que se refiere. Con las dos pastillas juntas
   la columna no alcanzaba y esa fila se corria respecto de las demas. */
#lista .grilla.lista .f-foto { grid-column: 3; grid-row: 1 / -1; background: none;
                               border: 0; display: flex; justify-content: center; }
#lista .grilla.lista .f-foto .marco { display: none; }
#lista .grilla.lista .f-foto .chips { position: static; padding: 0; display: flex;
                                      gap: 4px; flex-wrap: nowrap; }
#lista .grilla.lista .f-foto .et-off { display: none; }
#lista .grilla.lista .etiqueta { font-size: 9.5px; padding: 1px 6px; }

#lista .grilla.lista .codigo { grid-column: 1; grid-row: 1 / -1; height: auto; font-size: 11px; }
#lista .grilla.lista .cod-fabrica { display: none; }

#lista .grilla.lista .titulo { grid-column: 2; grid-row: 2; height: auto;
                               -webkit-line-clamp: 1; font-size: 13px;
                               font-weight: 600; line-height: 1.3; }

/* LA DESCRIPCION ADICIONAL: debajo de la descripcion, gris, cortada a una
   linea. Si el articulo no la tiene, el div llega vacio y no ocupa lugar. */
#lista .grilla.lista .detalle-extra {
    grid-column: 2; grid-row: 3;
    height: auto; margin: 0; font-size: 11.5px; line-height: 1.35;
    color: var(--texto-suave);
    display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#lista .grilla.lista .detalle-extra:empty { display: none; }
#lista .grilla.lista .marca-txt { display: none; }

/* LOS PRECIOS: dos columnas fijas por dentro, lista y contado, alineadas a
   la derecha. El rotulo no entra en 40px de alto; lo dice la cabecera. */
#lista .grilla.lista .precio {
    grid-column: 4; grid-row: 1 / -1; min-height: 0; padding: 0;
    display: grid; grid-template-columns: 116px 146px; column-gap: 12px;
    align-items: center; justify-items: end;
}
#lista .grilla.lista .precio .lista-fila { display: block; grid-column: 1; }
#lista .grilla.lista .precio .lista-fila .rotulo { display: none; }
/* "Consultar precio" (articulo sin precio): ocupa las dos columnas. */
#lista .grilla.lista .precio > .rotulo { grid-column: 1 / -1; }
/* Los importes NO se parten en dos renglones. Un "$ 22.677,00" cortado
   despues del signo hace que la fila mida 54px en vez de 40, y encima se lee
   peor. Las columnas se dimensionaron para el numero mas largo del catalogo. */
#lista .grilla.lista .precio .valor { font-size: 14px; white-space: nowrap; }
#lista .grilla.lista .precio .contado {
    grid-column: 2; margin: 0; padding: 0; border: 0; background: none;
    flex-direction: row; align-items: center; gap: 6px;
}
#lista .grilla.lista .precio .contado .e,
#lista .grilla.lista .precio .hueco-contado,
#lista .grilla.lista .precio .sugerido { display: none; }
#lista .grilla.lista .precio .contado .v { font-size: 14px; white-space: nowrap; }

/* El descuento va ANTES del importe y no despues: asi el borde derecho de
   todos los precios de contado queda en la misma vertical, tengan o no
   descuento. En la vista de tarjetas no se ve (ahi esta sobre la foto). */
.precio .off-l { display: none; }
#lista .grilla.lista .precio .off-l { display: inline-flex; order: -1; }

#lista .grilla.lista .f-pie { grid-column: 5; grid-row: 1 / -1; margin: 0; padding: 0;
                              border-top: 0; justify-content: flex-end; }
#lista .grilla.lista .qty { transform: scale(.88); transform-origin: right center; }
#lista .grilla.lista .cargar { padding: 5px 11px; font-size: 12.5px; }
#lista .grilla.lista .cargar svg { display: none; }

/* CATALOGO MEDIANO (menos de 940px): se va la columna de stock. No se
   pierde nada: el boton de la derecha ya dice "Sin stock" o "Consultar"
   cuando no se puede pedir, y "Disponible" es lo que se da por hecho.
   Sin esto la descripcion quedaba en 60px y no se leia ninguna. */
@container catalogo (max-width: 939px) {
    #lista .grilla.lista .ficha,
    #lista .grilla.lista .l-cab { grid-template-columns: 100px minmax(0, 1fr) 274px 176px;
                                  column-gap: 12px; }
    #lista .grilla.lista .f-foto,
    #lista .grilla.lista .l-cab .l-cab-der { display: none; }
    #lista .grilla.lista .precio { grid-column: 3; }
    #lista .grilla.lista .f-pie  { grid-column: 4; }
}

/* CATALOGO ANGOSTO (menos de 760px): la fila se parte en dos. Arriba el
   codigo y la descripcion; abajo el stock, los dos precios y el boton.
   La cabecera se esconde: sin columnas no tiene nada que encabezar, y el
   verde distingue el contado. */
@container catalogo (max-width: 759px) {
    #lista .grilla.lista .l-cab { display: none; }
    #lista .grilla.lista .ficha {
        grid-template-columns: 96px minmax(0, 1fr) auto;
        grid-template-rows: auto auto auto;
        row-gap: 4px; padding: 8px 12px;
    }
    #lista .grilla.lista .codigo { grid-column: 1; grid-row: 1; }
    #lista .grilla.lista .titulo { grid-column: 2 / -1; grid-row: 1; }
    #lista .grilla.lista .detalle-extra { grid-column: 2 / -1; grid-row: 2; }
    #lista .grilla.lista .f-foto { display: flex; grid-column: 1; grid-row: 3;
                                   justify-content: flex-start; }
    #lista .grilla.lista .precio { grid-column: 2; grid-row: 3; justify-content: start; }
    #lista .grilla.lista .f-pie  { grid-column: 3; grid-row: 3; }
}

/* CELULAR (catalogo de menos de 520px): no entran los dos precios al lado
   del boton. El stock sube al renglon del codigo, y abajo quedan los
   precios --uno arriba del otro-- a la izquierda y el boton a la derecha. */
@container catalogo (max-width: 519px) {
    #lista .grilla.lista .ficha { grid-template-columns: minmax(0, 1fr) auto;
                                  grid-template-rows: auto auto auto auto; }
    #lista .grilla.lista .codigo { grid-column: 1; grid-row: 1; }
    #lista .grilla.lista .f-foto { grid-column: 2; grid-row: 1; justify-content: flex-end; }
    #lista .grilla.lista .titulo { grid-column: 1 / -1; grid-row: 2; }
    #lista .grilla.lista .detalle-extra { grid-column: 1 / -1; grid-row: 3; }
    #lista .grilla.lista .precio { grid-column: 1; grid-row: 4; grid-template-columns: auto;
                                   justify-items: start; row-gap: 2px; }
    #lista .grilla.lista .precio .lista-fila,
    #lista .grilla.lista .precio .contado { grid-column: 1; }
    /* En el celular el descuento vuelve arriba, al lado de "Disponible",
       como en la tarjeta: al lado del precio no entra junto al boton y
       bajarlo a otro renglon agrandaba la fila 20px. */
    #lista .grilla.lista .precio .off-l { display: none; }
    #lista .grilla.lista .f-foto .et-off { display: inline-flex; }
    #lista .grilla.lista .f-pie  { grid-column: 2; grid-row: 4; }
}

/* LOS TITULOS QUE ORDENAN.
   Se ven como titulo, no como enlace azul subrayado: en una cabecera de
   tabla todo el mundo sabe que se toca. Las flechitas grises dicen que se
   puede; la columna activa se pone en color de texto y con una sola flecha
   que dice hacia donde esta ordenada. */
#lista .grilla.lista .l-cab a {
    display: inline-flex; align-items: center; gap: 4px; max-width: 100%;
    color: inherit; text-decoration: none; cursor: pointer; border-radius: 4px;
}
#lista .grilla.lista .l-cab a:hover { color: var(--texto); }
#lista .grilla.lista .l-cab a:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
#lista .grilla.lista .l-cab a i { font-style: normal; font-size: 9px; line-height: 1; opacity: .45;
                                  flex: none; }
#lista .grilla.lista .l-cab a i::before { content: "\2195"; }            /* flecha doble */
#lista .grilla.lista .l-cab a.on { color: var(--texto); }
#lista .grilla.lista .l-cab a.on i { opacity: 1; color: var(--rojo); font-size: 10px; }
#lista .grilla.lista .l-cab a.on.sube i::before { content: "\25B2"; }   /* A-Z, menor a mayor */
#lista .grilla.lista .l-cab a.on.baja i::before { content: "\25BC"; }   /* Z-A, mayor a menor */

/* "DISPONIBLE" EN LA LISTA: SIN EL FONDO BLANCO.
   Sobre la foto de la tarjeta la pastilla lleva fondo casi blanco para
   leerse encima de la imagen. En la lista no hay foto, y ese fondo blanco con
   borde la hacia saltar como un boton en cada renglon. Aca queda igual que
   el "7 disponibles" de los packs: verde transparente. Las tarjetas no
   cambian. */
#lista .grilla.lista .f-foto .etiqueta     { backdrop-filter: none; }
#lista .grilla.lista .f-foto .et-stock     { background: var(--verde-tinte); }
#lista .grilla.lista .f-foto .et-sinstock  { background: var(--superficie-2); }
#lista .grilla.lista .f-foto .et-nopedible { background: var(--ambar-tinte); }

/* Los dos botones de vista. El activo se marca con fondo, no con color de
   texto: a esta escala un icono rojo sobre blanco no se distingue de uno
   gris de un vistazo. */
.vistas { display: flex; gap: 2px; padding: 2px; border: 1px solid var(--borde);
          border-radius: 9px; background: var(--superficie); align-self: end; }
.v-b { display: flex; align-items: center; justify-content: center;
       width: 30px; height: 28px; border: 0; border-radius: 7px; cursor: pointer;
       background: none; color: var(--texto-suave); transition: background .14s, color .14s; }
.v-b:hover { color: var(--texto); background: var(--superficie-2); }
.v-b.on { background: var(--rojo); color: #fff; }
.v-b:focus-visible { outline: 2px solid var(--rojo); outline-offset: 1px; }

.ficha {
    background: var(--superficie); border: 1px solid var(--borde);
    border-radius: var(--r-lg); box-shadow: var(--sombra);
    display: flex; flex-direction: column; overflow: hidden;
    transition: border-color .16s, box-shadow .16s, transform .16s;
}
.ficha:hover { border-color: var(--rojo); box-shadow: var(--sombra-a); transform: translateY(-2px); }

.f-cab { display: flex; align-items: center; gap: 6px; padding: 12px 14px 0; flex-wrap: wrap; }
/* El cuerpo absorbe el espacio sobrante, asi el precio y el pie quedan
   pegados abajo aunque una descripcion sea de una linea y otra de tres.
   Se hace con flex:1 aca y no con margin-top:auto en dos bloques distintos,
   porque dos margenes automaticos se reparten el hueco y abren un agujero. */
.f-cuerpo { padding: 10px 14px 0; display: flex; flex-direction: column; gap: 4px; flex: 1 1 auto; }

.ficha .codigo {
    display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
    font-size: 11.5px; font-weight: 700; color: var(--rojo);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    letter-spacing: .02em;
    /* Alto fijo: la pastilla del codigo de fabrica es unos pixeles mas alta
       que el texto pelado, y sin esto las tarjetas con codigo de fabrica
       quedaban mas altas que las que no lo tienen. */
    height: 21px;
}
/* El codigo de fabrica, al lado del interno. Se distingue por el fondo y no
   por el color: son dos codigos con el mismo peso y el cliente busca tanto
   por uno como por el otro. */
.cod-fabrica {
    padding: 1px 6px; border-radius: 5px; background: var(--superficie-2);
    border: 1px solid var(--borde); font-size: 11px; color: var(--texto-2);
}
/* TODAS LAS TARJETAS MIDEN LO MISMO.
   Antes cada una crecia con lo que tenia adentro: la que traia precio de
   contado quedaba mas alta que la que no, y la de descripcion larga mas alta
   que la de descripcion corta. En una grilla eso se nota enseguida y da
   sensacion de desprolijidad.

   Se arregla en tres puntos, y ninguno esconde informacion:
   1. El titulo ocupa SIEMPRE dos renglones. Si sobra, se recorta con puntos
      suspensivos y el nombre completo queda en el atributo title y en la
      ficha del articulo.
   2. La ruta de categoria ocupa siempre un renglon.
   3. El bloque del precio reserva el alto del caso mas grande. Cuando el
      articulo no tiene precio de contado, el hueco queda vacio en vez de
      subir todo lo de abajo. */
.ficha .titulo {
    font-weight: 700; line-height: 1.32; font-size: 14.5px;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden; height: 2.64em;
}
.ficha .titulo:hover { color: var(--rojo); }
.ficha .marca-txt { font-size: 11.5px; color: var(--texto-tenue);
                    height: 1.5em; overflow: hidden; white-space: nowrap;
                    text-overflow: ellipsis; }

/* LA DESCRIPCION ADICIONAL.
   El alto esta RESERVADO, tenga o no texto: si creciera con el contenido,
   cada tarjeta mediria distinto y la grilla quedaria desprolija. Es el mismo
   cuidado que ya se tuvo con el precio de contado.
   Se corta a dos renglones con puntos suspensivos; el texto completo queda en
   el title, y entero en la ficha del articulo. */
.ficha .detalle-extra {
    /* El alto va en pixeles y no en em: 2,8em de 11,5px da 32,2 y el
       navegador redondea distinto segun lo que tenga al lado, asi que las
       tarjetas quedaban con un pixel de diferencia entre si. */
    margin-top: 3px; height: 32px; overflow: hidden;
    font-size: 11.5px; line-height: 16px; color: var(--texto-suave);
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
}

/* --- Etiquetas de estado ------------------------------------------------ */
.etiqueta {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: 10.5px; font-weight: 700; letter-spacing: .02em;
    padding: 3px 9px; border-radius: 99px; border: 1px solid transparent;
    white-space: nowrap;
}
.etiqueta::before { content: ""; width: 6px; height: 6px; border-radius: 99px; background: currentColor; }
.et-stock     { color: var(--verde); background: var(--verde-tinte); border-color: var(--verde-borde); }
.et-sinstock  { color: var(--texto-suave); background: var(--superficie-2); border-color: var(--borde); }
.et-nopedible { color: var(--ambar); background: var(--ambar-tinte); border-color: var(--ambar-borde); }

/* LA BONIFICACION, EN NUMERO Y NO EN LA PALABRA "OFERTA".
   Un cartel que dice OFERTA no se puede verificar y todo el mundo aprendio a
   ignorarlo; "-10%" es un dato, sale del precio real de las dos listas y el
   cliente lo comprueba mirando los dos importes de abajo.
   Va rellena, no en tinte: es lo unico de la tarjeta que se puede perder si
   no lo ve, y por eso es la unica etiqueta que grita. */
.et-off { color: #fff; background: var(--rojo); border-color: var(--rojo);
          font-weight: 800; font-variant-numeric: tabular-nums; }
.et-off::before { display: none; }

/* --- Precios ------------------------------------------------------------ */
.precio { padding: 12px 14px 0; }
.ficha .precio { min-height: 96px; }
.precio .rotulo { font-size: 10.5px; color: var(--texto-tenue); text-transform: uppercase;
                  letter-spacing: .06em; font-weight: 700; }
.precio .valor { font-size: 21px; font-weight: 700; letter-spacing: -.02em;
                 font-variant-numeric: tabular-nums; line-height: 1.2; }
.precio .lista-fila { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.precio .contado {
    margin-top: 7px; display: flex; flex-direction: column; gap: 1px;
    padding: 6px 10px; border-radius: 8px;
    background: var(--verde-tinte); border: 1px solid var(--verde-borde);
}
/* El rotulo va ARRIBA y el importe abajo, no uno al lado del otro. La
   etiqueta de la lista de contado la escribe el cliente en appsettings y hoy
   dice "Oferta pagando de contado": puesta al costado partia el numero en
   dos renglones justo en la cifra que se tiene que leer de un vistazo. */
.precio .hueco-contado { margin-top: 7px; height: 49px; }
.precio .contado .e { font-size: 10px; font-weight: 800; letter-spacing: .06em;
                      text-transform: uppercase; color: var(--verde); line-height: 1.3; }
.precio .contado .v { font-family: var(--tit); font-size: 18px; font-weight: 700;
                      color: var(--verde); font-variant-numeric: tabular-nums; line-height: 1.15; }

/* El precio sugerido de reventa. Se calcula en el navegador sobre el precio
   real; NO sale de ningun lado del ERP y por eso dice "sugerido" con todas
   las letras. El margen lo elige el cliente en el panel de la izquierda. */
.sugerido {
    display: none; margin-top: 8px; padding: 6px 10px; border-radius: 8px;
    background: var(--superficie-2); border: 1px solid var(--borde);
    font-size: 11.5px; color: var(--texto-suave);
}
.sugerido.se-ve { display: block; }
.sugerido .l { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.sugerido .l b { color: var(--texto); font-variant-numeric: tabular-nums; font-size: 13px; }
.sugerido em { font-style: normal; color: var(--texto-tenue); }
.sugerido .g { color: var(--verde); font-weight: 700; }

/* --- Cantidad y cargar -------------------------------------------------- */
.f-pie { margin-top: 12px; padding: 11px 14px; border-top: 1px solid var(--borde);
         display: flex; gap: 8px; align-items: center; }

.qty { display: inline-flex; align-items: center; flex: none;
       border: 1px solid var(--borde); border-radius: 9px; background: var(--superficie);
       overflow: hidden; }
.qty button {
    width: 32px; height: 36px; border: 0; background: none; cursor: pointer;
    color: var(--texto-suave); font: inherit; font-size: 17px; line-height: 1;
}
.qty button:hover:not(:disabled) { background: var(--superficie-2); color: var(--rojo); }
.qty button:disabled { color: var(--borde-2); cursor: not-allowed; }
.qty input {
    width: 46px; height: 36px; border: 0; background: none; text-align: center;
    font: inherit; font-size: 14px; font-weight: 700; color: var(--texto);
    font-variant-numeric: tabular-nums; -moz-appearance: textfield;
}
.qty input::-webkit-outer-spin-button,
.qty input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.qty input:focus { outline: none; }
.qty:focus-within { border-color: var(--rojo); }

.cargar {
    flex: 1; min-width: 0; display: flex; align-items: center; justify-content: center; gap: 7px;
    /* 38px, no 36: es el alto EXTERIOR del selector de cantidad (36 de caja
       mas su borde de un pixel arriba y abajo). Con 36 el pie de las tarjetas
       sin stock --que no llevan selector-- quedaba dos pixeles mas bajo. */
    height: 38px; padding: 0 12px; border: 0; border-radius: 9px; cursor: pointer;
    background: var(--rojo); color: #fff; font: inherit; font-weight: 700; font-size: 13.5px;
}
.cargar:hover { background: var(--rojo-h); }
/* El borde va por dentro (box-shadow) y no como border: un borde real suma
   dos pixeles de alto y dejaba las tarjetas sin stock mas altas que el resto. */
.cargar:disabled {
    background: var(--superficie-2); color: var(--texto-tenue); cursor: not-allowed;
    box-shadow: inset 0 0 0 1px var(--borde);
}

/* ===========================================================================
   PAGINADO
   =========================================================================== */
/* Paginado numerado. Se muestran la primera, la ultima, la actual y sus
   vecinas: con 112 paginas, dibujarlas todas seria una tira inutilizable. */
.paginado { display: flex; gap: 7px; align-items: center; justify-content: center;
            margin-top: 26px; color: var(--texto-suave); font-size: 14px; flex-wrap: wrap; }
.paginado a, .paginado span.p {
    min-width: 38px; height: 38px; padding: 0 11px; border-radius: 9px;
    display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid var(--borde); background: var(--superficie);
    font-size: 13.5px; font-weight: 700; color: var(--texto-2);
    font-variant-numeric: tabular-nums;
}
.paginado a:hover { border-color: var(--rojo); color: var(--rojo); }
.paginado span.p.on { background: var(--rojo); border-color: var(--rojo); color: #fff; }
.paginado .puntos { border: 0; background: none; min-width: 0; padding: 0 2px;
                    color: var(--texto-tenue); }

/* ===========================================================================
   MENU DE CATEGORIAS
   En escritorio es una columna fija. En celular se pliega: veinte categorias
   abiertas empujan los articulos fuera de la pantalla, que es exactamente lo
   que el cliente vino a ver.
   =========================================================================== */
.contenido.con-menu { display: grid; grid-template-columns: 242px 1fr; gap: 24px; align-items: start; }
/* Sin esto, una columna de grilla NO baja del ancho de su contenido --es el
   min-width:auto por omision-- y un nombre de categoria largo empujaba la
   pagina entera a lo ancho en el celular. */
.contenido.con-menu > * { min-width: 0; }

/* La columna izquierda entera queda fija al desplazar. Lo pegajoso es la
   columna, no cada caja: si cada una se pegara por su cuenta, se montarian
   una encima de la otra al llegar al final de la pagina. */
.lat { position: sticky; top: 82px; display: flex; flex-direction: column; gap: 14px;
       max-height: calc(100vh - 92px); }

.menu {
    background: var(--superficie); border: 1px solid var(--borde);
    border-radius: var(--r-lg); padding: 6px;
    min-height: 0;
    box-shadow: var(--sombra);

    /* LAS DOS BARRAS DE DESPLAZAMIENTO, Y POR QUE APARECIAN LAS DOS.
       Aca habia un "overflow-y: auto" solo. La barra vertical era a
       proposito --la lista de categorias no entra en la pantalla-- pero la
       HORIZONTAL aparecia sola, y no por un error de ancho: cuando un eje
       se declara desplazable y el otro se deja en "visible", el CSS obliga
       al segundo a volverse "auto" tambien. O sea que pedir barra vertical
       regala barra horizontal.
       Ahora el eje horizontal se recorta explicitamente, y la vertical
       sigue funcionando pero sin dibujarse: se desplaza con la rueda y con
       el dedo igual que antes. */
    overflow-y: auto;
    /* Va "hidden" y no "clip": el CSS no deja combinar clip en un eje con
       auto en el otro, y el navegador lo convierte a hidden igual. Mejor
       escribir lo que de verdad se aplica. */
    overflow-x: hidden;
    scrollbar-width: none;            /* Firefox */
    -ms-overflow-style: none;         /* Edge viejo */
}
.menu::-webkit-scrollbar { width: 0; height: 0; }   /* Chrome, Safari */

/* Un rubro largo ya no puede empujar el ancho del panel: se corta con
   puntos suspensivos. Sin esto, recortar el eje horizontal escondería el
   final del texto en vez de avisar que hay mas. */
.menu .nom { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.menu > summary {
    list-style: none; cursor: pointer;
    display: flex; align-items: center; gap: 8px; padding: 9px 10px;
    font-family: var(--tit); font-size: 12px; letter-spacing: .08em;
    text-transform: uppercase; color: var(--texto-suave); font-weight: 700;
}
.menu > summary::-webkit-details-marker { display: none; }
.menu > summary .flecha { margin-left: auto; transition: transform .2s; color: var(--texto-tenue); }
.menu[open] > summary .flecha { transform: rotate(180deg); }
.menu > summary .donde { font-family: "Plus Jakarta Sans", sans-serif; text-transform: none;
                         letter-spacing: 0; color: var(--rojo); font-size: 12.5px; }

.menu-titulo { font-size: 11px; text-transform: uppercase; letter-spacing: .07em;
               color: var(--texto-suave); font-weight: 700; padding: 4px 10px 8px; }

/* Las categorias van con la tipografia de titulos. Es un indice, no texto
   corrido: se recorre con la vista saltando de renglon en renglon, y esta
   letra --mas angosta y con las mayusculas mas marcadas-- se lee mejor asi. */
.menu a {
    display: flex; align-items: center; gap: 7px;
    padding: 8px 10px; border-radius: 8px; line-height: 1.3;
    font-family: var(--tit); font-size: 14px; font-weight: 600;
    letter-spacing: .005em; color: var(--texto-2);
}
.menu a .nom { flex: 1; min-width: 0; }

/* ---------------------------------------------------------------------------
   EL RENGLON DE UN RUBRO SON DOS CONTROLES, NO UNO
   La flechita despliega y el nombre filtra. Antes eran el mismo <a> y no
   habia forma de espiar un rubro sin cambiar de pagina.

   La flecha va POSICIONADA ENCIMA del renglon, no adentro: un <button>
   dentro de un <a> es HTML invalido, y ponerlos uno al lado del otro en la
   misma fila partiria el area de clic del nombre por la mitad. Asi el
   nombre ocupa el renglon entero --que es lo que el dedo busca-- y la
   flecha se queda con sus 26 pixeles de la izquierda.
   --------------------------------------------------------------------------- */
.menu .cat-fila { position: relative; }
.menu .cat-fila.con-flecha > .cat-1 { padding-left: 31px; }
.menu a.cat-1.sin-flecha { padding-left: 31px; }

.menu .flecha-cat {
    position: absolute; left: 4px; top: 50%; transform: translateY(-50%);
    z-index: 2; display: flex; align-items: center; justify-content: center;
    width: 24px; height: 24px; padding: 0; border: 0; border-radius: 6px;
    background: none; color: var(--texto-tenue); cursor: pointer;
}
.menu .flecha-cat:hover { background: var(--rojo-suave); color: var(--rojo); }
.menu .flecha-cat:focus-visible { outline: 2px solid var(--rojo); outline-offset: 1px; }
.menu .flecha-cat .chevron { flex: none; transition: transform .18s; }
.menu .flecha-cat .chevron.abierta { transform: rotate(90deg); }

.menu a:hover { background: var(--superficie-2); color: var(--texto); }
.menu a.activo { background: var(--rojo-suave); color: var(--rojo); font-weight: 700; }
.menu .cuenta { font-size: 11.5px; color: var(--texto-tenue); font-variant-numeric: tabular-nums; }
.menu a.activo .cuenta { color: var(--rojo); }
.menu .cat-2 { padding-left: 31px; font-size: 13.5px; }
.menu .cat-3 { padding-left: 45px; font-size: 13px; font-weight: 500; color: var(--texto-suave); }
.menu .cat-3.activo { color: var(--rojo); }
/* La caja de subcategorias se prende y apaga con el atributo "hidden". Sin
   esta linea el display:flex de los hijos la volveria a mostrar. */
.menu .cat-sub[hidden] { display: none; }

/* La calculadora de ganancia. Define el margen que despues muestra cada
   tarjeta. Es una cuenta del navegador sobre el precio real: el ERP no
   conoce ni decide el precio de reventa de nadie. */
.ganancia {
    margin-top: 14px; background: var(--superficie); border: 1px solid var(--borde);
    border-radius: var(--r-lg); padding: 13px; box-shadow: var(--sombra);
}
.ganancia h4 { font-family: var(--tit); font-size: 12px; letter-spacing: .08em;
               text-transform: uppercase; color: var(--texto-suave); margin: 0 0 4px; font-weight: 700; }
.ganancia .exp { font-size: 11.5px; color: var(--texto-suave); line-height: 1.45; margin: 0 0 10px; }
.ganancia .ops { display: flex; gap: 5px; flex-wrap: wrap; }
.ganancia .ops button {
    flex: 1 1 44px; padding: 6px 0; border-radius: 8px; border: 1px solid var(--borde);
    background: var(--superficie); color: var(--texto-suave); font: inherit;
    font-size: 12.5px; font-weight: 700; cursor: pointer; font-variant-numeric: tabular-nums;
}
.ganancia .ops button:hover { border-color: var(--rojo); color: var(--rojo); }
.ganancia .ops button.on { background: var(--rojo); border-color: var(--rojo); color: #fff; }
/* Apagar no es una accion destacada: no merece el rojo, que en esta pantalla
   significa "hace algo". Cuando esta elegido queda gris oscuro. */
.ganancia .ops button[data-m="0"].on { background: var(--tinta); border-color: var(--tinta);
                                       color: var(--tinta-txt); }
/* El margen de cada casa no tiene por que ser uno de los cuatro que pusimos.
   El campo libre va al lado de los botones, del mismo alto, para que se lea
   como una opcion mas y no como un formulario aparte. */
.ganancia .ops .otro {
    flex: 1 1 62px; display: flex; align-items: center; gap: 2px;
    padding: 0 7px; border-radius: 8px;
    border: 1px dashed var(--borde); background: var(--superficie);
}
.ganancia .ops .otro input {
    width: 100%; min-width: 0; border: 0; background: none; color: var(--texto);
    font: inherit; font-size: 12.5px; font-weight: 700; padding: 6px 0;
    font-variant-numeric: tabular-nums; -moz-appearance: textfield;
}
.ganancia .ops .otro input::-webkit-outer-spin-button,
.ganancia .ops .otro input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.ganancia .ops .otro input:focus { outline: none; }
.ganancia .ops .otro span { font-size: 11.5px; font-weight: 800; color: var(--texto-tenue); }
.ganancia .ops .otro:focus-within { border-color: var(--rojo); border-style: solid; }

/* --- Renglones del pedido: codigo de fabrica y descripcion adicional ----- */
.ren-larga { margin-top: 2px; font-size: 12px; line-height: 1.4; color: var(--texto-suave); }
.ren-cods { margin-top: 3px; display: flex; flex-wrap: wrap; gap: 8px;
            font-size: 11.5px; color: var(--texto-tenue); }
.ren-cods .fab { padding: 0 6px; border-radius: 5px;
                 background: var(--superficie-2); border: 1px solid var(--borde); }

/* ===========================================================================
   AVISOS, CINTAS Y VACIOS
   AMBAR y ROJO de aviso: nunca relleno. Borde y tinte. Se leen, no se tocan.
   =========================================================================== */
.cinta { border-radius: var(--radio); padding: 12px 16px; margin: 14px 0; font-size: 14px;
         border: 1px solid var(--borde); background: var(--superficie); border-left-width: 3px; }
.cinta-ok  { border-left-color: var(--verde); }
.cinta-mal { border-left-color: var(--rojo); }
.cinta ul  { margin: 8px 0 0; padding-left: 18px; }
.cinta li  { margin-bottom: 4px; }
.cinta a   { margin-left: 10px; color: var(--rojo); font-weight: 700; }

.error {
    background: var(--rojo-suave); color: var(--rojo);
    border: 1px solid rgba(220,38,38,.28); border-left: 3px solid var(--rojo);
    padding: 10px 14px; border-radius: var(--radio); font-size: 14px; margin-bottom: 16px;
}
.vacio { text-align: center; padding: 52px 20px; color: var(--texto-suave); }
.vacio p { margin-bottom: 14px; }

/* ===========================================================================
   LOGIN
   =========================================================================== */
.centro { min-height: 100vh; display: grid; place-items: center; padding: 20px; }
.tarjeta-login {
    background: var(--superficie); border: 1px solid var(--borde);
    border-radius: var(--r-xl); padding: 30px; width: 100%; max-width: 390px;
    box-shadow: var(--sombra-a);
}
.tarjeta-login h1 { margin: 0 0 4px; font-size: 24px; letter-spacing: -.02em; }
.tarjeta-login h1 span { color: var(--rojo); }
.tarjeta-login p.ayuda { margin: 0 0 22px; color: var(--texto-suave); font-size: 14px; }
.campo { margin-bottom: 15px; }
.campo label { display: block; font-size: 13px; font-weight: 700; margin-bottom: 6px; }
.campo input {
    width: 100%; padding: 11px 14px; font: inherit;
    border: 1px solid var(--borde); border-radius: var(--radio);
    background: var(--fondo); color: var(--texto);
}
.campo input:focus { outline: 2px solid var(--rojo); outline-offset: 1px; border-color: transparent; }
.tarjeta-login .boton { width: 100%; padding: 12px; }

/* ===========================================================================
   DETALLE DE ARTICULO
   =========================================================================== */
.detalle { background: var(--superficie); border: 1px solid var(--borde);
           border-radius: var(--r-lg); padding: 26px; box-shadow: var(--sombra); }
.detalle h1 { margin: 6px 0 4px; font-size: 25px; letter-spacing: -.02em; }
.datos { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
         gap: 16px; margin: 22px 0; }
.datos div span { display: block; font-size: 10.5px; color: var(--texto-tenue);
                  text-transform: uppercase; letter-spacing: .06em; font-weight: 700; margin-bottom: 3px; }
.volver { color: var(--texto-suave); font-size: 14px; }
.volver:hover { color: var(--rojo); }

/* ===========================================================================
   TABLERO INTERNO
   =========================================================================== */
.titulo-pagina { font-family: var(--tit); font-size: 26px; letter-spacing: -.02em; margin: 0 0 6px; }
.ayuda-pagina  { color: var(--texto-suave); font-size: 14px; margin: 0 0 22px; }
.titulo-seccion{ font-family: var(--tit); font-size: 17px; margin: 30px 0 12px; }

.avisos { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }
.aviso {
    display: flex; align-items: baseline; gap: 14px;
    background: var(--superficie); border: 1px solid var(--borde);
    border-left: 3px solid var(--borde); border-radius: var(--radio); padding: 14px 16px;
}
.aviso-num { font-family: var(--tit); font-size: 23px; font-weight: 700; letter-spacing: -.02em;
             font-variant-numeric: tabular-nums; min-width: 2.2em; }
.aviso-txt { font-size: 14px; color: var(--texto-suave); line-height: 1.4; }
.aviso-ver { display: block; margin-top: 4px; font-size: 13px; color: var(--rojo); font-weight: 700; }
.aviso-ver:hover { text-decoration: underline; }

/* El color solo aparece cuando hay algo que mirar. Un tablero donde todo
   grita no dice nada. */
.aviso.en-cero { opacity: .5; }
.aviso.en-cero .aviso-num { color: var(--texto-suave); }
.aviso.av-alto:not(.en-cero)  { border-left-color: var(--rojo); }
.aviso.av-alto:not(.en-cero)  .aviso-num { color: var(--rojo); }
.aviso.av-medio:not(.en-cero) { border-left-color: var(--ambar); }
.aviso.av-medio:not(.en-cero) .aviso-num { color: var(--ambar); }

/* ===========================================================================
   TABLAS
   Se desplazan dentro de su caja. Nunca empujan la pagina.
   =========================================================================== */
/* position: relative para que lo que va posicionado adentro (el texto
   .oculto de los titulos para lectores de pantalla) quede dentro de la caja
   que se desplaza. Sin esto se ubicaba contra la pagina y, en el celular,
   estiraba la pagina entera de costado. */
.tabla-wrap { position: relative; overflow-x: auto; border: 1px solid var(--borde);
              border-radius: var(--r-lg); background: var(--superficie); }
.tabla { width: 100%; border-collapse: collapse; font-size: 14px; }
.tabla th { text-align: left; padding: 10px 14px; font-size: 10.5px;
            text-transform: uppercase; letter-spacing: .06em; font-weight: 700;
            color: var(--texto-suave); border-bottom: 1px solid var(--borde); white-space: nowrap; }
.tabla td { padding: 9px 14px; border-bottom: 1px solid var(--borde); }
.tabla tr:last-child td { border-bottom: 0; }
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 13px; }

.nav { display: flex; gap: 16px; flex-wrap: wrap; }
.nav a { font-size: 14px; color: var(--texto-suave); }
.nav a:hover { color: var(--rojo); }

/* ===========================================================================
   CARRITO Y PEDIDOS
   =========================================================================== */
.fila-cant { display: inline-flex; align-items: center; gap: 8px; }
.etiqueta-cant { font-size: 13px; color: var(--texto-suave); }
.caja-cant { width: 84px; padding: 7px 9px; text-align: right;
             border: 1px solid var(--borde); border-radius: 7px;
             background: var(--superficie); color: var(--texto);
             font-family: ui-monospace, monospace; font-size: 14px; }

.resumen { margin-top: 18px; padding: 16px 18px; border: 1px solid var(--borde);
           border-radius: var(--r-lg); background: var(--superficie); box-shadow: var(--sombra); }
.resumen-linea { font-size: 14px; color: var(--texto-suave); }
.resumen-total { display: flex; justify-content: space-between; align-items: baseline;
                 gap: 12px; margin-top: 8px; font-size: 20px; flex-wrap: wrap; }
.resumen-total strong { font-family: var(--tit); font-size: 27px; letter-spacing: -.02em;
                        font-variant-numeric: tabular-nums; }
.resumen-nota { margin-top: 6px; font-size: 12.5px; color: var(--texto-suave); }

.caja-form { margin-top: 20px; display: flex; flex-direction: column; gap: 14px; max-width: 620px; }
.caja-form label { display: flex; flex-direction: column; gap: 5px; font-size: 13px; color: var(--texto-suave); }
.caja-form input[type=text], .caja-form textarea {
    padding: 9px 11px; border: 1px solid var(--borde); border-radius: 7px;
    background: var(--superficie); color: var(--texto); font: inherit; font-size: 14px; resize: vertical; }
.opcional { color: var(--texto-suave); font-weight: 400; }
.acciones { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
.nota-envio { font-size: 13px; color: var(--texto-suave); margin: 0; }

/* Estado del pedido. El color dice si hay que hacer algo. */
.estado { display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: .05em;
          text-transform: uppercase; padding: 3px 9px; border-radius: 99px;
          background: var(--superficie-2); color: var(--texto-suave);
          /* Partido en dos lineas, "EN PREPARACION" parece dos estados
             distintos. La tabla ya scrollea sola, asi que ensancharla un
             poco no rompe nada. */
          white-space: nowrap; }
.est-confirmado { background: var(--verde-tinte); color: var(--verde); }
.est-rechazado  { background: var(--rojo-suave); color: var(--rojo); }

/* Los estados que informa el ERP. El color va de gris a verde a medida que el
   pedido avanza, asi el cliente entiende el progreso sin leer la palabra.
   Los dos finales --despachado y facturado-- comparten el verde: para el
   cliente los dos significan "ya salio", y hacer siete colores distintos
   convertiria la lista en un semaforo roto. */
.est-recibido    { background: var(--superficie-2); color: var(--texto-suave); }
.est-preparacion { background: rgba(217,119,6,.10); color: #B45309; }
.est-despachado  { background: var(--verde-tinte); color: var(--verde); }
.est-facturado   { background: var(--verde-tinte); color: var(--verde); }
.est-cancelado   { background: var(--rojo-suave); color: var(--rojo); }
.est-tango       { background: var(--superficie-2); color: var(--texto-suave); }

/* De donde vino el pedido y su orden de compra, debajo del numero. */
.ped-origen { font-size: 11px; color: var(--texto-suave); margin-top: 3px; }
.ped-oc     { font-size: 12px; color: var(--texto-suave); margin-top: 3px; }
.ped-papeles { font-size: 12px; line-height: 1.5; color: var(--texto-suave); }

/* ---------------------------------------------------------------------------
   POR DONDE VA EL PEDIDO
   Es un <details> del navegador, no un bloque con JavaScript: se abre con el
   teclado solo y funciona con el JavaScript apagado. Lo unico que hay que
   hacer a mano es sacarle el triangulito que cada navegador dibuja distinto y
   poner uno propio.
   --------------------------------------------------------------------------- */
.linea { margin-top: 16px; border: 1px solid var(--borde); border-radius: 10px;
         background: var(--superficie); overflow: hidden; }
.linea > summary { list-style: none; cursor: pointer; padding: 13px 15px;
                   display: flex; align-items: center; gap: 10px;
                   font-weight: 600; font-size: 14px; }
.linea > summary::-webkit-details-marker { display: none; }
.linea > summary::after { content: ""; margin-left: auto; width: 8px; height: 8px;
                          border-right: 2px solid var(--texto-suave);
                          border-bottom: 2px solid var(--texto-suave);
                          transform: rotate(45deg); transition: transform .18s ease; }
.linea[open] > summary::after { transform: rotate(225deg); }
.linea > summary:focus-visible { outline: 2px solid var(--rojo); outline-offset: -2px; }
.li-resumen { font-size: 12px; font-weight: 700; letter-spacing: .04em;
              text-transform: uppercase; color: var(--texto-suave); }

.li-pasos { list-style: none; margin: 0; padding: 4px 15px 0; }
.li-pasos li { position: relative; display: flex; align-items: baseline; gap: 10px;
               padding: 0 0 18px 20px; }
/* La linea vertical que une los puntos. El ultimo paso no la lleva. */
.li-pasos li::before { content: ""; position: absolute; left: 4px; top: 12px; bottom: 0;
                       width: 2px; background: var(--borde); }
.li-pasos li:last-child { padding-bottom: 4px; }
.li-pasos li:last-child::before { display: none; }
.li-pasos li.li-ok::before { background: var(--verde-borde); }
.li-punto { position: absolute; left: 0; top: 5px; width: 10px; height: 10px;
            border-radius: 50%; background: var(--superficie);
            border: 2px solid var(--borde-2); box-sizing: border-box; }
.li-ok .li-punto { background: var(--verde); border-color: var(--verde); }
.li-nombre { font-size: 14px; }
.li-falta .li-nombre { color: var(--texto-suave); }
.li-ok .li-nombre { font-weight: 600; }
.li-cuando { margin-left: auto; font-size: 12px; color: var(--texto-suave);
             font-variant-numeric: tabular-nums; }

.li-papeles { display: flex; flex-wrap: wrap; gap: 10px 26px;
              padding: 12px 15px; border-top: 1px solid var(--borde);
              background: var(--superficie-2); }
.li-papeles > div { display: flex; flex-direction: column; gap: 2px; }
.li-papeles span { font-size: 11px; text-transform: uppercase; letter-spacing: .04em;
                   color: var(--texto-suave); }
.li-papeles strong { font-size: 14px; }
.li-nota { margin: 0; padding: 11px 15px; font-size: 12px; color: var(--texto-suave);
           border-top: 1px solid var(--borde); }

.nav-carrito { position: relative; }
.globo { display: inline-block; min-width: 18px; padding: 1px 6px; margin-left: 5px;
         border-radius: 99px; background: var(--rojo); color: #fff;
         font-size: 11px; font-weight: 700; text-align: center; font-variant-numeric: tabular-nums; }

/* ===========================================================================
   MI CUENTA CORRIENTE
   El rojo se usa UNICAMENTE para lo vencido: si pintaramos de rojo todo lo
   que se debe, el cliente al dia veria una pantalla alarmante sin motivo, y
   el que de verdad esta atrasado no lo notaria.
   =========================================================================== */
.cc-encabezado { display: flex; align-items: flex-start; justify-content: space-between;
                 gap: 20px; flex-wrap: wrap; margin-bottom: 18px; }
.cc-titulo { margin: 0; font-size: 23px; letter-spacing: -.02em; }
.cc-hora   { margin-top: 4px; color: var(--texto-suave); font-size: 13px; }

.cc-saldo { text-align: right; padding: 12px 18px; border-radius: var(--r-lg);
            background: var(--superficie); border: 1px solid var(--borde); box-shadow: var(--sombra); }
.cc-saldo .rotulo { font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase;
                    color: var(--texto-suave); font-weight: 700; }
.cc-saldo .valor  { font-size: 29px; font-weight: 700; letter-spacing: -.02em;
                    font-variant-numeric: tabular-nums; }
/* EL MISMO NUMERO, EL MISMO COLOR EN TODAS LAS PANTALLAS.
   El saldo de la cabecera y el de aca son el mismo dato, asi que van del
   mismo color: ambar. El rojo se reserva para lo que exige una accion --el
   cartel de vencido y los comprobantes atrasados del detalle--. Si el saldo
   tambien fuera rojo, el aviso que de verdad importa se perderia entre dos
   numeros rojos iguales. */
.cc-saldo-vencido { border-color: var(--ambar-borde); background: var(--ambar-tinte); }
.cc-saldo-vencido .rotulo { color: var(--ambar); }
.cc-saldo-vencido .valor  { color: var(--ambar); }

.cc-alerta { padding: 12px 16px; border-radius: var(--radio); font-size: 14px; margin-bottom: 18px;
             border: 1px solid var(--borde); background: var(--superficie); }
.cc-ok       { border-left: 3px solid var(--verde); }
.cc-atencion { border-left: 3px solid var(--peligro); background: var(--rojo-suave);
               border-color: rgba(220,38,38,.24); }

.cc-cifras { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 22px; }
.cc-cifra  { flex: 1 1 150px; padding: 12px 14px; border-radius: var(--radio);
             background: var(--superficie); border: 1px solid var(--borde); }
.cc-cifra .e { display: block; font-size: 10.5px; letter-spacing: .06em; font-weight: 700;
               text-transform: uppercase; color: var(--texto-suave); }
.cc-cifra .v { display: block; margin-top: 3px; font-family: var(--tit); font-size: 18px;
               font-weight: 700; font-variant-numeric: tabular-nums; }
.cc-cifra .v.rojo { color: var(--ambar); }
.cc-nada { color: var(--texto-suave); font-weight: 400; }
.cc-sub  { font-family: var(--tit); font-size: 16px; margin: 0 0 10px; }

.cc-tabla { width: 100%; border-collapse: collapse; font-size: 14px; }
.cc-tabla th { text-align: left; font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase;
               color: var(--texto-suave); font-weight: 700; padding: 9px 10px;
               border-bottom: 1px solid var(--borde); white-space: nowrap; }
.cc-tabla td { padding: 10px; border-bottom: 1px solid var(--borde); vertical-align: top; }
.cc-tabla .der { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.cc-tabla tfoot td { border-bottom: 0; padding-top: 14px; font-weight: 700; }
.cc-total { font-family: var(--tit); font-size: 18px; }
.cc-pendiente { font-weight: 700; }
.cc-fila-vencida .cc-pendiente { color: var(--peligro); }
.cc-nro  { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 13px; }
.cc-tipo { display: block; color: var(--texto-suave); font-size: 12px; }
.cc-dias { display: block; color: var(--peligro); font-size: 12px; }
.cc-pie  { margin-top: 16px; color: var(--texto-suave); font-size: 12.5px; max-width: 70ch; }
.cc-parcial { display: none; }


/* ===========================================================================
   LA FOTO DE LA TARJETA
   Fondo blanco SIEMPRE, tambien en modo oscuro: sobre gris el recorte del
   producto se ve sucio. Relacion cuadrada y object-fit: contain, no cover,
   porque en un repuesto recortar los bordes puede sacar justo la parte por
   la que se reconoce la pieza.
   =========================================================================== */
.f-foto { position: relative; background: var(--foto); border-bottom: 1px solid var(--borde); }
.f-foto .marco {
    display: flex; align-items: center; justify-content: center;
    aspect-ratio: 1 / 1; width: 100%; padding: 12px; overflow: hidden;
}
.f-foto img { width: 100%; height: 100%; object-fit: contain; }

/* El marcador de "todavia no tiene foto". Lleva el codigo adentro para que
   el hueco igual diga algo util. */
.f-foto .sin-foto {
    display: flex; flex-direction: column; align-items: center; gap: 8px;
    color: #C7C7CC;
}
.f-foto .sin-foto .c { font-size: 11px; letter-spacing: .04em; color: #A1A1AA; }

/* Los chips van sobre la foto, arriba a la izquierda. El estado primero: si
   no se puede comprar, no hace falta leer el resto de la tarjeta. */
.f-foto .chips {
    position: absolute; top: 10px; left: 10px; right: 10px; z-index: 2;
    display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
}
/* La bonificacion se va sola al borde derecho. Estado a la izquierda,
   descuento a la derecha: ninguna de las dos tapa el centro de la foto, que
   es donde esta el producto. */
.f-foto .chips .et-off { margin-left: auto; }
.f-foto .etiqueta { background: var(--superficie); backdrop-filter: blur(2px); }
.f-foto .et-stock    { background: rgba(236,253,245,.94); }
/* La bonificacion es la unica que va rellena. Sin esta linea, la regla de
   arriba --que le pone fondo claro a TODA etiqueta sobre la foto-- le ganaba
   por especificidad y la dejaba en blanco sobre blanco. */
.f-foto .et-off      { background: var(--rojo); color: #fff; }
.f-foto .et-sinstock { background: rgba(244,244,245,.94); }
.f-foto .et-nopedible{ background: rgba(255,251,235,.94); }

/* ===========================================================================
   CARRUSEL DE PORTADA
   =========================================================================== */
.sec { padding: 26px 0 0; }
.sec-t { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.sec-t h2 { font-family: var(--tit); font-size: 20px; font-weight: 700; margin: 0; letter-spacing: -.01em; }
.sec-t .raya { flex: 1; height: 1px; background: var(--borde); }

.hero { padding: 20px 0 0; }
/* El alto sale de la proporcion de los banners (1920x629). Asi la lamina de
   imagen entra entera, sin recortes, y las de texto tienen sitio de sobra.
   El minimo y el maximo evitan los dos extremos: una franja aplastada en
   pantalla angosta y una portada gigante en un monitor de 27 pulgadas. */
.hero-in {
    position: relative; border-radius: var(--r-xl); overflow: hidden;
    background: #09090B; border: 1px solid var(--borde);
    /* width primero y aspect-ratio despues, y SIN min-height: con un alto
       minimo puesto, el navegador calculaba el ANCHO a partir de el y la
       portada terminaba midiendo 977 pixeles dentro de una ventana de 768.
       La proporcion decide el alto; el ancho lo decide la pagina. */
    width: 100%; aspect-ratio: 1920 / 629; max-height: 470px;
}

/* La lamina que es un banner: la imagen ocupa todo y no lleva nada encima. */
.lamina-img { padding: 0; }
.lamina-img picture, .lamina-img img { width: 100%; height: 100%; display: block; }
.lamina-img img { object-fit: cover; }
.hero-img-link { position: absolute; inset: 0; z-index: 3; }
.hero-tr { position: absolute; inset: 0; opacity: .06; z-index: 1;
           background-image: repeating-linear-gradient(115deg,#fff 0 1px,transparent 1px 13px); }

/* Cada lamina trae su propio fondo. El color no es decorativo: distingue de
   un vistazo si lo que se muestra es una liquidacion, el Club o una
   herramienta. */
.lamina { position: absolute; inset: 0; display: flex; align-items: center;
          opacity: 0; visibility: hidden; transition: opacity .55s ease; z-index: 1; }
.lamina.on { opacity: 1; visibility: visible; z-index: 2; }
.lamina::before { content: ""; position: absolute; inset: 0; opacity: .30; }
.lamina[data-tono="rojo"]::before {
    background: radial-gradient(1000px 420px at 78% 42%, #DC2626 0%, transparent 62%),
                radial-gradient(700px 400px at 12% 92%, #52525B 0%, transparent 70%); }
.lamina[data-tono="ambar"]::before {
    background: radial-gradient(950px 430px at 74% 38%, #B45309 0%, transparent 62%),
                radial-gradient(700px 400px at 10% 95%, #7C2D12 0%, transparent 70%); }
.lamina[data-tono="gris"]::before {
    background: radial-gradient(980px 420px at 80% 45%, #3F3F46 0%, transparent 62%),
                radial-gradient(720px 400px at 12% 90%, #DC2626 0%, transparent 74%); }

.hero-txt { position: relative; z-index: 2; padding: 40px 48px; max-width: 660px; color: #fff; }
.pill { display: inline-flex; align-items: center; gap: 8px; padding: 5px 13px; border-radius: 99px;
        background: rgba(220,38,38,.18); border: 1px solid rgba(239,68,68,.45); color: #FCA5A5;
        font-size: 11.5px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; }
.pill-ambar { background: rgba(180,83,9,.24); border-color: rgba(252,211,77,.45); color: #FCD34D; }
.pill-gris  { background: rgba(255,255,255,.09); border-color: rgba(255,255,255,.24); color: #E4E4E7; }

.hero h1 { font-family: var(--tit); font-size: 42px; line-height: 1.05; font-weight: 700;
           margin: 15px 0 10px; letter-spacing: -.015em; text-wrap: balance; color: #fff; }
.hero h1 em { font-style: normal; color: #F87171; }
.lamina[data-tono="ambar"] h1 em { color: #FCD34D; }
.hero p { margin: 0 0 20px; color: #D4D4D8; font-size: 15.5px; max-width: 48ch; }
.hero .btns { display: flex; gap: 11px; flex-wrap: wrap; }
.btn { display: inline-flex; align-items: center; gap: 9px; border: 0; cursor: pointer;
       font: inherit; font-weight: 700; font-size: 14.5px; padding: 12px 22px; border-radius: var(--radio); }
.btn-rojo  { background: #DC2626; color: #fff; }
.btn-rojo:hover  { background: #B91C1C; }
.btn-ambar { background: #B45309; color: #fff; }
.btn-ambar:hover { background: #92400E; }
.btn-gris  { background: #DC2626; color: #fff; }
.btn-gris:hover  { background: #B91C1C; }
.btn-fant  { background: rgba(255,255,255,.07); color: #fff; border: 1px solid rgba(255,255,255,.22); }
.btn-fant:hover  { background: rgba(255,255,255,.14); }

.hero-num { position: absolute; right: 44px; top: 50%; transform: translateY(-50%);
            z-index: 2; text-align: right; color: #fff; }
.hero-num .n { font-family: var(--tit); font-size: 72px; font-weight: 700; line-height: .9; color: #F87171; }
.hero-num .n.n-ambar { color: #FCD34D; }
.hero-num .n.n-gris  { color: #E4E4E7; }
.hero-num .l { font-size: 12px; letter-spacing: .14em; text-transform: uppercase;
               color: #A1A1AA; margin-top: 6px; }

/* Las flechas aparecen al pasar por encima. En pantalla tactil no hay hover:
   ahi quedan siempre visibles, porque sin ellas no hay como volver atras. */
.fl { position: absolute; top: 50%; transform: translateY(-50%); z-index: 4;
      width: 38px; height: 38px; border-radius: 99px; border: 1px solid rgba(255,255,255,.22);
      background: rgba(0,0,0,.42); color: #fff; display: flex; align-items: center;
      justify-content: center; cursor: pointer; opacity: 0; transition: .2s; }
.fl.ant { left: 14px; } .fl.sig { right: 14px; }
.hero-in:hover .fl { opacity: 1; }
.fl:hover { background: var(--rojo); border-color: var(--rojo); }
@media (hover: none) { .fl { opacity: .85; } }

.dots { position: absolute; left: 48px; bottom: 22px; z-index: 4; display: flex; gap: 7px; }
.dots button { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 99px;
               background: rgba(255,255,255,.30); cursor: pointer; transition: .22s; }
.dots button:hover { background: rgba(255,255,255,.6); }
.dots button.on { background: var(--rojo); width: 24px; }

/* ===========================================================================
   LIQUIDACION POR BULTO CERRADO
   =========================================================================== */
.liq { background: linear-gradient(180deg, var(--rojo-suave) 0%, transparent 100%);
       border: 1px solid var(--borde); border-radius: var(--r-xl); padding: 16px 18px 18px; }
.liq-t { display: flex; align-items: center; gap: 11px; margin-bottom: 4px; flex-wrap: wrap; }
.liq-t h2 { font-family: var(--tit); font-size: 20px; font-weight: 700; margin: 0; }
.flama { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px;
         border-radius: 8px; background: var(--rojo); color: #fff; flex: none; }
.liq-t .reloj { margin-left: auto; display: flex; align-items: center; gap: 8px;
                background: var(--ambar-tinte); border: 1px solid var(--ambar-borde);
                color: var(--ambar); padding: 5px 12px; border-radius: 99px;
                font-size: 12.5px; font-weight: 700; white-space: nowrap; }
/* El numero cambia cada segundo. Sin ancho fijo por caracter el cartel entero
   se movia una pizca en cada tic y quedaba temblando. */
.liq-t .reloj b { font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; }
.liq-sub { font-size: 13px; color: var(--texto-suave); margin: 0 0 14px; }
.liq-g { display: grid; gap: 13px; grid-template-columns: repeat(auto-fit, minmax(256px, 1fr)); }

.lote-c { background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-lg);
          padding: 14px; display: flex; flex-direction: column; gap: 7px;
          box-shadow: var(--sombra); transition: .18s; }
.lote-c:hover { border-color: var(--rojo); transform: translateY(-2px); box-shadow: var(--sombra-a); }
.lote-c .top-l { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-height: 20px; }
.lote-c .cerr { font-size: 9.5px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
                background: var(--tinta); color: var(--tinta-txt); padding: 3px 8px;
                border-radius: 5px; border: 1px solid var(--borde-2); }
.lote-c .off  { font-size: 9.5px; font-weight: 800; letter-spacing: .07em; background: var(--rojo);
                color: #fff; padding: 3px 8px; border-radius: 5px; }

/* La foto va chica y al costado, no arriba y grande. Un lote se reconoce con
   una miniatura; una foto grande haria que esta franja pese mas que el
   catalogo, que es lo que el cliente vino a mirar. */
.lote-c .cuerpo { display: flex; gap: 12px; align-items: flex-start; }
.lote-c .mini { flex: none; width: 84px; height: 84px; border-radius: 10px; background: var(--foto);
                border: 1px solid var(--borde); display: flex; align-items: center;
                justify-content: center; overflow: hidden; color: #C7C7CC; }
.lote-c .mini img { width: 100%; height: 100%; object-fit: contain; padding: 5px; }
.lote-c .txt { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.lote-c .cod { font-size: 11px; color: var(--rojo); font-weight: 700;
               font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
.lote-c h3 { font-size: 14.5px; margin: 0; font-weight: 700; line-height: 1.3; }
.lote-c .comp { font-size: 12px; color: var(--texto-suave); line-height: 1.45; margin: 0; }
.lote-c .pr { margin-top: auto; padding-top: 10px; border-top: 1px solid var(--borde);
              display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.lote-c .pr .antes { font-size: 11.5px; color: var(--texto-tenue); text-decoration: line-through; }
.lote-c .pr .ahora { font-family: var(--tit); font-size: 19px; font-weight: 700; color: var(--rojo);
                     font-variant-numeric: tabular-nums; }
.lote-c .unit { font-size: 11px; color: var(--texto-suave); }

/* ===========================================================================
   PACKS MAYORISTAS
   =========================================================================== */
.packs { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); }
.pack { position: relative; border-radius: var(--r-lg); background: var(--superficie);
        border: 1px solid var(--borde); box-shadow: var(--sombra);
        display: flex; flex-direction: column; overflow: hidden; transition: .18s; }
.pack:hover { border-color: var(--rojo); box-shadow: var(--sombra-a); }
.pack-h { display: flex; align-items: center; gap: 8px; padding: 14px 16px 0; }
.pack-h .cat { font-size: 10.5px; font-weight: 800; letter-spacing: .08em;
               text-transform: uppercase; color: var(--texto-tenue); }
.pack-h .kit { margin-left: auto; font-size: 10px; font-weight: 800; letter-spacing: .08em;
               background: var(--tinta); color: var(--tinta-txt); padding: 3px 8px;
               border-radius: 6px; border: 1px solid var(--borde-2); }
.pack-b { padding: 8px 16px 0; }
.pack .cod { font-size: 11.5px; font-weight: 700; color: var(--rojo);
             font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
.pack h3 { font-family: var(--tit); font-size: 17.5px; margin: 3px 0 6px; font-weight: 700;
           line-height: 1.2; letter-spacing: -.01em; text-wrap: balance; }
.pack .d { font-size: 12.5px; color: var(--texto-suave); line-height: 1.5; margin: 0; }

/* Un mayorista no compra un pack por el nombre: compra por lo que trae
   adentro y por cuantas piezas se lleva de cada cosa. */
.cont { margin: 13px 16px 0; border: 1px solid var(--borde); border-radius: 10px;
        background: var(--superficie-2); padding: 11px 12px; }
.cont-t { font-size: 11px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
          color: var(--texto-suave); margin-bottom: 7px; }
.cont ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.cont li { display: flex; align-items: baseline; gap: 10px; font-size: 12.5px; color: var(--texto-2); }
.cont li .it { flex: 1; line-height: 1.35; }
.cont li .qt { font-weight: 800; font-size: 11.5px; color: var(--texto);
               font-variant-numeric: tabular-nums; background: var(--superficie);
               border: 1px solid var(--borde); border-radius: 6px; padding: 1px 7px; white-space: nowrap; }

/* De donde salio la lista. "del sistema" no es adorno: aclara que esto lo
   dice el ERP y no alguien que lo escribio a mano en un archivo. */
.cont-t .fuente { float: right; font-weight: 700; letter-spacing: .02em;
                  text-transform: none; font-size: 10.5px; color: var(--texto-tenue); }

/* El componente que esta frenando al pack. Un "Sin stock" sin decir por cual
   obliga a levantar el telefono para averiguarlo. */
.cont li.falta .it { color: var(--rojo); }
.cont li.falta .qt { color: var(--rojo); border-color: var(--rojo);
                     background: var(--rojo-suave); }
.cont-falta { margin: 9px 0 0; font-size: 11.5px; line-height: 1.4;
              color: var(--texto-suave); }
.cont-falta strong { color: var(--rojo); font-weight: 700; }

/* Mano de obra y servicios. Van en la lista porque forman parte del kit,
   pero no son piezas: se muestran mas apagados y nunca se marcan faltantes. */
.cont li.servicio .it { color: var(--texto-suave); font-style: italic; }
.cont li.servicio .qt { color: var(--texto-suave); font-weight: 700; }

/* El simulador de margen, plegado. Cerrado muestra el resultado --el margen y
   el PVP-- porque ese es el dato que el cliente mira de reojo. Abierto muestra
   la grilla completa. Asi la tarjeta no queda cargada y el que quiere jugar
   con los numeros lo hace. */
.sim { margin: 12px 16px 13px; border: 1px solid var(--borde); border-radius: 10px;
       background: var(--superficie-2); overflow: hidden; }
.sim-cab { width: 100%; display: flex; align-items: center; gap: 8px; padding: 9px 11px;
           border: 0; background: none; font: inherit; color: var(--texto-2);
           cursor: pointer; text-align: left; }
.sim-cab:hover { background: var(--superficie); }
.sim-cab .t { font-size: 11px; font-weight: 800; letter-spacing: .07em;
              text-transform: uppercase; color: var(--texto-suave); }
.sim-cab .res { margin-left: auto; font-size: 12.5px; color: var(--texto-suave);
                font-variant-numeric: tabular-nums; white-space: nowrap; }
.sim-cab .res b { color: var(--verde); font-weight: 800; }
.sim-cab .chev { flex: none; color: var(--texto-tenue); transition: transform .2s; }
.sim-cab[aria-expanded="true"] .chev { transform: rotate(180deg); }
.sim-cab[aria-expanded="true"] .res { display: none; }
.sim-cuerpo { padding: 2px 11px 11px; border-top: 1px solid var(--borde); }
.sim .ops { display: flex; flex-wrap: wrap; gap: 5px; margin: 10px 0 11px; }
.sim .ops button { padding: 4px 9px; border-radius: 7px; border: 1px solid var(--borde);
                   background: var(--superficie); color: var(--texto-suave); font: inherit;
                   font-size: 11.5px; font-weight: 800; cursor: pointer;
                   font-variant-numeric: tabular-nums; transition: .15s; }
.sim .ops button:hover { border-color: var(--rojo); color: var(--rojo); }
.sim .ops button.on { background: var(--rojo); border-color: var(--rojo); color: #fff; }
/* El campo libre existe porque doce botones nunca alcanzan: siempre hay
   alguien que trabaja con 38 o con 112. */
.sim .otro { display: inline-flex; align-items: center; gap: 2px; border: 1px dashed var(--borde-2);
             border-radius: 7px; background: var(--superficie); padding: 0 7px 0 3px; }
.sim .otro input { width: 46px; border: 0; background: none; font: inherit; font-size: 11.5px;
                   font-weight: 800; color: var(--texto); padding: 4px 0 4px 6px; text-align: right;
                   font-variant-numeric: tabular-nums; -moz-appearance: textfield; }
.sim .otro input::-webkit-outer-spin-button,
.sim .otro input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.sim .otro input:focus { outline: none; }
.sim .otro span { font-size: 11.5px; font-weight: 800; color: var(--texto-tenue); }
.sim .otro:focus-within { border-color: var(--rojo); border-style: solid; }
.sim-g { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.sim-c { background: var(--superficie); border: 1px solid var(--borde); border-radius: 9px; padding: 8px 10px; }
.sim-c .e { display: block; font-size: 10.5px; color: var(--texto-tenue); letter-spacing: .04em;
            text-transform: uppercase; font-weight: 700; margin-bottom: 2px; }
.sim-c b { font-family: var(--tit); font-size: 16px; font-weight: 700;
           font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
.sim-c b.verde { color: var(--verde); }
.sim-pie { margin: 9px 0 0; font-size: 11px; color: var(--texto-tenue); line-height: 1.45; }

.pack-p { margin-top: auto; padding: 13px 16px; display: flex; align-items: flex-end; gap: 10px;
          border-top: 1px solid var(--borde); background: var(--superficie); }
.pack-p .izq { flex: 1; min-width: 0; }
.pack-p .rot { font-size: 10.5px; font-weight: 800; letter-spacing: .06em;
               text-transform: uppercase; color: var(--verde); }
.pack-p .antes { font-size: 12px; color: var(--texto-tenue); text-decoration: line-through;
                 font-variant-numeric: tabular-nums; }
.pack-p .ahora { display: block; font-family: var(--tit); font-size: 22px; font-weight: 700;
                 font-variant-numeric: tabular-nums; letter-spacing: -.015em; line-height: 1.15; }
.pack-p .cargar { flex: none; height: auto; padding: 10px 16px; }


/* ===========================================================================
   EL BOTON DEL TEMA
   Dos estados y nada mas: claro y oscuro. La primera vez manda el sistema.
   Muestra UN icono, el del estado actual; tocarlo lleva al otro.
   =========================================================================== */
.tema {
    flex: none; width: 38px; height: 38px; border-radius: var(--radio);
    border: 1px solid var(--borde); background: var(--superficie);
    color: var(--texto-suave); cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    transition: color .16s, border-color .16s, transform .16s;
}
.tema:hover { color: var(--rojo); border-color: var(--rojo); }
.tema:active { transform: scale(.93); }
.tema svg { display: none; }
/* Tres iconos, DOS estados. Sol y luna dicen que color esta puesto porque el
   cliente lo eligio; la pantallita dice que todavia no eligio y lo esta
   decidiendo el sistema. El boton sigue teniendo dos posiciones: nunca vuelve
   solo a "segun el sistema". */
.tema[data-modo="claro"]  .i-sol,
.tema[data-modo="oscuro"] .i-luna,
.tema[data-modo="auto"]   .i-auto { display: block; }

/* EL SOL, EN DOS PIEZAS.
   El disco late y los rayos giran, cada uno a su ritmo. Si fueran un solo
   dibujo habria que animarlos juntos y se veria como un molinete.

   QUIETO MIENTRAS NADIE LO TOCA. Girando todo el tiempo en un rincon de la
   cabecera es un punto de movimiento permanente en el borde del ojo: cansa
   en una pantalla que el cliente mira una hora seguida, y encima obliga al
   navegador a repintar ese pedacito para siempre. La animacion arranca al
   pasar el mouse --que es cuando el boton tiene algo que decir-- y se frena
   al salir. */
.tema .i-sol .rayos { transform-origin: 12px 12px; }
.tema .i-sol .disco { transform-origin: 12px 12px; }
.tema:hover .i-sol .rayos, .tema:focus-visible .i-sol .rayos {
    animation: sol-gira 3.5s linear infinite;
}
.tema:hover .i-sol .disco, .tema:focus-visible .i-sol .disco {
    animation: sol-late 1.6s ease-in-out infinite;
}

@keyframes sol-gira { to { transform: rotate(360deg); } }
@keyframes sol-late {
    0%, 100% { transform: scale(1); }
    50%      { transform: scale(1.13); }
}

/* La luna se inclina apenas al pasar el mouse, para que el modo oscuro
   tambien tenga su gesto. */
.tema .i-luna { transition: transform .25s ease; }
.tema:hover .i-luna { transform: rotate(-18deg); }

@media (prefers-reduced-motion: reduce) {
    .tema .i-sol .rayos, .tema .i-sol .disco { animation: none; }
    .tema:hover .i-luna { transform: none; }
}
/* Sin JavaScript el boton no sirve para nada: se esconde en vez de quedar
   ahi sin responder. Un boton que no hace nada parece roto. */
.tema:not([data-modo]) { display: none; }

/* ===========================================================================
   QUE TRAE ESTE KIT
   Un pack se compra por lo que trae adentro, no por el nombre. La cantidad va
   adelante y en una pastilla, porque es lo primero que se mira al comparar
   dos kits; el estado de cada componente va a la derecha, alineado.
   =========================================================================== */
.kit-comp { margin-top: 22px; border: 1px solid var(--borde); border-radius: var(--r-lg);
            background: var(--superficie); overflow: hidden; }
.kit-comp-t { display: flex; align-items: center; gap: 9px;
              padding: 12px 15px; border-bottom: 1px solid var(--borde);
              background: var(--superficie-2); color: var(--rojo); }
.kit-comp-t h2 { margin: 0; font-family: var(--tit); font-size: 14px; font-weight: 700;
                 letter-spacing: .02em; color: var(--texto); }
.kit-comp-t .pz { margin-left: auto; font-size: 11px; font-weight: 800;
                  letter-spacing: .05em; text-transform: uppercase;
                  color: var(--texto-tenue); }

.kit-lista { list-style: none; margin: 0; padding: 6px 0; }
.kit-lista li { display: flex; align-items: center; gap: 12px; padding: 9px 15px; }
.kit-lista li + li { border-top: 1px solid var(--borde); }
.kit-lista .cant { flex: none; min-width: 34px; height: 26px; padding: 0 8px;
                   display: flex; align-items: center; justify-content: center;
                   border-radius: 7px; background: var(--superficie-2);
                   border: 1px solid var(--borde);
                   font-family: var(--tit); font-size: 13px; font-weight: 700;
                   font-variant-numeric: tabular-nums; }
.kit-lista .txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.kit-lista .txt a { font-size: 13.5px; font-weight: 600; color: var(--texto-2); line-height: 1.35; }
.kit-lista .txt a:hover { color: var(--rojo); }
.kit-lista .cod { font-size: 11px; color: var(--texto-tenue); }
.kit-lista .est { flex: none; font-size: 11.5px; color: var(--texto-tenue);
                  font-variant-numeric: tabular-nums; white-space: nowrap; }
.kit-lista .est.mal { color: var(--rojo); font-weight: 700; }
.kit-lista li.falta .cant { border-color: var(--rojo); color: var(--rojo);
                            background: var(--rojo-suave); }
.kit-lista li.servicio .txt a { color: var(--texto-suave); font-style: italic; }

.kit-saldo { padding: 11px 15px; border-top: 1px solid var(--borde);
             background: var(--superficie-2); font-size: 12.5px; color: var(--texto-suave); }
.kit-saldo strong { color: var(--verde); font-weight: 800; }
.kit-saldo.sin strong { color: var(--rojo); }

/* ===========================================================================
   LA BARRA DE FILTROS
   Antes eran tres desplegables sueltos del navegador dentro de una caja, y no
   se parecian en nada al buscador de la cabecera: leidos juntos daban la
   sensacion de dos aplicaciones distintas.

   Ahora comparten la misma familia: mismo alto, mismo redondeo, misma flecha
   dibujada por nosotros, mismo aro rojo al enfocar. Cada control va en un
   grupo con su rotulo arriba, asi se entiende que hace sin tener que abrirlo.
   =========================================================================== */
.barra-orden {
    display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap;
    padding: 12px 14px; margin-bottom: 16px;
    background: var(--superficie); border: 1px solid var(--borde);
    border-radius: var(--r-lg); box-shadow: var(--sombra);
}

/* Un grupo: rotulo arriba, control abajo. */
.barra-orden .grupo { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.barra-orden .rot { font-size: 10px; font-weight: 800; letter-spacing: .08em;
                    text-transform: uppercase; color: var(--texto-tenue);
                    padding-left: 2px; }

/* LA FLECHA LA DIBUJAMOS NOSOTROS.
   La del navegador cambia de forma en cada sistema y no se puede teñir, asi
   que en modo oscuro quedaba casi invisible. Con appearance:none el
   desplegable pierde la suya y le ponemos una que hereda el color del texto
   y gira al abrirse. */
.sel { position: relative; display: flex; align-items: center; min-width: 0; }
.sel select {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    height: 38px; padding: 0 32px 0 11px; max-width: 220px; min-width: 0;
    border: 1px solid var(--borde); border-radius: var(--radio);
    background: var(--superficie-2); color: var(--texto);
    font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer;
    transition: border-color .15s, box-shadow .15s, background .15s;
}
.sel select:hover { border-color: var(--rojo); background: var(--superficie); }
.sel select:focus-visible { outline: none; border-color: var(--rojo);
                            box-shadow: 0 0 0 3px var(--rojo-suave); }
.sel .chev { position: absolute; right: 10px; pointer-events: none;
             color: var(--texto-tenue); transition: color .15s; }
.sel select:hover + .chev, .sel select:focus-visible + .chev { color: var(--rojo); }

/* "Solo con stock" deja de ser una casilla gris perdida al costado y pasa a
   ser una pastilla que se prende. Tildada se ve tildada de lejos. */
.barra-orden .chk {
    display: flex; align-items: center; gap: 8px; height: 38px; padding: 0 13px;
    border: 1px solid var(--borde); border-radius: var(--radio);
    background: var(--superficie-2); color: var(--texto-suave);
    font-size: 13px; font-weight: 600; cursor: pointer; user-select: none;
    transition: border-color .15s, color .15s, background .15s;
}
.barra-orden .chk:hover { border-color: var(--rojo); color: var(--texto); }
.barra-orden .chk:has(input:checked) { border-color: var(--rojo); color: var(--rojo);
                                        background: var(--rojo-suave); }
.barra-orden .chk input { accent-color: var(--rojo); width: 15px; height: 15px; cursor: pointer; }
.barra-orden .chk:focus-within { box-shadow: 0 0 0 3px var(--rojo-suave); }

.barra-orden .limpiar { margin-left: auto; align-self: center;
                        display: flex; align-items: center; gap: 6px;
                        height: 38px; padding: 0 12px; border-radius: var(--radio);
                        font-size: 12.5px; font-weight: 700; color: var(--rojo); }
.barra-orden .limpiar:hover { background: var(--rojo-suave); }

/* ===========================================================================
   EL RELOJ DE LA LIQUIDACION
   Digitos en cajas separadas y de ancho fijo. El numero cambia cada segundo:
   sin lugar reservado por cifra, el cartel entero se mueve en cada tic y
   queda temblando.
   =========================================================================== */
.liq-t .reloj {
    margin-left: auto; display: inline-flex; align-items: center; gap: 7px;
    background: var(--rojo-suave); border: 1px solid rgba(220,38,38,.22);
    color: var(--rojo); padding: 7px 12px; border-radius: 99px;
    white-space: nowrap;
}
.liq-t .reloj .rot { font-size: 10.5px; font-weight: 800; letter-spacing: .1em;
                     text-transform: uppercase; opacity: .85; }
.liq-t .reloj .caja {
    display: inline-flex; align-items: baseline; gap: 1px;
    min-width: 34px; justify-content: center;
    background: var(--superficie); border: 1px solid rgba(220,38,38,.20);
    border-radius: 7px; padding: 3px 7px;
}
.liq-t .reloj .caja b {
    font-family: var(--tit); font-size: 15px; font-weight: 700; line-height: 1.1;
    font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1;
    letter-spacing: .02em;
}
.liq-t .reloj .caja i { font-style: normal; font-size: 10px; font-weight: 800; opacity: .75; margin-left: 1px;
                        text-transform: uppercase; }
.liq-t .reloj .sep { font-weight: 800; opacity: .5; margin: 0 -2px; }
/* Cuando ya vencio deja de ser una cuenta regresiva y pasa a ser un aviso. */
.liq-t .reloj.vencido { background: var(--superficie-2); border-color: var(--borde);
                        color: var(--texto-suave); }
.liq-t .reloj.vencido .caja { display: none; }

/* ===========================================================================
   EL CARINO: COMO RESPONDE LA TARJETA AL MOUSE
   La descripcion pasa a rojo al pasar por encima de CUALQUIER parte de la
   tarjeta, no solo del texto. El cliente apunta a la tarjeta entera --a la
   foto, casi siempre-- y el titulo le tiene que contestar igual, porque es
   el que lo lleva a la ficha.
   =========================================================================== */
/* La descripcion se enciende SOLO cuando el mouse esta sobre el texto, no
   sobre cualquier parte de la tarjeta. En una grilla de veinticuatro, que se
   encienda un titulo entero por pasar cerca es ruido; encendido sobre la
   palabra, dice exactamente que va a pasar si hace clic. */
.ficha .titulo { transition: color .18s ease; }
.ficha .titulo:hover { color: var(--rojo); }

/* La foto crece apenas dentro de su marco. El marco no se mueve: si creciera
   la tarjeta, la grilla entera saltaria al pasar el mouse. */
.f-foto .marco img { transition: transform .3s ease; }
.ficha:hover .f-foto .marco img { transform: scale(1.05); }

/* El codigo se enciende junto con el titulo: son la misma cosa mirada de dos
   maneras. */
.ficha .codigo { transition: color .18s ease; }

/* Los lotes y los packs siguen la misma regla, para que toda la pagina
   responda igual. */
.lote-c h3, .pack h3 { transition: color .18s ease; }
.lote-c h3:hover { color: var(--rojo); }
.lote-c .mini img { transition: transform .3s ease; }
.lote-c:hover .mini img { transform: scale(1.05); }

/* Nada de esto corre si el sistema pide menos animacion. */
@media (prefers-reduced-motion: reduce) {
    .ficha .titulo, .f-foto .marco img, .lote-c h3, .lote-c .mini img { transition: none; }
    .ficha:hover .f-foto .marco img, .lote-c:hover .mini img { transform: none; }
}

/* ===========================================================================
   PEDIDO RAPIDO
   =========================================================================== */
.pr-form { max-width: 900px; }
.pr-caja { background: var(--superficie); border: 1px solid var(--borde);
           border-radius: var(--r-lg); padding: 14px 16px 16px; box-shadow: var(--sombra); }
.pr-caja label { display: block; font-size: 11px; font-weight: 800; letter-spacing: .07em;
                 text-transform: uppercase; color: var(--texto-suave); margin-bottom: 8px; }
.pr-caja textarea {
    width: 100%; padding: 12px 14px; border: 1px solid var(--borde); border-radius: 10px;
    background: var(--fondo); color: var(--texto); resize: vertical; min-height: 190px;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 13.5px; line-height: 1.7; tab-size: 12;
}
.pr-caja textarea:focus { outline: none; border-color: var(--rojo); }
.pr-caja textarea::placeholder { color: var(--texto-tenue); }
.pr-ayuda { margin: 10px 0 0; font-size: 12.5px; color: var(--texto-suave); line-height: 1.5; }
.pr-ayuda strong { color: var(--texto-2); font-weight: 700; }

/* "Recuperamos la lista que habias escrito." Solo aparece cuando de verdad se
   repuso algo: un cartel que anuncia un borrador inexistente es peor que
   ninguno. Lo prende el JavaScript. */
.pr-borrador { display: flex; align-items: center; gap: 7px;
               margin: 9px 0 0; font-size: 12.5px; font-weight: 600;
               color: var(--verde); }
.pr-borrador[hidden] { display: none; }

.pr-acciones { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 14px; }
/* El campo de archivo nativo no se puede pintar, asi que se esconde y se
   estiliza la etiqueta que lo envuelve. El clic sigue llegando al campo. */
.pr-archivo input[type=file] { position: absolute; width: 1px; height: 1px;
                               opacity: 0; overflow: hidden; }
.pr-archivo span {
    display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
    padding: 10px 16px; border-radius: var(--radio);
    border: 1px dashed var(--borde-2); background: var(--superficie);
    color: var(--texto-suave); font-size: 13.5px; font-weight: 600;
}
.pr-archivo span:hover { border-color: var(--rojo); color: var(--rojo); border-style: solid; }
.pr-archivo input:focus-visible + span { outline: 2px solid var(--rojo); outline-offset: 2px; }
.pr-acciones .boton { margin-left: auto; }

.pr-resumen { display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
              margin: 20px 0 12px; font-size: 13.5px; }
.pr-resumen .ok  { color: var(--verde); font-weight: 700; }
.pr-resumen .mal { color: var(--ambar); font-weight: 700; }
.pr-resumen .tot { margin-left: auto; color: var(--texto-suave); }
.pr-resumen .tot b { font-family: var(--tit); font-size: 18px; color: var(--texto);
                     font-variant-numeric: tabular-nums; }

.pr-tabla .num { width: 46px; color: var(--texto-tenue); font-variant-numeric: tabular-nums; }
.pr-tabla .der { text-align: right; }
.pr-cod { display: block; font-family: ui-monospace, monospace; font-size: 11.5px;
          color: var(--texto-tenue); }
.pr-problema { display: block; font-size: 12.5px; color: var(--ambar); font-weight: 600; }
/* El renglon con problema se marca por el BORDE, no pintando la fila entera:
   una tabla con medio fondo de color no se lee. */
.pr-mal td:first-child { box-shadow: inset 3px 0 0 var(--ambar); }
.pr-nota { margin-top: 12px; font-size: 12.5px; color: var(--texto-suave); max-width: 70ch; }


/* ===========================================================================
   PIE DE PAGINA
   =========================================================================== */
.pie { background: var(--superficie-2); border-top: 1px solid var(--borde); margin-top: 40px; }
.pie-cols { display: grid; gap: 32px; padding-top: 38px; padding-bottom: 34px;
            grid-template-columns: 1.5fr 1fr 1fr 1.3fr; }
.pie-col { display: flex; flex-direction: column; gap: 9px; min-width: 0; }
.pie-col h4 { font-family: var(--tit); font-size: 12px; letter-spacing: .09em;
              text-transform: uppercase; color: var(--texto-suave);
              margin: 0 0 4px; font-weight: 700; }
.pie-col > a { font-size: 13.5px; color: var(--texto-2); }
.pie-col > a:hover { color: var(--rojo); }
.pie-col > a.mas { color: var(--rojo); font-weight: 700; margin-top: 3px; }

.pie-marca .marca { font-size: 22px; margin-bottom: 4px; }
.pie-marca p { margin: 0 0 6px; font-size: 13px; color: var(--texto-suave);
               line-height: 1.55; max-width: 42ch; }
.pie-marca .dato { display: flex; align-items: flex-start; gap: 9px;
                   font-size: 12.5px; color: var(--texto-suave); }
.pie-marca .dato svg { flex: none; margin-top: 2px; color: var(--rojo); }

.pie-caja { background: var(--superficie); border: 1px solid var(--borde);
            border-radius: var(--r-lg); padding: 14px; }
.pie-caja p { margin: 0 0 12px; font-size: 12.5px; color: var(--texto-suave); line-height: 1.55; }
.pie-wa {
    display: inline-flex; align-items: center; justify-content: center; gap: 9px;
    width: 100%; padding: 10px 14px; border-radius: var(--radio);
    background: var(--verde); color: #fff; font-size: 13.5px; font-weight: 700;
}
.pie-wa:hover { filter: brightness(.92); }

.pie-fin { border-top: 1px solid var(--borde); }
.pie-fin .wrap { display: flex; gap: 14px; flex-wrap: wrap; align-items: center;
                 padding-top: 15px; padding-bottom: 15px;
                 font-size: 12px; color: var(--texto-tenue); }
.pie-fin .der { margin-left: auto; }

/* ===========================================================================
   VOLVER ARRIBA
   Aparece recien cuando hay de donde subir. Quieto arriba de todo seria un
   boton que no hace nada, y un boton que no hace nada parece roto.
   =========================================================================== */
.arriba {
    /* Abajo a la IZQUIERDA. Del lado derecho competia por el lugar con las
       notificaciones de "se agrego al carrito", que es donde el cliente mira
       despues de cargar. De este lado no se cruzan nunca. */
    position: fixed; left: 20px; right: auto; bottom: 20px; z-index: 45;
    width: 46px; height: 46px; border-radius: 99px; border: 0; cursor: pointer;
    /* Quieto es discreto. Se pone rojo recien al pasar por encima: es una
       ayuda, no una accion principal, y en rojo permanente compite con el
       boton Cargar de cada tarjeta. */
    background: var(--superficie); color: var(--texto-suave);
    border: 1px solid var(--borde);
    display: flex; align-items: center; justify-content: center;
    box-shadow: var(--sombra-a);
    opacity: 0; transform: translateY(10px);
    transition: opacity .22s ease, transform .22s ease, background .16s;
}
.arriba.se-ve { opacity: 1; transform: translateY(0); }
.arriba:hover { background: var(--rojo); border-color: var(--rojo); color: #fff; }
.arriba:active { transform: scale(.92); }


/* ===========================================================================
   NOTIFICACIONES
   Abajo a la derecha, se van solas. Antes el aviso era una cinta arriba de
   todo, y por eso cargar un articulo mandaba la pagina al principio: el
   cliente tenia que volver a bajar hasta donde estaba para cargar el
   siguiente. Una notificacion no mueve nada de lugar.
   =========================================================================== */
.avisos-pila {
    /* Ahora que el boton de subir se fue a la izquierda, las notificaciones
       vuelven al piso: no hay nada abajo a la derecha que esquivar. */
    position: fixed; right: 18px; bottom: 20px; z-index: 60;
    display: flex; flex-direction: column-reverse; gap: 10px;
    max-width: min(380px, calc(100vw - 36px));
}
.aviso-tosta {
    display: flex; align-items: flex-start; gap: 11px;
    padding: 13px 14px; border-radius: var(--r-lg);
    background: var(--superficie); border: 1px solid var(--borde);
    border-left: 3px solid var(--verde); box-shadow: var(--sombra-a);
    font-size: 13.5px; color: var(--texto-2); line-height: 1.45;
    /* Entra desde la derecha. Al salir se encoge ademas de desvanecerse,
       asi las que quedan abajo suben suave en vez de saltar. */
    animation: tosta-entra .3s cubic-bezier(.2,.8,.3,1) both;
}
.aviso-tosta.mal { border-left-color: var(--rojo); }
.aviso-tosta .ic { flex: none; color: var(--verde); margin-top: 1px; }
.aviso-tosta.mal .ic { color: var(--rojo); }
.aviso-tosta .txt { flex: 1; min-width: 0; }
.aviso-tosta .txt a { display: inline-block; margin-top: 5px;
                      color: var(--rojo); font-weight: 700; }
.aviso-tosta .txt a:hover { text-decoration: underline; }
.aviso-tosta .cerrar { flex: none; border: 0; background: none; cursor: pointer;
                       color: var(--texto-tenue); padding: 0 2px; font-size: 17px;
                       line-height: 1; }
.aviso-tosta .cerrar:hover { color: var(--texto); }
.aviso-tosta.yendose { animation: tosta-sale .28s ease forwards; }

@keyframes tosta-entra {
    from { opacity: 0; transform: translateX(28px) scale(.97); }
    to   { opacity: 1; transform: none; }
}
@keyframes tosta-sale {
    to { opacity: 0; transform: translateX(28px); max-height: 0;
         padding-top: 0; padding-bottom: 0; margin-top: -10px; }
}
@media (prefers-reduced-motion: reduce) {
    .aviso-tosta, .aviso-tosta.yendose { animation: none; }
}

/* El dato crudo que deja el servidor. Con JavaScript no se ve --lo convierte
   en notificacion-- y sin JavaScript se dibuja como cinta, en su lugar, para
   que el aviso nunca se pierda. */
.aviso-dato { display: none; }
.sin-js .aviso-dato {
    display: block; border-radius: var(--radio); padding: 12px 16px; margin: 0 0 14px;
    font-size: 14px; border: 1px solid var(--borde); background: var(--superficie);
    border-left: 3px solid var(--verde);
}
.sin-js .aviso-dato[data-tipo="mal"] { border-left-color: var(--rojo); }

/* ===========================================================================
   VITRINA DE MARCAS
   Informativa, no navegable. Es una cinta de confianza: dice con quien
   trabaja la empresa. Para filtrar por marca esta el desplegable de arriba,
   que ademas solo ofrece marcas que de verdad tienen articulos.
   =========================================================================== */
.vitrina { margin-top: 34px; padding: 22px 0 4px; border-top: 1px solid var(--borde); }
.vitrina-t { font-family: var(--tit); font-size: 11.5px; letter-spacing: .1em;
             text-transform: uppercase; color: var(--texto-tenue);
             text-align: center; margin-bottom: 14px; }
/* Los bordes se desvanecen en vez de cortarse en seco: sin esto, los nombres
   aparecen y desaparecen de golpe contra el filo de la caja. */
.vitrina-cinta {
    overflow: hidden;
    -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
    mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.vitrina-fila { display: flex; width: max-content; animation: vitrina 34s linear infinite; }
.vitrina-grupo { display: flex; gap: 34px; padding-right: 34px; }
.vitrina-grupo span {
    font-family: var(--tit); font-size: 17px; font-weight: 700; letter-spacing: .04em;
    color: var(--texto-tenue); white-space: nowrap; transition: color .2s;
}
.vitrina-grupo span:hover { color: var(--rojo); }
/* Se frena al pasar el mouse, para poder leer una marca sin correrla. */
.vitrina-cinta:hover .vitrina-fila { animation-play-state: paused; }
/* -50% y no -100%: la lista esta dos veces, asi que al correr la mitad el
   dibujo vuelve a ser identico al del principio y el salto no se ve. */
@keyframes vitrina { to { transform: translateX(-50%); } }

@media (prefers-reduced-motion: reduce) {
    .vitrina-fila { animation: none; }
    .vitrina-cinta { overflow-x: auto; }
}

/* El filtro aplicado, escrito. Sale del modelo, o sea de lo que el servidor
   de verdad uso, no de lo que dice el desplegable. */
.resultados .aplicado {
    display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 99px;
    background: var(--rojo-suave); color: var(--rojo);
    font-size: 11.5px; font-weight: 700;
}

/* ===========================================================================
   RESPONSIVE
   Los cortes no son numeros redondos porque si: cada uno es el ancho en el
   que algo concreto deja de entrar.
   =========================================================================== */

/* 1100px: la columna de categorias empieza a apretar las tarjetas. */
@media (max-width: 1100px) {
    .contenido.con-menu { grid-template-columns: 214px 1fr; gap: 18px; }
}

/* 900px: ya no entran dos columnas de tarjetas al lado del menu. El menu
   pasa arriba y se pliega; los articulos son lo que el cliente vino a ver. */
@media (max-width: 1000px) {
    .pie-cols { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 900px) {
    .contenido.con-menu { grid-template-columns: 1fr; gap: 14px; }
    /* El numero grande de la portada se va: en pantalla angosta se monta
       encima del titulo. */
    .hero-num { display: none; }
    /* Y las laminas se desapilan: la que no se ve sale del flujo con
       display:none y no con opacidad, porque una lamina invisible pero
       presente dejaria un hueco del alto de la mas larga. El alto pasa a
       decidirlo el contenido: una franja de proporcion 3 a 1 en una pantalla
       angosta no deja lugar para el texto. */
    .hero-in { aspect-ratio: auto; max-height: none; }
    .lamina { position: relative; inset: auto; }
    .lamina:not(.on) { display: none; }
    .lamina-img img { height: auto; }
    .hero-txt { max-width: none; padding: 32px 30px; }
    .hero h1 { font-size: 34px; }
    .lat { position: static; max-height: none; }
    .menu { max-height: 60vh; }
    /* La calculadora de ganancia se va del celular: en una pantalla angosta
       los cinco botones compiten con los articulos y el margen se elige una
       vez, no en cada visita. El precio sugerido sigue apareciendo con el
       ultimo margen que el cliente eligio. */
    .ganancia { display: none; }
}

/* 1100px: el buscador se lleva un renglon entero. En un portatil de 1024,
   compartiendo fila con la marca, el saldo, el nombre y el carrito, le
   quedaban noventa pixeles de campo: ahi no entra un codigo de fabrica. Un
   renglon mas de cabecera cuesta menos que un buscador inservible. */
@media (max-width: 1100px) {
    .buscador-cab { order: 3; flex: 1 0 100%; max-width: none; }
}

/* 780px: ademas, el nombre del cliente y el saldo bajan de prioridad frente
   a buscar y al carrito. */
@media (max-width: 780px) {
    .barra-in { gap: 10px 12px; padding: 10px 16px; }
    /* Orden en el celular: marca, saldo, carrito arriba; el buscador ocupa
       el renglon entero abajo. El carrito queda pegado al borde derecho, que
       es donde el pulgar lo busca. */
    .buscador-cab { order: 3; flex: 1 0 100%; }
    .buscador-cab .sel-cab { max-width: 138px; }
    .buscador-cab .sel-cab select { padding: 10px 26px 10px 9px; font-size: 12.5px; }
    .lat { top: 0; }
    .saldo-barra  { order: 1; margin-left: auto; }
    .cab-carrito  { order: 2; }
    .tema         { order: 2; }
    /* El nombre del cliente baja a la barra oscura, que en celular es la
       unica franja que siempre entra entera. */
    .barra .quien > summary .txt { display: none; }
    .barra .quien .panel { right: -6px; }
    .menu-b .tel { display: none; }
    .menu-b .nav-quien { display: block; }
    .wrap, .contenido { padding-left: 16px; padding-right: 16px; }
}

/* 560px: dos tarjetas por fila dejan de ser legibles con el precio adentro.
   Una sola columna, y el pie de la tarjeta con la cantidad al lado del
   boton sigue entrando porque el boton se encoge, no se rompe. */
@media (max-width: 560px) {
    .grilla { grid-template-columns: 1fr; }
    .pie-cols { grid-template-columns: 1fr; gap: 26px; }
    .pie-fin .der { margin-left: 0; }
    .arriba { left: 12px; right: auto; bottom: 14px; width: 42px; height: 42px; }
    /* En el celular la notificacion ocupa todo el ancho, asi que SI se
       cruzaria con el boton de subir: ahi se queda levantada. */
    .avisos-pila { right: 12px; left: 12px; bottom: 66px; max-width: none; }
    .vitrina-grupo { gap: 24px; padding-right: 24px; }
    .vitrina-grupo span { font-size: 15px; }
    .pr-acciones { flex-direction: column; align-items: stretch; }
    .pr-acciones .boton, .pr-acciones .boton-secundario { margin-left: 0; width: 100%; }
    .pr-archivo span { justify-content: center; }
    .barra-orden { gap: 9px 10px; }
    .barra-orden .grupo { flex: 1 1 140px; }
    .sel, .sel select { width: 100%; max-width: none; }
    .barra-orden .chk { flex: 1 1 100%; justify-content: center; }
    .barra-orden .limpiar { margin-left: 0; flex: 1 1 100%; justify-content: center; }
    .liq-t .reloj { margin-left: 0; }
    .hero-txt { padding: 26px 20px 30px; }
    .hero h1 { font-size: 28px; }
    .hero p { font-size: 14.5px; }
    .hero .btns { flex-direction: column; align-items: stretch; }
    .btn { justify-content: center; }
    .dots { left: 20px; bottom: 12px; }
    .fl { display: none; }
    .liq { padding: 14px; }
    .liq-t .reloj { margin-left: 0; }
    .packs { grid-template-columns: 1fr; }
    .sim-g { grid-template-columns: 1fr; }
    .pack-p { flex-direction: column; align-items: stretch; gap: 10px; }
    .pack-p .cargar { width: 100%; }
    .ficha .titulo { min-height: 0; }
    .contenido { padding-top: 16px; }
    .cc-saldo { text-align: left; width: 100%; }
    .cc-encabezado { gap: 12px; }
    /* Quedan las tres columnas que contestan la pregunta del cliente: cual,
       cuando y cuanto. El pago parcial reaparece bajo el pendiente. */
    .cc-tabla th:nth-child(2), .cc-tabla td:nth-child(2),
    .cc-tabla th:nth-child(4), .cc-tabla td:nth-child(4),
    .cc-tabla th:nth-child(5), .cc-tabla td:nth-child(5) { display: none; }
    .cc-tabla tfoot { display: none; }
    .cc-parcial { display: block; font-size: 12px; font-weight: 400; color: var(--texto-suave); }
    .titulo-pagina { font-size: 22px; }
    .detalle { padding: 18px; }
    .tarjeta-login { padding: 24px; }
}

/* 380px: telefonos chicos. El saldo se va de la cabecera --sigue estando en
   Mi cuenta, a un toque-- para que buscar y el carrito no queden apretados. */
@media (max-width: 380px) {
    .saldo-barra { display: none; }
    .buscador-cab button span { display: none; }
    .buscador-cab button { padding: 0 14px; }
}

@media (prefers-reduced-motion: reduce) {
    * { transition: none !important; animation: none !important; }
    .ficha:hover { transform: none; }
}

@media print {
    .cabecera, .menu-b, .top, .menu, .f-pie, .paginado, .ganancia,
    .pie, .vitrina, .arriba, .avisos-pila { display: none; }
    .contenido.con-menu { grid-template-columns: 1fr; }
}

/* ===========================================================================
   CLUB MSP
   El nivel sale de lo que el cliente compro de verdad. Por eso la pantalla
   muestra el numero al lado del nivel: sin el dato a la vista, "sos Plata" es
   una etiqueta que no significa nada y que nadie puede verificar.

   Los tres niveles tienen su color, pero el acento de la marca --el rojo--
   NO se usa para ninguno: si Oro fuera rojo competiria con los botones de
   comprar, que es lo que de verdad importa en toda la pantalla.
   =========================================================================== */
.club-cab { margin-bottom: 18px; }

.club-tarjeta {
    display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
    padding: 20px 22px; border-radius: var(--r-lg);
    border: 1px solid var(--borde); background: var(--superficie);
    box-shadow: var(--sombra);
    /* La franja de color vive arriba y no de fondo: tenida entera, la tarjeta
       compite con todo lo demas de la pantalla. */
    border-top: 3px solid var(--club);
}
.club-tarjeta.n-bronce { --club: #a5713f; }
.club-tarjeta.n-plata  { --club: #8d949c; }
.club-tarjeta.n-oro    { --club: #c08a1e; }

.club-chapa { flex: none; width: 52px; height: 52px; border-radius: 99px;
              display: flex; align-items: center; justify-content: center;
              color: var(--club); border: 1.5px solid var(--club);
              /* El relleno tenue va con color-mix, que no existe en
                 navegadores viejos. Por eso primero se declara un fondo
                 solido que siempre funciona: si color-mix no se entiende,
                 esa linea se ignora y queda la de arriba. */
              background: var(--superficie-2);
              background: color-mix(in srgb, var(--club) 12%, transparent); }
.club-datos { flex: 1 1 200px; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.club-datos .e, .club-monto .e { font-size: 10.5px; font-weight: 800; letter-spacing: .08em;
                                 text-transform: uppercase; color: var(--texto-tenue); }
.club-datos .n { font-family: var(--tit); font-size: 27px; font-weight: 700;
                 line-height: 1.1; color: var(--club); letter-spacing: -.01em; }
.club-datos .pos { font-size: 12.5px; color: var(--texto-suave);
                   font-variant-numeric: tabular-nums; }
.club-monto { flex: none; text-align: right; display: flex; flex-direction: column; gap: 1px; }
.club-monto strong { font-family: var(--tit); font-size: 22px; font-weight: 700;
                     font-variant-numeric: tabular-nums; letter-spacing: -.015em; }
.club-monto .d { font-size: 11.5px; color: var(--texto-tenue); }

/* CUANTO FALTA PARA SUBIR.
   La barra no es decorativa: un numero solo --"te faltan 4.200.000"-- no dice
   si estas cerca o lejisimos. La barra lo dice de un vistazo. */
.club-falta { margin-top: 14px; padding: 15px 18px; border-radius: var(--r-lg);
              border: 1px solid var(--borde); background: var(--superficie-2); }
.club-falta .t { font-size: 13.5px; color: var(--texto-2); }
.club-falta .t strong { font-family: var(--tit); font-size: 16px; font-weight: 700;
                        color: var(--texto); font-variant-numeric: tabular-nums; }
.club-falta .barra { margin-top: 10px; height: 8px; border-radius: 99px;
                     background: var(--borde); overflow: hidden; }
.club-falta .barra span { display: block; height: 100%; border-radius: 99px;
                          background: var(--verde); transition: width .5s ease; }
.club-falta.tope { border-color: var(--verde); }
.club-falta.tope .t { color: var(--verde); font-weight: 600; }

.club-niveles { margin-top: 18px; display: grid; gap: 12px;
                grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
.club-nivel { padding: 14px 16px; border-radius: var(--r-lg);
              border: 1px solid var(--borde); background: var(--superficie); }
.club-nivel.n-bronce { --club: #a5713f; }
.club-nivel.n-plata  { --club: #8d949c; }
.club-nivel.n-oro    { --club: #c08a1e; }
.club-nivel.aca { border-color: var(--club);
                  box-shadow: 0 0 0 3px color-mix(in srgb, var(--club) 16%, transparent); }
@supports not (color: color-mix(in srgb, red 10%, transparent)) {
    .club-nivel.aca { box-shadow: var(--sombra-a); }
}
.club-nivel .h { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; }
.club-nivel .t { font-family: var(--tit); font-size: 15px; font-weight: 700; color: var(--club); }
.club-nivel .vos { margin-left: auto; font-size: 10px; font-weight: 800;
                   letter-spacing: .06em; text-transform: uppercase;
                   padding: 3px 8px; border-radius: 99px; color: var(--club);
                   border: 1px solid var(--club); }
.club-nivel p { margin: 0; font-size: 12.5px; color: var(--texto-suave); line-height: 1.5; }

.club-letra { margin-top: 22px; }
.club-letra h2 { font-family: var(--tit); font-size: 14px; font-weight: 700;
                 letter-spacing: .02em; margin: 0 0 8px; }
.club-letra ul { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 6px; }
.club-letra li { font-size: 12.5px; color: var(--texto-suave); line-height: 1.55; }
.club-letra strong { color: var(--texto-2); font-weight: 700; }

@media (max-width: 560px) {
    .club-monto { text-align: left; flex: 1 1 100%; }
}

/* ===========================================================================
   SECCION DE OFERTAS
   Usa las mismas tarjetas del catalogo a proposito: una oferta no es otro
   tipo de articulo, es el mismo con menos precio. Inventarle una tarjeta
   distinta obligaria al cliente a aprender dos lenguajes en la misma pantalla.
   Lo unico que cambia es que el precio de lista va tachado y aparece cuanto
   se ahorra, que es el dato que justifica la seccion.
   =========================================================================== */
.of-t { margin-bottom: 14px; }
.of-g { margin-bottom: 4px; }
.precio .valor.tachado { color: var(--texto-tenue); text-decoration: line-through;
                         font-weight: 600; font-size: 14px; }
.precio .ahorro { margin-top: 6px; font-size: 11.5px; font-weight: 700;
                  color: var(--verde); font-variant-numeric: tabular-nums; }

/* La tarjeta de oferta no lleva el precio sugerido, asi que su bloque de
   precios es mas bajo que el del catalogo. Se le reserva el mismo alto para
   que, si alguna vez conviven, no queden desparejas. */
.of-g .ficha .precio { min-height: 96px; }

/* ===========================================================================
   DATOS DE ENTREGA DEL PEDIDO
   Vienen sugeridos de la ficha del cliente y se cambian POR PEDIDO. La ficha
   en Tango no se toca nunca.

   Es un <details> a proposito: confirmados una vez, el bloque se pliega y
   deja de estorbar, pero el resumen en una linea sigue a la vista. Obligar a
   revisar una direccion que ya esta bien, en cada pedido, es la clase de paso
   que hace que la gente vuelva al telefono.
   =========================================================================== */
.entrega { margin-bottom: 16px; border: 1px solid var(--borde);
           border-radius: var(--r-lg); background: var(--superficie);
           box-shadow: var(--sombra); overflow: hidden; }
.entrega > summary {
    list-style: none; cursor: pointer;
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    padding: 13px 16px;
}
.entrega > summary::-webkit-details-marker { display: none; }
.entrega > summary .t { font-family: var(--tit); font-size: 14px; font-weight: 700; }
.entrega > summary .ok { display: inline-flex; align-items: center; gap: 5px;
                         font-size: 11px; font-weight: 800; letter-spacing: .04em;
                         text-transform: uppercase; color: var(--verde); }
.entrega > summary .pend { font-size: 11px; font-weight: 800; letter-spacing: .04em;
                           text-transform: uppercase; color: var(--ambar); }
/* OJO: ya existe una clase .resumen para el total del carrito, con borde y
   fondo. Aca hay que anularlos explicitamente o el renglon aparece dentro de
   una caja que no tiene nada que ver. */
.entrega > summary .resumen { flex: 1 1 200px; min-width: 0; font-size: 12.5px;
                              color: var(--texto-tenue); overflow: hidden;
                              text-overflow: ellipsis; white-space: nowrap;
                              margin: 0; padding: 0; border: 0; background: none;
                              box-shadow: none; }
.entrega > summary .flecha { flex: none; color: var(--texto-tenue); transition: transform .2s; }
.entrega[open] > summary .flecha { transform: rotate(180deg); }
.entrega[open] > summary { border-bottom: 1px solid var(--borde); }

.ent-form { padding: 14px 16px; }
.ent-ayuda { margin: 0 0 12px; font-size: 12.5px; color: var(--texto-suave); line-height: 1.5; }
.ent-ayuda strong { color: var(--texto-2); font-weight: 700; }

/* Doce columnas. Calle y numero tienen que quedar en el mismo renglon: son
   un solo dato partido en dos campos, y separarlos obliga a leer dos veces. */
.ent-grilla { display: grid; grid-template-columns: repeat(12, 1fr); gap: 10px; }
/* display:block y no flex en columna: con flex, el "(opcional)" se convierte
   en un renglon propio y el rotulo queda partido en dos lineas. */
.ent-grilla label { display: block; font-size: 11.5px; font-weight: 700;
                    color: var(--texto-suave); min-width: 0; }
.ent-grilla label > input, .ent-grilla label > select { margin-top: 5px; width: 100%; }
.ent-grilla .c2 { grid-column: span 2; }
.ent-grilla .c4 { grid-column: span 4; }
.ent-grilla .c6 { grid-column: span 6; }
.ent-grilla .c8 { grid-column: span 8; }
.ent-grilla .c12 { grid-column: span 12; }
.ent-grilla input, .ent-grilla select {
    height: 38px; padding: 0 11px; font: inherit; font-size: 13.5px; font-weight: 500;
    border: 1px solid var(--borde); border-radius: var(--radio);
    background: var(--superficie-2); color: var(--texto); min-width: 0;
}
.ent-grilla input:focus-visible, .ent-grilla select:focus-visible {
    outline: none; border-color: var(--rojo); box-shadow: 0 0 0 3px var(--rojo-suave);
}
.ent-form .acciones { margin-top: 13px; display: flex; gap: 10px; flex-wrap: wrap; }

/* Los datos de facturacion se MIRAN. Fondo distinto y sin campos: la forma
   tiene que decir "esto no se toca" antes de que el cliente lo intente. */
.ent-fiscal { padding: 14px 16px; border-top: 1px solid var(--borde);
              background: var(--superficie-2); }
.f-t { font-size: 10.5px; font-weight: 800; letter-spacing: .08em;
       text-transform: uppercase; color: var(--texto-tenue); margin-bottom: 9px; }
.f-g { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
       gap: 9px 18px; }
.f-g > div { font-size: 13px; color: var(--texto-2); display: flex;
             flex-direction: column; gap: 1px; }
.f-g > div > span:first-child { font-size: 10.5px; font-weight: 700;
                                letter-spacing: .05em; text-transform: uppercase;
                                color: var(--texto-tenue); }
.f-rep { margin-top: 12px; }
.f-rep > summary { cursor: pointer; font-size: 12.5px; font-weight: 700;
                   color: var(--rojo); }
.f-rep .ent-form { padding: 12px 0 0; }

@media (max-width: 620px) {
    .ent-grilla .c2, .ent-grilla .c4 { grid-column: span 6; }
    .ent-grilla .c6, .ent-grilla .c8 { grid-column: span 12; }
}

/* ===========================================================================
   DESCARGAR EL PRESUPUESTO
   Un bloque y no dos botones sueltos: la casilla del margen y los dos botones
   son una sola decision --que quiero y con que numero-- y separarlos haria
   que alguien apriete "PDF" sin entender que la casilla de arriba lo cambia.
   =========================================================================== */
.descargas { margin-top: 20px; padding: 15px 17px; border-radius: var(--r-lg);
             border: 1px solid var(--borde); background: var(--superficie);
             box-shadow: var(--sombra); }
.descargas .d-t { font-family: var(--tit); font-size: 13px; font-weight: 700;
                  margin-bottom: 11px; }

.descargas .d-roi { display: inline-flex; align-items: center; gap: 8px;
                    height: 36px; padding: 0 13px; border-radius: var(--radio);
                    border: 1px solid var(--borde); background: var(--superficie-2);
                    font-size: 13px; font-weight: 600; color: var(--texto-suave);
                    cursor: pointer; user-select: none;
                    transition: border-color .15s, color .15s, background .15s; }
.descargas .d-roi:hover { border-color: var(--rojo); color: var(--texto); }
.descargas .d-roi:has(input:checked) { border-color: var(--rojo); color: var(--rojo);
                                        background: var(--rojo-suave); }
.descargas .d-roi input { accent-color: var(--rojo); width: 15px; height: 15px; cursor: pointer; }

.descargas .d-margen { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
                       margin-top: 11px; }
.descargas .d-margen[hidden] { display: none; }
.descargas .d-margen label { display: flex; align-items: center; gap: 8px;
                             font-size: 11.5px; font-weight: 700; color: var(--texto-suave); }
.descargas .d-margen input {
    width: 76px; height: 36px; padding: 0 11px; font: inherit; font-size: 13.5px;
    font-weight: 700; font-variant-numeric: tabular-nums;
    border: 1px solid var(--borde); border-radius: var(--radio);
    background: var(--superficie-2); color: var(--texto);
    -moz-appearance: textfield;
}
.descargas .d-margen input::-webkit-outer-spin-button,
.descargas .d-margen input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.descargas .d-margen input:focus-visible { outline: none; border-color: var(--rojo);
                                            box-shadow: 0 0 0 3px var(--rojo-suave); }
.descargas .d-pct { font-size: 13px; font-weight: 800; color: var(--texto-tenue); }
.descargas .d-ayuda { flex: 1 1 220px; min-width: 0; font-size: 11.5px;
                      color: var(--texto-tenue); line-height: 1.45; }

.descargas .d-botones { margin-top: 13px; display: flex; gap: 10px; flex-wrap: wrap; }
.descargas .d-botones button { display: inline-flex; align-items: center; gap: 8px; }

@media (max-width: 480px) {
    .descargas .d-roi, .descargas .d-botones button { width: 100%; justify-content: center; }
}

/* ===========================================================================
   ANIMACIONES · LA TANDA CHICA
   Cuatro movimientos y ni uno mas. La regla que segui: cada animacion tiene
   que decir algo que el cliente necesita saber --que algo respondio, que algo
   llego, que algo esta cargando--. Las que solo decoran no entran, porque en
   una pagina que se usa ocho horas por dia el adorno cansa antes que gustar.

   Todas se apagan enteras con prefers-reduced-motion, al final del bloque.
   =========================================================================== */

/* 1 · EL BOTON SE HUNDE AL APRETARLO.
   Es el unico aviso de que el dedo llego al lugar correcto antes de que la
   pagina conteste. En el celular, donde no hay hover, es la unica senal. */
.boton:active,
.boton-secundario:active,
.boton-chico:active,
.cargar:active:not(:disabled),
.v-b:active { transform: translateY(1px) scale(.985); }

/* 2 · EL GLOBO DEL CARRITO LATE CUANDO SUMA.
   El carrito vive en la cabecera y el articulo se agrega mas abajo. Sin este
   salto, el cliente no tiene forma de saber si entro, y termina apretando dos
   veces. La clase la pone el JavaScript despues de agregar. */
@keyframes globo-late {
    0%   { transform: scale(1); }
    35%  { transform: scale(1.32); }
    100% { transform: scale(1); }
}
.globo.late { animation: globo-late .38s cubic-bezier(.34, 1.56, .64, 1); }

/* 3 · LAS TARJETAS APARECEN AL LLEGAR.
   Un desplazamiento de seis pixeles y nada mas, escalonado apenas entre las
   primeras. Del septimo en adelante todas entran juntas: escalonar veinticuatro
   tarjetas se convierte en una espera, que es exactamente lo contrario de lo
   que se busca. */
@keyframes ficha-entra {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: none; }
}
.grilla .ficha { animation: ficha-entra .26s ease-out both; }
.grilla .ficha:nth-child(1) { animation-delay: 0ms; }
.grilla .ficha:nth-child(2) { animation-delay: 25ms; }
.grilla .ficha:nth-child(3) { animation-delay: 50ms; }
.grilla .ficha:nth-child(4) { animation-delay: 75ms; }
.grilla .ficha:nth-child(5) { animation-delay: 100ms; }
.grilla .ficha:nth-child(6) { animation-delay: 125ms; }
.grilla .ficha:nth-child(n+7) { animation-delay: 150ms; }

/* 4 · LA LISTA SE APAGA MIENTRAS BUSCA.
   Cuando se cambia un filtro sin recargar, la lista vieja sigue en pantalla
   unos milisegundos. Sin esta senal parece que el filtro no hizo nada y el
   cliente lo vuelve a tocar. Se atenua y deja de aceptar clics: lo que se ve
   ya no es lo que se pidio. */
#lista.cargando { opacity: .45; pointer-events: none;
                  transition: opacity .12s ease-out; }

@media (prefers-reduced-motion: reduce) {
    .boton:active, .boton-secundario:active, .boton-chico:active,
    .cargar:active:not(:disabled), .v-b:active { transform: none; }
    .globo.late { animation: none; }
    .grilla .ficha { animation: none; }
    #lista.cargando { transition: none; }
}

/* ---------------------------------------------------------------------------
   EL CARRITO QUE SE ACTUALIZA SOLO
   --------------------------------------------------------------------------- */
/* El paso a paso del carrito es mas chico que el del catalogo: en una tabla
   de veinte renglones, el control de cantidad no puede ser lo mas grande de
   la fila. */
.fila-cant { display: flex; align-items: center; gap: 8px; justify-content: flex-end; }
.fila-cant .qty { transform: scale(.92); transform-origin: right center; }

/* El tacho. Gris hasta que lo tocas, rojo cuando si: borrar es una accion
   destructiva y tiene que avisar antes de que el dedo llegue, pero no puede
   gritar rojo en veinte renglones a la vez. */
.tacho { display: inline-flex; align-items: center; justify-content: center;
         width: 32px; height: 32px; padding: 0; border: 1px solid transparent;
         border-radius: 8px; background: none; cursor: pointer;
         color: var(--texto-tenue); transition: color .14s, background .14s, border-color .14s; }
.tacho:hover { color: var(--rojo); background: var(--rojo-suave); border-color: var(--rojo-suave); }
.tacho:focus-visible { outline: 2px solid var(--rojo); outline-offset: 1px; }
.tacho:active { transform: scale(.92); }

/* Mientras el carrito viaja al servidor. Misma senal que en el catalogo: se
   atenua y deja de aceptar clics, porque lo que se ve ya no es lo que se
   pidio. */
#carro.cargando { opacity: .5; pointer-events: none; transition: opacity .12s ease-out; }

@media (prefers-reduced-motion: reduce) {
    .tacho:active { transform: none; }
    #carro.cargando { transition: none; }
}

/* ===========================================================================
   TEXTO SOLO PARA LECTORES DE PANTALLA
   Titulos de columnas que a la vista sobran (la columna del boton) pero que
   quien escucha la tabla necesita para saber que hay ahi.
   =========================================================================== */
.oculto {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ===========================================================================
   MI CUENTA - EL BOTON PAGAR Y LA VENTANA "EN CONSTRUCCION"
   =========================================================================== */
.cc-accion { width: 1%; white-space: nowrap; vertical-align: middle; }
.cc-pagar {
    font: inherit; font-size: 12.5px; font-weight: 700; cursor: pointer;
    padding: 5px 13px; border-radius: 7px;
    color: var(--rojo); background: var(--rojo-suave); border: 1px solid transparent;
    transition: background .14s, border-color .14s;
}
.cc-pagar:hover { border-color: var(--rojo); }
.cc-pagar:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }

.pago {
    width: min(460px, calc(100vw - 32px)); max-height: calc(100vh - 32px);
    padding: 0; border: 1px solid var(--borde); border-radius: var(--r-xl);
    background: var(--superficie); color: var(--texto);
    box-shadow: 0 24px 60px rgba(0,0,0,.28);
}
.pago::backdrop { background: rgba(9,9,11,.55); }
.pago-caja { display: flex; flex-direction: column; gap: 14px; padding: 20px; }
.pago-cab { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.pago-cab h2 { margin: 0; font-family: var(--tit); font-size: 19px; }
.pago-x {
    display: flex; align-items: center; justify-content: center; flex: none;
    width: 34px; height: 34px; border-radius: 9px; cursor: pointer;
    border: 1px solid var(--borde); background: var(--superficie); color: var(--texto-suave);
}
.pago-x:hover { color: var(--texto); border-color: var(--borde-2); }

.pago-datos {
    display: grid; grid-template-columns: 1fr auto; gap: 12px;
    padding: 12px 14px; border-radius: var(--radio); background: var(--superficie-2);
}
.pago-datos > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pago-datos > div:last-child { text-align: right; }
.pago-datos .e { font-size: 10.5px; font-weight: 700; letter-spacing: .06em;
                 text-transform: uppercase; color: var(--texto-tenue); }
.pago-datos .v { font-size: 14px; overflow-wrap: anywhere; }
.pago-datos strong.v { font-family: var(--tit); font-size: 20px;
                       font-variant-numeric: tabular-nums; white-space: nowrap; }

.pago-obra {
    display: flex; gap: 10px; align-items: flex-start;
    padding: 11px 13px; border-radius: var(--radio); font-size: 13.5px; line-height: 1.45;
    color: var(--ambar); background: var(--ambar-tinte); border: 1px solid var(--ambar-borde);
}
.pago-obra svg { flex: none; margin-top: 1px; }
.pago-obra strong { display: block; }
.pago-obra div { color: var(--texto); }
.pago-obra div strong { color: var(--ambar); }

/* Los medios de pago: se ven, pero apagados. Dicen "esto va a existir", no
   "toca aca". Sin hover, sin cursor de mano. */
.pago-medios { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px;
               grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pago-medios li {
    display: grid; grid-template-columns: auto 1fr; align-items: center; column-gap: 9px;
    padding: 10px 11px; border-radius: var(--radio);
    border: 1px dashed var(--borde-2); color: var(--texto-suave); cursor: default;
}
.pago-medios li svg { grid-row: 1 / span 2; opacity: .7; }
.pago-medios li span { font-size: 13px; font-weight: 600; line-height: 1.25; }
.pago-medios li em { font-style: normal; font-size: 10.5px; font-weight: 700;
                     letter-spacing: .04em; text-transform: uppercase; color: var(--texto-tenue); }
@media (max-width: 420px) {
    .pago-medios { grid-template-columns: 1fr; }
    /* En el celular el numero y el importe van uno debajo del otro: al lado
       no entran y el rotulo "Comprobante" quedaba cortado. */
    .pago-datos { grid-template-columns: 1fr; }
    .pago-datos > div:last-child { text-align: left; }
}

.pago-mientras { margin: 0; font-size: 13px; color: var(--texto-suave); }
.pago-acciones { display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap; }
.pago-acciones .boton { text-decoration: none; }

/* ===========================================================================
   MIS PEDIDOS - QUE SE NOTE QUE CADA PEDIDO SE ABRE
   Tres pistas, ninguna permanente:
   1. Toda la fila se ilumina al pasar el mouse y abre el pedido.
   2. Al final de la fila dice "Ver detalle ›", en palabras.
   3. La primera vez que entra, un cartel lo explica y el primer pedido late
      dos veces. Despues no vuelve a aparecer.
   Nada titila todo el tiempo: en una pantalla que se usa todos los dias, lo
   que se mueve sin parar se deja de mirar a la semana y molesta para siempre.
   =========================================================================== */
.ped-fila { cursor: pointer; transition: background .12s; }
.ped-fila:hover { background: var(--superficie-2); }
.ped-ver-celda { width: 1%; white-space: nowrap; text-align: right; }
.ped-ver { font-size: 13px; font-weight: 700; color: var(--rojo); text-decoration: none; }
.ped-ver:hover { text-decoration: underline; }
.ped-fila:hover .ped-ver span { display: inline-block; transform: translateX(2px); }

.ped-pista {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    flex-wrap: wrap; margin-bottom: 12px; padding: 10px 14px;
    border-radius: var(--radio); font-size: 13.5px;
    background: var(--rojo-suave); border: 1px solid var(--rojo); color: var(--texto);
}
.ped-pista[hidden] { display: none; }
.ped-pista-ok {
    font: inherit; font-size: 12.5px; font-weight: 700; cursor: pointer;
    padding: 5px 12px; border-radius: 7px; border: 0; background: var(--rojo); color: #fff;
}

.ped-fila.pista { animation: ped-late 1.1s ease-in-out 2; }
@keyframes ped-late {
    0%, 100% { background: transparent; }
    50%      { background: var(--rojo-suave); }
}
@media (prefers-reduced-motion: reduce) {
    .ped-fila.pista { animation: none; background: var(--rojo-suave); }
    .ped-fila, .ped-fila:hover .ped-ver span { transition: none; transform: none; }
}


/* ===========================================================================
   CARRITO - COMO VAS A PAGAR
   Dos tarjetas que se eligen, cada una con su total. La decision cambia la
   lista de precios del pedido entero, asi que se toma mirando el numero.
   =========================================================================== */
.forma-pago { margin-bottom: 14px; }
.forma-pago fieldset { border: 0; margin: 0; padding: 0; display: grid; gap: 10px;
                       grid-template-columns: repeat(2, minmax(0, 1fr)); }
.forma-pago legend { font-weight: 700; font-size: 15px; margin-bottom: 8px; padding: 0; }
.fp-op {
    display: grid; grid-template-columns: auto 1fr; align-items: center;
    column-gap: 10px; row-gap: 2px; padding: 12px 14px; cursor: pointer;
    border: 1.5px solid var(--borde); border-radius: var(--radio);
    background: var(--superficie); transition: border-color .12s, background .12s;
}
.fp-op:hover { border-color: var(--borde-2); }
.fp-op input { grid-row: 1 / span 2; width: 18px; height: 18px; margin: 0; accent-color: var(--rojo); }
.fp-op:has(input:checked), .fp-op.on { border-color: var(--rojo); background: var(--rojo-suave); }
.fp-op:has(input:focus-visible) { outline: 2px solid var(--rojo); outline-offset: 2px; }
.fp-nombre { font-weight: 700; font-size: 14px; }
.fp-total { font-size: 16px; font-weight: 700; font-variant-numeric: tabular-nums; }
.fp-falta { margin: 8px 0 0; font-size: 13px; color: var(--ambar); }
@media (max-width: 520px) { .forma-pago fieldset { grid-template-columns: 1fr; } }

/* Sin nada que elegir: se dice como sale, en una linea. */
.fp-fija {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px;
    padding: 10px 14px; border-radius: var(--radio);
    background: var(--verde-tinte); border: 1px solid var(--verde-borde);
}
.fp-fija .fp-rotulo { font-size: 10.5px; font-weight: 700; letter-spacing: .06em;
                      text-transform: uppercase; color: var(--texto-tenue); }
.fp-fija strong { color: var(--verde); }
.fp-fija .fp-ayuda { font-size: 13px; color: var(--texto-suave); }

/* En la tabla: el precio de contado de referencia mientras falta elegir, y
   el aviso del articulo que no tiene precio de contado. */
.fp-alt   { font-size: 11.5px; color: var(--verde); font-weight: 600; white-space: nowrap; }
.fp-aviso { font-size: 11px; color: var(--ambar); font-weight: 600; white-space: nowrap;
            font-family: inherit; }
.fp-total-alt span, .fp-total-alt strong { color: var(--verde); }


/* ===========================================================================
   CARRITO - LA CONFIRMACION ANTES DE ENVIAR
   Usa la misma ventana que "Pagar" en Mi cuenta (.pago): mismo tamano, misma
   cabecera, mismos botones. Lo propio es la lista del resumen.
   =========================================================================== */
.env-lista { margin: 0; display: grid; gap: 0; border: 1px solid var(--borde);
             border-radius: var(--radio); overflow: hidden; }
.env-lista > div { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: 10px;
                   padding: 9px 13px; border-bottom: 1px solid var(--borde); align-items: baseline; }
.env-lista > div:last-child { border-bottom: 0; }
.env-lista > div[hidden] { display: none; }
.env-lista dt { font-size: 10.5px; font-weight: 700; letter-spacing: .06em;
                text-transform: uppercase; color: var(--texto-tenue); }
.env-lista dd { margin: 0; font-size: 14px; overflow-wrap: anywhere; }
.env-lista .env-total { background: var(--superficie-2); }
.env-lista .env-total dd { font-family: var(--tit); font-size: 20px; font-weight: 700;
                           font-variant-numeric: tabular-nums; }
.env-recibe { display: block; font-size: 12.5px; color: var(--texto-suave); margin-top: 2px; }
@media (max-width: 420px) {
    .env-lista > div { grid-template-columns: 1fr; gap: 2px; }
}

/* ===========================================================================
   PANEL DE ADMINISTRACION
   Pantalla de trabajo, no de venta: campos a la izquierda, vista previa a la
   derecha, y el boton de guardar siempre al pie de cada seccion con el
   estado ("version 3, guardada por ... el ...") al lado.
   =========================================================================== */
.adm-tabs { display: flex; flex-wrap: wrap; gap: 4px; border-bottom: 1px solid var(--borde);
            margin: 6px 0 18px; }
.adm-tabs a { padding: 9px 14px; font-size: 14px; font-weight: 600; color: var(--texto-suave);
              text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.adm-tabs a:hover { color: var(--texto); }
.adm-tabs a.on { color: var(--rojo); border-bottom-color: var(--rojo); }
.adm-tabs a:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; border-radius: 4px; }

.adm-sec { background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-lg);
           padding: 18px 20px; margin-bottom: 18px; }
.adm-h2 { font-family: var(--tit); font-size: 18px; margin: 0 0 10px; }
.adm-sec .adm-h2 + .adm-ayuda { margin-top: -4px; }
.adm-ayuda { font-size: 13.5px; color: var(--texto-suave); margin: 0 0 14px; max-width: 80ch; }
.adm-vacio { font-size: 14px; color: var(--texto-suave); }

.adm-form { display: flex; flex-direction: column; gap: 14px; }
.adm-form label { display: flex; flex-direction: column; gap: 5px; font-size: 13px;
                  color: var(--texto-suave); min-width: 0; }
.adm-form input:not([type=checkbox]):not([type=file]), .adm-form select, .adm-form textarea {
    padding: 8px 10px; border: 1px solid var(--borde); border-radius: 7px; width: 100%;
    background: var(--superficie); color: var(--texto); font: inherit; font-size: 14px; resize: vertical; }
.adm-form input:focus-visible, .adm-form select:focus-visible, .adm-form textarea:focus-visible {
    outline: 2px solid var(--rojo); outline-offset: 1px; }
.adm-form input[type=file] { font-size: 13px; color: var(--texto); }
.adm-form fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
.adm-form legend { font-weight: 700; font-size: 14px; color: var(--texto); padding: 0; margin-bottom: 8px; }

.adm-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 18px; }
.adm-campos { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.adm-fila2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.adm-acc { align-items: end; }
.adm-orden { max-width: 90px; }
.adm-quitar { flex-direction: row !important; align-items: center; gap: 7px !important;
              color: var(--texto) !important; cursor: pointer; }
.adm-peligro { color: var(--rojo); }

.adm-pie { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end;
           gap: 10px 14px; padding-top: 12px; border-top: 1px solid var(--borde); }
.adm-estado { font-size: 12.5px; color: var(--texto-suave); margin-right: auto; }
.adm-pie [data-adm-mas] { order: -1; }

/* LA VISTA PREVIA */
.adm-prev { border: 1px dashed var(--borde-2); border-radius: var(--radio); padding: 12px;
            background: var(--superficie-2); min-width: 0; }
.adm-prev-rot { font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
                color: var(--texto-tenue); margin-bottom: 8px; }
.adm-prev [data-p]:empty, .adm-prev [hidden] { display: none !important; }
.adm-prev-franja { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
                   background: var(--nav-fondo); color: var(--nav-texto); font-size: 12.5px;
                   padding: 7px 12px; border-radius: 6px; min-height: 32px; }
.adm-prev-franja .der { display: flex; gap: 12px; margin-left: auto; }
.adm-prev-pie { margin-top: 10px; background: var(--superficie); border: 1px solid var(--borde);
                border-radius: 8px; padding: 12px 14px; font-size: 13px; color: var(--texto-suave);
                display: flex; flex-direction: column; gap: 5px; }
.adm-prev-pie .marca { font-family: var(--tit); font-weight: 700; color: var(--texto); font-size: 16px; }
.adm-prev-pie .marca span { color: var(--rojo); }
.adm-prev-pie p { margin: 0; }
.adm-prev-dato { display: flex; align-items: flex-start; gap: 7px; }
.adm-prev-dato svg { flex: none; margin-top: 2px; color: var(--rojo); }

.adm-lams { display: flex; flex-direction: column; gap: 16px; }
.adm-lam { border: 1px solid var(--borde) !important; border-radius: var(--radio);
           padding: 14px !important; background: var(--superficie); }
.adm-lam-in { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); gap: 16px;
              align-items: start; }
/* El carrusel de verdad mide 1920x629 de proporcion y usa letra de 42px:
   en la vista previa se achica todo para que entre en media pantalla. */
.adm-hero { padding: 0; }
.adm-hero .hero-in { aspect-ratio: 16 / 7; max-height: none; }
.adm-hero .hero-txt { padding: 18px 20px; max-width: 72%; }
.adm-hero h1 { font-size: 22px; margin-bottom: 8px; }
.adm-hero p { font-size: 12.5px; margin-bottom: 10px; }
.adm-hero .btn { font-size: 12px; padding: 7px 12px; }
.adm-hero .pill { font-size: 10px; padding: 3px 9px; margin-bottom: 8px; }
.adm-hero .hero-num { right: 18px; }
.adm-hero .hero-num .n { font-size: 38px; }
.adm-hero .hero-num .l { font-size: 9.5px; max-width: 110px; }
.adm-prev-nota { font-size: 11.5px; color: var(--texto-suave); margin-top: 6px; }

.adm-prev-cinta { display: flex; flex-wrap: wrap; gap: 8px 18px; font-family: var(--tit);
                  font-weight: 700; font-size: 15px; color: var(--texto-suave); }

.adm-tabla input { padding: 6px 8px; border: 1px solid var(--borde); border-radius: 6px; width: 100%;
                   background: var(--superficie); color: var(--texto); font: inherit; font-size: 13.5px; }

.adm-banners { list-style: none; margin: 0 0 18px; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.adm-banner { display: grid; grid-template-columns: 180px minmax(0, 1fr) auto; gap: 14px; align-items: center;
              border: 1px solid var(--borde); border-radius: var(--radio); padding: 8px; background: var(--superficie); }
.adm-banner img { width: 180px; aspect-ratio: 1920 / 629; object-fit: cover; border-radius: 6px;
                  background: var(--superficie-2); display: block; }
.adm-banner-txt { display: flex; flex-direction: column; gap: 3px; min-width: 0; font-size: 12.5px;
                  color: var(--texto-suave); }
.adm-banner-txt strong { color: var(--texto); font-size: 13px; overflow-wrap: anywhere; }
.adm-banner-acc { display: flex; gap: 6px; }
.adm-banner-acc form { margin: 0; }
.adm-papelera .adm-banner { opacity: .75; }
.adm-prev-img { display: flex; gap: 12px; flex-wrap: wrap; align-items: flex-start; }
.adm-prev-img[hidden], .adm-prev-img img[hidden] { display: none; }
.adm-prev-img .adm-prev-rot { width: 100%; }
.adm-prev-img img { max-width: 100%; max-height: 180px; border-radius: 6px; }
.adm-prev-img .adm-prev-movil { max-height: 180px; }

.adm-volver summary { cursor: pointer; font-size: 13px; color: var(--rojo); font-weight: 600; }
.adm-volver form { margin-top: 6px; }

@media (max-width: 900px) {
    .adm-grid, .adm-lam-in { grid-template-columns: 1fr; }
    .adm-hero .hero-num { display: block; }
    /* Como en el carrusel real: en pantalla angosta el alto lo decide el texto. */
    .adm-hero .hero-in { aspect-ratio: auto; }
}
@media (max-width: 560px) {
    .adm-sec { padding: 14px; }
    .adm-fila2 { grid-template-columns: 1fr; }
    .adm-banner { grid-template-columns: 1fr; }
    .adm-banner img { width: 100%; }
    .adm-hero .hero-txt { max-width: none; }
    .adm-hero .hero-num { display: none; }
}

/* ===========================================================================
   AREA INTERNA (/Interno)
   El mismo sistema visual que la tienda --mismos colores, letras y cajas--
   pero con una barra propia y mas sobria: aca se trabaja, no se vende. La
   barra dice siempre quien esta adentro y con que rol.
   =========================================================================== */
.int-barra { background: var(--nav-fondo); color: var(--nav-texto); border-bottom: 1px solid var(--nav-borde); }
.int-barra-in { display: flex; align-items: center; gap: 10px 22px; min-height: 58px; flex-wrap: wrap;
                padding-top: 8px; padding-bottom: 8px; }
.int-barra .marca { color: #fff; text-decoration: none; font-family: var(--tit); }
.int-barra .marca span { color: var(--rojo); }
.int-barra .marca small { color: var(--nav-texto); letter-spacing: .14em; }
.int-nav { display: flex; gap: 2px; flex-wrap: wrap; }
.int-nav a { color: var(--nav-texto); text-decoration: none; font-size: 14px; font-weight: 600;
             padding: 8px 12px; border-radius: 8px; }
.int-nav a:hover { color: #fff; background: rgba(255,255,255,.06); }
.int-nav a.on { color: #fff; background: rgba(255,255,255,.10); box-shadow: inset 0 -2px 0 var(--rojo); }
.int-nav a:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
.int-quien { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.int-quien .txt { font-size: 12.5px; color: var(--nav-texto); text-align: right; line-height: 1.35; }
.int-quien .txt strong { display: block; color: #fff; font-size: 13.5px; }
.int-quien form { margin: 0; }
.int-quien .boton-chico { background: transparent; color: var(--nav-texto); border-color: var(--nav-borde); }
.int-quien .boton-chico:hover { color: #fff; border-color: var(--rojo); }
.int-quien .tema { color: var(--nav-texto); background: transparent; border-color: var(--nav-borde); width: 34px; height: 34px; }
.int-cinta { margin: 14px 0 0; }

/* INGRESO */
.int-login { max-width: 420px; }
.int-paso { font-family: var(--tit); font-weight: 700; font-size: 17px; margin: 0 0 6px; }
.int-texto { font-size: 14px; color: var(--texto-2); margin: 0 0 16px; line-height: 1.5; }
.int-chico { font-size: 12.5px; color: var(--texto-suave); margin: 14px 0 0; }
.int-falta { background: var(--ambar-tinte); border: 1px solid var(--ambar-borde); border-radius: var(--radio);
             padding: 12px 14px; font-size: 14px; }
.int-falta p { margin: 6px 0 0; color: var(--texto-2); line-height: 1.5; }
.int-pasos { margin: 0 0 12px; padding-left: 20px; font-size: 14px; color: var(--texto-2); line-height: 1.5; }
.int-pasos li { margin-bottom: 4px; }
/* El QR va SIEMPRE negro sobre blanco, tambien en modo oscuro. */
.int-qr { background: #fff; border-radius: 12px; padding: 8px; width: 216px; max-width: 100%;
          margin: 4px auto 14px; border: 1px solid var(--borde); }
.int-qr svg { display: block; width: 100%; height: auto; }
.int-qr svg rect[fill="white"], .int-qr svg rect[fill="#ffffff"] { fill: #fff; }
.int-manual { font-size: 13.5px; margin-bottom: 16px; }
.int-manual summary { cursor: pointer; color: var(--rojo); font-weight: 600; }
.int-manual p { margin: 8px 0 0; color: var(--texto-2); }
.int-secreto { font-size: 15px; letter-spacing: .06em; background: var(--superficie-2); padding: 8px 10px;
               border-radius: 7px; overflow-wrap: anywhere; user-select: all; }
.int-codigo { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
              font-size: 22px !important; letter-spacing: .3em; text-align: center; }
.int-cancelar { margin: 12px 0 0; text-align: center; }
button.link { background: none; border: 0; padding: 4px; font: inherit; font-size: 13px;
              color: var(--texto-suave); text-decoration: underline; cursor: pointer; }
button.link:hover { color: var(--rojo); }
.int-respaldo { list-style: none; margin: 0 0 14px; padding: 12px; display: grid;
                grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 16px;
                background: var(--superficie-2); border-radius: var(--radio); font-size: 15px; }
.int-respaldo li { font-variant-numeric: tabular-nums; }
.int-copiar { width: 100%; margin-bottom: 10px; }
.int-login a.boton { display: block; text-align: center; text-decoration: none; }

/* USUARIOS Y MI CUENTA */
.int-clave-nueva { border-color: var(--verde-borde); background: var(--verde-tinte); }
.int-clave-fila { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.int-clave { font-size: 20px; letter-spacing: .08em; background: var(--superficie); padding: 8px 12px;
             border-radius: 8px; border: 1px solid var(--borde); user-select: all; }
.int-usuarios td { vertical-align: top; }
.int-inactivo td { color: var(--texto-tenue); }
.int-mal td { color: var(--rojo); }
.int-quedan { display: block; font-size: 11.5px; color: var(--ambar); margin-top: 3px; }
.int-editar > summary { list-style: none; display: inline-block; cursor: pointer; }
.int-editar > summary::-webkit-details-marker { display: none; }
.int-editar[open] > summary { color: var(--rojo); border-color: var(--rojo); }
.int-editar-caja { margin-top: 8px; padding: 12px; border: 1px solid var(--borde); border-radius: var(--radio);
                   background: var(--superficie-2); min-width: 260px; display: flex; flex-direction: column; gap: 12px; }
.int-editar-caja .adm-form { gap: 10px; }
.int-editar-acc { display: flex; flex-direction: column; gap: 6px; align-items: flex-start;
                  padding-top: 10px; border-top: 1px solid var(--borde); }
.int-editar-acc form { margin: 0; }
.int-alta { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.int-cuenta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.int-cuenta .adm-sec { margin-bottom: 0; }

/* Los desplegables del area interna llevan su flechita dibujada (no hay
   <svg> al lado como en la cabecera de la tienda). */
.adm .sel select, .fot-filtros .sel select {
    padding-right: 32px; max-width: none; width: 100%;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13' height='13' viewBox='0 0 24 24' fill='none' stroke='%238a8a93' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 10px center; }

/* CHIPS DE ESTADO (fotos, usuarios) */
.chip-f { display: inline-block; font-size: 11.5px; font-weight: 700; padding: 3px 8px; border-radius: 99px;
          white-space: nowrap; border: 1px solid transparent; }
.chip-con    { background: var(--verde-tinte); color: var(--verde); border-color: var(--verde-borde); }
.chip-sin    { background: var(--superficie-2); color: var(--texto-suave); border-color: var(--borde); }
.chip-marca  { background: var(--rojo-suave); color: var(--rojo); border-color: rgba(220,38,38,.26); }
.chip-alerta { background: var(--ambar-tinte); color: var(--ambar); border-color: var(--ambar-borde); }
.chip-mal    { background: var(--rojo-suave); color: var(--rojo); border-color: rgba(220,38,38,.26);
               white-space: normal; }

/* ===========================================================================
   FOTOS DE ARTICULOS
   =========================================================================== */
.fot-barra { display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: flex-start; justify-content: space-between;
             padding-bottom: 14px; margin-bottom: 18px; border-bottom: 1px solid var(--borde); }
.fot-barra .adm-ayuda { margin: 0; flex: 1 1 420px; }
.fot-opciones { display: flex; flex-direction: column; gap: 4px; padding: 10px 14px; border-radius: var(--radio);
                background: var(--superficie-2); border: 1px solid var(--borde); }
.fot-chk { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; cursor: pointer; }
.fot-chk input { width: 17px; height: 17px; accent-color: var(--rojo); }
.fot-chk input:disabled + * , .fot-chk:has(input:disabled) { color: var(--texto-tenue); cursor: default; }
.fot-nota { font-size: 12.5px; color: var(--texto-suave); }
.fot-nota a { color: var(--rojo); font-weight: 600; }

.fot-zona { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
            text-align: center; padding: 26px 16px; margin-bottom: 14px; cursor: pointer;
            border: 2px dashed var(--borde-2); border-radius: var(--r-lg); background: var(--superficie-2);
            color: var(--texto-2); font-size: 14px; transition: border-color .15s, background .15s; }
.fot-zona svg { color: var(--rojo); }
.fot-zona small { color: var(--texto-suave); font-size: 12px; }
.fot-zona:hover, .fot-zona.encima { border-color: var(--rojo); background: var(--rojo-suave); }
.fot-zona:focus-within { outline: 2px solid var(--rojo); outline-offset: 2px; }
.fot-zona input, .fot-subir-una input, .marca-probar input {
    position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.fot-cotejo { display: flex; flex-direction: column; gap: 10px; margin-bottom: 22px; }
.fot-cotejo[hidden] { display: none; }
.fot-resumen { font-weight: 700; font-size: 14px; }
.fot-tabla-cot { max-height: 340px; overflow: auto; border: 1px solid var(--borde); border-radius: var(--radio); }
.fot-tabla-cot table { margin: 0; }
.fot-avance { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; }
.fot-avance[hidden] { display: none; }
.fot-barra-av { flex: 1 1 240px; height: 8px; border-radius: 99px; background: var(--superficie-2);
                border: 1px solid var(--borde); overflow: hidden; }
.fot-barra-av span { display: block; height: 100%; width: 0; background: var(--rojo); transition: width .25s; }

.fot-h2-lista { margin-top: 8px; scroll-margin-top: 16px; }
.fot-filtros { display: grid; grid-template-columns: minmax(0, 2fr) repeat(3, minmax(0, 1fr)) auto;
               gap: 10px; align-items: end; margin-bottom: 10px; }
.fot-filtros label { display: flex; flex-direction: column; gap: 5px; font-size: 13px; color: var(--texto-suave); min-width: 0; }
.fot-filtros input[type=search] { padding: 0 11px; height: 38px; border: 1px solid var(--borde); border-radius: var(--radio);
                                  background: var(--superficie); color: var(--texto); font: inherit; font-size: 14px; width: 100%; }
.fot-filtros input:focus-visible { outline: 2px solid var(--rojo); outline-offset: 1px; }
.fot-filtros .boton { height: 38px; }
.fot-cuentas { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; font-size: 13px; margin: 0 0 10px; }

.fot-lista td { vertical-align: middle; }
.fot-mini { width: 56px; }
.fot-mini img, .fot-hueco { width: 48px; height: 48px; border-radius: 7px; object-fit: contain; display: block;
                            background: var(--foto); border: 1px solid var(--borde); }
.fot-hueco { background: repeating-linear-gradient(45deg, var(--superficie-2) 0 6px, transparent 6px 12px); }
.fot-desc small { display: block; color: var(--texto-suave); font-size: 11.5px; margin-top: 2px; }
.fot-lista .num { text-align: right; font-variant-numeric: tabular-nums; }
.fot-acc { white-space: nowrap; }
.fot-acc > * { display: inline-block; vertical-align: middle; margin: 2px 4px 2px 0; }
.fot-acc form { margin: 0; display: inline-block; }
.fot-subir-una { position: relative; cursor: pointer; }
.fot-subir-una.ocupado { opacity: .55; pointer-events: none; }
.fot-subir-una.ocupado::after { content: " …"; }
.fot-subir-una:focus-within { outline: 2px solid var(--rojo); outline-offset: 2px; }
.fot-quitar { display: inline-block; }
.fot-quitar[open] { display: block; }
.fot-recien td { background: var(--verde-tinte); transition: background 1.2s; }
.adm-paginado { display: flex; gap: 14px; align-items: center; justify-content: center; margin-top: 14px; font-size: 13.5px; }
.adm-paginado a { color: var(--rojo); font-weight: 700; text-decoration: none; }

/* ===========================================================================
   MARCA DE AGUA
   =========================================================================== */
.marca-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); gap: 20px; align-items: start; }
.marca-campos { display: flex; flex-direction: column; gap: 22px; min-width: 0; }
.marca-logo fieldset { display: flex; flex-direction: column; gap: 10px; }
.marca-logo .boton-secundario { align-self: flex-start; }
.marca-logo-fila { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: 14px; align-items: center; }
/* Cuadriculado = transparencia, como en cualquier editor de imagenes. */
.marca-damero { width: 120px; height: 90px; border-radius: 8px; border: 1px solid var(--borde);
                display: grid; place-items: center; overflow: hidden; font-size: 12px; color: #71717a;
                background: #fff conic-gradient(#e4e4e7 25%, #fff 0 50%, #e4e4e7 0 75%, #fff 0) 0 0 / 16px 16px; }
.marca-damero img { max-width: 92%; max-height: 80%; }
.marca-pos { display: grid; grid-template-columns: repeat(3, 44px); grid-template-rows: repeat(3, 34px); gap: 5px;
             padding: 8px; width: max-content; border-radius: 10px; background: var(--superficie-2);
             border: 1px solid var(--borde); margin-bottom: 4px; }
.marca-pos-op { position: relative; display: block !important; border-radius: 6px; cursor: pointer;
                border: 1px dashed var(--borde-2); background: var(--superficie); }
.marca-pos-op input { position: absolute; inset: 0; opacity: 0; cursor: pointer; margin: 0; }
.marca-pos-op:has(input:checked) { background: var(--rojo); border: 1px solid var(--rojo); }
.marca-pos-op:has(input:focus-visible) { outline: 2px solid var(--rojo); outline-offset: 2px; }
.marca-pos-arriba-izq { grid-area: 1 / 1; } .marca-pos-arriba-der { grid-area: 1 / 3; }
.marca-pos-centro { grid-area: 2 / 2; }
.marca-pos-abajo-izq { grid-area: 3 / 1; } .marca-pos-abajo-der { grid-area: 3 / 3; }
.adm-form input[type=range] { padding: 0 !important; border: 0 !important; accent-color: var(--rojo); background: none !important; }
.adm-form output { font-weight: 700; color: var(--texto); font-variant-numeric: tabular-nums; }
.marca-prev { position: sticky; top: 14px; display: flex; flex-direction: column; gap: 8px; align-items: flex-start; }
.marca-prev canvas { width: 100%; height: auto; border-radius: 8px; background: var(--foto); border: 1px solid var(--borde); }
.marca-probar { position: relative; cursor: pointer; }
.marca-probar:focus-within { outline: 2px solid var(--rojo); outline-offset: 2px; }

.marca-masivo { margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--borde); }
.marca-cuentas { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 0 0 14px; }
.marca-cuentas > div { background: var(--superficie-2); border: 1px solid var(--borde); border-radius: var(--radio); padding: 10px 12px; }
.marca-cuentas dt { font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--texto-tenue); }
.marca-cuentas dd { margin: 2px 0 0; font-family: var(--tit); font-size: 22px; font-weight: 700; font-variant-numeric: tabular-nums; }
.marca-botones { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.marca-avance { margin-top: 14px; padding: 12px; border-radius: var(--radio); background: var(--superficie-2); border: 1px solid var(--borde); }
.marca-avance-acc { display: flex; gap: 6px; }
.marca-errores { width: 100%; margin: 0; padding-left: 18px; font-size: 12.5px; color: var(--rojo); max-height: 160px; overflow: auto; }
.marca-errores:empty { display: none; }

@media (max-width: 900px) {
    .marca-grid, .int-cuenta, .int-alta { grid-template-columns: 1fr; }
    .marca-prev { position: static; }
    .fot-filtros { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .fot-filtros .fot-q { grid-column: 1 / -1; }
    .marca-cuentas { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
    .int-quien { margin-left: 0; width: 100%; justify-content: space-between; }
    .int-quien .txt { text-align: left; }
    .int-respaldo { grid-template-columns: 1fr 1fr; font-size: 14px; }
    .fot-filtros { grid-template-columns: 1fr; }
    .marca-logo-fila { grid-template-columns: 1fr; }
    .fot-acc { white-space: normal; }
}
.adm .boton-secundario:disabled, .adm .boton-chico:disabled { opacity: .45; cursor: not-allowed; }
.adm .boton-secundario:disabled:hover, .adm .boton-chico:disabled:hover { color: inherit; border-color: var(--borde); }

/* EL ROTULO EN UNA SOLA LINEA.
   Con el rotulo en columna, "Leyenda (izquierda)" o "Tamaño 24 % del ancho"
   se partian en dos o tres renglones: cada pedacito era una fila. Ahora el
   texto del rotulo corre seguido y el campo va abajo. */
.adm-form label { display: block; line-height: 1.45; }
.adm-form label > input:not([type=checkbox]):not([type=radio]),
.adm-form label > select, .adm-form label > textarea { display: block; margin-top: 5px; }
.adm-form label > .sel { display: flex; margin-top: 5px; }
.adm-form label.adm-quitar { display: flex !important; }
.adm-form label.marca-pos-op { display: block !important; }

/* En el celular la lista de fotos pasa a tarjetas: foto a la izquierda,
   codigo y stock arriba, descripcion abajo y los botones al pie. En tabla
   la descripcion quedaba de una palabra por renglon. */
.fot-rot { display: none; }
@media (max-width: 640px) {
    .fot-lista thead { display: none; }
    .fot-lista, .fot-lista tbody { display: block; }
    .fot-lista tr { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto;
                    grid-template-areas: "foto cod stock" "foto desc desc" "foto est est" "acc acc acc";
                    gap: 4px 10px; padding: 12px; border-bottom: 1px solid var(--borde); }
    .fot-lista td { display: block; padding: 0 !important; border: 0 !important; }
    .fot-lista .fot-mini { grid-area: foto; }
    .fot-lista .fot-cod { grid-area: cod; font-weight: 700; }
    .fot-lista .fot-stock { grid-area: stock; color: var(--texto-suave); }
    .fot-lista .fot-rot { display: inline; }
    .fot-lista .fot-desc { grid-area: desc; }
    .fot-lista .fot-est { grid-area: est; }
    .fot-lista .fot-acc { grid-area: acc; white-space: normal; padding-top: 6px !important; }
}

.int-reloj { background: var(--ambar-tinte); border: 1px solid var(--ambar-borde); color: var(--texto);
             border-left: 3px solid var(--ambar); border-radius: var(--radio); padding: 10px 12px;
             font-size: 13px; line-height: 1.5; margin-bottom: 14px; }
.int-reloj[hidden] { display: none; }

/* LA CASILLA "CON STOCK" DENTRO DEL BUSCADOR.
   Chica y gris para no competir con el campo; tildada toma el rojo de la
   marca. Comparte bordes con el campo: se ve como parte del buscador. */
.buscador-cab .stock-cab {
    flex: none; display: flex; align-items: center; gap: 7px; padding: 0 10px 0 8px;
    border: 1px solid var(--borde); border-left: 0; border-right: 0;
    background: var(--superficie); color: var(--texto-tenue);
    font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap; user-select: none;
}
.buscador-cab .stock-cab:hover { color: var(--texto-suave); }
.buscador-cab .stock-cab input {
    appearance: none; -webkit-appearance: none; margin: 0; flex: none;
    width: 18px; height: 18px; border-radius: 5px; cursor: pointer;
    border: 1.5px solid var(--borde-2); background: var(--superficie);
    display: grid; place-content: center; transition: background .15s, border-color .15s;
}
.buscador-cab .stock-cab input::after {
    content: ""; width: 9px; height: 5px; margin-top: -2px;
    border: solid #fff; border-width: 0 0 2px 2px; transform: rotate(-45deg) scale(0);
    transition: transform .15s;
}
.buscador-cab .stock-cab input:checked { background: var(--rojo); border-color: var(--rojo); }
.buscador-cab .stock-cab input:checked::after { transform: rotate(-45deg) scale(1); }
.buscador-cab .stock-cab:has(input:checked) { color: var(--texto-suave); }
.buscador-cab .stock-cab input:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
.buscador-cab input[type=search]:focus + .stock-cab { border-color: var(--rojo); }
.buscador-cab .stock-cab .corto { display: none; }
@media (max-width: 560px) {
    .buscador-cab .stock-cab .largo { display: none; }
    .buscador-cab .stock-cab .corto { display: inline; }
    .buscador-cab .stock-cab { padding: 0 8px 0 6px; gap: 5px; font-size: 11.5px; }
    .buscador-cab .sel-cab { max-width: 104px; min-width: 84px; }
    /* El boton queda solo con la lupa: el campo de texto necesita el lugar. */
    .buscador-cab button span { display: none; }
    .buscador-cab button { padding: 0 14px; }
}
@media (prefers-reduced-motion: reduce) {
    .buscador-cab .stock-cab input, .buscador-cab .stock-cab input::after { transition: none; }
}

/* ===========================================================================
   FICHA DEL PRODUCTO: FOTO CON LUPA Y VISOR A PANTALLA COMPLETA
   =========================================================================== */
.detalle.producto { display: grid; grid-template-columns: minmax(0, 440px) minmax(0, 1fr); gap: 28px; align-items: start; }
.prod-media { position: sticky; top: 90px; display: flex; flex-direction: column; gap: 8px; }
.prod-foto { display: block; width: 100%; aspect-ratio: 1 / 1; padding: 0; border: 1px solid var(--borde);
             border-radius: var(--r-lg); background: var(--foto); overflow: hidden; cursor: zoom-in; }
.prod-foto img { width: 100%; height: 100%; object-fit: contain; display: block;
                 transition: transform .25s ease; transform-origin: 50% 50%; }
.prod-foto.ampliada img { transform: scale(2.2); transition: transform .12s ease-out; }
.prod-foto:focus-visible { outline: 2px solid var(--rojo); outline-offset: 3px; }
.prod-pista { display: flex; align-items: center; gap: 6px; margin: 0; font-size: 12px; color: var(--texto-suave); }
.prod-pista svg { flex: none; color: var(--texto-tenue); }
@media (hover: none), (pointer: coarse) { .prod-pista .solo-mouse { display: none; } }
.prod-sinfoto { aspect-ratio: 1 / 1; border: 1px dashed var(--borde-2); border-radius: var(--r-lg);
                display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px;
                color: var(--texto-tenue); font-size: 13px; background: var(--superficie-2); }
.prod-info { min-width: 0; }
@media (max-width: 820px) {
    .detalle.producto { grid-template-columns: 1fr; gap: 16px; }
    .prod-media { position: static; max-width: 460px; width: 100%; margin: 0 auto; }
}

/* El visor ocupa toda la pantalla, fondo casi negro (la foto manda). */
.visor-foto { width: 100vw; height: 100dvh; max-width: none; max-height: none; margin: 0; padding: 0;
              border: 0; background: rgba(10, 10, 12, .94); color: #fff; overflow: hidden; }
.visor-foto::backdrop { background: rgba(10, 10, 12, .6); }
.visor-foto[open] { animation: visor-entra .22s ease-out; }
@keyframes visor-entra { from { opacity: 0; transform: scale(.97); } to { opacity: 1; transform: none; } }
.visor-foto-lienzo { position: absolute; inset: 56px 16px 70px; display: flex; align-items: center; justify-content: center;
                     touch-action: none; cursor: zoom-in; overflow: hidden; }
.visor-foto-lienzo.con-zoom { cursor: grab; }
.visor-foto-lienzo.con-zoom:active { cursor: grabbing; }
.visor-foto-lienzo img { max-width: 100%; max-height: 100%; object-fit: contain; background: #fff; border-radius: 6px;
                         user-select: none; -webkit-user-drag: none; will-change: transform; }
.visor-foto-lienzo img.suave { transition: transform .22s ease; }
.visor-foto-cerrar { position: absolute; top: 10px; right: 12px; width: 42px; height: 42px; border-radius: 50%;
                     border: 1px solid rgba(255,255,255,.25); background: rgba(255,255,255,.08); color: #fff;
                     font-size: 26px; line-height: 1; cursor: pointer; }
.visor-foto-cerrar:hover, .visor-foto-zoom button:hover { background: rgba(255,255,255,.18); }
.visor-foto-zoom { position: absolute; bottom: 22px; left: 50%; transform: translateX(-50%); display: flex; gap: 6px; }
.visor-foto-zoom button { min-width: 44px; height: 38px; border-radius: 10px; border: 1px solid rgba(255,255,255,.25);
                          background: rgba(255,255,255,.08); color: #fff; font: inherit; font-weight: 700; cursor: pointer; }
.visor-foto-pista { position: absolute; top: 18px; left: 16px; right: 70px; margin: 0; font-size: 12.5px;
                    color: rgba(255,255,255,.7); }
.visor-foto button:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
@media (max-width: 560px) { .visor-foto-pista { display: none; } .visor-foto-lienzo { inset: 60px 0 76px; } }
@media (prefers-reduced-motion: reduce) {
    .prod-foto img, .prod-foto.ampliada img, .visor-foto-lienzo img.suave { transition: none; }
    .visor-foto[open] { animation: none; }
}

/* ===========================================================================
   PANEL DE FOTOS: VISOR, HERRAMIENTAS Y FORMATO
   =========================================================================== */
.fot-herr { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; margin: 0 0 12px; }
.fot-herr .fot-avance { flex: 1 1 100%; }
.fot-ver { display: block; padding: 0; border: 0; background: none; cursor: zoom-in; border-radius: 7px; }
.fot-ver:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
.fot-ver:hover img { border-color: var(--rojo); }
.marca-sub { margin: 10px 0 4px; font-size: 13px; font-weight: 700; color: var(--texto); }
.marca-cuadrar { font-weight: 600; }

.fot-visor { width: min(980px, calc(100vw - 24px)); max-height: calc(100dvh - 24px); padding: 0; border: 1px solid var(--borde);
             border-radius: var(--r-lg); background: var(--superficie); color: var(--texto); box-shadow: var(--sombra-a); }
.fot-visor::backdrop { background: rgba(10, 10, 12, .55); }
.fot-visor[open] { animation: visor-entra .2s ease-out; }
.fot-visor-in { position: relative; display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); }
.fot-visor-img { background: var(--superficie-2); padding: 16px; display: flex; flex-direction: column; gap: 10px; align-items: center; }
.fot-visor-img img { width: 100%; aspect-ratio: 1 / 1; object-fit: contain; background: #fff; border-radius: 8px;
                     border: 1px solid var(--borde); }
.fot-visor-vista { display: inline-flex; border: 1px solid var(--borde); border-radius: 99px; overflow: hidden; }
.fot-visor-vista button { border: 0; background: var(--superficie); color: var(--texto-suave); font: inherit;
                          font-size: 12.5px; font-weight: 600; padding: 6px 12px; cursor: pointer; }
.fot-visor-vista button.on { background: var(--rojo); color: #fff; }
.fot-visor-datos { padding: 20px 20px 18px; display: flex; flex-direction: column; gap: 10px; min-width: 0; overflow: auto; }
.fot-visor-cod { margin: 0; font-size: 13px; color: var(--texto-suave); }
.fot-visor-datos h2 { margin: 0; font-size: 17px; line-height: 1.35; padding-right: 36px; }
.fot-visor-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.fot-visor-rev { background: var(--ambar-tinte); border: 1px solid var(--ambar-borde); border-radius: var(--radio);
                 padding: 9px 11px; font-size: 13px; line-height: 1.5; }
.fot-visor-rev[hidden] { display: none; }
.fot-visor-rev p { margin: 6px 0 0; }
.fot-visor-acc { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 4px; }
.fot-visor-acc button { width: 100%; }
.fot-visor-cerrar { position: absolute; top: 10px; right: 10px; width: 36px; height: 36px; border-radius: 50%;
                    border: 1px solid var(--borde); background: var(--superficie); color: var(--texto);
                    font-size: 22px; line-height: 1; cursor: pointer; }
.fot-visor-cerrar:hover { color: var(--rojo); border-color: var(--rojo); }
@media (max-width: 720px) {
    .fot-visor-in { grid-template-columns: 1fr; }
    .fot-visor-acc { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) { .fot-visor[open] { animation: none; } }

/* Etiqueta corta de una oferta elegida en el panel ("Llegó stock"). */
.etiqueta.et-oferta { background: var(--rojo); color: #fff; border-color: var(--rojo); }
.adm-of-dato { font-size: 12.5px; color: var(--texto-suave); }
.adm-of-dato > span:first-child { display: block; margin-bottom: 3px; color: var(--texto-2); }
.adm-of-dato .chip-f { margin-right: 4px; }

/* ===========================================================================
   TANDA 14
   =========================================================================== */

/* --- 1. Cantidad en la ficha del articulo -------------------------------
   El mismo selector - numero + del catalogo (.qty), mas grande porque en la
   ficha es lo principal, y el boton "Agregar al carrito" con su carrito. */
.art-cant { display: grid; gap: 7px; max-width: 440px; }
.art-cant .etiqueta-cant { font-size: 13px; color: var(--texto-suave); }
.art-cant-fila { display: flex; gap: 10px; align-items: stretch; }
.art-cant .qty { border-radius: 11px; }
.art-cant .qty button { width: 44px; height: 46px; font-size: 21px; }
.art-cant .qty input { width: 62px; height: 46px; font-size: 17px; }
.art-cant .cargar { height: 48px; border-radius: 11px; font-size: 15px; }
.art-cant .cargar:hover:not(:disabled) { background: var(--rojo-h); }
.art-cant-tope { margin: 0; font-size: 12.5px; font-weight: 600; color: var(--ambar); }
@media (max-width: 420px) {
    .art-cant .qty button { width: 38px; }
    .art-cant .qty input { width: 50px; }
}

/* --- 3. El fuego de "Ofertas de la semana" ------------------------------
   Antes era un cuadradito de 28 px que se perdia al lado del titulo. Ahora
   40 px, con degradado y una llama que titila suave. Quien pidio menos
   animacion en su equipo lo ve quieto. */
.of-t { gap: 13px; }
.of-t h2 { font-size: 22px; }
.of-t .flama {
    position: relative; width: 40px; height: 40px; border-radius: 12px;
    background: linear-gradient(160deg, #F97316 0%, var(--rojo) 55%, #B91C1C 100%);
    box-shadow: 0 4px 14px -4px rgba(220, 38, 38, .55);
    animation: flama-brillo 2.4s ease-in-out infinite;
}
.of-t .flama svg {
    width: 23px; height: 23px; transform-origin: 50% 90%;
    filter: drop-shadow(0 0 3px rgba(255, 220, 150, .55));
    animation: flama-titila 1.6s ease-in-out infinite;
}
@keyframes flama-titila {
    0%, 100% { transform: scale(1) rotate(0); }
    25%      { transform: scale(1.06, .96) rotate(-2.5deg); }
    50%      { transform: scale(.97, 1.05) rotate(1.5deg); }
    75%      { transform: scale(1.04, .98) rotate(-1deg); }
}
@keyframes flama-brillo {
    0%, 100% { box-shadow: 0 4px 14px -4px rgba(220, 38, 38, .55); }
    50%      { box-shadow: 0 4px 22px -2px rgba(249, 115, 22, .7); }
}
@media (prefers-reduced-motion: reduce) {
    .of-t .flama, .of-t .flama svg { animation: none; }
}

/* --- 4. Panel: mostrar u ocultar una seccion de la portada -------------- */
.adm-mostrar { margin-bottom: 12px; font-weight: 600; }
.adm-mostrar .opcional { font-weight: 400; }
.adm-h2 .chip-f { margin-left: 8px; vertical-align: middle; }

/* --- 5. Pedido largo: primeros 10 renglones y la flecha -----------------
   La regla que esconde va con "html:not(.sin-js)": sin JavaScript no hay
   flecha que despliegue, asi que se ven todos. */
html:not(.sin-js) .ped-largo:not(.abierto) .ren-extra { display: none; }
html:not(.sin-js) .ped-largo { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.ped-largo.abierto .ren-extra { animation: ren-aparece .3s ease both; }
@keyframes ren-aparece { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.ren-ver {
    display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%;
    margin-top: -1px; padding: 11px 14px; cursor: pointer;
    border: 1px solid var(--borde); border-radius: 0 0 var(--r-lg) var(--r-lg);
    background: var(--superficie); color: var(--texto); font: inherit; font-size: 14px; font-weight: 700;
}
.ren-ver:hover { background: var(--superficie-2); color: var(--rojo); }
.ren-ver:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
.ren-ver-flecha { transition: transform .25s ease; }
.ren-ver[aria-expanded="true"] .ren-ver-flecha { transform: rotate(180deg); }
.sin-js .ren-ver { display: none; }
@media (prefers-reduced-motion: reduce) {
    .ped-largo.abierto .ren-extra { animation: none; }
    .ren-ver-flecha { transition: none; }
}

/* ===========================================================================
   TANDA 15
   =========================================================================== */

/* --- Pedido rapido: el aviso del archivo y "Revisar la lista" que late ---- */
.pr-archivo span[data-pr-archivo-txt] { max-width: 260px; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap; }
.pr-archivo-aviso {
    display: flex; align-items: center; gap: 12px; margin-top: 12px;
    padding: 12px 14px; border-radius: var(--radio);
    background: var(--rojo-suave); border: 1px solid var(--borde);
    border-left: 3px solid var(--rojo); color: var(--texto-2); font-size: 13.5px;
    animation: pr-aviso-entra .35s ease both;
}
.pr-archivo-aviso[hidden] { display: none; }
.pr-archivo-aviso > svg { flex: none; color: var(--rojo); }
.pr-archivo-aviso > div { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pr-archivo-aviso b { color: var(--texto); word-break: break-all; }
.pr-aviso-pisa { color: var(--ambar); font-weight: 600; font-size: 12.5px; }
@keyframes pr-aviso-entra { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* El pulso: el boton pasa a rojo, late apenas y le sale un anillo que crece
   y se apaga, cada 2 segundos, hasta que lo tocan. */
.pr-revisar.pr-late {
    position: relative; background: var(--rojo); color: #fff; border-color: var(--rojo);
    animation: pr-late 2s ease-out infinite;
}
.pr-revisar.pr-late:hover { background: var(--rojo-h); }
@keyframes pr-late {
    0%   { box-shadow: 0 0 0 0 rgba(220, 38, 38, .55); transform: scale(1); }
    12%  { transform: scale(1.045); }
    24%  { transform: scale(1); }
    70%  { box-shadow: 0 0 0 14px rgba(220, 38, 38, 0); }
    100% { box-shadow: 0 0 0 0 rgba(220, 38, 38, 0); transform: scale(1); }
}

/* --- Pedido rapido: renglones con varios parecidos ------------------------ */
.pr-resumen .elegir { color: var(--rojo); font-weight: 700; }
.pr-de-archivo { color: var(--texto-suave); }
.pr-de-archivo b { color: var(--texto); }
.pr-elegir td { background: var(--rojo-suave); }
.pr-elegir td:first-child { box-shadow: inset 3px 0 0 var(--rojo); }
.pr-opciones { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.pr-opciones legend { padding: 0; margin-bottom: 4px; font-size: 12px; font-weight: 800;
    letter-spacing: .04em; color: var(--texto-2); }
.pr-op {
    display: flex; align-items: center; gap: 10px; cursor: pointer;
    padding: 8px 10px; border: 1px solid var(--borde); border-radius: 9px;
    background: var(--superficie); transition: border-color .15s, box-shadow .15s;
}
.pr-op:hover { border-color: var(--borde-2); }
.pr-op.on { border-color: var(--rojo); box-shadow: 0 0 0 1px var(--rojo) inset; }
.pr-op input { accent-color: var(--rojo); flex: none; margin: 0; }
.pr-op-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.pr-op-txt .d { font-size: 13.5px; color: var(--texto); }
.pr-op-txt .c { font-family: ui-monospace, monospace; font-size: 11.5px; color: var(--texto-suave); }
.pr-op-est { flex: none; font-size: 11.5px; font-weight: 700; padding: 2px 8px; border-radius: 99px; }
.pr-op-est.si { color: var(--verde); background: var(--verde-tinte); }
.pr-op-est.no { color: var(--texto-suave); background: var(--superficie-2); }
.pr-por-desc { display: block; margin-top: 2px; font-size: 12px; color: var(--ambar); }
.pr-nota-elegir { color: var(--texto-2); }
@media (max-width: 560px) {
    .pr-op { flex-wrap: wrap; }
    .pr-archivo-aviso { flex-wrap: wrap; }
}
@media (prefers-reduced-motion: reduce) {
    .pr-revisar.pr-late { animation: none; box-shadow: 0 0 0 3px rgba(220, 38, 38, .35); }
    .pr-archivo-aviso { animation: none; }
}

/* --- El logo de la pagina como imagen ------------------------------------
   Misma altura que el texto (40 px; 32 en el celular), ancho libre hasta un
   tope, sin deformarse nunca. En modo oscuro, si hay version oscura, se
   cambia; si no, queda la clara. Tres estados del tema, como todo el sitio. */
.marca.marca-img { display: inline-flex; align-items: center; flex: none; }
.marca-img img { display: block; height: 40px; width: auto; max-width: 220px; object-fit: contain; }
.marca-img .logo-oscuro { display: none; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .marca-img.con-oscuro .logo-claro { display: none; }
    :root:not([data-theme="light"]) .marca-img.con-oscuro .logo-oscuro { display: block; }
}
:root[data-theme="dark"] .marca-img.con-oscuro .logo-claro { display: none; }
:root[data-theme="dark"] .marca-img.con-oscuro .logo-oscuro { display: block; }
@media (max-width: 560px) {
    .marca-img img { height: 32px; max-width: 160px; }
}

/* Panel: elegir texto o imagen y la vista previa en claro y oscuro. */
.logo-modo { display: inline-flex; border: 1px solid var(--borde); border-radius: 10px; overflow: hidden; margin-bottom: 14px; }
.logo-op { position: relative; display: flex !important; align-items: center; cursor: pointer; margin: 0 !important; }
.logo-op input { position: absolute; opacity: 0; pointer-events: none; }
.logo-op span { padding: 8px 18px; font-weight: 700; font-size: 13.5px; color: var(--texto-suave); }
.logo-op input:checked + span { background: var(--rojo); color: #fff; }
.logo-op input:focus-visible + span { outline: 2px solid var(--rojo); outline-offset: -2px; }
.logo-prev { margin-top: 16px; display: grid; gap: 8px; }
.logo-prev-franja { display: flex; align-items: center; gap: 16px; padding: 14px 16px; border-radius: 10px; border: 1px solid var(--borde); }
.logo-prev-franja.claro  { background: #FFFFFF; color: #18181B; }
.logo-prev-franja.oscuro { background: #18181B; color: #FAFAFA; border-color: #27272A; }
.logo-prev-franja .marca small { color: #A1A1AA; }
.logo-prev-franja img { height: 40px; width: auto; max-width: 220px; object-fit: contain; }
.logo-prev-franja img[hidden], .logo-prev-franja [hidden] { display: none; }
.logo-prev-busca { flex: 1; height: 34px; border-radius: 9px; background: rgba(127, 127, 127, .14); }

/* --- Al cargar la pagina ------------------------------------------------
   1. La barra roja de arriba: avanza rapido hasta casi el final, termina y
      se desvanece. Al navegar (clase "yendo", la pone catalogo.js) avanza
      despacio hasta el 90 % mientras el servidor contesta.
   2. El contenido sube apenas y aparece, en cascada: los primeros bloques
      de la pagina con unos milisegundos de diferencia. Las tarjetas del
      catalogo ya tenian su propia cascada (ficha-entra).
   Todo dura menos de medio segundo, se ve una vez por pagina y no ocurre
   si el equipo pidio reducir el movimiento. Se usa "backwards" y no "both":
   terminada la animacion no queda ningun transform puesto, que cambiaria
   como se ubican los elementos fijos de adentro. */
.carga-barra {
    position: fixed; top: 0; left: 0; z-index: 9999; height: 3px; width: 0;
    background: linear-gradient(90deg, var(--rojo), #F97316);
    box-shadow: 0 0 10px rgba(220, 38, 38, .45);
    border-radius: 0 3px 3px 0; pointer-events: none;
    animation: carga-entra 1.1s cubic-bezier(.2, .7, .3, 1) forwards;
}
.carga-barra.yendo { animation: carga-va 9s cubic-bezier(.08, .7, .2, 1) forwards; }
@keyframes carga-entra {
    0%   { width: 0;    opacity: 1; }
    55%  { width: 82%;  opacity: 1; }
    80%  { width: 100%; opacity: 1; }
    100% { width: 100%; opacity: 0; }
}
@keyframes carga-va {
    0%   { width: 0;   opacity: 1; }
    100% { width: 92%; opacity: 1; }
}
@keyframes aparece {
    from { opacity: 0; transform: translateY(10px); }
    to   { opacity: 1; transform: none; }
}
.aparece > *:not(.contenido) { animation: aparece .42s cubic-bezier(.2, .7, .3, 1) backwards; }
.aparece > *:not(.contenido):nth-child(2) { animation-delay: .06s; }
.aparece > *:not(.contenido):nth-child(3) { animation-delay: .12s; }
.aparece > *:not(.contenido):nth-child(n+4) { animation-delay: .16s; }
.contenido > * { animation: aparece .42s cubic-bezier(.2, .7, .3, 1) backwards; }
.contenido > *:nth-child(2) { animation-delay: .05s; }
.contenido > *:nth-child(3) { animation-delay: .1s; }
.contenido > *:nth-child(4) { animation-delay: .14s; }
.contenido > *:nth-child(n+5) { animation-delay: .18s; }
@media (prefers-reduced-motion: reduce) {
    .carga-barra { display: none; }
    .aparece > *, .contenido > * { animation: none; }
}
.pr-tabla .der { white-space: nowrap; }

/* ===========================================================================
   TANDA 16
   =========================================================================== */

/* ---- "Hola, ..." en la cabecera ------------------------------------------
   Como en las tiendas grandes: una linea chica de saludo y el nombre
   debajo. En el celular el texto no entra y queda el munequito. */
.barra .quien .txt .hola { display: block; font-size: 11.5px; color: var(--texto-suave); font-weight: 500; }
.barra .quien .i-persona { display: none; flex: none; color: var(--texto-2); }
.barra .quien .quien-cab b { font-weight: 700; color: var(--texto); }
.barra .quien .panel a.quien-datos { display: flex; align-items: center; gap: 9px; font-weight: 700; color: var(--texto); }
.barra .quien .panel a.quien-datos svg { color: var(--rojo); flex: none; }
@media (max-width: 780px) {
    .barra .quien .i-persona { display: block; }
    .barra .quien > summary { padding: 8px; }
    /* El muñequito va a la derecha, junto al color y el carrito; si hay
       saldo, el saldo empuja el grupo y el muñequito queda pegado a el. */
    .barra .quien { order: 1; margin-left: auto; }
    .saldo-barra ~ .quien { margin-left: 0; }
}

/* ---- La barra de anuncios -------------------------------------------------
   Los colores son fijos en los dos temas: es una franja de aviso y tiene
   que leerse igual de dia y de noche. El rojo es un poco mas oscuro que el
   de los botones para que el texto blanco se lea bien. */
.anuncio { font-size: 13.5px; line-height: 1.4; }
.anuncio-rojo  { background: #C42020; color: #FFFFFF; }
.anuncio-ambar { background: #FBBF24; color: #1C1917; }
.anuncio-tinta { background: #18181B; color: #FAFAFA; border-bottom: 1px solid #27272A; }
.anuncio-in { display: flex; align-items: center; gap: 10px; min-height: 38px; padding-top: 6px; padding-bottom: 6px; }
.anuncio p { margin: 0; flex: 1; text-align: center; min-width: 0; }
.anuncio p a { color: inherit; font-weight: 800; text-decoration: underline; text-underline-offset: 3px;
               margin-left: 8px; white-space: nowrap; }
.anuncio-x { flex: none; display: flex; align-items: center; justify-content: center; width: 30px; height: 30px;
             border: 0; border-radius: 7px; background: none; color: inherit; opacity: .8; cursor: pointer; }
.anuncio-x:hover { opacity: 1; background: rgba(255,255,255,.16); }
.anuncio-ambar .anuncio-x:hover { background: rgba(0,0,0,.08); }
.anuncio.cerrando { animation: anuncio-sale .22s ease forwards; }
@keyframes anuncio-sale { to { opacity: 0; transform: translateY(-8px); } }
@media (max-width: 560px) {
    .anuncio { font-size: 12.5px; }
    .anuncio p { text-align: left; }
}

/* ---- El menu de tres lineas (celular) -------------------------------------
   En la computadora el boton no existe y los destinos van en fila. Hasta
   780 px, si hay JavaScript (.con-hamb), los destinos se pliegan debajo del
   boton; al lado queda la seccion actual y el saludo a la derecha. */
.menu-b .hamb, .menu-b .solo-hamb { display: none; }
@media (max-width: 780px) {
    .menu-b.con-hamb .wrap { flex-wrap: wrap; overflow: visible; min-height: 50px; gap: 0; }
    .menu-b.con-hamb .hamb {
        order: -2; display: flex; align-items: center; gap: 11px; flex: 0 1 auto; min-width: 0;
        min-height: 50px; padding: 0 12px 0 0; border: 0; background: none; cursor: pointer;
        color: #fff; font: inherit; font-size: 14px; font-weight: 700;
    }
    .menu-b.con-hamb .nav-der { order: -1; padding-left: 10px; }
    .menu-b.con-hamb .wrap > a { display: none; }
    .menu-b.con-hamb.abierto .wrap { padding-bottom: 10px; }
    .menu-b.con-hamb.abierto .wrap > a {
        display: flex; flex: 1 0 100%; min-height: 48px; padding: 0 14px; border-radius: 9px;
        font-size: 15px; animation: hamb-entra .2s ease backwards;
    }
    .menu-b.con-hamb.abierto .wrap > a:nth-of-type(2) { animation-delay: .02s; }
    .menu-b.con-hamb.abierto .wrap > a:nth-of-type(3) { animation-delay: .04s; }
    .menu-b.con-hamb.abierto .wrap > a:nth-of-type(4) { animation-delay: .06s; }
    .menu-b.con-hamb.abierto .wrap > a:nth-of-type(5) { animation-delay: .08s; }
    .menu-b.con-hamb.abierto .wrap > a:nth-of-type(6) { animation-delay: .10s; }
    .menu-b.con-hamb.abierto .wrap > a:nth-of-type(7) { animation-delay: .12s; }
    .menu-b.con-hamb.abierto .wrap > a.solo-hamb { margin-top: 6px; border-top: 1px solid var(--nav-borde);
                                                   border-radius: 0 0 9px 9px; }
    .menu-b.con-hamb .nav-quien { max-width: 46vw; }
}
.hamb-ico { position: relative; width: 22px; height: 16px; flex: none; }
.hamb-ico i { position: absolute; left: 0; width: 100%; height: 2px; border-radius: 2px; background: currentColor;
              transition: transform .22s ease, opacity .15s ease, top .22s ease; }
.hamb-ico i:nth-child(1) { top: 0; }
.hamb-ico i:nth-child(2) { top: 7px; }
.hamb-ico i:nth-child(3) { top: 14px; }
.menu-b.abierto .hamb-ico i:nth-child(1) { top: 7px; transform: rotate(45deg); }
.menu-b.abierto .hamb-ico i:nth-child(2) { opacity: 0; }
.menu-b.abierto .hamb-ico i:nth-child(3) { top: 7px; transform: rotate(-45deg); }
.hamb-txt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.hamb-aca { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.menu-b .hamb:focus-visible { outline: 2px solid var(--rojo); outline-offset: -2px; border-radius: 6px; }
@keyframes hamb-entra { from { opacity: 0; transform: translateY(-6px); } }

/* ---- Mis datos y contrasena ----------------------------------------------- */
.md-cab { display: flex; align-items: center; gap: 18px; margin-bottom: 22px; }
.md-avatar {
    flex: none; width: 64px; height: 64px; border-radius: 50%; display: grid; place-items: center;
    background: var(--rojo-suave); color: var(--rojo); font-family: var(--tit); font-size: 24px; font-weight: 700;
    letter-spacing: .02em;
}
.md-quien { min-width: 0; }
.md-quien h1 { font-family: var(--tit); font-size: 26px; letter-spacing: -.02em; margin: 0 0 7px; line-height: 1.15;
               text-wrap: balance; }
.md-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.md-chip { font-size: 12.5px; color: var(--texto-suave); background: var(--superficie); border: 1px solid var(--borde);
           border-radius: 99px; padding: 4px 11px; }
.md-chip strong { color: var(--texto); font-weight: 700; margin-left: 3px; }
.md-ir-clave { display: inline-block; margin-top: 9px; font-size: 13px; font-weight: 700; color: var(--rojo); }
.md-ir-clave:hover { text-decoration: underline; }
.md-ultimo { margin: 8px 0 0; font-size: 12.5px; color: var(--texto-tenue); }

.md-grilla { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; align-items: start; }
.md-col { display: grid; gap: 18px; min-width: 0; }
.md-caja { background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-lg);
           padding: 20px 22px; box-shadow: var(--sombra); scroll-margin-top: 90px; }
.md-caja-cab { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap;
               margin-bottom: 8px; }
.md-caja-cab h2 { font-family: var(--tit); font-size: 18px; margin: 0; letter-spacing: -.01em; }
.md-nota { font-size: 12.5px; color: var(--texto-tenue); }
.md-lista { margin: 0; }
.md-fila { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 12px; padding: 11px 0;
           border-top: 1px solid var(--borde); }
.md-fila:first-child { border-top: 0; }
.md-fila dt { font-size: 13px; color: var(--texto-suave); }
.md-fila dd { margin: 0; font-size: 14px; font-weight: 600; color: var(--texto); overflow-wrap: anywhere; }
.md-vacio { font-weight: 400; color: var(--texto-tenue); font-style: italic; }

.md-rep { margin-top: 10px; border-top: 1px solid var(--borde); padding-top: 12px; }
.md-rep > summary { cursor: pointer; font-size: 13.5px; font-weight: 700; color: var(--rojo); list-style: none; }
.md-rep > summary::-webkit-details-marker { display: none; }
.md-rep > summary::after { content: " ›"; }
.md-rep[open] > summary::after { content: " ‹"; }
.md-ayuda { font-size: 13px; color: var(--texto-suave); margin: 10px 0 0; line-height: 1.5; }

.md-form { display: grid; gap: 13px; margin-top: 12px; }
.md-form label { display: grid; gap: 6px; font-size: 13px; font-weight: 700; color: var(--texto-2); }
.md-form input:not([type=checkbox]), .md-form select {
    width: 100%; padding: 10px 12px; font: inherit; font-size: 14px; font-weight: 400;
    border: 1px solid var(--borde-2); border-radius: var(--radio); background: var(--superficie); color: var(--texto);
}
.md-form input:focus, .md-form select:focus { outline: 2px solid var(--rojo); outline-offset: 1px; border-color: transparent; }
.md-pass { position: relative; display: block; }
.md-pass input { padding-right: 76px !important; }
.md-ver { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); border: 0; background: var(--superficie-2);
          color: var(--texto-2); font: inherit; font-size: 12px; font-weight: 700; padding: 5px 10px; border-radius: 7px; cursor: pointer; }
.md-ver:hover { color: var(--rojo); }
.md-reglas { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px 16px;
             font-size: 12.5px; color: var(--texto-suave); }
.md-reglas li { display: flex; align-items: center; gap: 7px; transition: color .15s; }
.md-reglas li::before { content: ""; width: 12px; height: 12px; border-radius: 50%; border: 1.6px solid var(--borde-2);
                        flex: none; transition: background .15s, border-color .15s; }
.md-reglas li.ok { color: var(--verde); }
.md-reglas li.ok::before { background: var(--verde); border-color: var(--verde); box-shadow: inset 0 0 0 2.5px var(--superficie); }
.md-acciones { display: flex; justify-content: flex-end; }
.md-alerta { display: flex; gap: 10px; align-items: flex-start; font-size: 13.5px; line-height: 1.45;
             background: var(--ambar-tinte); border: 1px solid var(--ambar-borde); color: var(--texto-2);
             border-radius: var(--radio); padding: 11px 13px; margin: 8px 0 4px; }
.md-alerta svg { color: var(--ambar); flex: none; margin-top: 1px; }
.md-clave .cinta { margin: 10px 0 0; }
.md-pie { font-size: 12.5px; color: var(--texto-suave); margin: 10px 0 0; }
.md-pie a { color: var(--rojo); font-weight: 700; }
.md-vend { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 6px; }
.md-atajos { display: grid; margin-top: 12px; border-top: 1px solid var(--borde); }
.md-atajos a { display: flex; justify-content: space-between; padding: 11px 2px; font-size: 14px; font-weight: 600;
               color: var(--texto-2); border-bottom: 1px solid var(--borde); }
.md-atajos a:last-child { border-bottom: 0; }
.md-atajos a:hover { color: var(--rojo); }
@media (max-width: 900px) { .md-grilla { grid-template-columns: 1fr; } }
@media (max-width: 560px) {
    .md-cab { gap: 14px; }
    .md-avatar { width: 52px; height: 52px; font-size: 20px; }
    .md-quien h1 { font-size: 21px; }
    .md-caja { padding: 16px; }
    .md-fila { grid-template-columns: 1fr; gap: 2px; padding: 9px 0; }
    .md-acciones .boton, .md-acciones .boton-secundario { width: 100%; }
}

/* ---- Panel: icono de la pestana y barra de anuncios ---------------------- */
.fav-fila { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr); gap: 18px; align-items: start; }
.fav-pestanas { display: flex; flex-wrap: wrap; gap: 10px; }
.fav-pestana { display: flex; align-items: center; gap: 8px; min-width: 190px; padding: 9px 14px;
               border-radius: 9px 9px 0 0; font-size: 12.5px; border: 1px solid; border-bottom-width: 3px; }
.fav-pestana.claro  { background: #FFFFFF; color: #202124; border-color: #DADCE0; border-bottom-color: #FFFFFF; }
.fav-pestana.oscuro { background: #35363A; color: #E8EAED; border-color: #202124; border-bottom-color: #35363A; }
.fav-pestana img { width: 16px; height: 16px; object-fit: contain; flex: none; }
.fav-sin { width: 14px; height: 14px; border-radius: 50%; border: 1.5px solid currentColor; opacity: .5; flex: none; }
.an-prev { border-radius: var(--radio); overflow: hidden; }
.an-prev .anuncio-in { padding-left: 14px; padding-right: 8px; }
.an-tonos { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 4px; }
.adm-form .an-tonos label.an-tono { position: relative; display: block; }
.adm-form .an-tonos .an-tono input[type=radio] { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; padding: 0; }
.an-tono span { display: inline-flex; align-items: center; gap: 7px; padding: 7px 13px; border-radius: 99px;
                border: 1px solid var(--borde); font-size: 13px; font-weight: 600; cursor: pointer; background: var(--superficie); }
.an-tono span::before { content: ""; width: 12px; height: 12px; border-radius: 50%; }
.an-tono-rojo span::before { background: #C42020; }
.an-tono-ambar span::before { background: #FBBF24; }
.an-tono-tinta span::before { background: #18181B; box-shadow: 0 0 0 1px var(--borde-2); }
.an-tono input:checked + span { border-color: var(--rojo); color: var(--texto); box-shadow: 0 0 0 1px var(--rojo); }
.an-tono input:focus-visible + span { outline: 2px solid var(--rojo); outline-offset: 2px; }
@media (max-width: 720px) { .fav-fila { grid-template-columns: 1fr; } }

/* ---- Interno > Clientes ---------------------------------------------------- */
.cli-cuenta { display: inline-block; min-width: 19px; padding: 1px 6px; margin-left: 6px; border-radius: 99px;
              background: var(--rojo); color: #fff; font-size: 11px; font-weight: 800; text-align: center;
              font-variant-numeric: tabular-nums; }
.cli-cab { display: flex; gap: 16px; align-items: flex-start; justify-content: space-between; flex-wrap: wrap;
           margin-bottom: 14px; }
.cli-cab .adm-ayuda { margin: 0; flex: 1 1 380px; }
.cli-avisos { display: grid; gap: 12px; }
.cli-aviso { border: 1px solid var(--borde); border-radius: var(--radio); padding: 14px 16px; background: var(--superficie); }
.cli-aviso.cli-resuelto { background: var(--superficie-2); }
.cli-aviso.cli-resuelto .cli-cambio { opacity: .7; }
.cli-aviso-cab { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; align-items: baseline; }
.cli-aviso-cab strong { font-size: 14.5px; margin-right: 8px; }
.cli-aviso-cab .mono { font-size: 12.5px; color: var(--texto-suave); }
.cli-fecha { font-size: 12px; color: var(--texto-tenue); font-variant-numeric: tabular-nums; }
.cli-cambio { margin: 10px 0 12px; }
.cli-campo { display: inline-block; font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
             color: var(--texto-suave); margin-bottom: 7px; }
.cli-valores { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.cli-valores .e { display: block; font-size: 11px; color: var(--texto-tenue); text-transform: uppercase; letter-spacing: .05em; }
.cli-valores .v { display: block; font-size: 14px; color: var(--texto-2); overflow-wrap: anywhere; }
.cli-valores strong.v { color: var(--verde); }
.cli-coment { margin: 8px 0 0; font-size: 13px; color: var(--texto-suave); font-style: italic; }
.cli-aviso-pie { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cli-aviso-pie form { margin: 0; }
.cli-ok { color: var(--verde); border-color: var(--verde-borde); font-weight: 700; }
.cli-ok:hover { color: #fff; background: var(--verde); border-color: var(--verde); }
.cli-por { font-size: 12.5px; color: var(--texto-suave); }

.cli-buscar { display: flex; gap: 10px; margin-bottom: 14px; }
.cli-buscar input { flex: 1; min-width: 0; padding: 10px 14px; font: inherit; font-size: 14px;
                    border: 1px solid var(--borde-2); border-radius: var(--radio); background: var(--superficie); color: var(--texto); }
.cli-buscar input:focus { outline: 2px solid var(--rojo); outline-offset: 1px; border-color: transparent; }
.cli-lista { display: grid; gap: 10px; }
.cli-fila { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1.5fr) minmax(0, 1fr) auto; gap: 10px 16px;
            align-items: center; border: 1px solid var(--borde); border-radius: var(--radio); padding: 13px 15px; }
.cli-fila.cli-susp { border-left: 3px solid var(--rojo); }
.cli-quien strong { display: block; font-size: 14px; }
.cli-quien > span { font-size: 12.5px; color: var(--texto-suave); }
.cli-estado { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.cli-chip-susp { background: var(--rojo-suave); color: var(--rojo); border-color: var(--rojo); }
.cli-motivo { flex: 1 0 100%; font-size: 12.5px; color: var(--texto-suave); }
.cli-ultimo { font-size: 13px; }
.cli-ultimo .e { display: block; font-size: 11px; color: var(--texto-tenue); text-transform: uppercase; letter-spacing: .05em; }
.cli-intentos { display: block; font-size: 12px; color: var(--ambar); }
.cli-acc { justify-self: end; }
.cli-acc[open] { grid-column: 1 / -1; justify-self: stretch; }
.cli-acc .int-editar-caja { display: flex; flex-direction: column; gap: 10px; align-items: flex-start; }
.cli-acc .int-editar-caja form { margin: 0; }
.cli-susp-form { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; width: 100%; }
.cli-susp-form label { display: grid; gap: 4px; font-size: 12.5px; flex: 1 1 240px; }
.cli-susp-form input { padding: 7px 10px; font: inherit; font-size: 13px; border: 1px solid var(--borde-2);
                       border-radius: 7px; background: var(--superficie); color: var(--texto); }
.cli-busq .der { text-align: right; }
.cli-texto { font-weight: 700; }
.cli-revisada td { opacity: .6; }
@media (max-width: 820px) {
    .cli-fila { grid-template-columns: 1fr; }
    .cli-acc { justify-self: start; }
    .cli-valores { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
    .anuncio.cerrando, .menu-b.con-hamb.abierto .wrap > a { animation: none; }
    .hamb-ico i { transition: none; }
}

/* Pedido rapido: al elegir un parecido, el renglon de la lista se corrige. */
.pr-op-hecho { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: var(--verde); }
.pr-op-hecho::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--verde); }
.pr-op-hecho.pr-hecho-ya { animation: pr-hecho .5s ease; }
@keyframes pr-hecho { from { opacity: 0; transform: translateX(-4px); } }
@media (prefers-reduced-motion: reduce) { .pr-op-hecho.pr-hecho-ya { animation: none; } }

/* Ingreso interno: "Recordar esta PC" */
.int-recordar { display: flex; gap: 9px; align-items: flex-start; margin: 4px 0 14px; font-size: 13.5px; cursor: pointer; }
.int-recordar input { margin-top: 3px; accent-color: var(--rojo); }
.int-recordar small { display: block; font-size: 12px; color: var(--texto-suave); margin-top: 2px; }
.int-pcs { gap: 10px; justify-content: flex-start; }
.int-pcs form { margin: 0; }
.cli-valores { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.cli-ficha small { display: block; font-size: 11.5px; color: var(--ambar); margin-top: 2px; }
.cli-ficha-ok .v { color: var(--verde); font-weight: 700; }
.cli-ficha-ok .v::after { content: "  ✓"; }
@media (max-width: 820px) { .cli-valores { grid-template-columns: 1fr; } }

/* ---- El boton de WhatsApp ---------------------------------------------------
   El verde es el de WhatsApp y es fijo en los dos temas: es una marca que la
   gente reconoce, no un color de la pagina. Las notificaciones suben para no
   taparlo. */
.wa { position: fixed; right: 20px; bottom: 20px; z-index: 55; display: flex; flex-direction: column;
      align-items: flex-end; gap: 12px; }
.wa-boton { width: 58px; height: 58px; border-radius: 50%; display: grid; place-items: center;
            background: #25D366; color: #fff; box-shadow: 0 6px 18px rgba(0,0,0,.22), 0 2px 4px rgba(0,0,0,.12);
            transition: transform .18s ease, box-shadow .18s ease; }
.wa-boton:hover { transform: scale(1.06); box-shadow: 0 10px 24px rgba(0,0,0,.26); color: #fff; }
.wa-boton:focus-visible { outline: 3px solid #128C7E; outline-offset: 3px; }
.wa.abierto .wa-boton { transform: scale(.92); }
.wa-caja { width: min(340px, calc(100vw - 32px)); border-radius: 16px; overflow: hidden;
           background: var(--superficie); border: 1px solid var(--borde); box-shadow: var(--sombra-a);
           transform-origin: bottom right; animation: wa-entra .2s ease; }
@keyframes wa-entra { from { opacity: 0; transform: translateY(8px) scale(.97); } }
.wa-cab { display: flex; align-items: center; gap: 11px; padding: 13px 12px 13px 14px; background: #075E54; color: #fff; }
.wa-cab strong { display: block; font-size: 15px; }
.wa-cab small { display: block; font-size: 12px; opacity: .85; }
.wa-cab > div { flex: 1; min-width: 0; }
.wa-avatar { width: 38px; height: 38px; border-radius: 50%; display: grid; place-items: center;
             background: #25D366; flex: none; }
.wa-x { border: 0; background: none; color: #fff; opacity: .8; width: 32px; height: 32px; border-radius: 8px;
        display: grid; place-items: center; cursor: pointer; }
.wa-x:hover { opacity: 1; background: rgba(255,255,255,.14); }
.wa-cuerpo { padding: 16px 14px; background: #ECE5DD; }
:root[data-theme="dark"] .wa-cuerpo { background: #0B141A; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .wa-cuerpo { background: #0B141A; } }
.wa-globo { margin: 0; max-width: 88%; padding: 9px 12px; border-radius: 0 10px 10px 10px; font-size: 14px;
            line-height: 1.45; background: #FFFFFF; color: #111B21; box-shadow: 0 1px 1px rgba(0,0,0,.08); }
.wa-form { display: flex; gap: 8px; align-items: flex-end; padding: 10px; border-top: 1px solid var(--borde); }
.wa-form textarea { flex: 1; min-width: 0; resize: none; padding: 9px 12px; border-radius: 18px; font: inherit; font-size: 14px;
                    border: 1px solid var(--borde-2); background: var(--superficie); color: var(--texto); max-height: 120px; }
.wa-form textarea:focus { outline: 2px solid #25D366; outline-offset: 0; border-color: transparent; }
.wa-enviar { flex: none; width: 40px; height: 40px; border-radius: 50%; border: 0; cursor: pointer;
             display: grid; place-items: center; background: #25D366; color: #fff; }
.wa-enviar:hover { background: #1EBE5A; }
/* Las notificaciones suben para no taparse con el boton. */
body:has(.wa) .avisos-pila { bottom: 92px; }
@media (max-width: 560px) {
    .wa { right: 14px; bottom: 14px; }
    .wa-boton { width: 54px; height: 54px; }
    body:has(.wa) .avisos-pila { bottom: 80px; right: 12px; left: 12px; }
}
@media print { .wa { display: none; } }
@media (prefers-reduced-motion: reduce) { .wa-caja { animation: none; } .wa-boton { transition: none; } }
:root[data-theme="dark"] .wa-globo { background: #202C33; color: #E9EDEF; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .wa-globo { background: #202C33; color: #E9EDEF; } }

/* Mis datos: clave inicial obligatoria de cambiar */
.md-obligado { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; margin-bottom: 22px;
               padding: 16px 18px; border-radius: var(--r-lg); background: var(--ambar-tinte);
               border: 1px solid var(--ambar-borde); color: var(--texto-2); font-size: 14px; line-height: 1.5; }
.md-obligado > svg { color: var(--ambar); flex: none; }
.md-obligado > div { flex: 1 1 320px; }
.md-obligado strong { display: block; color: var(--texto); font-size: 15.5px; }

/* Tablero interno: descarga en Excel */
.tab-cab { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; flex-wrap: wrap; }
.tab-excel { white-space: nowrap; }

/* Pedido rapido: vista previa mientras se escribe */
.pr-form { max-width: 1200px; }
.pr-con-vista { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: 18px; align-items: start; }
.pr-con-vista:not(:has(.pr-vista:not([hidden]))) { grid-template-columns: 1fr; }
.pr-vista { border-left: 1px solid var(--borde); padding-left: 18px; min-width: 0; }
.pr-vista-cab { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.pr-vista-cab strong { font-size: 11px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--texto-suave); }
.pr-vista-res { font-size: 12.5px; color: var(--texto-suave); }
.pr-vista-res b { color: var(--texto); }
.pr-vista-vacia { font-size: 13px; color: var(--texto-tenue); margin: 6px 0; }
.pr-vista-lista { list-style: none; margin: 0; padding: 0; max-height: 420px; overflow-y: auto; display: grid; gap: 6px; }
.pr-vista-lista li { display: grid; grid-template-columns: 26px minmax(0, 1fr) auto; gap: 8px; align-items: start;
                     padding: 7px 9px; border-radius: 8px; background: var(--superficie-2); font-size: 13px; }
.pr-vista-lista .n { font-size: 11px; color: var(--texto-tenue); font-variant-numeric: tabular-nums; padding-top: 2px; }
.pr-vista-lista .d { min-width: 0; overflow-wrap: anywhere; }
.pr-vista-lista .d small { display: block; font-size: 11.5px; color: var(--texto-suave); }
.pr-vista-lista .q { font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pr-vista-lista li.ok { box-shadow: inset 3px 0 0 var(--verde); }
.pr-vista-lista li.mal { box-shadow: inset 3px 0 0 var(--rojo); }
.pr-vista-lista li.mal .d small { color: var(--rojo); }
.pr-vista-lista li.elegir { box-shadow: inset 3px 0 0 var(--ambar); background: var(--ambar-tinte); }
.pr-vista-lista li.buscando { opacity: .6; }
.pr-vista-ops { display: grid; gap: 4px; margin-top: 6px; }
.pr-vista-ops label { display: flex; gap: 7px; align-items: flex-start; font-size: 12.5px; cursor: pointer; padding: 5px 7px;
                      border-radius: 6px; background: var(--superficie); border: 1px solid var(--borde); }
.pr-vista-ops label:hover { border-color: var(--rojo); }
.pr-vista-ops input { margin-top: 2px; accent-color: var(--rojo); }
.pr-vista-ops .sin { color: var(--texto-tenue); font-size: 11.5px; }
@media (max-width: 900px) {
    .pr-con-vista { grid-template-columns: 1fr; }
    .pr-vista { border-left: 0; padding-left: 0; border-top: 1px solid var(--borde); padding-top: 14px; }
    .pr-vista-lista { max-height: 360px; }
}

/* Ficha: los sugeridos ("Los que compran esto tambien llevan").
   Carril sin barra de desplazamiento; se mueve con las flechas (de a una
   pagina) o deslizando. Las fotos son cuadradas y se ven enteras. */
.sug { margin-top: 34px; border-top: 1px solid var(--borde); padding-top: 22px; }
.sug-cab { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 12px; margin-bottom: 14px; }
.sug-por { font-size: 12.5px; color: var(--texto-suave); }
.sug-cab h2 { font-family: var(--tit); font-size: 19px; margin: 0; text-wrap: balance; }
.sug-marco { position: relative; }
.sug-flechas { display: contents; }
.sug-flechas[hidden] { display: none; }
/* Flotan a la altura de la foto, montadas sobre el borde del primer y del
   ultimo articulo visibles. La de una punta ya alcanzada desaparece. */
.sug-flecha { position: absolute; z-index: 2; top: 32%; transform: translateY(-50%);
              width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--borde-2);
              background: var(--superficie); color: var(--texto); box-shadow: var(--sombra-a);
              display: grid; place-items: center; cursor: pointer; padding: 0;
              transition: opacity .15s, border-color .15s; }
.sug-flecha[data-sug-mover="-1"] { left: -14px; }
.sug-flecha[data-sug-mover="1"]  { right: -14px; }
.sug-flecha:hover:not(:disabled) { border-color: var(--texto); }
.sug-flecha:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
.sug-flecha:disabled { opacity: 0; pointer-events: none; }
@media (max-width: 520px) {
    .sug-flecha { width: 34px; height: 34px; }
    .sug-flecha[data-sug-mover="-1"] { left: -6px; }
    .sug-flecha[data-sug-mover="1"]  { right: -6px; }
}
@media (prefers-reduced-motion: reduce) { .sug-flecha { transition: none; } }
/* Cuantas tarjetas entran a la vista (--n). El ancho sale exacto, asi las
   flechas mueven paginas enteras y nunca queda una tarjeta cortada al
   costado. En el celular asoma la siguiente, para que se note que sigue. */
.sug-carril { --n: 6; list-style: none; margin: 0; padding: 0; display: grid; grid-auto-flow: column;
              grid-auto-columns: calc((100% - (var(--n) - 1) * 12px) / var(--n)); gap: 12px; overflow-x: auto; overscroll-behavior-x: contain;
              scroll-snap-type: x mandatory; scrollbar-width: none; -ms-overflow-style: none; }
.sug-carril::-webkit-scrollbar { display: none; }
.sug-mini { scroll-snap-align: start; display: flex; flex-direction: column; gap: 6px; min-width: 0;
            background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--r-lg); padding: 10px; }
.sug-mini:hover { border-color: var(--borde-2); }
.sug-foto { position: relative; display: block; aspect-ratio: 1 / 1; border-radius: 10px; background: var(--foto);
            border: 1px solid var(--borde); overflow: hidden; }
.sug-foto img { position: absolute; inset: 6px; width: calc(100% - 12px); height: calc(100% - 12px);
                max-width: none; object-fit: contain; display: block; }
.sug-sinfoto { position: absolute; inset: 0; display: grid; place-items: center; color: var(--texto-tenue); }
.sug-cod { font-size: 11px; color: var(--texto-suave); }
.sug-desc { font-size: 13px; font-weight: 600; line-height: 1.3; color: var(--texto); text-decoration: none;
            display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 2.6em; }
.sug-desc:hover { color: var(--rojo); }
.sug-pie { margin-top: auto; display: flex; align-items: flex-end; gap: 8px; }
.sug-pie form { margin-left: auto; flex: none; }
.sug-precios { display: grid; grid-template-rows: auto 30px; gap: 4px; min-width: 0; }
.sug-precios .e { display: block; font-size: 10px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase;
                  color: var(--texto-tenue); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sug-precios .v { display: block; font-family: var(--tit); font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.sug-p-lista .v { font-size: 15px; color: var(--texto); }
.sug-p-contado .e { color: var(--verde); }
.sug-p-contado .v { font-size: 14px; color: var(--verde); }
.sug-stock { font-size: 11.5px; font-weight: 700; color: var(--verde); }
.sug-mas { width: 34px; height: 34px; border-radius: 9px; border: 0; background: var(--rojo); color: #fff;
           font-size: 20px; line-height: 1; cursor: pointer; }
.sug-mas:hover { background: var(--rojo-h); }
.sug-mas:focus-visible { outline: 2px solid var(--texto); outline-offset: 2px; }
.sug-mas:disabled { opacity: .55; cursor: default; }
@media (max-width: 1150px) { .sug-carril { --n: 5; } }
@media (max-width: 900px)  { .sug-carril { --n: 4; } }
@media (max-width: 700px)  { .sug-carril { --n: 3; } }
@media (max-width: 520px)  { .sug-carril { --n: 2.2; } }
@media (prefers-reduced-motion: reduce) { .sug-carril { scroll-behavior: auto; } }
.pr-vista-ops label { text-transform: none; letter-spacing: 0; font-weight: 500; color: var(--texto); margin: 0; }

/* Ficha: compatibilidades (motos). Una tabla que muestra 3 renglones y se
   extiende ahi mismo con "Ver las N motos". */
.compat { margin-top: 34px; border-top: 1px solid var(--borde); padding-top: 22px; }
.compat-wrap { overflow-x: auto; border: 1px solid var(--borde); border-radius: var(--radio); background: var(--superficie); }
.compat-tabla { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.compat-tabla th { text-align: left; font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
                   color: var(--texto-suave); padding: 8px 14px; background: var(--superficie-2); white-space: nowrap; }
.compat-tabla td { padding: 7px 14px; border-top: 1px solid var(--borde); }
.compat-tabla td:first-child { font-weight: 700; white-space: nowrap; }
.compat-tabla td.num { white-space: nowrap; font-variant-numeric: tabular-nums; color: var(--texto-2); }
.compat-tabla a { color: var(--texto); text-decoration: none; }
.compat-tabla a:hover { color: var(--rojo); text-decoration: underline; }
.compat.corta .compat-tabla tbody tr:nth-child(n+4) { display: none; }
.compat-mas { margin-top: 10px; border: 0; background: none; padding: 4px 0; cursor: pointer;
              color: var(--rojo); font: inherit; font-size: 13.5px; font-weight: 700; display: inline-flex; gap: 6px; align-items: center; }
.compat-mas::after { content: ""; width: 7px; height: 7px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
                     transform: rotate(45deg) translateY(-2px); transition: transform .15s; }
.compat-mas[aria-expanded="true"]::after { transform: rotate(-135deg) translateY(-1px); }
.compat-mas:hover { text-decoration: underline; }
.compat-mas:focus-visible { outline: 2px solid var(--rojo); outline-offset: 2px; }
.compat-mas[hidden] { display: none; }
.compat-nota { font-size: 12.5px; color: var(--texto-suave); margin: 10px 0 0; }
@media (prefers-reduced-motion: reduce) { .compat-mas::after { transition: none; } }

/* Catalogo: Tu moto */
.mimoto { display: grid; gap: 6px; margin: 14px 0; padding: 14px; border: 1px solid var(--borde); border-radius: var(--r-lg); background: var(--superficie); }
.mimoto h4 { margin: 0; font-family: var(--tit); font-size: 15px; }
.mimoto .exp { margin: 0 0 4px; font-size: 12.5px; color: var(--texto-suave); }
.mimoto .rot { font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--texto-suave); margin-top: 4px; }
.mimoto .sel { position: relative; display: block; }
.mimoto select { width: 100%; appearance: none; -webkit-appearance: none; padding: 8px 30px 8px 10px; border: 1px solid var(--borde-2);
                 border-radius: var(--radio); background: var(--superficie); color: var(--texto); font: inherit; font-size: 13.5px; }
.mimoto .sel .chev { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); pointer-events: none; color: var(--texto-suave); }
.mimoto-quitar { font-size: 12.5px; font-weight: 700; color: var(--rojo); text-decoration: none; justify-self: start; margin-top: 2px; }
.mimoto-quitar:hover { text-decoration: underline; }
.mimoto-nota { margin: 4px 0 0; font-size: 11.5px; color: var(--texto-tenue); }

/* Catalogo: la segunda foto (CODIGO_2). Va encima de la primera, invisible,
   y aparece SOLO con el mouse sobre la foto (no sobre el resto de la
   tarjeta). En pantallas tactiles no hay "pasar el mouse": queda la
   primera. */
.f-foto .marco { position: relative; }
.f-foto .marco img.foto2 { position: absolute; inset: 12px; width: calc(100% - 24px); height: calc(100% - 24px);
                           object-fit: contain; opacity: 0; transition: opacity .25s ease, transform .3s ease; background: var(--foto); }
@media (hover: hover) {
    .f-foto .marco:hover img.foto2 { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) { .f-foto .marco img.foto2 { transition: none; } }

/* Segunda foto (CODIGO_2) en el renglon del panel de fotos */
.fot-segunda { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 6px; padding-top: 6px; border-top: 1px dashed var(--borde, #ddd); white-space: normal; }
.fot-segunda img, .fot-segunda .fot-hueco2 { width: 34px; height: 34px; object-fit: contain; border: 1px solid var(--borde, #ddd); border-radius: 4px; background: var(--foto, #fff); flex: none; }
.fot-segunda .fot-hueco2 { background: repeating-linear-gradient(45deg, transparent 0 4px, rgba(0,0,0,.06) 4px 8px); }
