/* ═══════════════════════════════════════════════════════════════════════════
   EL DIRECTORIO DE AGRICULTORES — la hoja común de las dos pantallas
   ═══════════════════════════════════════════════════════════════════════════

   Todo cuelga de `.sd`. Aquí vive lo que las DOS pantallas comparten --la
   tarjeta del vendedor y sus cuatro tallas, los sellos, las píldoras, el bloque
   de búsqueda, las cifras, las etiquetas de lo filtrado y la columna de
   criterios--; lo propio de cada una está en su propio componente.

   Los verdes están MUESTREADOS del PNG de la maqueta (botón #01753b, «Buscar»
   #01642c, pie #005c2d), no elegidos a ojo. Y los cuatro colores de medalla,
   muestreados de las piezas de `/assets/sellers/`: es el mismo dorado del sello
   el que rodea la tarjeta.

   CANDIDATO A LA HOJA COMÚN DEL ÁREA DE CLIENTE (ver CLAUDE.md): la tarjeta,
   las píldoras, la valoración y los botones se repiten ya en TOrderDetail y
   TReturnOrder con otros valores. Cuando esa hoja se extraiga, esto sube tal
   cual.
   ═══════════════════════════════════════════════════════════════════════════ */

.sd{
    --sd-verde:        #04713a;
    --sd-verde-vivo:   #01753b;
    --sd-verde-oscuro: #005c2d;
    --sd-verde-claro:  #eef6ee;
    --sd-verde-borde:  #cfe3d2;

    --sd-tinta:  #16211a;
    --sd-texto:  #46514a;
    --sd-suave:  #6b7a70;
    --sd-tenue:  #93a399;

    --sd-crema:  #f7faf6;
    --sd-borde:  #e4eae4;
    --sd-oro:    #e2a812;

    /* ── LOS COLORES DE LAS MEDALLAS ──────────────────────────────
       Muestreados de las piezas: el tono dominante de cada escarapela. Con
       ellos se rodea la tarjeta del vendedor que tiene ese nivel, para que la
       medalla y su borde sean lo mismo y no dos verdes distintos. */
    --sd-m-oro:      #d9a51e;
    --sd-m-plata:    #a8adb4;
    --sd-m-bronce:   #c1783a;
    --sd-m-diamante: #9aa0e8;

    --sd-radio:  14px;
    --sd-sombra: 0 2px 10px rgba(20,40,25,.06);

    color: var(--sd-texto);
    font-size: 14px;
    line-height: 1.45;
}

.sd *{ box-sizing: border-box; }
.sd img{ display:block; max-width:100%; }
.sd a{ color:inherit; text-decoration:none; }
.sd h1,.sd h2,.sd h3,.sd h4{ margin:0; color:var(--sd-tinta); }

/* EL TAMAÑO SE DECLARA EN EL ICONO, NO EN SU CAJA: `iconify-icon` no hereda el
   `font-size` del padre y sin esto todos saldrían al tamaño por defecto. */
.sd iconify-icon{ display:inline-block; vertical-align:-.125em; }

/* La hoja global del sitio pinta de negro el borde de cualquier enlace ya
   visitado (`a:visited`), y estas tarjetas SON enlaces: sin esto, volver a una
   búsqueda las enseña todas con marco negro. `getComputedStyle` no lo delata. */
.sd a:visited, .sd a:visited *{ border-color: inherit; color: inherit; }

/* El contenido recogido a la medida de la página; las franjas van a sangre. */
.sd-ancho{ max-width:1200px; margin:0 auto; padding:0 20px; }

/* ═══ BOTONES ══════════════════════════════════════════════════════ */
.sd .sd-btn{
    display:inline-flex; align-items:center; justify-content:center; gap:8px;
    height:40px; padding:0 18px; border:1px solid transparent; border-radius:9px;
    font-size:13.5px; font-weight:700; cursor:pointer; white-space:nowrap;
    font-family:inherit; transition:background .15s, border-color .15s, color .15s;
}
.sd .sd-btn-primary{ background:var(--sd-verde); color:#fff; }
.sd .sd-btn-primary:hover{ background:var(--sd-verde-oscuro); color:#fff; }
.sd .sd-btn-secondary{ background:#fff; color:var(--sd-tinta); border-color:var(--sd-borde); }
.sd .sd-btn-secondary:hover{ background:var(--sd-crema); color:var(--sd-tinta); }
.sd .sd-btn-blanco{ background:#fff; color:var(--sd-tinta); }
.sd .sd-btn-sm{ height:34px; padding:0 14px; font-size:12.5px; }
.sd .sd-btn-block{ width:100%; }

/* ═══ TÍTULOS DE SECCIÓN ═══════════════════════════════════════════ */
.sd-seccion{ padding:34px 0 0; }
.sd-tit{ display:flex; align-items:flex-end; gap:16px; margin-bottom:16px; }
.sd-tit-txt{ flex:1; min-width:0; }
.sd-tit h2{ font-size:17px; font-weight:800; letter-spacing:.3px; text-transform:uppercase;
            border-bottom:3px solid var(--sd-verde); display:inline-block; padding-bottom:6px; }
.sd-tit p{ margin:8px 0 0; font-size:12.5px; color:var(--sd-suave); }
.sd .sd-tit-mas{ flex:0 0 auto; font-size:12.5px; font-weight:700; color:var(--sd-verde);
                 display:inline-flex; align-items:center; gap:6px; }

/* ═══ EL BLOQUE DE BÚSQUEDA ════════════════════════════════════════ */
.sd-busca{ background:#fff; border:1px solid var(--sd-borde); border-radius:var(--sd-radio);
           box-shadow:0 14px 34px rgba(18,40,24,.13); padding:18px; }
.sd-busca-fila{ display:flex; gap:12px; }
.sd-busca-txt{ flex:1; display:flex; align-items:center; gap:10px; height:48px;
               border:1px solid var(--sd-borde); border-radius:10px; padding:0 14px; background:#fff; }
.sd-busca-txt iconify-icon{ font-size:18px; color:var(--sd-tenue); flex:0 0 auto; }
.sd-busca-txt input{ flex:1; min-width:0; border:0; outline:none; font-size:14px;
                     font-family:inherit; color:var(--sd-tinta); background:transparent; }
.sd .sd-btn-buscar{ height:48px; padding:0 30px; font-size:14px;
                    background:var(--sd-verde-oscuro); color:#fff; border-radius:10px; }

.sd-filtros{ display:grid; grid-template-columns:repeat(3,1fr); gap:14px; margin-top:14px; }
.sd-campo{ border:1px solid var(--sd-borde); border-radius:10px; padding:8px 12px 6px; background:#fff; }
.sd-campo label{ display:block; font-size:11px; color:var(--sd-suave); }
.sd-campo select{ width:100%; border:0; outline:none; background:transparent; font-size:13.5px;
                  font-weight:600; color:var(--sd-tinta); font-family:inherit; padding:2px 0; cursor:pointer; }

/* Los dos interruptores. APAGADOS DE SALIDA: encendidos esconden a la mayoría
   del censo y la primera pantalla del directorio parece vacía. */
.sd-switches{ display:grid; grid-template-columns:repeat(2,1fr); gap:14px; margin-top:14px; }
.sd-switch{ display:flex; align-items:center; gap:10px; border:1px solid var(--sd-borde);
            border-radius:10px; padding:10px 14px; cursor:pointer; background:#fff; }
.sd-switch > iconify-icon{ font-size:19px; color:var(--sd-verde); flex:0 0 auto; }
.sd-switch-txt{ flex:1; min-width:0; }
.sd-switch-txt b{ display:block; font-size:13px; color:var(--sd-tinta); font-weight:600; }
.sd-switch-txt small{ display:block; font-size:11px; color:var(--sd-suave); }
.sd-palanca{ flex:0 0 auto; width:44px; height:24px; border-radius:99px; background:#d8ded8;
             position:relative; transition:background .18s; }
.sd-palanca::after{ content:''; position:absolute; top:3px; left:3px; width:18px; height:18px;
                    border-radius:50%; background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.25); transition:left .18s; }
.sd-switch.on .sd-palanca{ background:var(--sd-verde); }
.sd-switch.on .sd-palanca::after{ left:23px; }

/* ═══ CIFRAS ═══════════════════════════════════════════════════════ */
.sd-cifras{ display:grid; grid-template-columns:repeat(4,1fr); background:var(--sd-crema);
            border:1px solid var(--sd-borde); border-radius:var(--sd-radio); margin-top:22px; }
.sd-cifra{ display:flex; align-items:center; gap:12px; padding:16px 20px; }
.sd-cifra + .sd-cifra{ border-left:1px solid var(--sd-borde); }
.sd-cifra > iconify-icon{ font-size:22px; color:var(--sd-verde); flex:0 0 auto; }
.sd-cifra div{ flex:1; min-width:0; }
.sd-cifra b{ display:block; font-size:19px; font-weight:800; color:var(--sd-tinta); line-height:1.15; }
.sd-cifra small{ display:block; font-size:11.5px; color:var(--sd-suave); }

/* ═══ PIEZAS DE UNA TARJETA ════════════════════════════════════════ */

/* EL SELLO VERIFICADO ES UNA IMAGEN, Y LA REGLA SE ESCRIBE CON `img`.
   `.sd img{display:block}` (0,1,1) le gana a `.sd-verificado` (0,1,0) y el sello
   se iba a su propia línea debajo del nombre -- el mismo mordisco que ya estaba
   documentado en `.sd-card-foto img.sd-card-sello`. Con la clase Y el elemento,
   esta manda. Bajado tres píxeles para que se siente en la base del nombre y no
   sobre su altura de mayúsculas. */
.sd img.sd-verificado{ display:inline-block; vertical-align:-3px; width:16px; height:16px;
                       margin-left:5px; object-fit:contain; }

/* Icono a la izquierda y TODO el texto en la segunda columna: la regla de
   alineación del proyecto. Nada de `margin-left` a ojo para compensar el icono. */
.sd-linea{ display:flex; align-items:flex-start; gap:6px; margin-top:5px; }
.sd-linea > iconify-icon{ font-size:13px; color:var(--sd-tenue); flex:0 0 auto; margin-top:2px; }
.sd-linea span{ flex:1; min-width:0; font-size:12px; color:var(--sd-suave); }

.sd-rating{ display:flex; align-items:center; gap:5px; margin-top:7px; font-size:12.5px; }
.sd-rating b{ color:var(--sd-tinta); font-weight:700; }
.sd-rating iconify-icon{ color:var(--sd-oro); font-size:13px; }
.sd-rating small{ color:var(--sd-suave); font-size:11.5px; }

.sd-hechos{ display:flex; gap:14px; margin-top:10px; margin-bottom:12px; padding-top:10px;
            border-top:1px solid var(--sd-borde); }
.sd-hecho{ display:flex; align-items:flex-start; gap:6px; flex:1; min-width:0; }
.sd-hecho > iconify-icon{ font-size:14px; color:var(--sd-verde); flex:0 0 auto; margin-top:1px; }
.sd-hecho div{ flex:1; min-width:0; }
.sd-hecho b{ display:block; font-size:12px; color:var(--sd-tinta); }
.sd-hecho small{ display:block; font-size:10.5px; color:var(--sd-suave); }

.sd-pills{ display:flex; flex-wrap:wrap; gap:6px; margin-top:10px; }
.sd-pill{ font-size:10.5px; font-weight:700; border-radius:99px; padding:3px 9px;
          background:var(--sd-verde-claro); color:var(--sd-verde-oscuro); border:1px solid var(--sd-verde-borde); }

.sd-nivel{ display:inline-flex; align-items:center; gap:4px; background:var(--sd-crema);
           border:1px solid var(--sd-borde); border-radius:99px; padding:2px 9px 2px 3px;
           font-size:10px; font-weight:700; color:var(--sd-tinta); white-space:nowrap; }
.sd-nivel img{ width:18px; height:18px; object-fit:contain; }

.sd-proteccion{ display:flex; align-items:center; gap:7px; margin-top:auto;
                background:var(--sd-verde-claro); border-top:1px solid var(--sd-verde-borde);
                padding:9px 14px; }
.sd-proteccion iconify-icon{ color:var(--sd-verde); font-size:14px; flex:0 0 auto; }
.sd-proteccion span{ font-size:11.5px; font-weight:700; color:var(--sd-verde-oscuro); }

/* El avatar: con foto o con su inicial. Un círculo con letra se lee como una
   identidad; un hueco gris, no. */
.sd-avatar{ flex:0 0 auto; width:44px; height:44px; border-radius:50%; overflow:hidden;
            background:var(--sd-verde-claro); color:var(--sd-verde-oscuro); font-weight:800;
            display:flex; align-items:center; justify-content:center; font-size:15px;
            border:1px solid var(--sd-verde-borde); }
.sd-avatar img{ width:100%; height:100%; object-fit:cover; }

/* La foto de portada cuando el vendedor no ha subido ninguna: su inicial sobre
   el verde de la casa. NUNCA una foto de archivo: sería enseñar una finca que
   no es la suya. */
.sd-portada-vacia{ position:absolute; inset:0; z-index:1; display:flex; align-items:center;
                   justify-content:center; gap:10px; color:#7ba57f;
                   background:linear-gradient(135deg, #e8f2e6 0%, #d7e9d6 100%); }
.sd-portada-vacia iconify-icon{ font-size:26px; }
/* Las iniciales, para que el hueco se lea como una identidad y no como una foto
   que no ha cargado. */
.sd-portada-vacia b{ font-size:22px; font-weight:800; letter-spacing:1px; color:#6f9c74; }

/* ═══ LA TARJETA ════════════════════════════════════════════════════
   Vive en `TSellerCard` (Storefront/templates), con sus tokens puestos en la
   propia tarjeta: así no pierde el borde fuera de `.sd`, en favoritos. */

/* ═══ CARRIL ═══════════════════════════════════════════════════════ */
.sd-carril{ position:relative; }
.sd-carril-pista{ display:grid; grid-auto-flow:column; grid-auto-columns:calc((100% - 4*14px)/5);
                  gap:14px; overflow-x:auto; scroll-behavior:smooth; padding:4px 2px 8px;
                  scrollbar-width:none; }
.sd-carril-pista::-webkit-scrollbar{ display:none; }
.sd-flecha{ position:absolute; top:50%; right:-16px; transform:translateY(-50%); z-index:3;
            width:34px; height:34px; border-radius:50%; background:#fff; border:1px solid var(--sd-borde);
            box-shadow:0 3px 10px rgba(20,40,25,.16); display:flex; align-items:center; justify-content:center;
            cursor:pointer; color:var(--sd-tinta); }

/* ═══ ETIQUETAS DE LO FILTRADO ═════════════════════════════════════
   Arriba del todo y quitables una a una. Un filtro puesto hace tres pantallas
   y olvidado es la causa número uno de «no hay resultados». */
.sd-chips{ display:flex; align-items:center; flex-wrap:wrap; gap:8px; margin-bottom:12px; }
.sd-chips-tit{ font-size:11.5px; font-weight:700; color:var(--sd-suave);
               text-transform:uppercase; letter-spacing:.4px; }
.sd-chip{ display:inline-flex; align-items:center; gap:6px; background:var(--sd-verde-claro);
          border:1px solid var(--sd-verde-borde); border-radius:99px; padding:4px 6px 4px 11px;
          font-size:11.5px; font-weight:600; color:var(--sd-verde-oscuro); }
.sd-chip button{ border:0; background:rgba(0,0,0,.06); color:inherit; cursor:pointer;
                 width:16px; height:16px; border-radius:50%; display:flex; align-items:center;
                 justify-content:center; font-size:10px; padding:0; }
.sd-chip button:hover{ background:var(--sd-verde); color:#fff; }
.sd-chips-limpiar{ font-size:11.5px; font-weight:700; color:var(--sd-verde); cursor:pointer;
                   display:inline-flex; align-items:center; gap:5px; background:none; border:0;
                   font-family:inherit; }

/* ═══ COLUMNA DE CRITERIOS ═════════════════════════════════════════ */
.sd-panel{ background:#fff; border:1px solid var(--sd-borde); border-radius:var(--sd-radio);
           box-shadow:var(--sd-sombra); overflow:hidden; }
.sd-panel-cab{ display:flex; align-items:center; gap:8px; padding:11px 14px;
               border-bottom:1px solid var(--sd-borde); }
.sd-panel-cab > iconify-icon{ color:var(--sd-verde); font-size:16px; flex:0 0 auto; }
.sd-panel-cab b{ flex:1; min-width:0; font-size:13px; color:var(--sd-tinta); }
.sd-panel-cab a{ font-size:11.5px; font-weight:700; color:var(--sd-verde); cursor:pointer; }

.sd-grupo{ border-bottom:1px solid var(--sd-borde); }
.sd-grupo:last-child{ border-bottom:0; }
/* 20 ARRIBA Y 12 ABAJO, Y NO LOS 11 IGUALES DE ANTES.
   Cada grupo lleva su línea de separación (`.sd-grupo`), así que el rótulo se
   leía pegado a la raya. Y no van iguales a propósito: un título pertenece a lo
   que tiene DEBAJO, así que se separa más de la línea de arriba --que es el
   final del grupo anterior-- que de sus propias opciones. Con los dos iguales,
   la columna se lee como una tabla de filas sueltas y no como una lista de
   secciones. El relleno lateral no se toca: lo comparte con el cuerpo. */
.sd-grupo-cab{ width:100%; display:flex; align-items:center; gap:8px; padding:20px 14px 12px;
               background:none; border:0; cursor:pointer; font-family:inherit; text-align:left; }
.sd-grupo-cab b{ flex:1; min-width:0; font-size:12.5px; font-weight:700; color:var(--sd-tinta); }
.sd-grupo-cab > iconify-icon:first-child{ font-size:15px; color:var(--sd-verde); flex:0 0 auto; }
.sd-grupo-flecha{ font-size:15px; color:var(--sd-tenue); transition:transform .15s; }
.sd-grupo.cerrado .sd-grupo-flecha{ transform:rotate(-90deg); }
/* Y el cuerpo cierra con 16: es lo que deja el aire de debajo del último
   control parecido al de encima del título siguiente, contando que ahí hay
   además una línea. */
.sd-grupo-cuerpo{ padding:0 14px 16px; }
.sd-grupo.cerrado .sd-grupo-cuerpo{ display:none; }

.sd-buscasub{ display:flex; align-items:center; gap:6px; border:1px solid var(--sd-borde);
              border-radius:8px; padding:5px 9px; margin-bottom:8px; }
.sd-buscasub iconify-icon{ font-size:14px; color:var(--sd-tenue); flex:0 0 auto; }
.sd-buscasub input{ flex:1; min-width:0; border:0; outline:none; font-family:inherit; font-size:12px; }

/* Una casilla, con SU RECUENTO: sin él no se sabe si un filtro deja dos
   resultados o doscientos, y se prueba a ciegas. */
.sd-check{ display:flex; align-items:center; gap:8px; padding:4px 0; cursor:pointer; }
.sd-check input{ position:absolute; opacity:0; width:0; height:0; }
.sd-marca{ flex:0 0 auto; width:16px; height:16px; border:1px solid #c8d2c8; border-radius:4px;
           background:#fff; display:flex; align-items:center; justify-content:center;
           color:#fff; font-size:11px; }
.sd-check input:checked + .sd-marca{ background:var(--sd-verde); border-color:var(--sd-verde); }
.sd-marca iconify-icon{ visibility:hidden; }
.sd-check input:checked + .sd-marca iconify-icon{ visibility:visible; }
.sd-check-txt{ flex:1; min-width:0; font-size:12px; color:var(--sd-texto);
               display:flex; align-items:center; gap:6px; }
.sd-check-txt img{ width:17px; height:17px; object-fit:contain; }
.sd-check i{ flex:0 0 auto; font-style:normal; font-size:10.5px; color:var(--sd-tenue); }
.sd-check input:checked ~ .sd-check-txt{ color:var(--sd-verde-oscuro); font-weight:600; }
.sd-vermas{ display:inline-block; margin-top:6px; font-size:11.5px; font-weight:700;
            color:var(--sd-verde); cursor:pointer; }

/* Valoración mínima: una sola respuesta, así que píldoras y no casillas. */
.sd-notas{ display:flex; flex-wrap:wrap; gap:6px; }
.sd-nota{ cursor:pointer; }
.sd-nota input{ position:absolute; opacity:0; }
.sd-nota span{ display:inline-flex; align-items:center; gap:4px; border:1px solid var(--sd-borde);
               border-radius:99px; padding:4px 10px; font-size:11.5px; color:var(--sd-texto); }
.sd-nota span iconify-icon{ color:var(--sd-oro); font-size:12px; }
.sd-nota input:checked + span{ background:var(--sd-verde-claro); border-color:var(--sd-verde);
                               color:var(--sd-verde-oscuro); font-weight:700; }

/* ═══ BARRA DE RESULTADOS Y VISTAS ═════════════════════════════════ */
.sd-barra{ display:flex; align-items:center; gap:10px; margin-bottom:14px; }
.sd-barra h2{ font-size:15px; font-weight:800; display:flex; align-items:center; gap:8px;
              text-transform:none; border:0; padding:0; }
.sd-barra h2 iconify-icon{ color:var(--sd-verde); font-size:17px; }
.sd-barra small{ color:var(--sd-suave); font-size:12px; }
.sd-barra-sp{ flex:1; }

.sd-vista{ display:flex; border:1px solid var(--sd-borde); border-radius:8px; overflow:hidden; }
.sd-vista button{ width:34px; height:34px; border:0; background:#fff; cursor:pointer;
                  color:var(--sd-suave); font-size:16px; }
.sd-vista button.on{ background:var(--sd-verde-claro); color:var(--sd-verde-oscuro); }

/* ═══ PAGINACIÓN ═══════════════════════════════════════════════════ */
/* LA PAGINACIÓN ES UN <nav>, Y ESO LA VESTÍA SOLA.
   `www_oneway/base.php` tiene una regla global para `nav` --la que pinta la
   barra de categorías del sitio-- con fondo blanco y `border-bottom: 1px solid
   #bbb`. Como el paginador también es un `nav`, se llevaba la raya gris de
   extremo a extremo por debajo de los resultados, como si allí acabara una
   sección. El fondo blanco se deja puesto a propósito; la raya se quita. */
.sd-pag{ display:flex; justify-content:center; align-items:center; gap:6px; margin:22px 0 6px;
         background-color:#FFF; border-bottom:0; }
.sd-pag a,.sd-pag span{ min-width:32px; height:32px; border-radius:8px; border:1px solid var(--sd-borde);
                        background:#fff; display:flex; align-items:center; justify-content:center;
                        font-size:12.5px; font-weight:700; color:var(--sd-tinta); cursor:pointer; }
.sd-pag .on{ background:var(--sd-verde); border-color:var(--sd-verde); color:#fff; }
.sd-pag .vacio{ border:0; background:transparent; color:var(--sd-tenue); cursor:default; }

/* ═══ COMPROMISOS ══════════════════════════════════════════════════ */
.sd-promesas{ display:grid; grid-template-columns:repeat(4,1fr); gap:22px; background:var(--sd-crema);
              border:1px solid var(--sd-borde); border-radius:var(--sd-radio);
              padding:20px 22px; margin:34px 0 40px; }
.sd-promesa{ display:flex; align-items:flex-start; gap:12px; }
.sd-promesa > span{ flex:0 0 auto; width:38px; height:38px; border-radius:50%; background:#fff;
                    border:1px solid var(--sd-verde-borde); display:flex; align-items:center;
                    justify-content:center; color:var(--sd-verde); font-size:18px; }
.sd-promesa div{ flex:1; min-width:0; }
.sd-promesa b{ display:block; font-size:13px; color:var(--sd-verde-oscuro); }
.sd-promesa small{ display:block; font-size:11.5px; color:var(--sd-suave); margin-top:3px; }

/* ═══ SIN RESULTADOS ═══════════════════════════════════════════════
   Y con la salida puesta: decir «no hay nada» sin ofrecer cómo deshacer el
   filtro que lo ha dejado vacío es dejar al visitante en un callejón. */
.sd-vacio{ text-align:center; padding:44px 20px; background:#fff;
           border:1px dashed var(--sd-borde); border-radius:var(--sd-radio); }
.sd-vacio iconify-icon{ font-size:32px; color:var(--sd-tenue); }
.sd-vacio b{ display:block; margin-top:10px; font-size:15px; color:var(--sd-tinta); }
.sd-vacio small{ display:block; margin:6px 0 14px; font-size:12.5px; color:var(--sd-suave); }

@media (max-width:1100px){
    .sd-promesas{ grid-template-columns:repeat(2,1fr); }
    .sd-carril-pista{ grid-auto-columns:calc((100% - 2*14px)/3); }
}
@media (max-width:760px){
    .sd-filtros,.sd-switches,.sd-cifras{ grid-template-columns:1fr; }
    .sd-cifra + .sd-cifra{ border-left:0; border-top:1px solid var(--sd-borde); }
    .sd-carril-pista{ grid-auto-columns:78%; }
    .sd-promesas{ grid-template-columns:1fr; }

    /* A 400 px el botón «Buscar» se salía 48 px por la derecha (medido el
       15/09/2026, al soltar el ancho mínimo del sitio): la caja de texto no
       baja de su contenido sin `min-width:0`. Caja arriba y botón debajo. */
    .sd-busca-fila{ flex-wrap:wrap; }
    .sd-busca-txt{ min-width:0; flex:1 1 100%; }
    .sd .sd-btn-buscar{ flex:1 1 100%; }

    /* Y las flechas del carril, dentro del borde: a -16 px empujaban la página. */
    .sd-flecha{ right:0; }
}



/* ══════════════════════════════════════════════════════════════════════
   LAS TARJETAS DE AGROCALIA — los tres formatos
   ══════════════════════════════════════════════════════════════════════

   `ag-card` la completa · `ag-mini` la compacta · `ag-subasta` la fila.

   Comparten foto, etiqueta, corazón, nombre, vendedor, nota y precio: lo común
   se declara una vez y cada formato solo cambia sus medidas.

   ── LOS COLORES SON LOS DEL ESCAPARATE ───────────────────────────────
   Tokens `--sd-*` con respaldo en el punto de uso, porque los sirve
   `TSellersUI` y estas tarjetas se pintan también dentro del panel de cuenta,
   que no lo carga.

   ── NO SE ESCOPAN BAJO UNA PANTALLA ──────────────────────────────────
   A propósito: son globales y se usan en el catálogo, en favoritos, en las
   colecciones y en el perfil del agricultor. El prefijo `ag-` es lo que las
   acota, y por eso todas las clases lo llevan.
   ────────────────────────────────────────────────────────────────────── */

.ag-cards { display: none; }

/* ── LO QUE LA REJILLA NECESITA SABER DE LA TARJETA ──────────────────
   Las rejillas del escaparate y de favoritos se montan con estos tokens, y los
   declaraba `TProductCard`. Al retirarlo a `old/` (10/09/2026) dejaron de
   llegar y las rejillas caían a sus respaldos: funcionaba, pero el ancho de la
   tarjeta lo decidía la pantalla en vez de la tarjeta.

   Van en `:root` a propósito: un token declarado sobre `.ag-card` no lo ve su
   contenedor, que es justo quien lo usa. */
:root{
    /* EL MÍNIMO. Por debajo de 260 la foto se queda pequeña y el nombre se
       parte en tres líneas. */
    --tf-card-min: 260px;

    /* Y EL TOPE, porque «líquida» no es «sin límite»: una fila con una sola
       tarjeta le daba el ancho entero de la página, y eso no es una tarjeta de
       producto, es un banner. */
    --tf-card-max: 350px;

    --tf-card-gap: 20px;
}

.ag-card, .ag-mini, .ag-subasta,
.ag-card *, .ag-mini *, .ag-subasta * { box-sizing: border-box; }

/* ── LOS `<span>` DE LA TARJETA HEREDAN SU LETRA, A LA FUERZA ────────
 *
 * `boot.css` declara `div, span, p, ul, li, ol { font: 12px Inter, sans-serif }`
 * y ese ATAJO `font` fija tamaño Y peso de un golpe. Un selector de elemento
 * (0,0,1) le gana siempre a un valor HEREDADO --que no tiene especificidad
 * ninguna-- así que todo el texto que la tarjeta mete en un `<span>` salía a
 * 12px y en redonda, dijera lo que dijera su contenedor. Medido el 26/09/2026:
 *
 *     .ag-vendedor  13 / 400   →  su span  12 / 400
 *     .ag-lugar     12,5 / 400 →  su span  12 / 400
 *     .ag-meta-it   11,5 / 500 →  su span  12 / 400
 *     .ag-reloj     12 / 700   →  su span  12 / 400   ← el que más se notaba
 *
 * O sea que el reloj de la subasta se declaraba en negrita y salía normal, y
 * no había forma de verlo leyendo esta hoja: hay que mirar `getComputedStyle`
 * DEL SPAN, no del bloque. Misma familia que las otras trampas de `boot.css`
 * (ver `Documentacion/Memoria/boot-css-pisa-color-heredado.md`).
 *
 * `font-size`/`font-weight`/`line-height` y no el atajo `font: inherit`: ese
 * arrastraría también `font-variant` y `font-stretch`, y aquí solo estorban
 * los tres de arriba. */
.ag-card :is(.ag-vendedor, .ag-lugar, .ag-nota, .ag-meta-it, .ag-reloj) > span,
.ag-mini :is(.ag-vendedor, .ag-lugar, .ag-nota, .ag-meta-it) > span,
.ag-subasta :is(.ag-vendedor, .ag-lugar, .ag-nota, .ag-meta-it) > span {
    font-size: inherit; font-weight: inherit; line-height: inherit;
}

/* ── LO COMÚN ───────────────────────────────────────────────────────── */

.ag-card, .ag-mini, .ag-subasta {
    position: relative;
    background: #fff;
    border: 1px solid var(--sd-borde, #e4eae4);
    border-radius: 14px;
    overflow: hidden;
}
.ag-card:hover, .ag-mini:hover, .ag-subasta:hover {
    border-color: #cfe0d3;
    box-shadow: 0 4px 14px rgba(20,40,25,.09);
}

/* La tapa cubre la tarjeta para poder pulsar en cualquier sitio. Va DEBAJO del
   corazón y del botón en el apilado: si no, se traga sus clics. */
.ag-card .ag-tapa, .ag-mini .ag-tapa, .ag-subasta .ag-tapa {
    position: absolute; inset: 0; z-index: 1;
    border: 0; text-decoration: none;
}

.ag-card .ag-foto, .ag-mini .ag-foto, .ag-subasta .ag-foto {
    position: relative; display: block;
    overflow: hidden;
    background: var(--sd-gris, #f2f5f2);
}
.ag-card .ag-foto img, .ag-mini .ag-foto img, .ag-subasta .ag-foto img {
    width: 100%; height: 100%; display: block;

    /* CUBRE EL HUECO, Y ANCLADA ARRIBA. `cover` recorta lo que sobra en vez de
       deformar la foto; `object-position: top` decide POR DÓNDE recorta, y en
       una foto de producto lo que importa está arriba --el género-- mientras que
       abajo suele haber caja, suelo o mesa. Con el centrado de fábrica, una foto
       vertical entraba por la mitad y la tarjeta enseñaba el palé. */
    object-fit: cover;
    object-position: top;
}

/* SIN FOTO, EL HUECO CON SU ICONO: un rectángulo vacío se lee como una imagen
   que no ha cargado, y la gente recarga la página. */
.ag-card .ag-sinfoto, .ag-mini .ag-sinfoto, .ag-subasta .ag-sinfoto {
    position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    color: #c3cfc6;
}
.ag-card .ag-sinfoto iconify-icon,
.ag-mini .ag-sinfoto iconify-icon,
.ag-subasta .ag-sinfoto iconify-icon { font-size: 30px; }

/* Oculto mientras la foto carga bien -- TAgroCard.js lo vuelve a enseñar
   solo si el `<img>` falla (`onerror`). Con `display:none` en vez de
   quitarlo del DOM, sigue ahí para ese caso; `.remove()` no se puede
   deshacer.

   ── Y CON LA TARJETA DELANTE, QUE SI NO NO OCULTA NADA (26/09/2026) ──
   Estaba como `.ag-sinfoto--oculto` a secas --0,0,1,0-- contra la regla que lo
   enseña, `.ag-card .ag-sinfoto` --0,0,2,0--: perdía por especificidad, así que
   el icono de «sin foto» salía SIEMPRE, también encima de las fotos que sí
   habían cargado. Se veía como un cuadradito gris en mitad de cada producto y
   no daba ningún error: el JS y el render de PHP llevaban meses poniendo una
   clase que no hacía nada. */
.ag-card .ag-sinfoto--oculto,
.ag-mini .ag-sinfoto--oculto,
.ag-subasta .ag-sinfoto--oculto { display: none; }

/* ── LA ETIQUETA DE LA ESQUINA ──────────────────────────────────────── */

.ag-card .ag-etiqueta, .ag-mini .ag-etiqueta {
    position: absolute; top: 10px; left: 10px; z-index: 2;
    display: inline-block;
    padding: 5px 12px;
    border-radius: 999px;
    font-size: 12px; font-weight: 700; line-height: 1.3;
    color: #fff;
    background: var(--sd-verde, #1d753b);
    box-shadow: 0 1px 4px rgba(20,40,25,.2);
}
.ag-mini .ag-etiqueta { top: 8px; left: 8px; padding: 3px 9px; font-size: 11px; }

/* 18px Y NO 10: la foto entró 8px hacia dentro (ver `.ag-card .ag-foto`), así
   que la esquina y el corazón se quedaban montados sobre su borde. Se suman
   los mismos 8 para que sigan cayendo DENTRO de la foto. */
.ag-card .ag-etiqueta { top: 18px; left: 18px; }
.ag-card .ag-fav      { top: 18px; right: 18px; }

/* ── LOS CUATRO TONOS, Y DOS NO LLEGABAN A AA ──────────────────────
 *
 * Medido el 26/09/2026 con la letra blanca que declara `.ag-etiqueta`:
 *
 *     ámbar  #e8a33d + #fff → 2,16    verde #1d753b + #fff → 5,74
 *     rojo   #ef5350 + #fff → 3,49    azul  #2f6fd0 + #fff → 4,88
 *
 * WCAG 2.1 AA pide 4,5 para texto normal, y esto son 12px. El ámbar es el que
 * más se ve --«Producción integrada» sale en media rejilla-- y era el peor.
 *
 * EL ÁMBAR NO SE ARREGLA OSCURECIÉNDOLO: para que quepa letra blanca hay que
 * bajarlo hasta que deja de ser ámbar y se vuelve marrón. Lleva LETRA OSCURA
 * (6,37) y se queda con su color. El rojo sí: #d32f2f con blanco da 4,98.
 *
 * Mismo hallazgo y misma decisión que en `TAuctionCard` (otra sesión, el mismo
 * día): ahí el ámbar con blanco daba 2,59 y se resolvió igual. */
.ag-card .ag-et--verde, .ag-mini .ag-et--verde { background: #1d753b; }
.ag-card .ag-et--ambar, .ag-mini .ag-et--ambar { background: #e8a33d; color: #3d2a00; }
.ag-card .ag-et--azul,  .ag-mini .ag-et--azul  { background: #2f6fd0; }
.ag-card .ag-et--rojo,  .ag-mini .ag-et--rojo  { background: #d32f2f; }

/* ── EL CORAZÓN ─────────────────────────────────────────────────────── */

.ag-card .ag-fav, .ag-mini .ag-fav {
    height: auto; min-height: 0;
    position: absolute; top: 9px; right: 9px; z-index: 3;
    display: inline-flex; align-items: center; justify-content: center;
    width: 34px; height: 34px;
    margin: 0; padding: 0;
    background: rgba(255,255,255,.95);
    border: 0; border-radius: 999px;
    color: #9aa8a0;
    cursor: pointer;
    box-shadow: 0 1px 5px rgba(20,40,25,.18);
}
.ag-mini .ag-fav { top: 7px; right: 7px; width: 28px; height: 28px; }

/* El corazón es un SVG inline --no un `<iconify-icon>`-- justo para poder
   rellenarlo: dentro de un shadow DOM el `fill="none"` de Lucide no se alcanza
   desde aquí. */
.ag-card .ag-corazon, .ag-mini .ag-corazon { width: 18px; height: 18px; fill: none; }
.ag-mini .ag-corazon { width: 15px; height: 15px; }

.ag-card .ag-fav:hover, .ag-mini .ag-fav:hover { color: #e11d48; }

/* GUARDADO: rojo y RELLENO. Con solo el contorno no se distingue de «se puede
   guardar», que es justo lo contrario de lo que dice. */
.ag-card .ag-fav.on, .ag-mini .ag-fav.on { color: #e11d48; }
.ag-card .ag-fav.on .ag-corazon, .ag-mini .ag-fav.on .ag-corazon { fill: #e11d48; }

/* ── EL CUERPO ──────────────────────────────────────────────────────── */

/* EL CUERPO CRECE PARA QUE EL BOTÓN SE QUEDE ABAJO.
   Sin esto, el botón sube o baja según lo que haya encima --un nombre de una
   línea o de dos, un producto con lugar y otro sin él-- y en una rejilla eso se
   ve como una fila de botones a distintas alturas. Con el cuerpo en columna y
   el botón con `margin-top:auto`, su sitio no depende del contenido: siempre al
   pie de la tarjeta. */
.ag-card .ag-cuerpo, .ag-mini .ag-cuerpo {
    position: relative; z-index: 2;
    pointer-events: none;
    flex: 1;
    display: flex; flex-direction: column;
}
/* El cuerpo deja pasar el clic a la tapa, salvo lo que sí se pulsa. */
.ag-card .ag-cuerpo .ag-btn, .ag-mini .ag-cuerpo .ag-btn { pointer-events: auto; }

.ag-card .ag-cuerpo { padding: 13px 14px 14px; }
.ag-mini .ag-cuerpo { padding: 8px 10px 9px; min-height: 0; }

.ag-card .ag-nombre, .ag-mini .ag-nombre, .ag-subasta .ag-nombre {
    margin: 0; padding: 0;
    font-weight: 800; line-height: 1.3;
    color: var(--sd-tinta, #16211a);
}
.ag-card .ag-nombre { font-size: 15px; }
/* HASTA DOS LÍNEAS, y sin encogerse. Antes era una sola línea con puntos
   suspensivos porque la tarjeta medía 150px fijos; pero el cuerpo no cabía en
   esos 150 --foto de 71, relleno y cuatro líneas-- y el flex, al ser el nombre
   `overflow:hidden`, lo comprimía por debajo de su altura: el título salía
   cortado por abajo y montado sobre el vendedor. Con `flex:0 0 auto` cada línea
   conserva su altura y es la tarjeta la que crece (ver `.ag-mini`). */
.ag-mini .ag-nombre {
    flex: 0 0 auto;
    font-size: 12.5px;
    overflow: hidden;
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
    line-clamp: 2;
}
.ag-subasta .ag-nombre { font-size: 13.5px; }

.ag-card .ag-vendedor, .ag-mini .ag-vendedor, .ag-subasta .ag-vendedor {
    margin: 3px 0 0; padding: 0;
    line-height: 1.35;
    color: var(--sd-suave, #6b7a70);
}

/* El icono del vendedor en su columna, como el del lugar: flex de dos
   columnas y todo el texto en la segunda. */
.ag-card .ag-vendedor { display: flex; align-items: center; gap: 6px; }
.ag-card .ag-vendedor > iconify-icon { flex: 0 0 auto; font-size: 14px; color: var(--sd-suave, #93a09a); }

/* En la compacta y en la fila no hay sitio para el icono. */
.ag-mini .ag-vendedor > iconify-icon,
.ag-subasta .ag-vendedor > iconify-icon { display: none; }
.ag-card .ag-vendedor { font-size: 13px; }
.ag-mini .ag-vendedor {
    flex: 0 0 auto;
    font-size: 11px; margin-top: 1px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ag-subasta .ag-vendedor { font-size: 12px; }

/* ── EL LUGAR ───────────────────────────────────────────────────────── */

.ag-card .ag-lugar {
    display: flex; align-items: center; gap: 5px;
    margin: 5px 0 0; padding: 0;
    font-size: 12.5px; line-height: 1.35;
    color: var(--sd-suave, #6b7a70);
}
/* El tamaño se declara EN el icono: `iconify-icon` no hereda el `font-size`. */
.ag-card .ag-lugar iconify-icon { flex: 0 0 auto; font-size: 14px; }

/* ── LA NOTA ────────────────────────────────────────────────────────── */

.ag-card .ag-nota, .ag-mini .ag-nota {
    display: flex; align-items: center; gap: 5px;
    margin: 6px 0 0; padding: 0;
}
.ag-mini .ag-nota { margin-top: 3px; }

/* La estrella va RELLENA. Es el trazo de Lucide copiado de su propia
   definición --su `<path>` trae `fill="none"` y con `iconify-icon` vive en un
   shadow DOM que ninguna regla alcanza-- así que no se mezcla ninguna familia
   de iconos: solo se pinta el interior. */
.ag-card .ag-estrella, .ag-mini .ag-estrella {
    width: 16px; height: 16px; flex: 0 0 auto;
    fill: #feac08; color: #feac08;
}
.ag-mini .ag-estrella { width: 14px; height: 14px; }

.ag-card .ag-nota b { font-size: 13.5px; font-weight: 700; color: var(--sd-tinta, #16211a); }
.ag-mini .ag-nota b { font-size: 12px; font-weight: 700; color: var(--sd-tinta, #16211a); }
.ag-card .ag-nota small { font-size: 13px; color: var(--sd-suave, #6b7a70); }
.ag-mini .ag-nota small { font-size: 11.5px; color: var(--sd-suave, #6b7a70); }

/* ── EL PRECIO, Y EL DESCUENTO A SU DERECHA ─────────────────────────── */

.ag-card .ag-precios, .ag-mini .ag-precios {
    display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px;
    margin: 9px 0 0; padding: 0;
}
.ag-mini .ag-precios { margin: 0; gap: 5px; }

.ag-card .ag-precio {
    font-size: 18px;
    font-weight: 600;
    color: var(--sd-tinta, #16211a);
    font-family: sans-serif;
}
.ag-mini .ag-precio { font-size: 14.5px; font-weight: 800; color: var(--sd-tinta, #16211a); }

/* EN OFERTA EL PRECIO VA EN ROJO: es lo que lo distingue de un precio normal de
   un vistazo. El tachado de al lado se lee después, no antes. */
.ag-card .ag-precio.ag-rebajado, .ag-mini .ag-precio.ag-rebajado { color: #e11d48; }

.ag-card .ag-antes, .ag-mini .ag-antes {
    font-size: 14px; font-weight: 600;
    color: var(--sd-suave, #93a09a);
    text-decoration: line-through;
}
.ag-mini .ag-antes { font-size: 11.5px; }

/* ── LA SUBASTA: EL RÓTULO DEL PRECIO Y EL RELOJ ────────────────────
   En una subasta la cifra NO es el precio: es lo que va costando ahora mismo.
   El rótulo va en su propia línea, encima, y ocupa la fila entera
   (`flex-basis:100%`) porque `.ag-precios` es un flex en línea de base. */
.ag-card .ag-precio-rotulo, .ag-mini .ag-precio-rotulo {
    flex-basis: 100%;
    font-size: 11px; font-weight: 700; line-height: 1.2;
    text-transform: uppercase; letter-spacing: .4px;
    color: var(--sd-suave-aa, #5f6b65);
}
.ag-mini .ag-precio-rotulo { font-size: 10px; }

/* EL RELOJ, EN ÁMBAR Y NO EN ROJO: el rojo de esta hoja es el del precio
   rebajado, y dos rojos en la misma tarjeta dicen dos cosas distintas. Icono en
   su columna y todo el texto en la segunda, como manda la regla de alineación
   del proyecto. */
.ag-card .ag-reloj {
    /* `align-self` Y `width:fit-content`: el cuerpo de la tarjeta es un flex en
       columna, y en un flex `inline-flex` no basta -- el hijo se estira igual y
       la píldora salía de borde a borde. */
    display: inline-flex; align-self: flex-start; width: fit-content;
    align-items: center; gap: 6px;
    margin: 9px 0 0; padding: 4px 9px;
    border-radius: 99px;
    background: #fff7e6; border: 1px solid #f5d999;
    font-size: 12px; font-weight: 700; line-height: 1.2;
    color: #8a5a00;
}
.ag-card .ag-reloj iconify-icon { flex: 0 0 auto; font-size: 14px; }

/* TERMINADA: la píldora pasa a gris. El ámbar avisa de que queda poco, y en una
   subasta cerrada ya no queda nada que avisar. #475569 sobre #f1f5f9: 7,2. */
.ag-card.es-finalizada .ag-reloj { background: #f1f5f9; border-color: #e2e8f0; color: #475569; }
.ag-card.es-finalizada .ag-reloj small { color: #475569; }
.ag-card .ag-reloj span { color: inherit; }
.ag-card .ag-reloj small {
    /* #a07a33 daba 3,70 sobre el fondo de la píldora y esto son 11px: por
       debajo del 4,5 de AA. Con #8a6620, 4,92. */
    font-size: 11px; font-weight: 500; color: #8a6620;
}

/* LA MENCIÓN DEL IVA: discreta pero legible (suelo de 10 px) y con contraste
   AA sobre el blanco de la tarjeta. El `span` no hereda el tamaño en este
   sitio --una regla global con `font:` lo fija--, así que se declara. */
.ag-card .ag-iva, .ag-mini .ag-iva, .ag-subasta .ag-iva {
    font-size: 11px; font-weight: 500; line-height: 1.2;
    color: var(--sd-suave-aa, #5f6b65);
}
.ag-mini .ag-iva { font-size: 10px; flex-basis: 100%; }
.ag-subasta .ag-iva { display: block; font-size: 10px; }

/* EL PRECIO POR KILO O LITRO: su propia línea bajo el precio, sobrio. Mismo tono
   que la mención del IVA, que es dato de lectura y no cifra de decisión. */
.ag-card .ag-ud, .ag-mini .ag-ud, .ag-subasta .ag-ud {
    flex-basis: 100%;
    font-size: 11px; font-weight: 500; line-height: 1.2;
    color: var(--sd-suave-aa, #5f6b65);
    font-variant-numeric: tabular-nums;
}
.ag-card .ag-ud { margin-top: -4px; }
.ag-mini .ag-ud { font-size: 10px; }
.ag-subasta .ag-ud { display: block; font-size: 10px; }

.ag-card .ag-dto {
    padding: 2px 8px;
    background: #ef5350; border-radius: 7px;
    font-size: 12px; font-weight: 700; color: #fff;
}

/* ── EL BOTÓN ───────────────────────────────────────────────────────── */

/* `height:auto` a la fuerza: la hoja global le pone `height:25px; display:flex`
   a todo `button` dentro de un TComponentES6, y estas tarjetas se pintan
   también dentro del panel de cuenta. */
.ag-card .ag-btn, .ag-mini .ag-btn, .ag-subasta .ag-btn {
    height: auto; min-height: 0;
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    margin: 0;
    background: var(--sd-verde, #116f34);
    border: 0; border-radius: 10px;
    font-size: 13.5px; font-weight: 700; line-height: 1.2;
    color: #fff;
    cursor: pointer; box-shadow: none;
    pointer-events: auto;
}
.ag-card .ag-btn:hover, .ag-mini .ag-btn:hover, .ag-subasta .ag-btn:hover {
    background: var(--sd-verde-oscuro, #0b5a2a);
}
.ag-card .ag-btn iconify-icon, .ag-mini .ag-btn iconify-icon, .ag-subasta .ag-btn iconify-icon { font-size: 16px; }

/* El rótulo del botón, en su `<span>`: así se puede quitar en la vista de lista
   sin tocar el icono. */
.ag-card .ag-btn-txt { display: inline; }

/* EL PIE. `margin-top: auto` lo empuja al fondo, que es lo que hace que todas
   las tarjetas de una fila tengan el botón a la misma altura. */
.ag-card .ag-pie { margin-top: auto; display: flex; align-items: center; gap: 10px;
                   padding: 12px 14px 14px; }

/* ── LA ACCIÓN DE LA TARJETA VERTICAL ES «VER PRODUCTO» ────────────
 *
 * Diseño del usuario (26/09/2026): el botón de carrito sale de la rejilla y la
 * tarjeta ofrece una sola puerta, en línea y no maciza. En un catálogo
 * agrícola casi nada se compra de un clic --hay mínimos, calibres y formatos
 * que decidir-- así que el carrito desde la rejilla prometía un atajo que casi
 * ningún artículo admite.
 *
 * El apaisado y la vista de lista lo vuelven a encender desde
 * `TStorefront.css`, que gana por especificidad. */
.ag-card .ag-pie .ag-btn { display: none; }

/* «VER PRODUCTO», a todo lo ancho y en línea. */
.ag-card .ag-ver {
    display: flex; flex: 1; width: 100%;
    align-items: center; justify-content: center; gap: 8px;
    padding: 10px 14px;
    /* EL BORDE, MÁS MARCADO QUE `--sd-borde`. Ese gris está pensado para
       separar superficies --el canto de una tarjeta sobre el fondo-- y sobre
       blanco casi no se ve; en un botón el borde ES el botón, porque no tiene
       fondo que lo dibuje. */
    border: 1px solid var(--ag-borde-btn, #a9bdaf); border-radius: 10px;
    font-size: 13px; font-weight: 600; line-height: 1.2;
    color: var(--sd-verde, #116f34); text-decoration: none;
    white-space: nowrap;
    pointer-events: auto; position: relative; z-index: 3;
}
.ag-card .ag-ver:hover { background: var(--sd-gris, #f2f5f2); }
.ag-card .ag-ver:hover { border-color: var(--sd-verde, #116f34); }

/* ── EL BORDE SE PONÍA NEGRO AL VISITARLO, Y NO SE VE MIDIENDO ──────
 *
 * La hoja global declara `a, a:active, a:focus, a:visited { … border: 0px; }`.
 * Ese shorthand deja `border-color` en `currentColor`, y el color del borde es
 * de las pocas propiedades que `:visited` SÍ puede cambiar --el navegador
 * bloquea el resto por privacidad--. Como `a:visited` (0,1,1) gana a una clase
 * suelta (0,1,0), este botón salía con el borde casi negro en cuanto se había
 * pinchado el producto una vez, mientras los no visitados seguían grises: dos
 * bordes distintos en la misma fila.
 *
 * **`getComputedStyle` no lo delata**: devuelve a propósito el valor del enlace
 * SIN visitar. Hay que declarar el `:visited` explícito.
 * Ver `Documentacion/Memoria/borde-negro-por-a-visited.md`. */
.ag-card .ag-ver:link,
.ag-card .ag-ver:visited,
.ag-card .ag-ver:hover,
.ag-card .ag-ver:active,
.ag-card .ag-ver:focus {
    border: 1px solid var(--ag-borde-btn, #a9bdaf);
    color: var(--sd-verde, #116f34);
}
/* El hueco mínimo sobre el botón lo pone el bloque de precios, no el botón: si
   lo pusiera él, `margin-top:auto` lo perdería. */
.ag-card .ag-precios { margin-bottom: 12px; }

/* En la compacta se queda en su icono: a todo lo ancho se comería la tarjeta. */
.ag-mini .ag-btn-icono { width: 30px; height: 30px; flex: 0 0 30px; padding: 0; border-radius: 8px; }

.ag-subasta .ag-btn { padding: 8px 14px; font-size: 12.5px; }

/* ── FORMATO 1: LA COMPLETA ─────────────────────────────────────────── */

/* `height:100%` para que la tarjeta ocupe toda la celda de la rejilla: es lo
   que permite que el botón se vaya al fondo. Una rejilla estira sus celdas,
   pero la tarjeta tiene que aceptar el alto. */
.ag-card { display: flex; flex-direction: column; height: 100%; }

/* EL THUMB: TODO EL ANCHO DE LA TARJETA, 138 de alto.
   ── EL `max-width: 210px` ESTABA MAL Y SE VEÍA ────────────────────
   La maqueta mide 210 x 138 porque SU tarjeta mide 210 de ancho. Copiar los dos
   números dejó la foto centrada dentro de una tarjeta de 298: un rectángulo
   despegado de los bordes, con dos franjas blancas a los lados que se leen como
   un fallo de montaje. Lo que la maqueta dice de verdad es que la foto ocupa el
   ancho ENTERO y mide 138 de alto.
   El alto sí se fija --no `aspect-ratio`-- para que las tarjetas de una fila
   tengan el texto a la misma altura, y `object-fit: cover` en el `img` recorta
   lo que sobre en vez de deformar la foto. */
/* ── Y VA METIDA, CON SUS CUATRO ESQUINAS REDONDEADAS (26/09/2026) ──
   Petición expresa del usuario sobre la maqueta. Antes iba a sangre y con las
   esquinas de arriba cuadradas, pegada al canto de la tarjeta: la foto se leía
   como el fondo del bloque y no como el producto. Con 8px de aire alrededor y
   12 de radio, la tarjeta enmarca la foto -- y el marco blanco es lo que hace
   que se lea como una ficha. */
.ag-card .ag-foto {
    display: block; width: 100%; height: 150px;
    margin: 8px 0 0; width: calc(100% - 16px); margin-left: 8px;
    border-radius: 12px;
}

/* ── FORMATO 2: LA COMPACTA ─────────────────────────────────────────── */

/* LA COMPACTA MIDE 178 de ancho y AL MENOS 150 de alto, con el thumb de 71: es
   una tarjeta de panel lateral, donde caben dos por fila. Dos tarjetas
   seguidas quedan iguales porque la fila las estira, no porque el alto sea fijo
   --fijo, el cuerpo no cabía y se solapaban título y vendedor--. */
.ag-mini {
    display: flex; flex-direction: column;
    /* Alto mínimo y no fijo: el cuerpo (nombre en dos líneas, vendedor, precio
       y «IVA incluido») no cabe en 79px, y con `height` fija se comprimía. */
    width: 178px; min-height: 150px;
    max-width: 100%;
}
.ag-mini .ag-foto { height: 71px; flex: 0 0 71px; }

.ag-mini .ag-mini-pie {
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
    /* Al pie, por lo mismo que en la completa. */
    margin-top: auto; padding-top: 6px;
}
.ag-mini .ag-mini-pie .ag-precios { margin: 0; }

/* ── FORMATO 3: LA FILA DE SUBASTA ──────────────────────────────────── */

/* LA FILA DE SUBASTA: 75 de alto y el thumb CUADRADO de 57 x 57. Las dos
   medidas salen de la maqueta (el PNG va a escala 1:1) y el alto es
   exactamente el thumb más sus 9 de aire arriba y abajo. */
.ag-subasta {
    display: grid;
    grid-template-columns: 57px minmax(0, 1fr) auto;
    gap: 12px; align-items: center;
    height: 75px; padding: 9px;
}
.ag-subasta .ag-foto { width: 57px; height: 57px; flex: 0 0 57px; border-radius: 10px; }

.ag-subasta .ag-subasta-txt { position: relative; z-index: 2; min-width: 0; pointer-events: none; }

.ag-subasta .ag-queda {
    display: inline-flex; align-items: center; gap: 5px;
    margin-top: 6px; padding: 3px 9px;
    background: #fdecec; border-radius: 999px;
    font-size: 11.5px; font-weight: 700; color: #d92d20;
}
.ag-subasta .ag-queda iconify-icon { font-size: 13px; }

/* LA PÍLDORA VA EN ROJO SIEMPRE, falten dos horas o falten tres días. Aquí
   había un `.ag-holgado` que la pasaba a gris con más de un día por delante --
   idea mía, no de la maqueta, y lo que conseguía era que la misma fila se viera
   de dos maneras distintas sin que nada lo explicara. La maqueta pinta una sola
   píldora, y en una subasta el tiempo SIEMPRE es el dato que decide. */

/* ── LA FILA COMO ARTÍCULO NORMAL ───────────────────────────────────
   El mismo formato sirve para lo que no es subasta: cambian los textos, no la
   colocación. En vez de la cuenta atrás va el lugar, que es lo que la tarjeta
   completa pone en esa misma posición. */
.ag-subasta .ag-lugar {
    display: inline-flex; align-items: center; gap: 5px;
    margin: 6px 0 0; padding: 0;
    font-size: 12px; line-height: 1.35;
    color: var(--sd-suave, #6b7a70);
}
.ag-subasta .ag-lugar iconify-icon { flex: 0 0 auto; font-size: 13px; }

.ag-subasta .ag-subasta-puja { position: relative; z-index: 2; text-align: right; }
.ag-subasta .ag-subasta-puja small { display: block; font-size: 11px; color: var(--sd-suave, #6b7a70); }
.ag-subasta .ag-subasta-puja b {
    display: block; margin-top: 2px;
    font-size: 15px; font-weight: 800; color: var(--sd-tinta, #16211a);
}
.ag-subasta .ag-subasta-puja .ag-btn { margin-top: 7px; }

/* ── EL FOCO TIENE QUE VERSE ────────────────────────────────────────── */

.ag-card .ag-btn:focus-visible, .ag-mini .ag-btn:focus-visible, .ag-subasta .ag-btn:focus-visible,
.ag-card .ag-fav:focus-visible, .ag-mini .ag-fav:focus-visible,
.ag-card .ag-tapa:focus-visible, .ag-mini .ag-tapa:focus-visible, .ag-subasta .ag-tapa:focus-visible {
    outline: 2px solid var(--sd-verde, #04713a);
    outline-offset: 2px;
}

/* ══ LAS ETIQUETAS Y LOS DATOS DE VENTA ════════════════════════════════
 *
 * NACÍAN OCULTAS y las encendía la hoja de cada pantalla. Desde el 26/09/2026
 * son parte de la tarjeta vertical --diseño del usuario-- y se ven SIEMPRE:
 * las píldoras bajo el precio (qué es la mercancía) y la fila de datos debajo
 * (cómo y cuándo se compra). El apaisado y la vista de lista las siguen
 * colocando a su manera desde `TStorefront.css`, que gana por especificidad.
 *
 * Y LAS PÍLDORAS VAN BAJO EL PRECIO Y NO SOBRE LA FOTO, a propósito:
 * amontonarlas encima tapa el producto, que es lo único que vende en una
 * rejilla. Sobre la foto se queda solo la etiqueta de esquina.
 *
 * CANDIDATAS A LA HOJA COMÚN del área de cliente junto con el resto de la
 * tarjeta; van aquí porque son de la tarjeta, no de la tienda.
 */
.ag-card .ag-tags,
.ag-card .ag-meta { display: flex; }

/* ── LAS ETIQUETAS: qué es la mercancía ───────────────────────────── */
.ag-card .ag-tags { flex-wrap: wrap; gap: 6px; margin-top: 9px; }

.ag-card .ag-tag {
    display: inline-flex; align-items: center;
    padding: 4px 11px;
    /* REDONDEO COMPLETO, como la maqueta: una píldora, no una etiqueta
       cuadrada. Es lo que la distingue del rótulo de la esquina. */
    border-radius: 999px;
    background: #f1f4f1;
    border: 1px solid transparent;
    color: var(--sd-texto, #46514a);
    font-size: 11.5px; font-weight: 700; line-height: 1.4;
    white-space: nowrap;
}

/* ── LOS DOS TONOS DE LA MAQUETA ───────────────────────────────────
   `eco` es una afirmación verificada --lleva certificado detrás-- y va maciza
   en verde; `info` es un dato del género (el calibre, un sello de finca) y va
   en azul pálido con letra azul. Medidos: 5,10 y 7,26 sobre sus fondos. */
.ag-card .ag-tag.es-eco  { background: #1d753b; border-color: #1d753b; color: #fff; }
.ag-card .ag-tag.es-info { background: #e8f0fb; border-color: #d3e3f7; color: #1f4f8f; }

/* El cultivo ecológico con su verde: es el que el comprador busca, y en gris
   pesa lo mismo que el formato del envase. */
.ag-card .ag-tag.es-eco {
    background: #e8f5ec;
    border-color: #bfe3cb;
    color: #1d753b;
}

/* Y los sellos de finca en azul apagado: son una afirmación del agricultor
   --«Producción integrada», «GlobalG.A.P.»--, no un certificado ecológico, y
   con el mismo verde se leerían como lo segundo. */
.ag-card .ag-tag.es-info {
    background: #eaf2fb;
    border-color: #c8ddf4;
    color: #1c5b96;
}

/* ── LOS DATOS DE VENTA: cómo y cuándo se compra ────────────────────
 *
 * SIN FONDO Y SIN FILETE (26/09/2026). Los llevaba --un `#fbfdfb` con borde
 * arriba-- y con las píldoras encima la tarjeta se leía partida en tres
 * bandas: ficha, píldoras y «pie». En la maqueta es una línea de texto
 * pequeño más, no una franja: lo que la separa es el aire, no una caja.
 *
 * Y SE PARTE EN DOS LÍNEAS antes que recortarse: «Envío disponible» cortado a
 * la mitad no dice nada. En el apaisado manda lo contrario --una sola línea
 * con puntos suspensivos-- y lo impone `TStorefront.css`, que gana. */
.ag-card .ag-meta {
    flex-wrap: wrap;
    align-items: center;
    gap: 5px 14px;
    margin: 10px 14px 0;
    padding: 0;
    border-top: 0;
    background: none;

    /* COMO EL CUERPO: la tapa que hace pulsable la tarjeta entera vive debajo,
       y sin esto esta franja se traga el clic en toda su altura. */
    position: relative; z-index: 2;
    pointer-events: none;
}

.ag-card .ag-meta-it {
    display: inline-flex; align-items: center; gap: 5px;
    font-size: 11.5px; font-weight: 500; line-height: 1.3;
    color: var(--sd-suave-aa, #5f6b65);
    white-space: nowrap;
}
.ag-card .ag-meta-it iconify-icon { flex: 0 0 auto; font-size: 14px; color: var(--sd-verde, #116f34); }
.ag-card .ag-meta-it span { color: inherit; }

/* ══ EL PIE, YA FUERA DEL CUERPO ═══════════════════════════════════════
 *
 * Se sacó de `.ag-cuerpo` para que en apaisado pueda compartir fila con los
 * datos de venta. En la tarjeta vertical no cambia nada a la vista --sigue
 * siendo lo último y pegado al fondo por su `margin-top: auto`-- pero necesita
 * lo que antes le daba el cuerpo: el relleno lateral y, sobre todo, el paso del
 * ratón. El cuerpo es `pointer-events: none` para que la tapa que hace pulsable
 * la tarjeta entera reciba el clic, y sus botones lo recuperaban con una regla
 * propia; fuera de él, sin esto, el botón de comprar dejaba de responder EN
 * TODAS LAS PANTALLAS y sin un solo error.
 */
.ag-card > .ag-cuerpo { padding-bottom: 0; }

.ag-card > .ag-pie {
    padding: 10px 14px 14px;
    position: relative; z-index: 2;
    pointer-events: none;
}
.ag-card > .ag-pie > * { pointer-events: auto; }

/* ══ EL SELLO DE VERIFICADO ════════════════════════════════════════════
   Relleno y azul: de trazo se lee como «se puede verificar». Va pegado al
   nombre del vendedor, en su línea. */
.ag-card .ag-vendedor { display: flex; align-items: center; gap: 5px; }

.ag-card .ag-verificado {
    flex: 0 0 auto;
    width: 15px; height: 15px;
    color: #1d8cf0;
}

/* ── LA ETIQUETA NO SE SALE DE LA TARJETA ──────────────────────────────
 *
 * `top/left` fijos y ningún tope de ancho: con un sello de dos palabras no se
 * notaba, pero desde que la etiqueta puede traer el sello de cultivo del
 * agricultor --«Sin tratamiento postcosecha»-- se salía por la derecha de la
 * tarjeta y se metía por debajo del corazón. El hueco que se le deja a la
 * derecha es el del corazón (34px) más su margen.
 */
.ag-card .ag-etiqueta, .ag-mini .ag-etiqueta {
    max-width: calc(100% - 56px);
    white-space: normal;
    line-height: 1.25;
}




/* ═══════════════════════════════════════════════════════════════════════════
   EL PERFIL PÚBLICO DEL AGRICULTOR — /sellers/{id}
   ═══════════════════════════════════════════════════════════════════════════

   TODO CUELGA DE `.TSellerProfile`, que es la clase que el framework le pone a
   la raíz. La tienda tiene reglas globales agresivas --una de ellas fija
   `font: 12px` con la forma corta, que arrasa el tamaño heredado de cualquier
   span-- y sin el prefijo se cuelan.

   Los tokens de color, los botones, las píldoras y las promesas del pie NO
   están aquí: vienen de `TSellersUI`, la hoja común del directorio, que el
   controlador manda con este componente. Es la misma que usan `/sellers` y
   `/sellers/buscar`, y es lo que evita que haya tres ideas distintas de qué es
   un vendedor. Aquí solo lo específico de esta pantalla, con prefijo `sp-`.

   Los tonos se han MUESTREADO del PNG de la maqueta (`Perfil seller.png`), no
   elegidos a ojo: el botón principal cae en el `--sd-verde-vivo` que ya existía
   y el verde hondo del presupuesto (#0e451f) es el único que no estaba.
   ═══════════════════════════════════════════════════════════════════════════ */

.TSellerProfile{
    --sp-hondo: #0e451f;
    --sp-aviso-fondo: #eef6ee;

    background: #fff;
    padding-bottom: 30px;
}

/* ═══ EL PERFIL VA PEGADO A LA CABECERA ════════════════════════════
   Y NO SE ARREGLA DESDE AQUÍ: lo declara el controlador con `layout('flush')`,
   que es un modo de `base.php` --con cabecera y pie, pero sin el marco del
   escaparate--. Aquí solo queda dicho para que nadie venga a buscar el hueco en
   esta hoja: el `padding-top` de `main` y el relleno y el tope de
   `.body-content` son del sitio, no de este componente, y el tope además sale
   de un ajuste que el usuario configura (`max_page_width`). Anularlo con un
   `:has()` desde aquí lo dejaría sin efecto y sin que nadie supiera por qué. */

/* El ancho recogido. La portada y las franjas van a sangre. */
/* El carril del sitio, no una medida propia: con 1360px fijos el perfil
   arrancaba en otra vertical que el logo de la cabecera en cuanto el ajuste de
   ADMIN no valía justo eso. */
.TSellerProfile .sp-ancho{ max-width:var(--site-carril);
                           margin-left:var(--site-carril-izq); margin-right:auto; }

/* ── LA PORTADA ────────────────────────────────────────────────────
   Sin foto NO se pone una de archivo: sería enseñar una finca que no es la
   suya. Queda el degradado de la casa, que es un fondo y no una mentira. */
.TSellerProfile .sp-portada{ height:230px; overflow:hidden;
                             background:linear-gradient(135deg,#e8f2e6 0%,#d7e9d6 100%); }
.TSellerProfile .sp-portada img{ display:block; width:100%; height:100%; object-fit:cover; }

/* ── CABECERA ──────────────────────────────────────────────────────
   600 px A LA OPERATIVA Y NO MÁS: es lo que deja sitio para que el nombre
   quepa en una línea con la meta a su lado. Medido en el navegador. */
/* ══ DE VACACIONES ═══════════════════════════════════════════════════
   ÁMBAR Y NO ROJO. El rojo es de error --algo ha salido mal, hay que hacer
   algo-- y aquí no ha fallado nada: el agricultor ha avisado de que no sirve.
   El ámbar dice «tenlo en cuenta», que es exactamente el recado.

   Va ENCIMA de la cabecera y a todo el ancho: cambia cómo se lee el resto de la
   pantalla, así que tiene que llegar antes.

   El flex de dos columnas de siempre --icono en la primera y TODO el texto en
   la segunda-- para que el titular y el mensaje arranquen en la misma vertical. */
.TSellerProfile .sp-vacaciones{
    display:flex; align-items:flex-start; gap:12px;
    /* Arriba del todo, separado de la cabecera del sitio y pegado a la portada
       que viene debajo: es el marco con el que hay que leer la página. */
    margin:16px 0 14px;
    padding:14px 18px;
    background:#fffbeb;
    border:1px solid #fde68a;
    border-radius:14px;
}
.TSellerProfile .sp-vac-icono{
    flex:0 0 auto;
    display:inline-flex; align-items:center; justify-content:center;
    width:34px; height:34px;
    border-radius:10px;
    background:#fef3c7; color:#b45309;
}
/* El tamaño se declara EN el icono: no hereda el `font-size` de su caja. */
.TSellerProfile .sp-vac-icono iconify-icon{ font-size:19px; }

.TSellerProfile .sp-vac-texto{ flex:1; min-width:0; }
.TSellerProfile .sp-vac-texto b{
    display:block; font-size:15px; font-weight:700; color:#92400e;
}
.TSellerProfile .sp-vac-texto span{
    display:block; margin-top:3px;
    font-size:13.5px; line-height:1.6; color:#b45309;
}

/* La fecha de vuelta, en su propia píldora: es el único dato que el comprador
   necesita para decidir si esperar, y suelto dentro del párrafo se pierde. */
.TSellerProfile .sp-vac-cuando{
    flex:0 0 auto;
    align-self:center;
    padding:6px 13px;
    border-radius:999px;
    background:#fef3c7; border:1px solid #fcd34d;
    font-size:12.5px; font-weight:700; color:#92400e;
    white-space:nowrap;
}

@media (max-width:720px){
    .TSellerProfile .sp-vacaciones{ flex-wrap:wrap; }
    .TSellerProfile .sp-vac-cuando{ margin-left:46px; align-self:flex-start; }
}

/* `[hidden]` sólo vale `display:none` en la hoja del navegador y pierde contra
   la regla de `display:flex` de arriba: sin esto, el aviso sale SIEMPRE, vacío
   y en todos los perfiles. */
.TSellerProfile .sp-vacaciones[hidden],
.TSellerProfile .sp-vac-cuando[hidden]{ display:none !important; }

.TSellerProfile .sp-cab{ display:grid; grid-template-columns:minmax(0,1fr) 600px;
                         gap:28px; align-items:start; padding-bottom:20px; }

.TSellerProfile .sp-cab-id{ display:flex; gap:22px; margin-top:-84px; }

/* El avatar monta sobre la portada: es lo que ata la foto de la finca con quien
   la lleva. El aro blanco lo separa de cualquier fondo. */
.TSellerProfile .sp-avatar{ flex:0 0 auto; position:relative; width:170px; height:170px;
                            border-radius:50%; overflow:hidden; border:5px solid #fff;
                            box-shadow:0 6px 20px rgba(20,40,25,.18);
                            background:var(--sd-verde-claro); display:flex;
                            align-items:center; justify-content:center; }
.TSellerProfile .sp-avatar img{ width:100%; height:100%; object-fit:cover; }
/* Sin logo, su inicial: un círculo con letra se lee como una identidad y un
   hueco gris, no. */
.TSellerProfile .sp-avatar b{ font-size:56px; font-weight:800; color:#6f9c74; }

/* TODO EL TEXTO EN LA SEGUNDA COLUMNA del flex, para que nombre, rol, lema,
   meta y píldoras arranquen en la misma vertical. Regla de alineación del
   proyecto: nada de compensar el avatar con `margin-left`, que se acerca pero
   no cuadra y deja cada línea en una vertical distinta. */
.TSellerProfile .sp-cab-txt{ flex:1; min-width:0; padding-top:92px; }

.TSellerProfile .sp-nombre{ display:flex; align-items:center; gap:9px; }
.TSellerProfile .sp-nombre h1{ margin:0; font-size:30px; font-weight:800;
                               letter-spacing:-.4px; line-height:1.1; color:var(--sd-tinta); }

/* EL SELLO VERIFICADO ES UNA IMAGEN, y la regla se escribe con `img`:
   `.sd img{display:block}` (0,1,1) le gana a una clase sola y el sello se iba a
   su propia línea. Mismo mordisco documentado en `.sd-card-sello`. */
.TSellerProfile img.sp-check{ display:inline-block; width:22px; height:22px;
                              object-fit:contain; flex:0 0 auto; }

.TSellerProfile .sp-rol{ display:flex; align-items:center; gap:6px; margin:7px 0 0;
                         font-size:13.5px; font-weight:700; color:var(--sd-verde); }
.TSellerProfile img.sp-rol-check{ display:inline-block; width:15px; height:15px; object-fit:contain; }

.TSellerProfile .sp-lema{ margin:8px 0 0; font-size:13.5px; color:var(--sd-suave); }

/* Separadores de verdad (una raya) y no puntos medios: son hechos de naturaleza
   distinta --dónde, desde cuándo, cómo cultiva-- y con puntos se leen como una
   enumeración de lo mismo. */
.TSellerProfile .sp-meta{ display:flex; flex-wrap:wrap; align-items:center; gap:10px 14px; margin-top:14px; }
.TSellerProfile .sp-meta span{ display:inline-flex; align-items:center; gap:6px;
                               font-size:12.5px; color:var(--sd-texto); }
.TSellerProfile .sp-meta span iconify-icon{ font-size:14px; color:var(--sd-tenue); }
.TSellerProfile .sp-meta i{ width:1px; height:14px; background:var(--sd-borde); }

/* Las píldoras del perfil son NEUTRAS, no las verdes del directorio: aquí
   conviven con la botonera y la franja de cifras, y en verde competían con el
   botón principal. Muestreado del PNG: fondo #edf2ee, texto #5c6a62. */
.TSellerProfile .sp-pills{ display:flex; flex-wrap:wrap; gap:8px; margin-top:14px; }
.TSellerProfile .sp-pills span{ font-size:11.5px; font-weight:600; border-radius:99px;
                                padding:5px 13px; background:#edf2ee; color:#5c6a62;
                                border:1px solid var(--sd-borde); }

/* ── LA OPERATIVA ──────────────────────────────────────────────────
   Los botones van ARRIBA y a la altura del nombre porque son la razón de estar
   aquí: quien abre un perfil ya ha decidido mirar a este, y lo que le falta es
   cómo empezar. */
.TSellerProfile .sp-cab-ops{ padding-top:14px; display:flex; flex-direction:column; gap:14px; }

/* NO MIDEN LO MISMO, y no puede ser de otra manera: los rótulos van de seis
   letras a veintiuna, y a partes iguales el más largo se sale de su caja. */
.TSellerProfile .sp-botones{ display:flex; flex-wrap:wrap; gap:10px; }
.TSellerProfile .sp-botones .sd-btn{ flex:1 1 auto; height:42px; padding:0 14px;
                                     font-size:12.5px; gap:6px; }
.TSellerProfile .sp-botones .sd-btn iconify-icon{ font-size:15px; }

/* SIGUIENDO SE QUEDA EN PANTALLA, no desaparece: es la única forma de dejar de
   seguir, y un botón que se esconde al pulsarlo obliga a buscar en ajustes lo
   que se apagó con un clic. Se distingue por el corazón lleno y el fondo, no
   por el texto solo. */
/* EL `fill:currentColor` SOBRE EL `<iconify-icon>` NO PINTABA NADA, y estuvo
   escrito aquí: el SVG de Lucide trae `fill="none"` como ATRIBUTO en su propio
   trazado --y un atributo de presentación gana a un valor heredado-- además de
   vivir en su shadow DOM, donde no llega ningún selector. Ahora el corazón se
   dibuja como SVG propio (`_corazon()`), con el trazado exacto de
   `lucide:heart`, para poder decidir si se rellena. */
.TSellerProfile .sp-corazon{
    width: 1em;
    height: 1em;
    flex: 0 0 auto;
    display: inline-block;
    vertical-align: -0.125em;
}

.TSellerProfile .sp-corazon path{
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
}

/* RELLENO Y DE COLOR cuando ya se sigue. El rojo es el que se espera de un
   corazón marcado; el trazo va del mismo tono para que no quede un borde de
   otro color alrededor del relleno. */
.TSellerProfile .sp-corazon.es-lleno path{ fill: #e11d48; stroke: #e11d48; }
.TSellerProfile .sp-via.sp-js-seguir{ cursor:pointer; }

/* LA FRANJA DE CIFRAS VA ANTES QUE EL DETALLE, y a propósito: es lo único que
   el vendedor NO puede escribirse --sale de sus pedidos, de sus valoraciones y
   de su alta--, así que leerla primero es lo que pone la medida al resto del
   perfil, que sí lo escribe él. */
.TSellerProfile .sp-cifras{ display:grid; grid-auto-flow:column; grid-auto-columns:minmax(0,1fr);
                            background:#fff; border:1px solid var(--sd-borde);
                            border-radius:var(--sd-radio); box-shadow:var(--sd-sombra);
                            padding:13px 4px; }
.TSellerProfile .sp-cifra{ text-align:center; padding:0 6px;
                           border-right:1px solid var(--sd-borde); }
.TSellerProfile .sp-cifra:last-child{ border-right:0; }
.TSellerProfile .sp-cifra b{ display:flex; align-items:center; justify-content:center; gap:4px;
                             font-size:16px; font-weight:800; color:var(--sd-tinta); white-space:nowrap; }
.TSellerProfile .sp-cifra b iconify-icon{ font-size:15px; color:var(--sd-verde); }
.TSellerProfile .sp-cifra small{ display:block; margin-top:3px; font-size:10px; color:var(--sd-suave); }

/* LAS ESTRELLAS, MACIZAS. Ver el `<symbol>` de la plantilla. */
.TSellerProfile .sp-s{ width:15px; height:15px; fill:var(--sd-oro); flex:0 0 auto; }
.TSellerProfile .sp-s.mini{ width:11px; height:11px; }

/* ── PESTAÑAS ──────────────────────────────────────────────────────
   Las pinta TProductTabs con sus clases `pt-*`; aquí solo se les da el aspecto
   de esta pantalla. */
.TSellerProfile .pt-tabs{ display:flex; gap:4px; border-bottom:1px solid var(--sd-borde);
                          overflow-x:auto; scrollbar-width:none; }
.TSellerProfile .pt-tabs::-webkit-scrollbar{ display:none; }
.TSellerProfile .pt-tab{ display:inline-flex; align-items:center; gap:7px; padding:14px 16px;
                         font-size:13px; font-weight:600; color:var(--sd-suave); white-space:nowrap;
                         background:none; border:0; border-bottom:2px solid transparent;
                         cursor:pointer; font-family:inherit; }
.TSellerProfile .pt-tab iconify-icon{ font-size:15px; }
.TSellerProfile .pt-tab:hover{ color:var(--sd-tinta); }
.TSellerProfile .pt-tab.is-on{ color:var(--sd-verde); border-bottom-color:var(--sd-verde); font-weight:700; }
/* EL CUERPO PROPIO DE TProductTabs, FUERA. Aquí se le da un `bodyTarget` --las
   secciones son tarjetas sueltas debajo de la barra, no el interior de una
   caja-- así que su `.pt-body` se queda vacío... y con su borde y su relleno
   puestos: salía un recuadro en blanco de dos centímetros entre las pestañas y
   la primera tarjeta. */
.TSellerProfile .pt-body{ display:none; }

/* ── LAS REJILLAS DE TARJETAS ──────────────────────────────────────
   La de tres es la fila de arriba --sobre el vendedor, productos, opiniones--
   y la de cuatro la de abajo. Las columnas NO son iguales: la de envíos lleva
   cuatro filas y un mapa, y la de contacto tres puertas y poco más.
   Proporciones tomadas de la maqueta. */
.TSellerProfile .sp-rej{ display:grid; gap:16px; margin:20px 0; align-items:start; }
.TSellerProfile .sp-rej-3{ grid-template-columns:minmax(0,1fr) minmax(0,1.05fr) minmax(0,1fr); }
.TSellerProfile .sp-rej-4{ grid-template-columns:1.55fr 1.05fr 1.15fr .95fr; }
.TSellerProfile .sp-rej-2{ grid-template-columns:repeat(2,minmax(0,1fr)); }
/* La pestaña de opiniones: la valoración general a la izquierda --que se mira
   una vez y se queda de referencia-- y las opiniones a la derecha. La columna
   de la nota no crece: es una ficha de cinco líneas y a mitad de pantalla queda
   un reparto de barras de medio metro. */
.TSellerProfile .sp-rej-op{ grid-template-columns:320px minmax(0,1fr); }
.TSellerProfile .sp-rej-1{ grid-template-columns:minmax(0,1fr); }

/* LAS TARJETAS DE UNA FILA MIDEN LO MISMO --el `height:100%` de una rejilla--,
   así que la que tiene menos contenido acaba con un hueco abajo. En columna,
   su último bloque puede bajarse con `margin-top:auto` y el hueco se reparte
   donde no se nota. El `flex:0 0 auto` de los hijos es lo que impide que, de
   paso, se compriman las fotos para rellenarlo. */
.TSellerProfile .sp-card{ background:#fff; border:1px solid var(--sd-borde);
                          border-radius:var(--sd-radio); box-shadow:var(--sd-sombra);
                          padding:18px; height:100%; display:flex; flex-direction:column; }
.TSellerProfile .sp-card > *{ flex:0 0 auto; }
.TSellerProfile .sp-card-cab{ display:flex; align-items:center; gap:8px; margin-bottom:14px; }
.TSellerProfile .sp-card-cab h3{ margin:0; font-size:14.5px; font-weight:700; color:var(--sd-tinta);
                                 flex:1; min-width:0; }
.TSellerProfile .sp-card-cab a{ display:inline-flex; align-items:center; gap:5px; font-size:11.5px;
                                font-weight:700; color:var(--sd-verde); white-space:nowrap; cursor:pointer; }

/* ── SOBRE EL VENDEDOR ─────────────────────────────────────────────
   Icono en su columna y TODO el texto en la segunda: la regla de alineación
   del proyecto otra vez. */
.TSellerProfile .sp-bio{ font-size:12.5px; color:var(--sd-texto); margin:0 0 12px; }
.TSellerProfile .sp-bio p{ margin:0 0 8px; }
.TSellerProfile .sp-valores{ display:flex; flex-direction:column; gap:9px; }
.TSellerProfile .sp-valor{ display:flex; align-items:flex-start; gap:8px; }
.TSellerProfile .sp-valor iconify-icon{ flex:0 0 auto; font-size:15px; color:var(--sd-verde); margin-top:1px; }
.TSellerProfile .sp-valor div{ flex:1; min-width:0; }
.TSellerProfile .sp-valor b{ display:block; font-size:12px; color:var(--sd-tinta); }
.TSellerProfile .sp-valor small{ display:block; font-size:11px; color:var(--sd-suave); }
.TSellerProfile .sp-foto{ margin-top:14px; border-radius:10px; overflow:hidden; aspect-ratio:16/10; }
.TSellerProfile .sp-foto img{ width:100%; height:100%; object-fit:cover; }

/* ── PRODUCTOS ─────────────────────────────────────────────────────
   Cuatro en dos filas y no cuatro en una tira: a un cuarto de columna cada uno,
   el nombre cabía en dos palabras y el precio se leía a lupa. */
/* LA REJILLA ES DE LA PANTALLA; la tarjeta la pinta `TProductCard` y su
   aspecto sale de su hoja. Aquí sólo se dice cuántas caben por fila.

   Cuatro por fila con la tarjeta completa se aprieta --lleva valoración, pedido
   mínimo y su botón--, así que se baja a tres. */
/* LA MISMA REJILLA QUE EL CATÁLOGO, y con el mismo mínimo: la tarjeta es
   `TProductCard` en los dos sitios, así que también tiene que MEDIR lo mismo.
   Con tres columnas fijas, aquí salían fichas de 400px y la misma ficha se veía
   más grande en el perfil del agricultor que en el escaparate. El suelo lo
   declara la propia tarjeta (`--tf-card-min`, en `TProductCard.css`).

   `auto-fill` Y NO `auto-fit`, y el tope en `--tf-card-max` y no en `1fr`: un
   agricultor con un único producto destacado lo enseñaba a todo lo ancho del
   panel -- mismo fallo que en `/tienda`, ver la nota larga en
   `TStorefront.css`. */
.TSellerProfile .sp-rejilla-prods{
    display:grid;
    grid-template-columns:repeat(auto-fill, minmax(min(100%, var(--tf-card-min, 260px)), var(--tf-card-max, 350px)));
    gap:var(--tf-card-gap, 20px);
}
/* La de OFERTA en verde, que es la única que informa de un precio. Las demás
   son sellos que declara el vendedor y no pueden pesar lo mismo. */

/* El hueco de la foto que no hay: el icono de la casa sobre su verde. Un
   rectángulo gris se lee como una imagen que no ha cargado. */

/* ── OPINIONES ─────────────────────────────────────────────────────
   La nota a la izquierda y el REPARTO a la derecha: la media sola no dice si
   son cien cincos o mitad unos y mitad cincos. */
.TSellerProfile .sp-op-top{ display:grid; grid-template-columns:auto minmax(0,1fr); gap:18px; align-items:center; }
.TSellerProfile .sp-op-nota b{ display:block; font-size:34px; font-weight:800;
                               color:var(--sd-tinta); line-height:1; }
.TSellerProfile .sp-op-estrellas{ display:flex; gap:2px; margin-top:6px; }
.TSellerProfile .sp-op-nota small{ display:block; margin-top:6px; font-size:11px; color:var(--sd-suave); }
.TSellerProfile .sp-barras{ display:flex; flex-direction:column; gap:5px; }
.TSellerProfile .sp-barra{ display:flex; align-items:center; gap:7px; font-size:10.5px; color:var(--sd-suave); }
.TSellerProfile .sp-barra em{ font-style:normal; display:inline-flex; align-items:center; gap:2px; color:var(--sd-tinta); }
.TSellerProfile .sp-barra i{ flex:1; height:6px; border-radius:99px; background:var(--sd-crema);
                             border:1px solid var(--sd-borde); overflow:hidden; }
.TSellerProfile .sp-barra i b{ display:block; height:100%; background:var(--sd-verde); }
.TSellerProfile .sp-barra u{ width:34px; text-align:right; text-decoration:none; }

.TSellerProfile .sp-op-lista{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px;
                              margin-top:16px; padding-top:14px; border-top:1px solid var(--sd-borde); }
.TSellerProfile .sp-op-lista.una{ grid-template-columns:minmax(0,1fr); }
.TSellerProfile .sp-op{ min-width:0; }
.TSellerProfile .sp-op-quien{ display:flex; align-items:center; gap:8px; }
.TSellerProfile .sp-op-av{ flex:0 0 auto; width:26px; height:26px; border-radius:50%;
                           background:var(--sd-verde-claro); border:1px solid var(--sd-verde-borde);
                           display:flex; align-items:center; justify-content:center;
                           color:var(--sd-verde-oscuro); font-size:11px; font-weight:800; }
.TSellerProfile .sp-op-quien div{ flex:1; min-width:0; }
.TSellerProfile .sp-op-quien b{ display:block; font-size:12px; color:var(--sd-tinta); }
.TSellerProfile .sp-op-quien span{ display:flex; gap:1px; }
.TSellerProfile .sp-op-quien small{ font-size:10.5px; color:var(--sd-tenue); white-space:nowrap; }
.TSellerProfile .sp-op p{ margin:8px 0 0; font-size:11.5px; color:var(--sd-texto); }
/* El sello de «compra verificada» pesa MÁS que el texto de la opinión: es lo
   que separa una valoración de un comentario. */
.TSellerProfile .sp-op-ok{ display:inline-flex; align-items:center; gap:4px; margin-top:6px;
                           font-size:10px; font-weight:700; color:var(--sd-verde-oscuro); }

/* ── LA PESTAÑA DE OPINIONES ───────────────────────────────────────
   La nota, en grande y sola: es el número por el que se entra aquí.

   `.sp-card-nota` pegajosa se ha ido: la pestaña la pinta `TReviewList` desde
   que las opiniones se unificaron con las de la ficha de producto, y esa clase
   no la lleva ya ningún elemento. Quien se pega ahora es `.rl-lado`, en la
   hoja de ese componente, y con el tope medido de la cabecera. */
.TSellerProfile .sp-nota-grande{ margin-bottom:16px; }
.TSellerProfile .sp-nota-grande b{ display:block; font-size:46px; font-weight:800;
                                   color:var(--sd-tinta); line-height:1; }
.TSellerProfile .sp-nota-grande small{ display:block; margin-top:7px; font-size:11.5px; color:var(--sd-suave); }

/* Cada opinión, separada por una línea y no por una caja: son de la misma
   tarjeta y encajonarlas una a una la convierte en una lista de listas. */
.TSellerProfile .sp-opiniones{ display:flex; flex-direction:column; }
.TSellerProfile .sp-opinion{ padding:16px 0; border-top:1px solid var(--sd-borde); }
.TSellerProfile .sp-opinion:first-child{ padding-top:0; border-top:0; }
.TSellerProfile .sp-opinion p{ margin:8px 0 0; font-size:12.5px; color:var(--sd-texto); }
.TSellerProfile .sp-op-estrellas.mini{ margin-top:0; }
.TSellerProfile .sp-op-fotos{ display:flex; flex-wrap:wrap; gap:8px; margin-top:10px; }
.TSellerProfile .sp-op-fotos img{ width:104px; height:78px; object-fit:cover; border-radius:8px;
                                  border:1px solid var(--sd-borde); }

/* La cabecera de la opinión: nota, titular y el sello, en una línea que
   envuelve. El titular en tinta y con cuerpo, que es lo que se lee primero. */
.TSellerProfile .sp-opinion .sp-op-cab{ display:flex; align-items:center; flex-wrap:wrap;
                                        gap:8px; margin-top:10px; }
.TSellerProfile .sp-opinion .sp-op-cab b{ font-size:13px; color:var(--sd-tinta); }

/* LAS ESTRELLAS DE LA FICHA NO SON LAS DEL REPARTO. `.mini` son 11px, que es
   la medida buena dentro de las barras --ahí la estrella acompaña a un número--
   pero al lado de un titular de 13px se leían como una pelusa: la nota es lo
   primero que se mira de una opinión y tiene que pesar como tal. */
.TSellerProfile .sp-opinion .sp-op-estrellas{ gap:3px; }
.TSellerProfile .sp-opinion .sp-op-estrellas .sp-s.mini{ width:14px; height:14px; }

/* EL SELLO, CENTRADO CON EL TITULAR Y CON SU ICONO A MEDIDA.
   Dos cosas lo torcían: el `margin-top:6px` que trae de la tarjeta compacta de
   Inicio --allí va debajo del texto, aquí en la misma línea-- y que
   `<iconify-icon>` NO hereda el tamaño de letra de su caja: salía a los 20px de
   fábrica junto a un texto de 10px, así que el sello era casi todo icono y
   empujaba la línea hacia abajo. El tamaño se declara en el icono, siempre. */
.TSellerProfile .sp-opinion .sp-op-cab .sp-op-ok{ margin-top:0; font-size:10.5px; line-height:1; }
.TSellerProfile .sp-opinion .sp-op-cab .sp-op-ok iconify-icon{ font-size:13px; flex:0 0 auto; }
.TSellerProfile .sp-op-id{ flex:1; min-width:0; }

/* EL ARTÍCULO VALORADO, a todo el ancho y antes del texto. */
.TSellerProfile .sp-op-prod{ display:flex; align-items:center; gap:9px; margin-top:10px;
                             padding:8px 10px; border:1px solid var(--sd-borde);
                             border-radius:10px; background:var(--sd-fondo, #fafaf7); }
.TSellerProfile .sp-op-prod-foto{ flex:0 0 auto; width:34px; height:34px; border-radius:7px;
                                  overflow:hidden; display:flex; align-items:center;
                                  justify-content:center; background:#fff; color:var(--sd-tenue);
                                  font-size:16px; }
.TSellerProfile .sp-op-prod-foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.TSellerProfile .sp-op-prod-txt{ flex:1; min-width:0; }
.TSellerProfile .sp-op-prod-txt b{ display:block; font-size:12px; color:var(--sd-tinta);
                                   overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.TSellerProfile .sp-op-prod-txt small{ display:block; font-size:10.5px; color:var(--sd-tenue); }

/* LA RESPUESTA DEL AGRICULTOR, metida y con su barra verde: se ve de un
   vistazo que cuelga de la opinión de arriba y no es otra opinión más. */
.TSellerProfile .sp-op-resp{ display:flex; gap:9px; margin:10px 0 0 14px; padding:11px 13px;
                             background:var(--sd-verde-claro); border-left:2px solid var(--sd-verde);
                             border-radius:0 10px 10px 0; }
.TSellerProfile .sp-op-resp-av{ flex:0 0 auto; width:28px; height:28px; border-radius:50%;
                                overflow:hidden; display:flex; align-items:center;
                                justify-content:center; background:#fff;
                                border:1px solid var(--sd-verde-borde);
                                color:var(--sd-verde-oscuro); font-size:11px; font-weight:800; }
.TSellerProfile .sp-op-resp-av img{ width:100%; height:100%; object-fit:cover; display:block; }
.TSellerProfile .sp-op-resp > div{ flex:1; min-width:0; }
.TSellerProfile .sp-op-resp-cab{ display:flex; align-items:center; gap:8px; }
.TSellerProfile .sp-op-resp-cab b{ font-size:12px; color:var(--sd-verde-oscuro); }
.TSellerProfile .sp-op-resp-cab small{ font-size:10.5px; color:var(--sd-tenue); }
.TSellerProfile .sp-opinion .sp-op-resp p{ margin:3px 0 0; font-size:12px; }

/* ── LAS ACCIONES DEL HILO: ENLACES, NO BOTONES ────────────────────
   Debajo de lo que alguien ha escrito, un botón macizo compite con el texto y
   convierte la conversación en un formulario. Y solo salen para las dos partes
   del hilo: a un visitante se le quitan enteras desde el JS. */
.TSellerProfile .sp-op-acciones{ display:flex; align-items:center; gap:16px; margin-top:8px; }
.TSellerProfile .sp-accion{
    display:inline-flex; align-items:center; gap:5px;
    background:none; border:0; padding:2px 0;
    font-family:inherit; font-size:11.5px; font-weight:700;
    color:var(--sd-suave); cursor:pointer;
}
.TSellerProfile .sp-accion:hover{ color:var(--sd-tinta); text-decoration:underline; }
.TSellerProfile .sp-accion[disabled]{ opacity:.5; cursor:default; text-decoration:none; }
/* El tamaño se declara EN el icono: `iconify-icon` no hereda el de su caja. */
.TSellerProfile .sp-accion iconify-icon{ font-size:14px; flex:0 0 auto; }

/* EJECUTADO: color propio y su contador. Sin esto, al volver a la página no se
   sabe si se llegó a dar el voto, y se pulsa otra vez quitándolo. */
.TSellerProfile .sp-accion.on{ color:var(--sd-verde-oscuro); }
.TSellerProfile .sp-accion.on:hover{ color:var(--sd-verde-oscuro); }
.TSellerProfile .sp-accion.on iconify-icon{ color:var(--sd-verde); }
.TSellerProfile .sp-accion em{
    font-style:normal; font-size:10.5px;
    color:var(--sd-suave); background:var(--sd-crema, #f7faf6);
    border-radius:9px; padding:1px 6px;
}
.TSellerProfile .sp-accion.on em{ background:var(--sd-verde-claro); color:var(--sd-verde-oscuro); }
.TSellerProfile .sp-accion.peligro:hover,
.TSellerProfile .sp-accion.peligro:hover iconify-icon{ color:#b42318; }

/* ── CONTESTAR, EN LA PROPIA FICHA ─────────────────────────────────
   Se contesta mirando lo que dijo el otro: en un overlay hay que cerrarlo para
   volver a leerlo. */
.TSellerProfile .sp-contestar{ margin:10px 0 0 14px; }
/* EL ALTO VA AQUÍ Y NO EN `rows`: una regla global de la hoja de arranque
   (`.whiteWindow input, textarea`) le pone `height:22px` a TODO textarea del
   sitio, y la caja salía como una línea con el texto cortado. */
.TSellerProfile .sp-contestar textarea{
    width:100%; height:auto; min-height:74px;
    border:1px solid var(--sd-borde); border-radius:10px;
    padding:9px 11px;
    font-family:inherit; font-size:12.5px; line-height:1.5;
    color:var(--sd-tinta); resize:vertical;
}
.TSellerProfile .sp-contestar textarea:focus{ outline:none; border-color:var(--sd-verde); }
.TSellerProfile .sp-adjuntos{ margin-top:9px; }
.TSellerProfile .sp-contestar-pie{
    display:flex; align-items:center; justify-content:flex-end; gap:8px;
    margin-top:8px; flex-wrap:wrap;
}
.TSellerProfile .sp-gracia{ flex:1; min-width:0; font-size:10.5px;
                            color:var(--sd-tenue); line-height:1.4; }

/* Las fotos de una respuesta, más pequeñas que las de la opinión: acompañan,
   no son la noticia. */
.TSellerProfile .sp-op-resp .sp-op-fotos img{ width:84px; height:64px; }

/* ── EL RESUMEN DE REPUTACIÓN ──────────────────────────────────────
   Encima de la nota, la primera tarjeta de la columna estrecha: es lo primero
   que se pregunta quien no conoce al agricultor, y estaba a un clic y siete
   pestañas de distancia.

   ESTAS REGLAS SON LAS DE LA PESTAÑA «INICIO». En «Opiniones» la misma
   tarjeta la pinta `TReviewList` con sus clases `rl-*` y su propia hoja: son
   las mismas cifras (`RatingCard::reputacion()`) y el mismo aspecto, escrito
   dos veces porque los dos componentes son independientes. Si se toca el
   aspecto aquí, hay que mirar allí. */
.TSellerProfile .sp-rep-rejilla{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }
.TSellerProfile .sp-rep{ display:flex; gap:9px; align-items:flex-start; }
.TSellerProfile .sp-rep-ico{ flex:0 0 auto; width:28px; height:28px; border-radius:8px;
                             display:flex; align-items:center; justify-content:center; }
/* EL TAMAÑO SE LE DICE AL ICONO, NO A SU CAJA: `iconify-icon` no hereda el
   `font-size`, así que con la medida solo en `.sp-rep-ico` los cuatro salían a
   los 20px de fábrica y se comían el recuadro de 28. */
.TSellerProfile .sp-rep-ico iconify-icon{ font-size:15px; }
.TSellerProfile .sp-rep-ico.verde{ background:var(--sd-verde-claro); color:var(--sd-verde-oscuro); }
.TSellerProfile .sp-rep-ico.rojo { background:#fdecec; color:#b42318; }
.TSellerProfile .sp-rep-ico.azul { background:#eaf1fd; color:#175cd3; }
.TSellerProfile .sp-rep-ico.ambar{ background:#fdf3e2; color:#b54708; }
.TSellerProfile .sp-rep > div{ flex:1; min-width:0; }
.TSellerProfile .sp-rep b{ display:block; font-size:17px; font-weight:800; color:var(--sd-tinta);
                           line-height:1.15; }
.TSellerProfile .sp-rep small{ display:block; font-size:10.5px; color:var(--sd-suave);
                               margin-top:2px; }
.TSellerProfile .sp-rep-pie{ margin:12px 0 0; font-size:10.5px; color:var(--sd-tenue);
                             line-height:1.5; }

/* Muy estrecho: dos por fila aprietan la cifra contra su icono. */
@media (max-width: 400px){
    .TSellerProfile .sp-rep-rejilla{ grid-template-columns:minmax(0,1fr); }
}

/* ── LA FRANJA DE CIFRAS DEL CUERPO ────────────────────────────────
   A todo el ancho y sin cajas por dentro: es UNA lectura, no ocho tarjetas. */
.TSellerProfile .sp-franja{ display:grid; grid-auto-flow:column; grid-auto-columns:minmax(0,1fr);
                            background:#fff; border:1px solid var(--sd-borde);
                            border-radius:var(--sd-radio); box-shadow:var(--sd-sombra);
                            padding:16px 8px; margin:20px 0; }
.TSellerProfile .sp-dato{ display:flex; align-items:flex-start; gap:9px; padding:0 10px; }
.TSellerProfile .sp-dato > iconify-icon{ flex:0 0 auto; font-size:18px; color:var(--sd-verde); margin-top:2px; }
.TSellerProfile .sp-dato div{ flex:1; min-width:0; }
.TSellerProfile .sp-dato b{ display:block; font-size:15px; font-weight:800; color:var(--sd-tinta); }
.TSellerProfile .sp-dato small{ display:block; font-size:10.5px; color:var(--sd-suave); }

/* ── FILAS DE ICONO + TEXTO ────────────────────────────────────────
   La forma que se repite en envíos, contacto y ubicación. */
.TSellerProfile .sp-filas{ display:flex; flex-direction:column; gap:12px; }
.TSellerProfile .sp-fila{ display:flex; align-items:flex-start; gap:9px; }
.TSellerProfile .sp-fila > iconify-icon{ flex:0 0 auto; font-size:16px; color:var(--sd-verde); margin-top:2px; }
.TSellerProfile .sp-fila div{ flex:1; min-width:0; }
.TSellerProfile .sp-fila b{ display:block; font-size:12px; color:var(--sd-tinta); }
.TSellerProfile .sp-fila small{ display:block; margin-top:2px; font-size:11px; color:var(--sd-suave); }
.TSellerProfile .sp-fila a{ color:var(--sd-verde); font-weight:700; }

/* ── ENVÍOS: las filas y el mapa, uno al lado del otro ─────────────
   Apilados, esta tarjeta medía el doble que las tres de su fila y las estiraba
   a todas. El SVG es el MISMO que ya pintaba el perfil anterior, con los
   vértices compartidos entre áreas vecinas --que es lo que evita las rendijas
   blancas-- y los mismos cuatro niveles. */
.TSellerProfile .sp-envios{ display:grid; grid-template-columns:minmax(0,1.35fr) minmax(0,1fr); gap:14px; }
.TSellerProfile .sp-mapa{ width:100%; height:auto; }
.TSellerProfile .sp-rg{ fill:#dfe8e1; stroke:#fff; stroke-width:2; }
.TSellerProfile .sp-lv-1{ fill:#0f7a3c; }
.TSellerProfile .sp-lv-2{ fill:#4da96f; }
.TSellerProfile .sp-lv-3{ fill:#a8d3b5; }
.TSellerProfile .sp-lv-4{ fill:#e6ebe6; }
.TSellerProfile .sp-out{ fill:#eef1ee; }
.TSellerProfile .sp-inset rect{ fill:none; stroke:var(--sd-borde); stroke-width:2; }
.TSellerProfile .sp-leyenda{ display:flex; flex-direction:column; gap:5px; margin-top:6px; }
.TSellerProfile .sp-leyenda span{ display:flex; align-items:center; gap:7px; font-size:10.5px; color:var(--sd-suave); }
.TSellerProfile .sp-leyenda i{ width:9px; height:9px; border-radius:50%; flex:0 0 auto; }

/* LA PESTAÑA «ENVÍOS E INFORMACIÓN» (`view/shipping.php`, D1 13/10/2026).
   Sus tarjetas, separadas como las de las demás pestañas; la tabla de tarifas
   es la del sitio (`TDataTable`, piel `tdt--escaparate`) y su hoja es la de
   Tbasic: aquí solo el sitio que ocupa. */
.TSellerProfile .sp-card + .sp-card--sig{ margin-top:16px; }
.TSellerProfile .sp-envios-tabla{ display:flex; flex-direction:column; gap:12px; min-width:0; }
.TSellerProfile .sp-envios-nota{ margin:0; }

/* ── CERTIFICACIONES ───────────────────────────────────────────────
   Sin «Vigente»: ese sello lo concede la plataforma tras ver el documento, y
   hoy esto es texto que teclea el propio vendedor. Ver el aviso del pie de la
   tarjeta, que lo dice en la propia pantalla en vez de dejarlo en un .md. */
.TSellerProfile .sp-certs{ display:flex; flex-direction:column; gap:12px; }
.TSellerProfile .sp-cert{ display:flex; align-items:center; gap:10px; }
.TSellerProfile .sp-cert-logo{ flex:0 0 auto; width:34px; height:34px; border-radius:8px;
                               background:var(--sd-crema); border:1px solid var(--sd-borde);
                               display:flex; align-items:center; justify-content:center; }
.TSellerProfile .sp-cert-logo iconify-icon{ font-size:18px; color:var(--sd-verde); }
.TSellerProfile .sp-cert div{ flex:1; min-width:0; }
.TSellerProfile .sp-cert b{ display:block; font-size:11.5px; color:var(--sd-tinta); }
.TSellerProfile .sp-cert small{ display:block; font-size:10.5px; color:var(--sd-suave); }
.TSellerProfile .sp-declarada{ flex:0 0 auto; font-size:10px; font-weight:700; border-radius:99px;
                               padding:3px 9px; background:var(--sd-crema); color:var(--sd-suave);
                               border:1px solid var(--sd-borde); }

.TSellerProfile .sp-aviso{ display:flex; align-items:flex-start; gap:8px; margin-top:12px; padding:10px;
                           border-radius:9px; background:var(--sp-aviso-fondo);
                           border:1px solid var(--sd-verde-borde); }
.TSellerProfile .sp-aviso iconify-icon{ flex:0 0 auto; font-size:15px; color:var(--sd-verde); margin-top:1px; }
.TSellerProfile .sp-aviso small{ flex:1; min-width:0; font-size:10.5px; color:var(--sd-verde-oscuro); }

/* ── CONTACTO ──────────────────────────────────────────────────────
   Ni teléfono, ni correo, ni WhatsApp, ni dirección de reparto: regla dura de
   CLAUDE.md, y la razón es económica antes que normativa. Quien llega aquí ya
   está convencido, así que es donde más cara sale una vía de salida: con ella
   se van la comisión, la logística, el cobro protegido y la trazabilidad. */
.TSellerProfile .sp-vias{ display:flex; flex-direction:column; gap:2px; }
.TSellerProfile .sp-via{ display:flex; align-items:flex-start; gap:10px; padding:10px 8px;
                         border-radius:9px; cursor:pointer; }
.TSellerProfile .sp-via:hover{ background:var(--sd-crema); }
.TSellerProfile .sp-via > iconify-icon{ flex:0 0 auto; font-size:17px; color:var(--sd-verde); margin-top:2px; }
.TSellerProfile .sp-via div{ flex:1; min-width:0; }
.TSellerProfile .sp-via b{ display:block; font-size:12.5px; color:var(--sd-tinta); }
.TSellerProfile .sp-via small{ display:block; margin-top:1px; font-size:10.5px; color:var(--sd-suave); }

.TSellerProfile .sp-donde{ margin-top:10px; padding-top:12px; border-top:1px solid var(--sd-borde); }
.TSellerProfile .sp-osm{ display:block; width:100%; height:150px; border:0; border-radius:9px;
                         margin-top:9px; background:var(--sd-verde-claro); }

/* ── HISTORIA ──────────────────────────────────────────────────────
   Los hitos en fila y la trayectoria en columna, que es como se leen: unos son
   cifras y la otra es un relato. */
.TSellerProfile .sp-hitos{ display:grid; grid-auto-flow:column; grid-auto-columns:minmax(0,1fr); gap:14px; }
.TSellerProfile .sp-hito{ text-align:center; padding:14px 10px; border-radius:10px;
                          background:var(--sd-crema); border:1px solid var(--sd-borde); }
.TSellerProfile .sp-hito iconify-icon{ font-size:20px; color:var(--sd-verde); }
.TSellerProfile .sp-hito b{ display:block; margin-top:6px; font-size:16px; font-weight:800; color:var(--sd-tinta); }
.TSellerProfile .sp-hito small{ display:block; margin-top:2px; font-size:10.5px; color:var(--sd-suave); }

.TSellerProfile .sp-paso{ display:flex; gap:14px; }
/* La línea de tiempo se dibuja con el borde del año, no con un elemento
   aparte: así no hay nada que alinear a mano cuando un paso crece. */
.TSellerProfile .sp-paso-anyo{ flex:0 0 78px; font-size:13px; font-weight:800; color:var(--sd-verde);
                               border-left:2px solid var(--sd-verde-borde); padding:0 0 22px 14px; }
.TSellerProfile .sp-paso:last-child .sp-paso-anyo{ border-left-color:transparent; }
.TSellerProfile .sp-paso div.sp-paso-txt{ flex:1; min-width:0; padding-bottom:22px; }
.TSellerProfile .sp-paso-txt b{ display:block; font-size:13px; color:var(--sd-tinta); }
.TSellerProfile .sp-paso-txt p{ margin:5px 0 0; font-size:12px; color:var(--sd-texto); }

/* ── FILTROS DE LA PESTAÑA DE PRODUCTOS ────────────────────────────── */
.TSellerProfile .sp-filtros{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px; align-items:center; }
.TSellerProfile .sp-chip{ font-size:11.5px; font-weight:700; border-radius:99px; padding:6px 13px;
                          background:#fff; color:var(--sd-texto); border:1px solid var(--sd-borde); cursor:pointer; }
.TSellerProfile .sp-chip.on{ background:var(--sd-verde); color:#fff; border-color:var(--sd-verde); }
.TSellerProfile .sp-sp{ flex:1; }

/* ── VACÍO ─────────────────────────────────────────────────────────
   Decir «no hay nada» sin decir por qué es un callejón. */
.TSellerProfile .sp-vacio{ text-align:center; padding:34px 20px; color:var(--sd-suave); }
.TSellerProfile .sp-vacio iconify-icon{ font-size:30px; color:var(--sd-tenue); }
.TSellerProfile .sp-vacio b{ display:block; margin-top:10px; font-size:13.5px; color:var(--sd-tinta); }
.TSellerProfile .sp-vacio small{ display:block; margin-top:4px; font-size:11.5px; }

/* ── LOS COMPROMISOS DEL PIE ───────────────────────────────────────
   `.sd-promesas` viene de la hoja común; aquí solo se le da su margen. */
.TSellerProfile .sd-promesas{ margin-top:24px; }

/* ── CORTES ────────────────────────────────────────────────────────── */
@media (max-width:1240px){
    .TSellerProfile .sp-cab{ grid-template-columns:minmax(0,1fr); }
    .TSellerProfile .sp-cab-ops{ padding-top:0; }
    .TSellerProfile .sp-rej-4{ grid-template-columns:repeat(2,minmax(0,1fr)); }
    /* La franja pasa de una fila a dos: en `grid-auto-flow:column` no cabe el
       salto, así que se vuelve a filas explícitas. */
    .TSellerProfile .sp-franja,.TSellerProfile .sp-cifras{ grid-auto-flow:row;
        grid-template-columns:repeat(4,minmax(0,1fr)); gap:16px 0; }
    .TSellerProfile .sp-cifra{ border-right:0; }
}
@media (max-width:1000px){
    .TSellerProfile .sp-rej-3,.TSellerProfile .sp-rej-op{ grid-template-columns:minmax(0,1fr); }
    .TSellerProfile .sp-hitos{ grid-auto-flow:row; grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:760px){
    .TSellerProfile .sp-portada{ height:150px; }
    .TSellerProfile .sp-cab-id{ flex-direction:column; margin-top:-56px; }
    .TSellerProfile .sp-avatar{ width:112px; height:112px; }
    .TSellerProfile .sp-avatar b{ font-size:38px; }
    .TSellerProfile .sp-cab-txt{ padding-top:0; }
    .TSellerProfile .sp-nombre h1{ font-size:24px; }
    .TSellerProfile .sp-botones .sd-btn{ flex:1 1 46%; }
    .TSellerProfile .sp-rej-4,.TSellerProfile .sp-rej-2{ grid-template-columns:minmax(0,1fr); }
    .TSellerProfile .sp-franja,.TSellerProfile .sp-cifras{ grid-template-columns:repeat(2,minmax(0,1fr)); }
    .TSellerProfile .sp-envios{ grid-template-columns:minmax(0,1fr); }
}

/* ════════════════════════════════════════════════════════════════════════
   «INICIO»: COLUMNA ESTRECHA + PRINCIPAL, Y DESTACADOS DEBAJO
   ════════════════════════════════════════════════════════════════════════

   Izquierda estrecha: la nota, los primeros comentarios y dónde está --tres
   cosas de un vistazo--. Derecha ancha: la biografía, que es texto seguido y
   necesita línea larga. Y los productos destacados debajo, a todo lo ancho,
   porque sus tarjetas llevan foto y precio y apretadas no se leen. */
.TSellerProfile .sp-inicio{
    display: grid;
    grid-template-columns: minmax(0, 340px) minmax(0, 1fr);
    gap: 20px;
    align-items: start;
    margin-bottom: 20px;
}

.TSellerProfile .sp-inicio-lado,
.TSellerProfile .sp-inicio-main{ display: flex; flex-direction: column; gap: 20px; min-width: 0; }

/* LA COLUMNA ESTRECHA SE QUEDA PEGADA, como la de «Opiniones» (`.rl-lado`):
   la reputación y la nota son lo que se consulta mientras se lee la biografía
   y se miran los productos, y se iban por arriba al primer scroll.

   El tope, del alto MEDIDO de la cabecera --que va pegada arriba con
   z-index 1000--; con un número a mano la columna se pega por debajo de su
   borde y queda tapada. `align-self` explícito y no heredado del
   `align-items:start` del grid: si el día de mañana alguien lo cambia, una
   columna estirada a la altura de la fila no tiene por dónde deslizarse y el
   `sticky` deja de hacer nada, sin que nada avise. */
.TSellerProfile .sp-inicio-lado{
    position: sticky;
    top: calc(var(--site-cabecera, 118px) + 14px);
    align-self: start;
}

/* En estrecho, una debajo de otra y la principal PRIMERO: en un móvil, quien
   abre un perfil quiere leer quién es antes que su reparto de estrellas. */
/* ── ESTE CORTE NO SE APLICABA NUNCA ──────────────────────────────────
   Estaba escrito con el prefijo `.sp`, y la raíz que pone el marco es
   `.TSellerProfile`: no hay un solo elemento con clase `.sp` en la página, así
   que en un móvil «Inicio» seguía a dos columnas --340px y el resto-- en vez
   de apilarse, y la biografía salía en una tira estrecha. */
@media (max-width: 980px){
    .TSellerProfile .sp-inicio{ grid-template-columns: minmax(0, 1fr); }
    .TSellerProfile .sp-inicio-main{ order: 1; }
    /* Y sin dos columnas no hay nada al lado que seguir: pegada arriba, la
       columna se quedaría flotando sobre el contenido. */
    .TSellerProfile .sp-inicio-lado{ order: 2; position: static; }
}

/* El mapa, en una columna de 340px: sin alto propio el `iframe` sale con los
   150px que trae el navegador de fábrica y no se distingue un pueblo. */
.TSellerProfile .sp-inicio-lado .sp-osm{ height: 220px; }

/* LOS COMENTARIOS, UNO DEBAJO DE OTRO en esta columna. La lista viene a dos
   columnas --y así se queda en la pestaña «Opiniones», donde tiene el ancho
   entero-- pero en 340px cada comentario salía en una tira de cuatro palabras.
   Es la misma decisión que la rejilla ya toma sola cuando solo hay uno. */
.TSellerProfile .sp-inicio-lado .sp-op-lista{ grid-template-columns: minmax(0, 1fr); }

/* Y las barras del reparto, más cortas: en esta columna el porcentaje se salía
   de la caja. */
.TSellerProfile .sp-inicio-lado .sp-barra em{ min-width: 32px; }

/* ── LA CHAPA DEL NIVEL, AL LADO DEL NOMBRE ──────────────────────────
   Detrás del ✓ de verificado: primero quién dice ser, después cuánto vende. */
.TSellerProfile .sp-nivel{
    display: inline-flex;
    align-items: center;
    gap: 5px;

    margin-left: 8px;
    padding: 3px 11px 3px 5px;
    border-radius: 999px;

    background: var(--sp-nivel-fondo, #f1f3f5);
    border: 1px solid var(--sp-nivel-borde, #d3d8dd);
    color: var(--sp-nivel-trazo, #6b747d);

    font-size: 12px;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
    vertical-align: middle;
}

/* LA MEDALLA, POR SU ALTO: el arte es más alto que ancho --lleva cinta-- así
   que fijar el ancho la deformaría. 22px es lo que mide una mayúscula de la
   chapa, y así la pieza no la hace crecer. */
/* 30px Y NO 22. La pieza no es un icono: es una escarapela con su cinta, su
   aro, el rótulo «SELLER», el nombre del nivel y cinco estrellas. A 22px nada
   de eso se lee y queda una mancha dorada al lado del nombre -- que es
   exactamente lo que hacía dudar de si el sello salía o no. A 30 se distingue
   el metal y el rótulo, y sigue cabiendo en la línea del título (30px). */
.TSellerProfile .sp-nivel img{ height: 30px; width: auto; display: block; }

/* Los cuatro metales, los mismos que en la página de precios. */
.TSellerProfile .sp-nivel--bronce  { --sp-nivel-fondo: #f7ece1; --sp-nivel-borde: #e3cbb0; --sp-nivel-trazo: #9a6b3f; }
.TSellerProfile .sp-nivel--plata   { --sp-nivel-fondo: #f1f3f5; --sp-nivel-borde: #d3d8dd; --sp-nivel-trazo: #6b747d; }
.TSellerProfile .sp-nivel--oro     { --sp-nivel-fondo: #fdf3d8; --sp-nivel-borde: #ecd79a; --sp-nivel-trazo: #a5811a; }
.TSellerProfile .sp-nivel--diamante{ --sp-nivel-fondo: #e9f4fb; --sp-nivel-borde: #bcdcf0; --sp-nivel-trazo: #2f7fa8; }

/* ════════════════════════════════════════════════════════════════════════
   EL SALTO AL CAMBIAR DE PESTAÑA
   ════════════════════════════════════════════════════════════════════════

   Al pulsar una pestaña el panel se repinta entero y sus `iconify-icon` nacen
   VACÍOS: miden 0 hasta que llega su SVG, y entonces crecen de golpe. Con
   treinta iconos en un panel eso es la página entera moviéndose un instante
   después del clic -- se ve como una recarga.

   La cura es reservarles el hueco DESDE EL PRIMER PINTADO: un `inline-block`
   con la medida de su propia letra. Cuando el SVG llega, ocupa un sitio que ya
   estaba guardado y no empuja nada.

   Va sobre `.sp` y con `1em`, no con un tamaño fijo: cada icono de la ficha
   declara el suyo --unos 15px, otros 27-- y el hueco tiene que ser el que va a
   ocupar cada uno, no uno igual para todos. */
.TSellerProfile iconify-icon{
    display: inline-block;
    width: 1em;
    height: 1em;
    /* El SVG se centra en su hueco en vez de apoyarse en la línea base, que es
       lo que descuadraba media pastilla al cargar. */
    vertical-align: -0.125em;
    flex-shrink: 0;
}

/* El ✓ de verificado, un poco mayor desde que el arte es la roseta azul
   (25/08/2026): la pieza anterior era un círculo liso y a 22px se leía; esta
   tiene el borde ondulado y el aro blanco, y necesita dos píxeles más para que
   no se confunda con un punto. */
.TSellerProfile img.sp-check{ width: 24px; height: 24px; }

/* ════════════════════════════════════════════════════════════════════════
   LAS PESTAÑAS, SIN CAJA Y CON EL PANEL SEPARADO
   ════════════════════════════════════════════════════════════════════════

   `TProductTabs` se dibuja como una TARJETA --marco, esquinas redondeadas y
   fondo blanco-- porque en la ficha de producto la barra y su cuerpo viven
   dentro de la misma caja y ese marco los une.

   AQUÍ NO: el cuerpo se pinta fuera, en `#spPanel` (por el `bodyTarget`), así
   que el marco solo envolvía la barra y quedaba una cajita suelta sobre un
   panel de tarjetas que ya traen su propio borde -- dos marcos seguidos que no
   contienen lo mismo.

   Se le quita AQUÍ, no en el componente, que sigue igual de bien en la ficha
   de subasta. Lo único que se conserva es la raya de debajo de la barra, que
   es la que separa la navegación de su contenido.

   El relleno del panel se iguala con el de la barra --20px-- para que la
   primera tarjeta arranque en la misma vertical que el rótulo de la pestaña
   que la trae. */
.TSellerProfile .TProductTabs{
    border: 0;
    border-radius: 0;
    background: transparent;
    overflow: visible;         /* el `hidden` del componente recortaba la
                                  sombra de lo que sobresalga de la barra */
}

.TSellerProfile .TProductTabs .pt-tabs{ padding: 0 20px; }

.TSellerProfile #spPanel{ padding: 20px; }

/* EN MÓVIL, SIN EL LATERAL: `.sp-ancho` ya reproduce el hueco único de la
   página (regla de CLAUDE.md — las secciones no llevan su propio margen/
   padding lateral además del de la página). Estos 20px eran un SEGUNDO hueco
   encima del de `.sp-ancho`, así que el texto de la barra y el de las tarjetas
   arrancaban 20px más adentro que el nombre del vendedor o el aviso de
   vacaciones. Se quita solo el lateral: el vertical sigue igual, y la barra y
   el panel se quedan alineados ENTRE ELLOS porque bajan los dos a la vez. */
@media (max-width:860px){
    .TSellerProfile .TProductTabs .pt-tabs{ padding-left:0; padding-right:0; }
    .TSellerProfile #spPanel{ padding-left:0; padding-right:0; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   SIN MARCOS, SALVO EN LAS CIFRAS
   ═══════════════════════════════════════════════════════════════════════════

   Es la regla de CLAUDE.md aplicada a una pantalla pública: agrupar no es
   dibujar, y solo se enmarca lo que hay que DESTACAR. Aquí estaba al revés
   --las siete `<section class="sp-card">`, las tarjetas de producto, las
   píldoras, los hitos, los logos y hasta las miniaturas llevaban su recuadro--
   y una ficha entera de recuadros iguales no destaca ninguno: solo pone una
   reja entre el lector y el contenido.

   LO ÚNICO QUE CONSERVA SU MARCO SON LAS CIFRAS: la franja de la cabecera
   --valoración, entregas, ventas, productos, opiniones-- y la del cuerpo. Es
   lo único de la ficha que el vendedor NO se escribe: sale de sus pedidos, de
   sus valoraciones y de su alta. Enmarcarlas es lo que las señala como el dato
   duro entre todo lo demás, que es relato suyo.

   LO QUE NO SE TOCA SON LAS RAYAS DE SEPARACIÓN, que no son marcos aunque se
   declaren con `border`: la línea entre dos opiniones, la de la tabla de
   tarifas, la de debajo de las pestañas y las verticales que reparten las
   propias cifras. Quitarlas no despeja nada -- deja una lista de opiniones
   pegadas unas a otras y una tabla de envíos sin filas.

   Y SIN SOMBRA TAMPOCO. Se probó dejarles la sombra --reforzada, incluso--
   para que el bloque siguiera teniendo canto, y el canto es justo lo que
   sobra: el componente va sobre fondo BLANCO --medido: `.TSellerProfile`
   computa `rgb(255,255,255)`, no el gris del `body`--, así que una sombra
   ahí dibuja una línea gris alrededor de la tarjeta que se lee como un borde
   aunque no lo sea. Lo que separa un bloque del siguiente es el aire entre
   ellos y su título, como en cualquier documento. */

.TSellerProfile .sp-card{ border: 0; box-shadow: none; }

/* Los demás recuadros: cada uno se sostiene con lo que ya tenía --su fondo,
   su foto o su color--, que es lo que hacía del borde un adorno. */
.TSellerProfile .sp-pills span,
.TSellerProfile .sp-hito,
.TSellerProfile .sp-cert-logo,
.TSellerProfile .sp-declarada,
.TSellerProfile .sp-aviso,
.TSellerProfile .sp-op-av,
.TSellerProfile .sp-barra i,
.TSellerProfile .sp-op-fotos img{ border: 0; }

/* La franja de cifras del cuerpo mantiene el suyo, como la de la cabecera: son
   la misma lectura en dos sitios y tienen que verse igual. */
.TSellerProfile .sp-franja{ border: 1px solid var(--sd-borde); }

/* ── LA SALA DE SUBASTAS DE LA LONJA, bajo sus cifras ─────────────────
   Un botón grande, del ancho de la columna: es la acción que distingue el
   perfil de una lonja. Icono en su columna, texto en la segunda. */
.TSellerProfile .sp-sala{ display:flex; gap:12px; align-items:center; padding:12px 16px; border-radius:14px;
    background:var(--sd-verde); color:#fff; text-decoration:none; border:1px solid transparent; }
.TSellerProfile a.sp-sala:hover{ background:var(--sd-verde-oscuro); color:#fff; }
.TSellerProfile a.sp-sala:focus-visible{ outline:3px solid var(--sd-verde-oscuro); outline-offset:2px; }
.TSellerProfile .sp-sala-ico{ flex:0 0 auto; font-size:22px; }
.TSellerProfile .sp-sala-txt{ flex:1; min-width:0; }
.TSellerProfile .sp-sala-txt b{ display:block; font-size:15px; line-height:1.25; }
.TSellerProfile .sp-sala-txt small{ display:flex; gap:6px; align-items:center; font-size:12.5px; opacity:.92; }
.TSellerProfile .sp-sala-flecha{ flex:0 0 auto; font-size:18px; }
.TSellerProfile .sp-sala-punto{ width:8px; height:8px; border-radius:50%; background:#fca5a5; box-shadow:0 0 0 3px rgba(252,165,165,.35); }
.TSellerProfile .sp-sala.is-sin{ background:#fff; color:var(--sd-tinta); border-color:var(--sd-borde); }
.TSellerProfile .sp-sala.is-sin .sp-sala-ico{ color:var(--sd-suave); }
.TSellerProfile .sp-sala.is-sin small{ color:var(--sd-suave); opacity:1; }
/* La hoja del sitio da color a `a span` y a `a:visited`: dentro del botón
   verde el texto salía oscuro y en morado. Se fija aquí, con el enlace. */
.TSellerProfile a.sp-sala,
.TSellerProfile a.sp-sala:visited,
.TSellerProfile a.sp-sala .sp-sala-txt,
.TSellerProfile a.sp-sala .sp-sala-txt b,
.TSellerProfile a.sp-sala .sp-sala-txt small{ color:#fff; }

/* ── LA CLASIFICACIÓN VERIFICADA DE LA LONJA (CLASIFICACION-VERIFICADA §4.5) ──
   Icono en su columna y todo el texto en la segunda. */
.TSellerProfile .sp-verif{ margin-bottom:20px; }
.TSellerProfile .sp-verif-cab{ display:flex; gap:12px; align-items:flex-start; }
.TSellerProfile .sp-verif-cab > iconify-icon{ flex:0 0 auto; font-size:24px; color:var(--sd-verde); margin-top:2px; }
.TSellerProfile .sp-verif-cab > div{ flex:1; min-width:0; }
.TSellerProfile .sp-verif h3{ margin:0 0 2px; font-size:15px; }
.TSellerProfile .sp-verif p{ margin:0 0 8px; font-size:13px; color:var(--sd-suave); }
.TSellerProfile .sp-verif b{ display:block; font-size:14px; }
.TSellerProfile .sp-verif small{ display:block; margin-top:4px; font-size:12px; color:var(--sd-suave); }
.TSellerProfile .sp-verif-barra{ height:8px; border-radius:99px; background:#e4eae4; overflow:hidden; margin:6px 0 2px; max-width:520px; }
.TSellerProfile .sp-verif-barra i{ display:block; height:100%; background:var(--sd-verde); }

/* LA CABECERA DE MARKETING IA (13/10/2026): la pieza que el vendedor publicó en
   su perfil, con la marca de contenido creado con IA debajo, siempre visible. */
.TSellerProfile .sp-campana{ margin:18px 0; }
.TSellerProfile .sp-campana a{ display:block; border-radius:12px; overflow:hidden; }
.TSellerProfile .sp-campana img{ display:block; width:100%; height:auto; }
.TSellerProfile .sp-campana-ia{ display:block; margin-top:4px; font-size:11.5px; color:#64748b; }



/**
 * TProductTabs — el detalle del producto, en pestañas.
 *
 * Estilo propio y completo: se monta en la ficha de subasta agrícola pero no
 * depende de ella. Las variables de la ficha se usan cuando existen, con su
 * respaldo detrás para cuando el componente viva en otra pantalla.
 */

.TProductTabs {
    border: 1px solid var(--ag-line, #e5e7eb);
    border-radius: var(--ag-radius, 12px);
    background: #fff;
    font-size: 14px;
    line-height: 1.5;
    color: var(--ag-ink, #1e293b);
    overflow: hidden;
}

/* ── LA BARRA ─────────────────────────────────────────────────────── */

.TProductTabs .pt-tabs {
    display: flex;
    /* Justo lo necesario para que las cuatro quepan en una fila: medido, con
       gap 18 y padding 20 pedían 485 sobre 470 disponibles y la última se iba
       al desplazamiento. */
    gap: 14px;
    padding: 0 16px;
    border-bottom: 1px solid var(--ag-line, #e5e7eb);
    overflow-x: auto;          /* con seis pestañas y poco ancho, se desplaza
                                  en vez de partir la barra en dos líneas */
    scrollbar-width: none;
}

.TProductTabs .pt-tabs::-webkit-scrollbar { display: none; }

.TProductTabs .pt-tab {
    flex: 0 0 auto;
    /* En línea aunque lleve icono: por la regla global de la tienda un `span`
       dentro de un botón no hereda su tamaño, así que el texto va en su propio
       elemento y se le declara aquí. */
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 14px 0 12px;
    border: 0;
    border-bottom: 2px solid transparent;
    background: none;
    font-family: inherit;
    font-size: 13px;
    white-space: nowrap;       /* «Envíos y devoluciones» partía en dos líneas
                                  y descuadraba la altura de la barra */
    color: var(--ag-muted, #64748b);
    cursor: pointer;
}

.TProductTabs .pt-tab span { font-size: 13px; }
.TProductTabs .pt-tab iconify-icon { font-size: 16px; display: inline-block; }

.TProductTabs .pt-tab:hover { color: var(--ag-ink, #1e293b); }

.TProductTabs .pt-tab.is-on {
    color: var(--ag-green-deep, #166534);
    border-bottom-color: var(--ag-green, #16a34a);
    font-weight: 600;
}

/* ── EL CUERPO ────────────────────────────────────────────────────── */

.TProductTabs .pt-body { padding: 18px 20px 20px; }

.TProductTabs .pt-body p {
    margin: 0 0 14px;
    font-size: 13.5px;
    line-height: 1.7;
    color: var(--ag-ink-soft, #475569);
}

.TProductTabs .pt-body p:last-child { margin-bottom: 0; }

.TProductTabs .pt-body ul { margin: 0 0 14px; padding-left: 20px; }
.TProductTabs .pt-body li { font-size: 13.5px; line-height: 1.7; color: var(--ag-ink-soft, #475569); }



/* ══════════════════════════════════════════════════════════════════════
   TReviewList — EL BLOQUE DE OPINIONES, IGUAL EN LAS DOS PANTALLAS
   ══════════════════════════════════════════════════════════════════════

   Sale de la pestaña «Opiniones» del perfil del agricultor: es la misma
   maqueta, movida aquí para que la ficha de producto enseñe exactamente lo
   mismo en vez de una imitación.

   ── LOS COLORES, CON RESPALDO EN EL PUNTO DE USO ────────────────────
   En el perfil los tokens `--sd-*` los pone `TSellersUI`. La ficha de producto
   NO carga esa hoja, así que cada uso lleva su valor de reserva
   --`var(--sd-tinta, #16211a)`--, que es la forma que no cicla. Un token que se
   cita a sí mismo en su propia declaración deja vacías TODAS las reglas que lo
   usan, y sin un solo error: ya pasó en `TProductCard`.

   TODO CUELGA DE `.rl`: la ficha de producto arrastra reglas globales muy
   agresivas (una fija `font: 12px` sobre div/span/p/li con la forma corta, otra
   le da `height: 22px` a cualquier `textarea`) y sin prefijo se cuelan.
   ══════════════════════════════════════════════════════════════════════ */

.rl{ display: block; }

/* `hidden` MANDA. El botón «Escribir una opinión» nace oculto y solo se enseña
   si quien mira tiene una compra pendiente de valorar, pero `.rl-btn` le da
   `display: inline-flex` y eso le gana al atributo: salía SIEMPRE, y pulsarlo
   sin compra detrás no hacía nada. Lo mismo con los resúmenes y el vacío. */
.rl [hidden]{ display: none !important; }

/* ── LAS DOS COLUMNAS ──────────────────────────────────────────────
   El resumen a la izquierda se mira UNA VEZ y se queda ahí mientras se leen las
   opiniones; apilado obligaba a subir cada vez que se quería contrastar un
   comentario con el conjunto. */
.rl .rl-rej{
    display: grid;
    grid-template-columns: 320px minmax(0, 1fr);
    gap: 22px;
    align-items: start;
}

/* Las dos tarjetas del lado suben juntas al hacer scroll: la pegajosa es la
   COLUMNA, no cada tarjeta.

   ── EL TOPE SALE DE LA CABECERA, NO DE UN NÚMERO ────────────────────
   Aquí ponía `top: 78px` y la cabecera del sitio mide 118: la columna se
   quedaba pegada 40px por DEBAJO de su borde superior, o sea tapada por ella,
   y el resumen de reputación se leía cortado por la mitad. `--site-cabecera`
   la mide y la publica `base.php`; el respaldo es por si esta hoja se usa
   fuera del sitio (la ficha de producto no carga `TSellersUI`, y el mismo
   día puede no cargar otra cosa). */
.rl .rl-lado{
    display: flex; flex-direction: column; gap: 22px;
    position: sticky; top: calc(var(--site-cabecera, 118px) + 14px);
    align-self: start;
}

.rl .rl-card{ background: #fff; }

.rl .rl-card-cab{ display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
.rl .rl-card-cab h3{
    margin: 0; padding: 0;
    flex: 1; min-width: 0;
    font-size: 14.5px; font-weight: 700;
    color: var(--sd-tinta, #16211a);
}

.rl .rl-btn{
    display: inline-flex; align-items: center; gap: 7px;
    padding: 8px 14px;
    border: 0; border-radius: 9px;
    background: var(--sd-verde, #04713a); color: #fff;
    font-family: inherit; font-size: 12px; font-weight: 700;
    white-space: nowrap; cursor: pointer;
}
.rl .rl-btn:hover{ filter: brightness(1.08); }
.rl .rl-btn.suave{
    background: #fff; color: var(--sd-suave, #6b7a70);
    border: 1px solid var(--sd-borde, #e4eae4);
}
.rl .rl-btn[disabled]{ opacity: .55; cursor: default; }

/* ── EL RESUMEN DE REPUTACIÓN ──────────────────────────────────────── */

.rl .rl-rep-rejilla{ display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.rl .rl-rep{ display: flex; gap: 9px; align-items: flex-start; }
.rl .rl-rep-ico{
    flex: 0 0 auto; width: 28px; height: 28px;
    border-radius: 8px;
    display: flex; align-items: center; justify-content: center;
}
/* El tamaño se declara EN el icono: `iconify-icon` no hereda el de su caja y
   sin esto salen todos a los 20px de fábrica. */
.rl .rl-rep-ico iconify-icon{ font-size: 15px; }
.rl .rl-rep-ico.verde{ background: var(--sd-verde-claro, #eef6ee); color: var(--sd-verde-oscuro, #005c2d); }
.rl .rl-rep-ico.rojo { background: #fdecec; color: #b42318; }
.rl .rl-rep-ico.azul { background: #eaf1fd; color: #175cd3; }
.rl .rl-rep-ico.ambar{ background: #fdf3e2; color: #b54708; }
.rl .rl-rep > div{ flex: 1; min-width: 0; }
.rl .rl-rep b{
    display: block; line-height: 1.15;
    font-size: 17px; font-weight: 800;
    color: var(--sd-tinta, #16211a);
}
.rl .rl-rep small{ display: block; margin-top: 2px; font-size: 10.5px; color: var(--sd-suave, #6b7a70); }
.rl .rl-rep-pie{ margin: 12px 0 0; font-size: 10.5px; line-height: 1.5; color: var(--sd-tenue, #93a399); }

/* ── LA VALORACIÓN GENERAL ─────────────────────────────────────────
   La nota en grande y sola: es el número por el que se entra aquí. */

.rl .rl-nota{ margin-bottom: 16px; }
.rl .rl-nota b{
    display: block; line-height: 1;
    font-size: 46px; font-weight: 800;
    color: var(--sd-tinta, #16211a);
}
.rl .rl-nota small{ display: block; margin-top: 7px; font-size: 11.5px; color: var(--sd-suave, #6b7a70); }

.rl .rl-estrellas{ display: flex; gap: 2px; margin-top: 6px; }
.rl .rl-s{ width: 15px; height: 15px; fill: var(--sd-oro, #e2a812); flex: 0 0 auto; }
/* En la ficha de una opinión son algo menores que la nota grande, pero NO las
   11px del reparto: al lado de un titular se leían como una pelusa. */
.rl .rl-s.mini{ width: 14px; height: 14px; }

.rl .rl-barras{ display: flex; flex-direction: column; gap: 5px; }
.rl .rl-barra{ display: flex; align-items: center; gap: 9px; font-size: 11px; color: var(--sd-suave, #6b7a70); }
.rl .rl-barra em{ flex: 0 0 auto; width: 28px; font-style: normal; }
.rl .rl-barra i{
    flex: 1; min-width: 0; height: 7px;
    border-radius: 999px;
    background: #eef2ee;
    border: 1px solid var(--sd-borde, #e4eae4);
    overflow: hidden;
}
.rl .rl-barra i > b{ display: block; height: 100%; background: var(--sd-verde, #04713a); }
.rl .rl-barra u{
    flex: 0 0 auto; width: 26px; text-align: right;
    text-decoration: none;
    font-variant-numeric: tabular-nums;
}

/* ── LA LISTA ──────────────────────────────────────────────────────
   Cada opinión separada por una línea y no por una caja: son del mismo bloque,
   y encajonarlas una a una lo convierte en una lista de listas. */

.rl .rl-opiniones{ display: flex; flex-direction: column; }
.rl .rl-opinion{ padding: 16px 0; border-top: 1px solid var(--sd-borde, #e4eae4); }
.rl .rl-opinion:first-child{ padding-top: 0; border-top: 0; }

.rl .rl-quien{ display: flex; align-items: center; gap: 8px; }
.rl .rl-avatar{
    flex: 0 0 auto; width: 26px; height: 26px;
    border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    background: var(--sd-verde-claro, #eef6ee);
    border: 1px solid var(--sd-verde-borde, #cfe3d2);
    color: var(--sd-verde-oscuro, #005c2d);
    font-size: 11px; font-weight: 800;
}
.rl .rl-quien-txt{ flex: 1; min-width: 0; }
.rl .rl-quien-txt b{ display: block; font-size: 12px; color: var(--sd-tinta, #16211a); }
.rl .rl-quien-txt small{ display: block; font-size: 10.5px; color: var(--sd-tenue, #93a399); }

/* ── NOMBRE · ESTRELLAS · NOTA, EN UNA LÍNEA ──────────────────────
   Quién opina y cuánto puntúa son el mismo dato cuando se recorre una
   lista. `flex-wrap` para que en una columna estrecha la nota baje sola
   en vez de empujar el nombre fuera de la caja. */
.rl .rl-quien-linea{
    display: flex; align-items: center; flex-wrap: wrap;
    gap: 6px; min-width: 0;
}

/* ── LOS TRES, A LA MISMA ALTURA ──────────────────────────────────
   Medido: la nota salía 11px POR ENCIMA de las estrellas y se leía como
   un superíndice. No era el flex --`align-items:center` estaba puesto--
   sino el MARGEN que la hoja del sitio le da a un `<small>`, que empuja
   la caja dentro de su línea; y los `line-height` dispares de un `<b>`,
   un `<small>` y unos SVG, que hacían cada caja de un alto distinto.

   Con el margen a cero y una interlínea común, los cinco comparten
   centro y la fila mide lo que mide su contenido. */
.rl .rl-quien-linea > *{
    margin: 0;
    line-height: 1;
    align-self: center;
}

/* El nombre y la nota son `display:block` por las dos reglas de arriba
   --valen para el bloque de debajo, el del lugar-- y aquí estorban: en
   línea, cada uno ocuparía su propio renglón. */
.rl .rl-quien-linea b,
.rl .rl-quien-linea small{ display: inline-block; }

/* El punto centrado: separa sin pesar. Con el mismo gris que el lugar,
   para que la línea la lidere el nombre. */
.rl .rl-sep{
    flex: 0 0 auto;
    font-size: 11px; line-height: 1;
    color: var(--sd-tenue, #93a399);
}

.rl .rl-nota{
    flex: 0 0 auto;
    font-size: 10.5px; font-weight: 700;
    color: var(--sd-suave, #6b7a70);
    white-space: nowrap;
}
.rl .rl-quien > small{ flex: 0 0 auto; font-size: 10.5px; color: var(--sd-tenue, #93a399); white-space: nowrap; }

.rl .rl-op-cab{ display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.rl .rl-op-cab b{ font-size: 13px; color: var(--sd-tinta, #16211a); }

/* El sello pesa MÁS que el texto de la opinión: es lo que separa una valoración
   de un comentario. Con su icono a medida, o sale a 20px y tuerce la línea. */
.rl .rl-ok{
    display: inline-flex; align-items: center; gap: 4px;
    font-size: 10.5px; font-weight: 700; line-height: 1;
    color: var(--sd-verde-oscuro, #005c2d);
}
.rl .rl-ok iconify-icon{ font-size: 13px; flex: 0 0 auto; }

.rl .rl-opinion > p{
    margin: 9px 0 0;
    font-size: 12.5px; line-height: 1.6;
    color: var(--sd-texto, #3d4a42);
}

/* ── EL ARTÍCULO VALORADO ──────────────────────────────────────────── */

/* ── LA TARJETA DEL ARTÍCULO SE AJUSTA A LO QUE DICE ──────────────
   Era `display:flex`, o sea un bloque, y se estiraba hasta el 100% del
   ancho de la opinión: un recuadro enorme para un nombre y una
   referencia, con más de media caja vacía.

   Con `inline-flex` la caja mide lo que mide su contenido. El
   `max-width:100%` es la otra mitad: sin él, un nombre de artículo largo
   la sacaría fuera de la columna en vez de recortarse con los puntos
   suspensivos que ya tiene el `<b>`. */
.rl .rl-prod{
    display: inline-flex; align-items: center; gap: 9px;
    max-width: 100%;
    margin-top: 10px;
    padding: 8px 10px;
    border: 1px solid var(--sd-borde, #e4eae4);
    border-radius: 10px;
    background: var(--sd-crema, #f7faf6);
}
.rl .rl-prod-foto{
    flex: 0 0 auto; width: 34px; height: 34px;
    border-radius: 7px; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: #fff; color: var(--sd-tenue, #93a399);
    font-size: 16px;
}
.rl .rl-prod-foto img{ width: 100%; height: 100%; object-fit: cover; display: block; }
/* `0 1 auto` y no `1`: con el padre ajustado al contenido, un `flex:1`
   no tiene espacio sobrante que repartir, pero deja la intención clara
   --el texto cede y se recorta, no estira la caja--. */
.rl .rl-prod-txt{ flex: 0 1 auto; min-width: 0; }
.rl .rl-prod-txt b{
    display: block; font-size: 12px; color: var(--sd-tinta, #16211a);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rl .rl-prod-txt small{ display: block; font-size: 10.5px; color: var(--sd-tenue, #93a399); }

/* ── PROS, CONTRAS Y FOTOS ─────────────────────────────────────────── */

.rl .rl-puntos{ display: flex; flex-wrap: wrap; gap: 16px; margin-top: 9px; }
.rl .rl-punto{ display: flex; gap: 6px; font-size: 11.5px; color: var(--sd-suave, #6b7a70); }
.rl .rl-punto iconify-icon{ flex: 0 0 auto; margin-top: 2px; font-size: 14px; }
.rl .rl-punto.pro iconify-icon{ color: var(--sd-verde, #04713a); }
.rl .rl-punto.contra iconify-icon{ color: #b42318; }

.rl .rl-fotos{ display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.rl .rl-foto{
    display: block; width: 104px; height: 78px;
    border-radius: 8px; overflow: hidden;
    border: 1px solid var(--sd-borde, #e4eae4);
}
.rl .rl-foto img{ width: 100%; height: 100%; object-fit: cover; display: block; }
.rl .rl-respuesta .rl-foto{ width: 84px; height: 64px; }

/* ── LAS ACCIONES: ENLACES, NO BOTONES ─────────────────────────────
   Debajo de lo que alguien ha escrito, un botón macizo compite con el texto y
   convierte la conversación en un formulario. */

.rl .rl-acciones{ display: flex; align-items: center; gap: 16px; margin-top: 9px; }

/* «Denunciar contenido»: el aspecto del botón es de TContentReportForm (viaja
   con toda página); aquí solo se acerca a la tarjeta. */
.rl .rl-denuncia{ margin-top: 4px; }
.rl .rl-accion{
    display: inline-flex; align-items: center; gap: 5px;
    background: none; border: 0; padding: 2px 0;
    font-family: inherit; font-size: 11.5px; font-weight: 700;
    color: var(--sd-suave, #6b7a70); cursor: pointer;
}
.rl .rl-accion:hover{ color: var(--sd-tinta, #16211a); text-decoration: underline; }
.rl .rl-accion[disabled]{ opacity: .5; cursor: default; text-decoration: none; }
.rl .rl-accion iconify-icon{ font-size: 14px; flex: 0 0 auto; }

/* EJECUTADO: color propio y contador. Sin esto, al volver a la página no se
   sabe si se llegó a dar el voto y se pulsa otra vez quitándolo. */
.rl .rl-accion.on{ color: var(--sd-verde-oscuro, #005c2d); }
.rl .rl-accion.on:hover{ color: var(--sd-verde-oscuro, #005c2d); }
.rl .rl-accion.on iconify-icon{ color: var(--sd-verde, #04713a); }
.rl .rl-accion em{
    font-style: normal; font-size: 10.5px;
    color: var(--sd-suave, #6b7a70);
    background: var(--sd-crema, #f7faf6);
    border-radius: 9px; padding: 1px 6px;
}
.rl .rl-accion.on em{ background: var(--sd-verde-claro, #eef6ee); color: var(--sd-verde-oscuro, #005c2d); }
.rl .rl-accion.peligro:hover,
.rl .rl-accion.peligro:hover iconify-icon{ color: #b42318; }

/* ── LA RESPUESTA DEL VENDEDOR ─────────────────────────────────────
   Metida y con su barra verde: se ve de un vistazo que cuelga de la opinión de
   arriba y no es otra opinión más. */

.rl .rl-respuesta{
    display: flex; gap: 9px;
    margin: 10px 0 0 14px;
    padding: 11px 13px;
    background: var(--sd-verde-claro, #eef6ee);
    border-left: 2px solid var(--sd-verde, #04713a);
    border-radius: 0 10px 10px 0;
}
.rl .rl-resp-avatar{
    flex: 0 0 auto; width: 28px; height: 28px;
    border-radius: 50%; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: #fff; border: 1px solid var(--sd-verde-borde, #cfe3d2);
    color: var(--sd-verde-oscuro, #005c2d);
    font-size: 11px; font-weight: 800;
}
.rl .rl-resp-avatar img{ width: 100%; height: 100%; object-fit: cover; display: block; }
.rl .rl-respuesta > div{ flex: 1; min-width: 0; }
.rl .rl-resp-cab{ display: flex; align-items: center; gap: 8px; }
.rl .rl-resp-cab b{ font-size: 12px; color: var(--sd-verde-oscuro, #005c2d); }
.rl .rl-resp-cab small{ font-size: 10.5px; color: var(--sd-tenue, #93a399); }
.rl .rl-respuesta p{ margin: 3px 0 0; font-size: 12px; line-height: 1.55; color: var(--sd-texto, #3d4a42); }

/* ── CONTESTAR ─────────────────────────────────────────────────────── */

.rl .rl-contestar{ margin: 10px 0 0 14px; }
/* EL ALTO VA AQUÍ Y NO EN `rows`: una regla global de la hoja de arranque
   (`.whiteWindow input, textarea`) le pone `height:22px` a TODO textarea del
   sitio, y la caja salía como una línea con el texto cortado por la mitad. */
.rl .rl-contestar textarea{
    width: 100%; height: auto; min-height: 76px;
    border: 1px solid var(--sd-borde, #e4eae4); border-radius: 10px;
    padding: 9px 11px;
    font-family: inherit; font-size: 12.5px; line-height: 1.5;
    color: var(--sd-tinta, #16211a); resize: vertical;
    background: #fff;
}
.rl .rl-contestar textarea:focus{ outline: none; border-color: var(--sd-verde, #04713a); }
.rl .rl-adjuntos{ margin-top: 9px; }
.rl .rl-contestar-pie{
    display: flex; align-items: center; justify-content: flex-end; gap: 8px;
    margin-top: 9px; flex-wrap: wrap;
}
.rl .rl-gracia{ flex: 1; min-width: 0; font-size: 10.5px; line-height: 1.4; color: var(--sd-tenue, #93a399); }

/* ── SIN OPINIONES ─────────────────────────────────────────────────
   Con su explicación, nunca un hueco en blanco: que un producto nuevo no tenga
   opiniones no es un fallo, y decirlo evita que lo parezca. */

.rl .rl-vacio{
    text-align: center;
    padding: 34px 20px;
    border: 1px dashed var(--sd-borde, #e4eae4);
    border-radius: 12px;
    color: var(--sd-suave, #6b7a70);
}
.rl .rl-vacio iconify-icon{ font-size: 30px; color: var(--sd-tenue, #93a399); }
.rl .rl-vacio b{ display: block; margin-top: 10px; font-size: 13.5px; color: var(--sd-tinta, #16211a); }
.rl .rl-vacio small{ display: block; margin-top: 4px; font-size: 11.5px; }

@media (max-width: 1000px){
    /* Sin dos columnas, pegar el resumen arriba lo deja tapando las opiniones. */
    .rl .rl-rej{ grid-template-columns: minmax(0, 1fr); }
    .rl .rl-lado{ position: static; }
}



/* ══════════════════════════════════════════════════════════════════════
   TContentReportForm — «Denunciar contenido»

   Esta hoja VIAJA CON TODA PÁGINA (pageComponents), y por eso el botón se
   define aquí: lo ponen la ficha de producto, el perfil del vendedor y cada
   valoración, y así los tres se ven igual sin que ninguno lo redefina.

   ── DISCRETO, PERO ACCESIBLE ─────────────────────────────────────────
   Es una opción que casi nadie usa y que no puede competir con «Añadir a la
   cesta»: texto pequeño, sin fondo ni borde. Pero el gris cumple AA
   (#556259 sobre blanco, 6,3:1) y el foco se ve.

   ── LA CLASE DOBLADA ─────────────────────────────────────────────────
   `.TComponentES6 button` impone display:flex y 25px de alto a todo botón
   dentro de un componente, y la hoja de la ficha arrastra reglas globales
   sobre `button`: con `button.crf-boton.crf-boton` se gana sin depender del
   orden de carga.

   Candidato a la hoja común del área pública cuando se extraiga.
   ══════════════════════════════════════════════════════════════════════ */

button.crf-boton.crf-boton{
    display: inline-flex; align-items: center; gap: 5px;
    height: auto; min-height: 0; width: auto;
    margin: 0; padding: 4px 2px;
    background: none; border: 0; border-radius: 4px; box-shadow: none;
    font-family: inherit; font-size: 12px; font-weight: 600; line-height: 1.3;
    color: #556259; cursor: pointer;
    text-decoration: none;
}
button.crf-boton.crf-boton:hover{ color: #9b1c14; text-decoration: underline; }
button.crf-boton.crf-boton:focus-visible{ outline: 2px solid #04713a; outline-offset: 2px; }
button.crf-boton.crf-boton iconify-icon{ font-size: 13px; flex: 0 0 auto; }

/* La fila que lo coloca al final de un bloque, alineado a la derecha. */
.crf-fila{ display: flex; justify-content: flex-end; margin-top: 10px; }

/* La variante de la página /denunciar-contenido: aquí SÍ es la acción principal. */
button.crf-boton.crf-boton--principal{
    padding: 10px 18px; border-radius: 8px;
    background: #04713a; color: #fff; font-size: 14px;
}
button.crf-boton.crf-boton--principal:hover{ background: #005c2d; color: #fff; text-decoration: none; }
button.crf-boton.crf-boton--principal iconify-icon{ font-size: 16px; }

/* ── LA PÁGINA ───────────────────────────────────────────────────────── */

.crf [hidden]{ display: none !important; }

.crf .crf-pagina{
    max-width: 880px; margin: 34px auto; padding: 0 16px;
    color: #16211a; font-size: 14px;
}

.crf .crf-cab{ display: flex; gap: 14px; align-items: flex-start; margin-bottom: 26px; }
.crf .crf-cab-ico{
    flex: 0 0 auto; width: 46px; height: 46px; border-radius: 12px;
    display: flex; align-items: center; justify-content: center;
    background: #eef6ee; color: #04713a;
}
.crf .crf-cab-ico iconify-icon{ font-size: 24px; }
.crf .crf-cab-txt{ flex: 1; min-width: 0; }
.crf .crf-cab-txt h1{ margin: 0 0 6px; font-size: 24px; line-height: 1.25; }
.crf .crf-cab-txt p{ margin: 0; color: #4a564e; line-height: 1.5; font-size: 14px; }

.crf .crf-pasos{ display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px; }
.crf .crf-paso{
    display: flex; gap: 10px; align-items: flex-start;
    padding: 14px; border: 1px solid #e3e9e4; border-radius: 12px; background: #fff;
}
.crf .crf-paso-ico{ flex: 0 0 auto; color: #04713a; }
.crf .crf-paso-ico iconify-icon{ font-size: 20px; }
.crf .crf-paso > div{ flex: 1; min-width: 0; }
.crf .crf-paso b{ display: block; margin-bottom: 4px; font-size: 14px; }
.crf .crf-paso small{ display: block; color: #4a564e; font-size: 13px; line-height: 1.45; }

.crf .crf-accion{ display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-top: 26px; }
.crf .crf-accion small{ color: #4a564e; font-size: 12px; }
.crf .crf-accion a{ color: #04713a; }

/* ── EL FORMULARIO ──────────────────────────────────────────────────────
   `rows` no pinta nada: una regla global le fija 22px a todo textarea y la de
   los controles un min-height de 60px. La altura se pide por clase. */
.crf-explicacion textarea,
textarea.crf-explicacion{ min-height: 120px !important; height: 120px !important; }

p.crf-nota{
    margin: 4px 0 0; padding: 9px 11px; border-radius: 8px;
    background: #f3f6f4; color: #3f4a43; font-size: 12.5px; line-height: 1.45;
}

/* ── EL ACUSE ───────────────────────────────────────────────────────── */

.crf-acuse{ max-width: 520px; padding: 4px 2px; color: #16211a; font-size: 14px; }
.crf-acuse .crf-acuse-fila{ display: flex; gap: 10px; align-items: flex-start; margin-bottom: 12px; }
.crf-acuse .crf-acuse-ico{ flex: 0 0 auto; color: #04713a; }
.crf-acuse .crf-acuse-ico iconify-icon{ font-size: 26px; }
.crf-acuse .crf-acuse-txt{ flex: 1; min-width: 0; }
.crf-acuse .crf-acuse-txt b{ display: block; font-size: 16px; margin-bottom: 3px; }
.crf-acuse .crf-acuse-txt small{ display: block; font-size: 13px; color: #4a564e; }
.crf-acuse p{ margin: 0 0 10px; line-height: 1.5; font-size: 14px; }
.crf-acuse .crf-acuse-pie{ display: flex; justify-content: flex-end; margin-top: 14px; }



/* ═══════════════════════════════════════════════════════════════════════════
 *  RECUPERAR LA CONTRASEÑA — la ficha dentro de la ventana
 *
 *  Copia la ficha de la pantalla (`TRegisterQuick`, `.rqk-solo-form`): el
 *  logotipo a 44 px, el título de 26 px, el campo de 11 px de radio con el
 *  verde de foco y el botón verde a todo lo ancho. CANDIDATO A LA HOJA COMÚN
 *  del área pública, junto con aquella: hoy son dos copias de los mismos
 *  valores (tokens `--rq-*` allí, `--fgp-*` aquí).
 * ═══════════════════════════════════════════════════════════════════════════ */

.fgp{
    --fgp-verde:        #2d6a2f;
    --fgp-verde-vivo:   #3f8f43;
    --fgp-verde-oscuro: #14532d;
    --fgp-verde-borde:  #dbe8d6;
    --fgp-verde-caja:   #f5faf3;
    --fgp-texto: #14261a;
    --fgp-suave: #5b6b60;
    --fgp-tenue: #93a399;

    padding: 18px 28px 26px;
    color: var(--fgp-texto);
    font-size: 13px;
    line-height: 1.5;
    text-align: left;
}

.fgp .fgp-marca{ display: block; height: 44px; width: auto; margin: 0 0 22px; }

.fgp .fgp-titulo{
    margin: 0 0 5px;
    font-size: 26px; font-weight: 800;
    letter-spacing: -.5px;
    line-height: 1.2;
    color: #07090d;
}

.fgp .fgp-sub{ margin: 0 0 14px; font-size: 13px; color: var(--fgp-suave); }

/* `!important` COMO EN `.rqk-campo`: una regla global del sitio pone los
   `label` en fila con `!important`, y sin esto el rótulo y el campo salían
   uno al lado del otro y el campo a media anchura (medido: 225 de 400 px). */
.fgp .fgp-campo{
    display: flex !important;
    flex-direction: column !important;
    align-items: stretch !important;
    gap: 5px;
    margin: 0 0 14px;
}

.fgp .fgp-rotulo{ align-self: stretch; font-size: 12px; font-weight: 600; }

.fgp .fgp-con-ico{ position: relative; display: block; width: 100%; }
.fgp .fgp-con-ico > iconify-icon{
    position: absolute; left: 13px; top: 50%;
    transform: translateY(-50%);
    font-size: 15px; color: var(--fgp-tenue);
    pointer-events: none;
}

.fgp .fgp-con-ico input{
    width: 100%;
    box-sizing: border-box;
    height: auto;
    padding: 12px 14px 12px 38px;
    border: 1px solid #dbe4dd;
    border-radius: 11px;
    background: #fff;
    font-size: 13px; font-family: inherit;
    color: var(--fgp-texto);
}
.fgp .fgp-con-ico input::placeholder{ color: var(--fgp-tenue); }
.fgp .fgp-con-ico input:focus{
    outline: none;
    border-color: var(--fgp-verde-vivo);
    box-shadow: 0 0 0 3px rgba(63,143,67,.12);
}

.fgp .fgp-error{ display: none; font-size: 11px; color: #b91c1c; font-style: normal; }
.fgp .fgp-campo.mal input{ border-color: #f87171; background: #fef2f2; }
.fgp .fgp-campo.mal .fgp-error{ display: block; }

/* EL BOTÓN, EL DE LA FICHA (`.rqk-btn-crear`). `height:auto` porque la regla
   global `.TComponentES6 button{height:25px}` lo aplastaría. */
.fgp .fgp-btn{
    display: flex; align-items: center; justify-content: center; gap: 9px;
    width: 100%;
    height: auto;
    padding: 13px;
    border: 0;
    border-radius: 11px;
    background: var(--fgp-verde);
    color: #fff;
    font-size: 14.5px; font-weight: 700; font-family: inherit;
    cursor: pointer;
}
.fgp .fgp-btn:hover{ background: var(--fgp-verde-oscuro); }
.fgp .fgp-btn:focus-visible{ outline: 3px solid rgba(63,143,67,.35); outline-offset: 2px; }
.fgp .fgp-btn:disabled{ opacity: .7; cursor: default; }
.fgp .fgp-btn iconify-icon{ font-size: 17px; }

/* EL AVISO: la misma caja verde que el de la pantalla (`.rqk-olv-hecho`). */
.fgp .fgp-hecho{
    display: none;
    gap: 10px;
    margin-top: 14px;
    padding: 12px 14px;
    border-radius: 11px;
    border: 1px solid var(--fgp-verde-borde);
    background: var(--fgp-verde-caja);
    color: #2f5136;
    font-size: 12.5px; line-height: 1.5;
}
.fgp .fgp-hecho.on{ display: flex; }
.fgp .fgp-hecho > iconify-icon{ flex: 0 0 auto; font-size: 18px; color: var(--fgp-verde-vivo); }
.fgp .fgp-hecho > div{ flex: 1; min-width: 0; }

.fgp .fgp-ya{ margin: 14px 0 0; text-align: center; font-size: 12.5px; }
.fgp .fgp-ya a{ color: var(--fgp-verde); font-weight: 700; text-decoration: underline; }

/* LA VENTANA, CON LAS ESQUINAS DE LA TARJETA de la pantalla (`--rq-radio`,
   30 px; algo menos aquí porque la ventana es más pequeña). Va por la
   `hostClass` que pone `open()`: el overlay vive fuera del árbol de `.fgp`. */
.TOverlayWin.fgp-ventana{ border-radius: 24px; overflow: hidden; }

@media (max-width: 600px){
    .fgp{ padding: 14px 18px 22px; }
    .fgp .fgp-marca{ height: 32px; }
    .fgp .fgp-titulo{ font-size: 22px; }
}



