:root {
  --fondo: #edeef0;
  --panel: #ffffff;
  --tinta: #16181d;
  --suave: #5d636e;
  --linea: #d6d9de;
  --vivo: #1f5d50;
  --vivo-claro: #e4efeb;
  --alerta: #a33a2c;
  --alerta-claro: #f7e7e4;
  --urgencia: #92610a;
  --urgencia-claro: #faf0da;
  --cielo: #0284c7;
  --texto: 1rem/1.55 'IBM Plex Sans', system-ui, sans-serif;
  --fuente-titulo: 'Space Grotesk', 'IBM Plex Sans', system-ui, sans-serif;

  --sombra: 0 1px 2px rgba(20, 22, 26, .05), 0 6px 16px rgba(20, 22, 26, .05);
  --radio: 6px;
  --rapido: .15s ease;

  color-scheme: light;
}

/* Modo oscuro: no es solo invertir colores. --panel queda más claro que
   --fondo (como en claro) para que las tarjetas sigan leyéndose como una capa
   por encima del fondo, y --vivo/--alerta se aclaran porque el mismo tono que
   funciona sobre blanco pierde contraste sobre un fondo oscuro. */
@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) {
    --fondo: #131519;
    --panel: #1c1f25;
    --tinta: #edeef0;
    --suave: #98a0ab;
    --linea: #2d313a;
    --vivo: #4fbfa4;
    --vivo-claro: #17332c;
    --alerta: #e2685a;
    --alerta-claro: #3a2220;
    --urgencia: #e0a53a;
    --urgencia-claro: #3a2f14;
    --cielo: #38bdf8;
    --sombra: 0 1px 2px rgba(0, 0, 0, .3), 0 6px 20px rgba(0, 0, 0, .35);
    color-scheme: dark;
  }
}

:root[data-tema="oscuro"] {
  --fondo: #131519;
  --panel: #1c1f25;
  --tinta: #edeef0;
  --suave: #98a0ab;
  --linea: #2d313a;
  --vivo: #4fbfa4;
  --vivo-claro: #17332c;
  --alerta: #e2685a;
  --alerta-claro: #3a2220;
  --urgencia: #e0a53a;
  --urgencia-claro: #3a2f14;
  --cielo: #38bdf8;
  --sombra: 0 1px 2px rgba(0, 0, 0, .3), 0 6px 20px rgba(0, 0, 0, .35);
  color-scheme: dark;
}

* { box-sizing: border-box; }

/* Sin esto, cualquier clase con display:flex/grid (.nav, .pujar, .mp-estado,
   .formulario label...) le gana en cascada al [hidden] del navegador, porque
   una regla del autor siempre le gana a la del user-agent aunque no tenga
   más especificidad. Con !important queda garantizado en cualquier caso. */
[hidden] { display: none !important; }

body {
  margin: 0;
  background: var(--fondo);
  color: var(--tinta);
  font: var(--texto);
  -webkit-font-smoothing: antialiased;
  transition: background-color var(--rapido), color var(--rapido);
  /* El hero de la portada rompe el ancho máximo de <main> a propósito
     (100vw) para ocupar toda la pantalla; esto evita que ese cálculo deje
     una barra de scroll horizontal de un pixel por el ancho del scrollbar. */
  overflow-x: hidden;
}

h1, h2, h3 { font-family: var(--fuente-titulo); font-weight: 600; letter-spacing: -0.015em; }
h1 { font-size: 2.3rem; line-height: 1.15; margin: 0 0 .6rem; }
h2 { font-size: 1.2rem; margin: 2.2rem 0 .7rem; }
h3 { font-size: 1rem; margin: 2rem 0 .5rem; }

main {
  max-width: 60rem;
  margin: 0 auto;
  padding: 1.5rem 1.25rem 4rem;
}

.oculto {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
}

/* ---------------- sprite de íconos ---------------- */

/* Un solo trazo/tamaño para todo el sitio (ver el <symbol> de cada uno al
   principio de <body>): sin esto los <line>/<polyline> del sprite no tienen
   ni relleno ni trazo por defecto y quedan invisibles. */
.icono {
  width: 1.15em;
  height: 1.15em;
  flex-shrink: 0;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  vertical-align: -.15em;
}

/* Las formas rellenas dentro de un símbolo (el punto del ícono de etiqueta,
   los círculos de "sliders"...) llevan esta clase en vez de quedar con trazo */
.icono-relleno { fill: currentColor; stroke: none; }

/* ---------------- barra superior ---------------- */

.barra {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  padding: .85rem 1.25rem;
  background: var(--panel);
  border-bottom: 1px solid var(--linea);
  flex-wrap: wrap;
  transition: background-color var(--rapido), border-color var(--rapido);
}

.marca {
  display: flex;
  align-items: center;
  gap: .45rem;
  font-family: var(--fuente-titulo);
  font-weight: 600;
  font-size: 1.1rem;
  letter-spacing: -0.02em;
  color: var(--tinta);
  text-decoration: none;
}

.marca-icono {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.9rem;
  height: 1.9rem;
  border-radius: var(--radio);
  background: var(--vivo);
  color: #fff;
}
.marca-icono .icono { width: 1.05rem; height: 1.05rem; }

.nav { display: flex; gap: .25rem; flex: 1; flex-wrap: wrap; }

.nav button {
  display: flex;
  align-items: center;
  gap: .4rem;
  border: 0;
  background: none;
  font: inherit;
  font-size: .92rem;
  color: var(--suave);
  padding: .3rem .55rem;
  border-radius: var(--radio);
  cursor: pointer;
  transition: background-color var(--rapido), color var(--rapido);
}

.nav button:hover { color: var(--tinta); }
.nav button.activa { color: var(--tinta); background: var(--fondo); }
.nav button:active { transform: scale(.96); }
.nav-icono { font-size: 1rem; line-height: 1; }

/* Menú desplegable de categorías: agrupa Subastas/Venta directa/Servicios/
   Alimentos/Alquiler/Inmuebles detrás de un solo botón — el nav tenía
   demasiados botones sueltos. El trigger calca .nav button; el panel abre
   hacia abajo, con los mismos botones de siempre adentro (mismo data-ir,
   sin cambios — aplicarModoBeta() los sigue encontrando igual). */
.nav-dropdown { position: relative; }
.nav-dropdown-trigger {
  display: flex;
  align-items: center;
  gap: .4rem;
  border: 0;
  background: none;
  font: inherit;
  font-size: .92rem;
  color: var(--suave);
  padding: .3rem .55rem;
  border-radius: var(--radio);
  cursor: pointer;
  transition: background-color var(--rapido), color var(--rapido);
}
.nav-dropdown-trigger:hover { color: var(--tinta); }
.nav-dropdown-trigger.activa { color: var(--tinta); background: var(--fondo); }
.nav-dropdown-chevron { width: .85rem; height: .85rem; transition: transform var(--rapido); }
.nav-dropdown-trigger[aria-expanded="true"] .nav-dropdown-chevron { transform: rotate(180deg); }
.nav-dropdown-menu {
  position: absolute;
  top: calc(100% + .3rem);
  left: 0;
  display: flex;
  flex-direction: column;
  gap: .1rem;
  min-width: 12rem;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  padding: .4rem;
  z-index: 20;
}
.nav-dropdown-menu button { width: 100%; }

/* Auditoría UX (2ª ronda): el panel de admin ya mide más de 20.000px con 12
   secciones y sin ninguna forma de saltar entre ellas — este índice corto
   queda pegado arriba del todo (sticky) para no perderlo de vista al
   scrollear. */
.admin-indice {
  position: sticky;
  top: 0;
  z-index: 5;
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  margin: .8rem 0 1.4rem;
  padding: .6rem;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
}

.admin-indice a {
  font-size: .78rem;
  padding: .25rem .65rem;
  border-radius: 999px;
  background: var(--fondo);
  color: var(--suave);
  text-decoration: none;
  white-space: nowrap;
}

.admin-indice a:hover { color: var(--tinta); background: var(--linea); }

/* Separador no interactivo entre grupos del índice — mismo texto que el
   <summary> del <details> que agrupa, para poder ubicar una sección sin
   tener que abrir cada grupo primero. */
.admin-indice-grupo {
  font-size: .7rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--suave);
  align-self: center;
  margin-left: .4rem;
}
.admin-indice-grupo:first-child { margin-left: 0; }

/* Agrupa las ~16 secciones del panel en 5 categorías plegables (Resumen/
   Logística/Contenido/Personas/Finanzas) — antes era un solo scroll de
   ~20.000px con todo desplegado a la vez; pedido del usuario de un panel
   "más profesional y eficiente para coordinar toda la página". Nativo
   (<details>/<summary>), sin JS para abrir/cerrar — solo el salto del
   índice de arriba necesita JS, para abrir el grupo antes del scroll (ver
   el manejador de clic en app.js: un ancla nunca abre solo un <details>
   cerrado). */
.admin-grupo {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  margin-bottom: 1rem;
  padding: 0 1.1rem;
}

.admin-grupo > summary {
  list-style: none;
  cursor: pointer;
  padding: 1rem 0;
  font-size: 1.05rem;
  font-weight: 600;
  font-family: 'Space Grotesk', sans-serif;
  display: flex;
  align-items: center;
  gap: .6rem;
}
.admin-grupo > summary::-webkit-details-marker { display: none; }
.admin-grupo > summary::before {
  content: '';
  width: .55rem;
  height: .55rem;
  border-right: 2px solid var(--suave);
  border-bottom: 2px solid var(--suave);
  transform: rotate(-45deg);
  transition: transform var(--rapido);
}
.admin-grupo[open] > summary::before { transform: rotate(45deg); }

.admin-grupo > h3:first-of-type { margin-top: 0; }
.admin-grupo > *:last-child { margin-bottom: 1.1rem; }

.admin-grupo-badge {
  background: var(--urgencia);
  color: #fff;
  font-size: .72rem;
  font-weight: 600;
  padding: .1rem .5rem;
  border-radius: 999px;
}

/* Insignia numérica compartida por cualquier ítem del nav que necesite
   avisar una cantidad pendiente (carrito, y ahora el total de pendientes
   de admin — ver "Auditoría UX", 2ª ronda). */
.contador-nav {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.1rem;
  height: 1.1rem;
  padding: 0 .3rem;
  border-radius: 999px;
  background: var(--vivo);
  color: #fff;
  font-size: .68rem;
  font-weight: 700;
  line-height: 1;
}
.contador-nav.urgente { background: var(--urgencia); }

.nav-anonimo { flex: 1; }
.nav-anonimo button {
  border: 0;
  background: none;
  font: inherit;
  font-size: .92rem;
  font-weight: 500;
  color: var(--tinta);
  padding: .3rem .55rem;
  border-radius: var(--radio);
  cursor: pointer;
  transition: background-color var(--rapido);
}
.nav-anonimo button:hover { background: var(--fondo); }

.sesion { margin-left: auto; display: flex; align-items: center; gap: .8rem; }
.quien { font-size: .88rem; color: var(--suave); }

.tema-toggle {
  border: 1px solid var(--linea);
  background: var(--panel);
  color: var(--tinta);
  width: 2.1rem;
  height: 2.1rem;
  border-radius: 50%;
  font-size: 1.05rem;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background-color var(--rapido), border-color var(--rapido), transform var(--rapido);
}

.tema-toggle:hover { border-color: var(--vivo); }
.tema-toggle:active { transform: scale(.9); }

/* ---------------- avisos ---------------- */

/* Auditoría UX: antes vivía en flujo normal cerca del tope de la página, así
   que en cualquier pantalla larga (o a media tarea, como ir subiendo
   documentos de a uno en Asociados) podía quedar fuera de la vista sin que
   nadie lo note. Un scrollIntoView() arregla eso pero crea un problema
   peor — saca a la persona de donde estaba constantemente, en vez de solo
   avisar. Fijo en la esquina, flotando sobre el contenido, no mueve el
   scroll para nada y aun así siempre se ve. */
.aviso {
  position: fixed;
  top: 1rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 60;
  width: calc(100% - 2rem);
  max-width: 34rem;
  margin: 0;
  padding: .7rem 1rem;
  border-left: 3px solid var(--vivo);
  border-radius: var(--radio);
  background: var(--vivo-claro);
  color: var(--tinta);
  font-size: .92rem;
  box-shadow: var(--sombra);
  transition: background-color var(--rapido), color var(--rapido);
}

.aviso.error {
  border-left-color: var(--alerta);
  background: var(--alerta-claro);
  color: var(--alerta);
}

/* ---------------- portada: hero ---------------- */

/* Sin fotografía real: en vez de fingir una, la profundidad la da el
   degradado — varias capas radiales sobre el fondo oscuro de base. Con tema
   claro se aclaran para no perder contraste con el texto blanco del hero. */
.hero {
  position: relative;
  left: 50%;
  transform: translateX(-50%);
  width: 100vw;
  margin-top: -1.5rem;
  padding: 5.5rem 1.25rem 4.5rem;
  background:
    radial-gradient(ellipse 60rem 30rem at 15% -10%, rgba(79, 191, 164, .35), transparent 60%),
    radial-gradient(ellipse 50rem 30rem at 100% 10%, rgba(224, 165, 58, .18), transparent 55%),
    #0e1013;
  color: #f3f4f5;
  overflow: hidden;
  text-align: center;
}

.hero-contenido { max-width: 40rem; margin: 0 auto; position: relative; z-index: 1; }

.hero-marca {
  font-family: var(--fuente-titulo);
  font-weight: 700;
  font-size: 1rem;
  letter-spacing: .28em;
  text-transform: uppercase;
  line-height: 1.5;
  color: #9adfcd;
  margin: 0 0 1.6rem;
}

.hero-titulo {
  font-family: var(--fuente-titulo);
  font-weight: 700;
  font-size: 3.4rem;
  line-height: 1.05;
  letter-spacing: -0.01em;
  margin: 0 0 1.1rem;
  color: #fff;
}

/* Subtítulo (modo beta): un peldaño entre el título y la explicación —
   más chico que .hero-titulo, más grande y firme que .hero-sub. */
.hero-subtitulo {
  font-family: var(--fuente-titulo);
  font-weight: 600;
  font-size: 1.35rem;
  color: #e7e9eb;
  margin: 0 0 1rem;
}

.hero-sub {
  font-size: 1.05rem;
  line-height: 1.6;
  color: #c7ccd1;
  max-width: 34rem;
  margin: 0 auto 1.4rem;
}

/* Frase de visión (modo beta): mismo tono que .hero-sub, apenas más suave
   — es la promesa a futuro, no la explicación de qué hace hoy. */
.hero-vision {
  font-size: .95rem;
  line-height: 1.6;
  font-style: italic;
  color: #9aa1a8;
  max-width: 30rem;
  margin: 0 auto 2.2rem;
}

.hero-acciones { display: flex; flex-direction: column; align-items: center; gap: .9rem; }
.hero-acciones .principal { font-size: 1rem; padding: .8rem 1.8rem; }
.hero-acciones .enlace { color: #c7ccd1; }
.hero-acciones .enlace:hover { color: #fff; }

/* Llamado secundario (modo beta): "Explorar productos" deja de ser el
   único botón — .principal ya lo usa "Publica gratis", así que este pasa
   a un contorno hueco para no competir por atención. */
.hero-acciones .principal.hero-secundario {
  background: none;
  border: 1px solid rgba(255, 255, 255, .35);
  color: #f3f4f5;
}
.hero-acciones .principal.hero-secundario:hover { background: rgba(255, 255, 255, .08); }

/* Insignia "LANDCO BETA" (eyebrow pill) y las dos frases de cierre, todas
   con colores fijos (no tokens de tema): el hero mismo ya es un fondo
   oscuro fijo, sin importar el tema claro/oscuro del resto del sitio. */
.hero-beta-badge {
  display: inline-block;
  font-size: .78rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: #d7fbef;
  background: rgba(79, 191, 164, .16);
  border: 1px solid rgba(79, 191, 164, .45);
  border-radius: 999px;
  padding: .35rem .9rem;
  margin: 1.8rem 0 0;
}

.hero-comunidad {
  font-size: .95rem;
  color: #c7ccd1;
  margin: .9rem 0 0;
}

.hero-futuro {
  font-size: .82rem;
  color: #8b9198;
  margin: .6rem 0 0;
}

/* ---------------- portada: secciones ---------------- */

.seccion-portada { max-width: 60rem; margin: 3.5rem auto; padding: 0 1.25rem; }
.seccion-portada h2 { text-align: center; font-size: 1.4rem; margin: 0 0 1.75rem; }

.pasos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1.5rem;
}

.paso { text-align: center; padding: 0 1rem; }

.paso-numero {
  display: inline-block;
  font-family: var(--fuente-titulo);
  font-weight: 700;
  font-size: 1.5rem;
  color: var(--vivo);
  margin-bottom: .5rem;
}

.paso h3 { margin: 0 0 .5rem; }
.paso p { color: var(--suave); margin: 0; font-size: .92rem; line-height: 1.55; }

.confianza-lista {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  max-width: 40rem;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.confianza-lista li {
  display: flex;
  align-items: flex-start;
  gap: .7rem;
  font-size: .95rem;
  line-height: 1.5;
}

.confianza-check {
  flex-shrink: 0;
  width: 1.4rem;
  height: 1.4rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--vivo-claro);
  color: var(--vivo);
  font-size: .8rem;
  font-weight: 700;
  margin-top: .1rem;
}

/* ---------------- promo de asociados (portada) y Sobre nosotros ---------------- */

/* Mismo lenguaje visual que .escudo-explicacion (borde izquierdo + fondo
   tenue en el color de marca) en vez de un bloque sólido: así el contraste
   ya queda resuelto en los dos temas sin definir un color nuevo. */
.promo-asociados {
  max-width: 60rem;
  margin: 3.5rem auto;
  padding: 1.75rem 2rem;
  display: flex;
  align-items: center;
  gap: 1.5rem;
  border: 1px solid var(--linea);
  border-left: 4px solid var(--vivo);
  border-radius: var(--radio);
  background: var(--vivo-claro);
  transition: background-color var(--rapido), border-color var(--rapido);
}

.promo-asociados > .icono {
  width: 2.5rem;
  height: 2.5rem;
  flex-shrink: 0;
  color: var(--vivo);
  stroke-width: 1.3;
}

.promo-asociados-texto { flex: 1; min-width: 0; }
.promo-asociados-texto h2 { margin: 0 0 .35rem; text-align: left; color: var(--vivo); font-size: 1.25rem; }
.promo-asociados-texto p { margin: 0; color: var(--tinta); font-size: .92rem; line-height: 1.55; }
.promo-asociados .principal { flex-shrink: 0; white-space: nowrap; }

@media (max-width: 40rem) {
  .promo-asociados { flex-direction: column; text-align: center; padding: 1.5rem 1.25rem; }
  .promo-asociados-texto h2 { text-align: center; }
  .promo-asociados .principal { align-self: center; }
}

.sobre-nosotros-intro { max-width: 40rem; color: var(--suave); font-size: 1rem; line-height: 1.6; }

.trabaja-con-nosotros {
  margin: 1.75rem 0;
  padding: 1.5rem 1.75rem;
  border: 1px solid var(--linea);
  border-left: 4px solid var(--vivo);
  border-radius: var(--radio);
  background: var(--vivo-claro);
  max-width: 40rem;
}

.trabaja-con-nosotros h3 { display: flex; align-items: center; gap: .5rem; margin: 0 0 .8rem; color: var(--vivo); }
.trabaja-con-nosotros p { margin: 0 0 .9rem; color: var(--tinta); font-size: .94rem; line-height: 1.6; }
.trabaja-con-nosotros .principal { margin-top: .3rem; }

.sobre-nosotros-ayuda { color: var(--suave); font-size: .9rem; margin-top: 2rem; }

.valores-lista { list-style: none; margin: 1.5rem 0 0; padding: 0; max-width: 40rem; display: flex; flex-direction: column; gap: 1rem; }
.valores-lista li { display: flex; align-items: flex-start; gap: .7rem; font-size: .95rem; line-height: 1.5; color: var(--tinta); }
.valores-lista li::before {
  content: "✓"; flex-shrink: 0; width: 1.4rem; height: 1.4rem; display: flex; align-items: center;
  justify-content: center; border-radius: 50%; background: var(--vivo-claro); color: var(--vivo);
  font-size: .8rem; font-weight: 700; margin-top: .1rem;
}

/* ---------------- privacidad y tratamiento de datos ---------------- */

.privacidad-intro { max-width: 40rem; color: var(--suave); font-size: 1rem; line-height: 1.6; }

.privacidad-doc {
  max-width: 46rem;
  margin: 1.75rem 0;
  padding: 1.75rem 2rem;
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  background: var(--panel);
  box-shadow: var(--sombra);
}
.privacidad-doc h3 { margin: 0 0 .3rem; }
.privacidad-doc .privacidad-fecha { color: var(--suave); font-size: .85rem; margin: 0 0 1.2rem; }
.privacidad-doc h4 { margin: 1.4rem 0 .5rem; font-size: 1rem; }
.privacidad-doc h4:first-of-type { margin-top: 1.6rem; }
.privacidad-doc p, .privacidad-doc li { color: var(--tinta); font-size: .94rem; line-height: 1.6; }
.privacidad-doc + .privacidad-doc { margin-top: 2.5rem; }

/* ---------------- pie de página ---------------- */

.pie {
  border-top: 1px solid var(--linea);
  background: var(--panel);
  margin-top: 3rem;
  padding: 3rem 1.25rem 1.5rem;
  transition: background-color var(--rapido), border-color var(--rapido);
}

.pie-contenido {
  max-width: 60rem;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1.4fr repeat(3, 1fr);
  gap: 2rem;
}

.pie-marca .marca { margin-bottom: .6rem; }
.pie-marca p { color: var(--suave); font-size: .86rem; line-height: 1.6; margin: 0; max-width: 22rem; }

.pie h4 {
  margin: 0 0 .75rem;
  font-family: var(--fuente-titulo);
  font-size: .82rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--suave);
}

.pie ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .55rem; }

.pie a, .pie button.enlace {
  color: var(--tinta);
  text-decoration: none;
  font-size: .88rem;
  background: none;
  border: 0;
  padding: 0;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
}
.pie a:hover, .pie button.enlace:hover { color: var(--vivo); }
.pie li { color: var(--suave); font-size: .88rem; }

.pie-legal {
  max-width: 60rem;
  margin: 2.5rem auto 0;
  padding-top: 1.25rem;
  border-top: 1px solid var(--linea);
  color: var(--suave);
  font-size: .8rem;
}

@media (max-width: 40rem) {
  .pie-contenido { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 34rem) {
  .hero { padding: 4rem 1rem 3rem; }
  .hero-titulo { font-size: 2.3rem; }
  .hero-subtitulo { font-size: 1.1rem; }
  .hero-sub { font-size: .95rem; }
}

/* ---------------- modal de acceso ---------------- */

.modal-fondo {
  position: fixed;
  inset: 0;
  z-index: 50;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.25rem;
  background: rgba(10, 11, 13, .55);
  animation: modal-fondo-entra .15s ease;
}

@keyframes modal-fondo-entra {
  from { opacity: 0; }
  to { opacity: 1; }
}

.modal-caja {
  position: relative;
  max-width: 100%;
  max-height: 90vh;
  overflow: auto;
  animation: modal-caja-entra .18s ease;
}

@keyframes modal-caja-entra {
  from { opacity: 0; transform: translateY(.75rem) scale(.98); }
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .modal-fondo, .modal-caja { animation: none; }
}

.modal-cerrar {
  position: absolute;
  top: -.6rem;
  right: -.6rem;
  width: 2.1rem;
  height: 2.1rem;
  border-radius: 50%;
  border: 1px solid var(--linea);
  background: var(--panel);
  color: var(--tinta);
  font-size: .95rem;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color var(--rapido), transform .1s ease;
  z-index: 1;
}

.modal-cerrar:hover { border-color: var(--vivo); }
.modal-cerrar:active { transform: scale(.9); }

.bienvenida-caja { max-width: 22rem; text-align: center; }
.bienvenida-caja h2 { margin: 0 0 .6rem; }
.bienvenida-caja .principal { width: 100%; margin-top: .4rem; }

.bienvenida-insignia {
  display: inline-block;
  font-size: .78rem;
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--vivo);
  background: var(--vivo-claro);
  border-radius: 999px;
  padding: .3rem .8rem;
  margin: 0 0 .75rem;
}

/* ---------------- formularios ---------------- */

.acceso {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  max-width: 24rem;
  padding: 1.25rem;
}

.pestanas { display: flex; gap: 1.25rem; margin-bottom: 1.1rem; }

.pestanas button {
  border: 0;
  background: none;
  font: inherit;
  font-size: .95rem;
  color: var(--suave);
  padding: 0 0 .35rem;
  border-bottom: 2px solid transparent;
  cursor: pointer;
}

.pestanas button.activa { color: var(--tinta); border-bottom-color: var(--vivo); }

.acceso-ayuda { color: var(--suave); font-size: .88rem; line-height: 1.5; margin: 0 0 .3rem; }

.formulario label.checkbox-consentimiento {
  flex-direction: row; align-items: flex-start; gap: .5rem;
  font-size: .85rem; color: var(--suave); line-height: 1.5;
}
.checkbox-consentimiento input { width: auto; margin-top: .2rem; flex-shrink: 0; }
.checkbox-consentimiento .enlace { font-size: inherit; }

.autorizacion-antecedentes {
  display: flex; align-items: flex-start; gap: .5rem; font-size: .85rem; color: var(--suave);
  line-height: 1.45; max-width: 26rem; margin: .5rem 0;
}
.autorizacion-antecedentes input { width: auto; margin-top: .2rem; flex-shrink: 0; }

.formulario { display: flex; flex-direction: column; gap: .85rem; }
.formulario.ancho { max-width: 30rem; background: var(--panel); border: 1px solid var(--linea); border-radius: var(--radio); box-shadow: var(--sombra); padding: 1.25rem; }

.formulario label {
  display: flex;
  flex-direction: column;
  gap: .3rem;
  font-size: .88rem;
  color: var(--suave);
}

.formulario small { color: var(--suave); font-size: .8rem; }

.buscador { position: relative; margin-bottom: 1.5rem; }

.buscador-fila { display: flex; gap: .6rem; }
.buscador-fila input[type="search"] { flex: 1; }

/* Categoría, marca, precio y orden viven acá adentro: cerrado por defecto,
   así la barra de arriba no compite con el listado por atención. */
.filtro-toggle {
  display: flex;
  align-items: center;
  gap: .4rem;
  white-space: nowrap;
  font: inherit;
  font-size: .88rem;
  color: var(--tinta);
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .5rem .9rem;
  cursor: pointer;
  transition: border-color var(--rapido), color var(--rapido);
}

.filtro-toggle:hover { border-color: var(--vivo); }
.filtro-toggle.activo { border-color: var(--vivo); color: var(--vivo); }

.filtro-flecha { font-size: .7rem; transition: transform var(--rapido); }
.filtro-toggle[aria-expanded="true"] .filtro-flecha { transform: rotate(180deg); }

.filtro-panel {
  position: absolute;
  top: calc(100% + .5rem);
  right: 0;
  z-index: 15;
  display: flex;
  flex-direction: column;
  gap: .2rem;
  width: 17rem;
  max-width: calc(100vw - 2.5rem);
  padding: 1rem;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra), 0 12px 32px rgba(20, 22, 26, .12);
}

.filtro-panel label {
  font-size: .82rem;
  color: var(--suave);
  margin: .5rem 0 .25rem;
}

.filtro-panel label:first-child { margin-top: 0; }

.filtro-acciones {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-top: .85rem;
}

input, textarea, select {
  font: inherit;
  font-size: .95rem;
  color: var(--tinta);
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .5rem .6rem;
  width: 100%;
  transition: border-color var(--rapido), background-color var(--rapido);
}

textarea { resize: vertical; }

input:focus-visible, textarea:focus-visible, button:focus-visible {
  outline: 2px solid var(--vivo);
  outline-offset: 1px;
}

input:hover, textarea:hover, select:hover { border-color: var(--suave); }

.modo { border: 1px solid var(--linea); padding: .8rem .9rem; margin: 0; }
.modo legend { font-size: .88rem; color: var(--suave); padding: 0 .3rem; }

.radio { flex-direction: row !important; align-items: flex-start; gap: .55rem; color: var(--tinta); }
.radio input { width: auto; margin-top: .28rem; }
.radio strong { font-weight: 500; display: block; }
.radio span { font-size: .88rem; color: var(--suave); }

/* Checkboxes de especialidad/servicio/zona: mismo lenguaje que .radio, en
   una cuadrícula que se ajusta sola en vez de una lista vertical larga. */
.checks { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: .5rem .9rem; }
.checks label { flex-direction: row !important; align-items: center; gap: .5rem; color: var(--tinta); font-size: .92rem; }
.checks input { width: auto; }

.capacidad-con-unidad { display: flex; gap: .5rem; }
.capacidad-con-unidad input { flex: 1; }
.capacidad-con-unidad select { width: auto; }

/* ---------------- botones ---------------- */

.principal {
  font: inherit;
  font-size: .95rem;
  background: var(--vivo);
  color: #fff;
  border: 0;
  border-radius: var(--radio);
  padding: .58rem 1.1rem;
  cursor: pointer;
  align-self: flex-start;
  transition: background-color var(--rapido), transform .1s ease, box-shadow var(--rapido);
}

.principal:hover { background: #17493f; }
.principal:active:not([disabled]) { transform: scale(.97); }
.principal[disabled] { background: var(--suave); cursor: default; }

@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) .principal:hover { background: #6cd0b6; }
}
:root[data-tema="oscuro"] .principal:hover { background: #6cd0b6; }

/* Mismo tamaño que .principal, solo cambia el color — para un botón que
   necesita distinguirse de la acción principal (ej. "Iniciar sesión" al
   lado de "Crear cuenta") sin bajar a texto plano como .enlace. */
.principal.azul { background: var(--cielo); }
.principal.azul:hover { background: #026aa3; }
@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) .principal.azul:hover { background: #7dd3fc; }
}
:root[data-tema="oscuro"] .principal.azul:hover { background: #7dd3fc; }

.enlace {
  font: inherit;
  font-size: .88rem;
  background: none;
  border: 0;
  color: var(--suave);
  padding: 0;
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
  align-self: flex-start;
  transition: color var(--rapido);
}

.enlace:hover { color: var(--tinta); }
.enlace:active { transform: scale(.97); }
.volver { margin-bottom: 1.2rem; }

.detalle-cabecera {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 1.2rem;
}
.detalle-cabecera .volver { margin-bottom: 0; }
.detalle-acciones-rapidas { display: flex; align-items: center; gap: 1rem; }
#btn-compartir, #btn-favorito-detalle { display: inline-flex; align-items: center; gap: .35rem; text-decoration: none; }
#btn-compartir:hover, #btn-favorito-detalle:hover { text-decoration: underline; }
#btn-favorito-detalle.activo { color: var(--urgencia); }
#btn-favorito-detalle.activo .icono { fill: currentColor; }

.convertir-fecha { width: auto; font-size: .85rem; padding: .35rem .5rem; }

/* ---------------- migas de navegación ---------------- */

.migas {
  display: flex;
  align-items: center;
  gap: .35rem;
  margin: 1.4rem 0 .3rem;
  font-size: .84rem;
  color: var(--suave);
}

.migas .icono { width: .85rem; height: .85rem; }

.miga-enlace {
  background: none;
  border: 0;
  padding: 0;
  color: var(--suave);
  font: inherit;
  cursor: pointer;
}
.miga-enlace:hover { color: var(--vivo); }

.migas .actual { color: var(--tinta); font-weight: 500; }

/* ---------------- mercado: filtros + grilla + anuncios ---------------- */

/* Tres columnas piden más aire del que da <main> (60rem, pensado para texto
   corrido) — el mismo quiebre de ancho que ya usa .hero, pero con un techo
   propio en vez de 100vw a secas: no queremos una cuadrícula infinita en
   monitores anchos. */
.mercado-layout {
  position: relative;
  left: 50%;
  transform: translateX(-50%);
  width: 100vw;
  max-width: 78rem;
  box-sizing: border-box;
  padding: 0 1.25rem;
  display: flex;
  gap: 1.75rem;
  align-items: flex-start;
}

.mercado-principal { flex: 1; min-width: 0; }

.panel-filtros {
  width: 14rem;
  flex-shrink: 0;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  padding: 1.1rem;
  transition: background-color var(--rapido), border-color var(--rapido);
}

.panel-filtros h2 {
  display: flex;
  align-items: center;
  gap: .4rem;
  margin: 0 0 .9rem;
  font-size: .95rem;
}

.panel-filtros-cabecera { display: flex; align-items: center; justify-content: space-between; gap: .6rem; }
.panel-filtros-cabecera h2 { margin: 0 0 .9rem; }

/* Oculto salvo en móvil (ver el media query de más abajo) — en escritorio
   los filtros ya se ven enteros, sin necesidad de un botón para abrirlos. */
.btn-filtros-toggle {
  display: none;
  border: 1px solid var(--linea);
  background: var(--fondo);
  color: var(--tinta);
  border-radius: 999px;
  padding: .3rem .8rem;
  font-size: .8rem;
  font-weight: 600;
  cursor: pointer;
  margin-bottom: .9rem;
}
.btn-filtros-toggle[aria-expanded="true"] { background: var(--vivo); color: #fff; border-color: var(--vivo); }

.buscador-panel {
  display: flex;
  align-items: center;
  gap: .5rem;
  padding: .5rem .7rem;
  margin-bottom: 1rem;
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  color: var(--suave);
  background: var(--fondo);
}
.buscador-panel .icono { width: 1rem; height: 1rem; flex-shrink: 0; }
.buscador-panel input {
  border: 0;
  background: none;
  padding: 0;
  width: 100%;
  color: var(--tinta);
}
.buscador-panel input:focus { outline: none; }

.grupo-filtro {
  padding: .9rem 0;
  border-top: 1px solid var(--linea);
}
.grupo-filtro:first-of-type { border-top: 0; padding-top: 0; }
.grupo-filtro h3 { margin: 0 0 .55rem; font-size: .8rem; text-transform: uppercase; letter-spacing: .03em; color: var(--suave); }

.lista-categorias { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .1rem; }

.opcion-categoria {
  display: flex;
  align-items: center;
  gap: .5rem;
  width: 100%;
  padding: .4rem .5rem;
  border: 0;
  border-radius: var(--radio);
  background: none;
  color: var(--tinta);
  font-size: .86rem;
  text-align: left;
  cursor: pointer;
  transition: background-color var(--rapido), color var(--rapido);
}
.opcion-categoria .icono { width: 1rem; height: 1rem; color: var(--suave); flex-shrink: 0; }
.opcion-categoria:hover { background: var(--fondo); }
.opcion-categoria.activa { background: var(--vivo-claro); color: var(--vivo); font-weight: 600; }
.opcion-categoria.activa .icono { color: var(--vivo); }

.rango-precio { display: flex; align-items: center; gap: .5rem; color: var(--suave); }
.rango-precio input { min-width: 0; }

.opcion-filtro {
  display: flex;
  align-items: center;
  gap: .5rem;
  font-size: .86rem;
  padding: .25rem 0;
  cursor: pointer;
}
.opcion-filtro input { width: auto; margin: 0; }

.panel-filtros .principal.ancho-completo { width: 100%; margin-top: 1rem; }
.panel-filtros .enlace { display: block; width: 100%; text-align: center; margin-top: .5rem; font-size: .84rem; }

.barra-resultados {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  margin-bottom: 1rem;
}

.cuenta-resultados { color: var(--suave); font-size: .88rem; }

.orden { display: flex; align-items: center; gap: .5rem; font-size: .86rem; color: var(--suave); }
.orden select { width: auto; }

.mercado-sidebar {
  width: 15rem;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
}

.panel-anuncios {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  padding: 1rem;
  transition: background-color var(--rapido), border-color var(--rapido);
}
.panel-anuncios h3 { margin: 0 0 .75rem; font-size: .92rem; }

.lista-anuncios { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .9rem; }

.lista-anuncios a {
  display: block;
  text-decoration: none;
  color: inherit;
  transition: opacity var(--rapido);
}
.lista-anuncios a:hover { opacity: .82; }
.lista-anuncios a:active { opacity: .65; }

.lista-anuncios img, .anuncio-imagen-vacia {
  width: 100%;
  height: 6rem;
  object-fit: cover;
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  margin-bottom: .4rem;
  background: var(--fondo);
}

.anuncio-imagen-vacia {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.8rem;
}

.anuncio-titulo { display: block; font-size: .86rem; font-weight: 500; }
.anuncio-sub { display: block; font-size: .78rem; color: var(--suave); margin-top: .15rem; }

/* Bento: el primer destacado ocupa las dos columnas y una imagen más grande,
   el resto queda en mosaico parejo — así el ojo escanea por tamaño, no por
   orden de lista, y el destacado más reciente siempre se nota primero. */
.lista-bento {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: .7rem;
}

.lista-bento > li:first-child { grid-column: 1 / -1; }
.lista-bento > li:first-child img, .lista-bento > li:first-child .anuncio-imagen-vacia { height: 8rem; font-size: 2.4rem; }
.lista-bento img, .lista-bento .anuncio-imagen-vacia { height: 4.5rem; }
.lista-bento .anuncio-titulo { font-size: .8rem; }

/* ---------------- listas ---------------- */

.lista {
  list-style: none;
  margin: 0;
  padding: 0;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  overflow: hidden;
  transition: background-color var(--rapido), border-color var(--rapido);
}
.lista:empty { display: none; }

.fila {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: .5rem 1rem;
  padding: .85rem 1rem;
  border-bottom: 1px solid var(--linea);
  cursor: pointer;
  position: relative;
  transition: background-color var(--rapido);
}

.fila:last-child { border-bottom: 0; }
.fila:hover { background: var(--fondo); }
.fila:active { background: var(--linea); }
.fila.quieta { cursor: default; }
.fila.quieta:hover, .fila.quieta:active { background: none; }
.fila.cargar-mas { justify-content: center; }

/* Mientras el carril cambia de imagen, se apaga hasta que la nueva carga */
.tarjeta-imagen .miniatura.cambiando { opacity: 0; }

/* ---------------- esqueleto de carga ---------------- */

@keyframes brillo-esqueleto {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

.skeleton .tarjeta-imagen,
.skeleton .tarjeta-categoria,
.skeleton .tarjeta-titulo,
.skeleton .tarjeta-sub {
  display: block;
  color: transparent;
  border-color: transparent;
  background: linear-gradient(90deg, var(--linea) 25%, var(--fondo) 50%, var(--linea) 75%);
  background-size: 250% 100%;
  animation: brillo-esqueleto 1.3s ease-in-out infinite;
}

.skeleton .tarjeta-categoria { width: 40%; height: .74rem; border-radius: var(--radio); margin-bottom: .3rem; }
.skeleton .tarjeta-titulo { width: 75%; height: 1.05rem; border-radius: var(--radio); }
.skeleton .tarjeta-sub { width: 45%; height: .8rem; border-radius: var(--radio); margin-top: .4rem; }

@media (prefers-reduced-motion: reduce) {
  .skeleton .tarjeta-imagen, .skeleton .tarjeta-categoria,
  .skeleton .tarjeta-titulo, .skeleton .tarjeta-sub { animation: none; }
}

/* min-width en rem (no 0): con flex-wrap, un valor mínimo razonable hace que
   .cifra-fila/los botones salten a su propia línea en vez de ir arrinconando
   el título letra por letra cuando no entran todos en una sola fila (pasaba
   en el panel de admin, con un <select> largo + botón compitiendo por
   espacio). Las tarjetas del mercado (.grid-productos) no compiten por ancho
   — ahí .cuerpo ya es columna completa y esto no cambia nada. */
.fila .cuerpo { flex: 1; min-width: 11rem; }
.fila .nombre { display: block; font-weight: 500; }
.fila .sub { display: block; font-size: .84rem; color: var(--suave); margin-top: .15rem; }
.fila .sub.error { color: var(--alerta); }

.fila .cifra-fila { text-align: right; white-space: nowrap; }

.mono, .importe, .cuenta, .cifra-fila strong {
  font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-variant-numeric: tabular-nums;
  font-weight: 500;
}

.cifra-fila strong { display: block; font-size: 1.02rem; color: var(--vivo); }
.cifra-fila span { display: block; font-size: .78rem; color: var(--suave); margin-top: .15rem; }

.vacio { padding: 1rem; color: var(--suave); font-size: .92rem; }

/* ---------------- tarjetas de producto (mercado) ---------------- */

/* .grid-productos va en #lista-subastas, #lista-fijos y #lista-portada (la
   portada reusa las mismas tarjetas). .fila también la usan Mis compras y Mis
   ventas como lista de gestión (con botones, sin fotos) — esa sigue siendo
   una fila angosta, solo .grid-productos la vuelve cuadrícula. */
.grid-productos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1rem;
  background: none;
  border: 0;
  box-shadow: none;
  border-radius: 0;
}

.grid-productos .fila {
  flex-direction: column;
  align-items: stretch;
  gap: 0;
  padding: 0;
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  transition: transform var(--rapido), box-shadow var(--rapido), border-color var(--rapido);
}

/* El min-width de 11rem en .fila .cuerpo (arriba) piensa en la fila angosta
   de Mis compras/Mis ventas, donde varios elementos compiten por una sola
   línea — acá adentro nunca hizo falta ("ya es columna completa"), pero deja
   de ser inofensivo en cuanto el propio grid-item mide menos de 11rem (ver
   el bloque de dos columnas en celular, más abajo): sin este 0, esa columna
   angosta se ve forzada a ensancharse hasta 11rem y rompe la grilla. */
.grid-productos .fila .cuerpo { min-width: 0; }

.grid-productos .fila:last-child { border: 1px solid var(--linea); }

.grid-productos .fila:hover {
  background: var(--panel);
  transform: translateY(-3px);
  border-color: var(--vivo);
  box-shadow: var(--sombra), 0 0 0 1px var(--vivo);
}

.grid-productos .vacio, .grid-productos .cargar-mas {
  grid-column: 1 / -1;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
}

/* La imagen (o el marcador sin foto) llena la cabecera de la tarjeta;
   insignias y favorito flotan encima con posicionamiento absoluto. */
.tarjeta-imagen {
  position: relative;
  /* width explícito, no heredado del stretch del flex: dentro de una fila que
     además es ítem de un grid (auto-fit), el aspect-ratio no alcanza a
     calcular la altura si el ancho depende solo de align-items:stretch —
     queda en ~0 (visto a mano, sin ancho propio la tarjeta se aplastaba). */
  width: 100%;
  aspect-ratio: 4 / 3;
  background: var(--fondo);
  border-bottom: 1px solid var(--linea);
  overflow: hidden;
}

.tarjeta-imagen .miniatura {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity .2s ease;
}

.marcador-imagen {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--suave);
}

.marcador-imagen .icono { width: 2.75rem; height: 2.75rem; stroke-width: 1.3; }

.insignia-condicion {
  position: absolute;
  top: .6rem;
  left: .6rem;
  padding: .2rem .55rem;
  border-radius: 999px;
  font-size: .68rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .03em;
  background: var(--panel);
  color: var(--suave);
  border: 1px solid var(--linea);
}

.insignia-condicion.nuevo { background: var(--vivo-claro); color: var(--vivo); border-color: transparent; }

.insignia-cierra {
  display: none;
  align-items: center;
  gap: .3rem;
  position: absolute;
  bottom: .6rem;
  left: .6rem;
  padding: .2rem .55rem;
  border-radius: 999px;
  background: var(--urgencia-claro);
  color: var(--urgencia);
  font-size: .68rem;
  font-weight: 600;
}

.insignia-cierra .icono { width: .8rem; height: .8rem; }
.fila.urgente .insignia-cierra { display: inline-flex; }

/* Corazón de favoritos: encima de la imagen, un círculo oscuro semitransparente
   funciona sobre cualquier foto y en cualquiera de los dos temas por igual */
.fav {
  position: absolute;
  top: .5rem;
  right: .5rem;
  width: 2rem;
  height: 2rem;
  border: 0;
  border-radius: 50%;
  background: rgba(15, 17, 20, .45);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background-color var(--rapido), transform .1s ease;
}

.fav .icono { width: 1.05rem; height: 1.05rem; }
.fav:hover { background: rgba(15, 17, 20, .65); }
.fav:active { transform: scale(.85); }
.fav.activo { color: #ff5470; }

/* Mismo botón circular que .fav, apilado justo debajo — solo aparece en
   publicaciones de precio fijo ajenas (ver filaProducto() en app.js). */
.carrito-boton {
  position: absolute;
  top: 2.85rem;
  right: .5rem;
  width: 2rem;
  height: 2rem;
  border: 0;
  border-radius: 50%;
  background: rgba(15, 17, 20, .45);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background-color var(--rapido), transform .1s ease;
}

.carrito-boton .icono { width: 1.05rem; height: 1.05rem; }
.carrito-boton:hover { background: rgba(15, 17, 20, .65); }
.carrito-boton:active { transform: scale(.85); }
.carrito-boton.activo { color: var(--vivo); background: #fff; }

.carrito-resumen {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-top: 1rem;
  padding: 1rem;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
}

.carrito-total { font-size: 1.05rem; }

.carrito-item-modalidad {
  display: flex;
  flex-direction: column;
  gap: .3rem;
  font-size: .82rem;
  color: var(--suave);
  margin-top: .4rem;
}

.tarjeta-cuerpo {
  display: flex;
  flex-direction: column;
  gap: .15rem;
  padding: .8rem 1rem .9rem;
  flex: 1;
}

.tarjeta-categoria {
  display: flex;
  align-items: center;
  gap: .35rem;
  font-size: .74rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .03em;
  color: var(--vivo);
}

.tarjeta-categoria .icono { width: .95rem; height: .95rem; }

.tarjeta-titulo {
  margin: .1rem 0 0;
  font-size: 1.05rem;
  font-weight: 600;
  line-height: 1.3;
}

.tarjeta-sub { font-size: .8rem; color: var(--suave); }
.fila.urgente .tarjeta-sub { color: var(--urgencia); font-weight: 500; }

/* Insignia "Vendedor confiable" — ver VENDEDOR_CONFIABLE_SQL en server.js.
   Mismo lenguaje visual que .escudo, pero más compacta para caber en la
   tarjeta del listado y en la línea de metadatos del detalle. */
.tarjeta-confiable {
  display: inline-flex;
  align-items: center;
  gap: .25rem;
  margin-top: .2rem;
  padding: .15rem .5rem;
  border-radius: 999px;
  background: var(--vivo-claro);
  color: var(--vivo);
  font-size: .72rem;
  font-weight: 600;
  width: fit-content;
}

/* ---------------- Compra Protegida LandCo ---------------- */

.escudo {
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  padding: .2rem .6rem;
  border-radius: 999px;
  background: var(--vivo-claro);
  color: var(--vivo);
  font-size: .78rem;
  font-weight: 600;
}

.escudo-explicacion {
  display: flex;
  align-items: flex-start;
  gap: .7rem;
  padding: .9rem 1.1rem;
  margin: 0 0 1.4rem;
  border: 1px solid var(--linea);
  border-left: 3px solid var(--vivo);
  border-radius: var(--radio);
  background: var(--vivo-claro);
}

.escudo-explicacion strong { display: block; color: var(--vivo); margin-bottom: .2rem; }
.escudo-explicacion p { margin: 0 0 .6rem; font-size: .88rem; color: var(--tinta); }
.escudo-explicacion .icono { width: 1.4rem; height: 1.4rem; color: var(--vivo); flex-shrink: 0; }
/* Auditoría UX (2ª ronda): las dos opciones de entrega quedaban pegadas,
   sin separación clara entre una y otra — se reutiliza en cada ítem del
   carrito, así que el problema aparece varias veces por página. */
.escudo-explicacion label.radio, .escudo-explicacion label.checkbox { display: flex; margin-bottom: .5rem; }

/* Código de recogida/entrega: grande y espaciado para leerlo rápido desde el
   celular, en voz alta, sin ambigüedad de dígitos. */
.codigo-verificacion {
  font-size: 1.8rem;
  font-weight: 700;
  letter-spacing: .35em;
  font-variant-numeric: tabular-nums;
  color: var(--vivo) !important;
  margin: .3rem 0 !important;
}

/* Línea de tiempo del seguimiento: un punto por evento, conectados por una
   guía vertical. El más reciente arriba (mismo orden que llega del backend
   invertido), sin distinguir roles — cada quien ve los mismos hechos. */
.linea-tiempo { list-style: none; margin: 1.5rem 0; padding: 0; }

.linea-tiempo li {
  position: relative;
  padding: 0 0 1.3rem 1.6rem;
  border-left: 2px solid var(--linea);
  margin-left: .45rem;
}

.linea-tiempo li:last-child { border-color: transparent; padding-bottom: 0; }

.linea-tiempo li::before {
  content: '';
  position: absolute;
  left: -.5rem;
  top: .2rem;
  width: .9rem;
  height: .9rem;
  border-radius: 50%;
  background: var(--vivo);
  border: 2px solid var(--panel);
}

.linea-tiempo .lt-accion { font-weight: 500; display: block; }
.linea-tiempo .lt-meta { font-size: .8rem; color: var(--suave); display: block; margin-top: .15rem; }

.ficha-congelada {
  background: var(--fondo);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: 1rem 1.1rem;
  margin: 1rem 0;
  font-size: .9rem;
}

.ficha-congelada dl { display: grid; grid-template-columns: auto 1fr; gap: .3rem 1rem; margin: 0; }
.ficha-congelada dt { color: var(--suave); }
.ficha-congelada dd { margin: 0; }

.panel-inspeccion {
  border-top: 1px solid var(--linea);
  margin-top: .9rem;
  padding-top: .9rem;
}

.checklist-grupo { margin-bottom: .9rem; }
.checklist-grupo h4 { margin: 0 0 .4rem; font-size: .85rem; color: var(--suave); text-transform: uppercase; letter-spacing: .03em; }
.checklist-item { display: flex; align-items: center; gap: .5rem; padding: .3rem 0; font-size: .9rem; }
.checklist-item select { width: auto; flex-shrink: 0; }

.seg-acciones { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-top: 1.2rem; }

.desglose-compra {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .7rem .9rem;
  margin-top: .7rem;
  font-size: .88rem;
  display: flex;
  flex-direction: column;
  gap: .25rem;
}
.desglose-compra strong { margin-top: .3rem; font-size: .95rem; }

#btn-contactar-whatsapp { display: inline-block; text-decoration: none; text-align: center; }

.nota-beta {
  background: var(--urgencia-claro);
  color: var(--urgencia);
  border-radius: var(--radio);
  padding: .8rem 1rem;
  font-size: .9rem;
  margin-bottom: 1.2rem;
}

.tarifas-tabla { width: 100%; border-collapse: collapse; font-size: .9rem; margin: .6rem 0 1rem; }
.tarifas-tabla th, .tarifas-tabla td { text-align: left; padding: .4rem .6rem; border-bottom: 1px solid var(--linea); }
.tarifas-tabla input { width: 6rem; }

/* ---------------- LandCo Asociados ---------------- */

.asociados-intro, .asociados-ayuda { color: var(--suave); font-size: .92rem; }

.asociado-resumen {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  padding: 1rem 1.1rem;
  margin: 0 0 1.2rem;
  transition: background-color var(--rapido), border-color var(--rapido);
}
.asociado-resumen p { margin: .5rem 0 0; font-size: .9rem; }
.asociado-resumen .escudo { margin-bottom: .2rem; }

.calificacion-inline { display: flex; align-items: center; gap: .3rem; color: var(--urgencia); font-weight: 600; }
.calificacion-inline .icono { width: .95rem; height: .95rem; }

.aviso-inline {
  background: var(--urgencia-claro);
  color: var(--urgencia);
  border-radius: var(--radio);
  padding: .6rem .8rem;
  font-size: .88rem;
}

.accion-con-texto { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.accion-con-texto input { width: auto; flex: 1 1 16rem; }

.tarjeta-precio-fila {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: .5rem;
  margin-top: .6rem;
  padding-top: .6rem;
  border-top: 1px solid var(--linea);
}

.precio-bloque { display: flex; flex-direction: column; }

/* Precio en Space Grotesk, no en la monoespaciada de .mono/.importe — pedido
   explícito del rediseño: el precio es lo primero que el ojo debe agarrar. */
.cifra-precio {
  font-family: var(--fuente-titulo);
  font-size: 1.4rem;
  font-weight: 700;
  color: var(--tinta);
  line-height: 1.1;
}

.precio-rotulo {
  font-size: .68rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--suave);
  margin-top: .1rem;
}

.escudo-protegida {
  display: inline-flex;
  align-items: center;
  gap: .25rem;
  padding: .2rem .5rem;
  border-radius: 999px;
  background: var(--vivo-claro);
  color: var(--vivo);
  font-size: .68rem;
  font-weight: 600;
  white-space: nowrap;
}

.escudo-protegida .icono { width: .8rem; height: .8rem; }

/* ---------------- galería de imágenes ---------------- */

.galeria { margin-bottom: 1.25rem; }

.galeria-principal {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  max-height: 24rem;
  /* contain, no cover: acá es la única foto grande del producto — recortarla
     para llenar un 4:3 fijo se comía partes de fotos verticales o panorámicas.
     El "vacío" alrededor lo llena el mismo --fondo del contenedor. */
  object-fit: contain;
  background: var(--fondo);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
}

.galeria-miniaturas {
  display: flex;
  gap: .5rem;
  margin-top: .5rem;
  flex-wrap: wrap;
}

.galeria-miniaturas img {
  width: 3.5rem;
  height: 3.5rem;
  object-fit: cover;
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  cursor: pointer;
  opacity: .7;
  transition: opacity var(--rapido), border-color var(--rapido);
}

.galeria-miniaturas img:hover { opacity: 1; }
.galeria-miniaturas img.activa { opacity: 1; border-color: var(--vivo); }

.previsualizacion {
  display: flex;
  gap: .5rem;
  flex-wrap: wrap;
}

.previsualizacion:empty { display: none; }

.previsualizacion img {
  width: 4rem;
  height: 4rem;
  object-fit: cover;
  border: 1px solid var(--linea);
}

/* Miniatura de referencia en listas de administración (cola de moderación) */
.miniatura-admin {
  width: 3.5rem;
  height: 3.5rem;
  object-fit: cover;
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  flex-shrink: 0;
}

/* ---------------- ficha de producto ---------------- */

.ficha { background: var(--panel); border: 1px solid var(--linea); border-radius: var(--radio); box-shadow: var(--sombra); padding: 1.5rem; }
.ficha h2 { margin-top: 0; }
.meta { font-size: .86rem; color: var(--suave); margin: 0 0 1rem; }

.mp-estado {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  padding: .9rem 1.1rem;
  margin: 0 0 1.4rem;
  border: 1px solid var(--linea);
  border-left: 3px solid var(--suave);
  border-radius: var(--radio);
  background: var(--panel);
  transition: background-color var(--rapido), border-color var(--rapido);
}

.mp-estado.conectado { border-left-color: var(--vivo); background: var(--vivo-claro); }

.mp-estado-texto { margin: 0; font-size: .92rem; }
.mp-estado-texto + .mp-estado-texto { margin-top: .3rem; }
.mp-estado.conectado .mp-estado-texto { color: var(--vivo); font-weight: 500; }
.mp-estado .principal { padding: .45rem .9rem; font-size: .88rem; }
.descripcion { max-width: 60ch; margin: 0 0 1.5rem; }

.marcador {
  display: flex;
  gap: 3rem;
  padding: 1.1rem 0;
  border-top: 1px solid var(--linea);
  border-bottom: 1px solid var(--linea);
  flex-wrap: wrap;
}

.rotulo {
  display: block;
  font-size: .72rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  font-weight: 600;
  color: var(--suave);
  margin-bottom: .3rem;
}

.importe { font-size: 2rem; color: var(--vivo); display: block; line-height: 1.1; }
.cuenta { font-size: 1.35rem; display: block; line-height: 1.1; transition: color var(--rapido); }
.cuenta.urgente { color: var(--urgencia); }

@keyframes destello {
  from { background: var(--vivo-claro); }
  to { background: transparent; }
}

.importe.nueva { animation: destello .9s ease-out; }

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

.pujar { display: flex; gap: .6rem; margin-top: 1.2rem; max-width: 22rem; }
.comprar { margin-top: 1.2rem; }
.nota { font-size: .9rem; color: var(--suave); margin: .9rem 0 0; }
/* Auditoría UX (2ª ronda): el estado de moderación es la información más
   importante de esta pantalla para quien acaba de publicar — se distingue
   con fondo/borde de advertencia, no con el mismo gris que una nota menor
   ("es tu publicación"). */
.nota.error, .nota.pendiente {
  padding: .7rem 1rem;
  border-radius: var(--radio);
  border-left: 3px solid var(--alerta);
}
.nota.error { color: var(--alerta); background: var(--alerta-claro); }
.nota.pendiente { color: var(--urgencia); background: var(--urgencia-claro); border-left-color: var(--urgencia); }

.pujas { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--linea); }

.pujas li {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  padding: .5rem 0;
  border-bottom: 1px solid var(--linea);
  font-size: .9rem;
}

.pujas .cuando { color: var(--suave); }

/* ---------------- mercado en pantallas medianas ---------------- */

/* Tres columnas necesitan más ancho del que hay en tablet: el panel de
   filtros pasa arriba de la grilla (sigue siendo la primera columna del
   flex, así que no hace falta reordenar nada, solo dejar de fijarle ancho). */
@media (max-width: 64rem) {
  .mercado-layout { flex-wrap: wrap; }
  .panel-filtros { width: 100%; }
  .lista-categorias { flex-direction: row; flex-wrap: wrap; }
  .opcion-categoria { width: auto; }
}

/* ---------------- móvil ---------------- */

@media (max-width: 34rem) {
  h1 { font-size: 1.8rem; }
  main { padding: 1rem 1rem 5.5rem; }
  .marcador { gap: 1.5rem; }
  .importe { font-size: 1.6rem; }
  .ficha { padding: 1.1rem; }

  /* Mis compras/Mis ventas (no el grid de tarjetas del mercado, que ya fuerza
     su propia columna con más especificidad): con el precio y hasta tres
     botones compitiendo por espacio en una sola fila, .cuerpo (flex:1) se
     dejaba apretar hasta un puñado de píxeles en vez de envolver — el título
     quedaba partido letra por letra, superpuesto con el precio. Apilar todo
     en columna evita que compitan por ancho. */
  .fila { flex-direction: column; align-items: stretch; flex-wrap: wrap; gap: .5rem; }
  .fila .cifra-fila { text-align: left; white-space: normal; }
  .fila > button.enlace, .fila > button.principal, .fila > input.convertir-fecha {
    align-self: flex-start;
  }

  .mercado-layout { flex-direction: column; }
  .mercado-sidebar { width: 100%; flex-direction: row; flex-wrap: wrap; }
  .panel-anuncios { flex: 1 1 12rem; }

  /* Pedido del usuario: en el celular, minmax(14rem, 1fr) del grid de
     tarjetas solo alcanzaba para una columna — se sentía vacío, con mucho
     scroll para ver poco. Dos columnas fijas (en vez de auto-fit) muestran
     el doble sin depender de que el ancho real alcance para un múltiplo de
     14rem — angostas a propósito, la imagen (aspect-ratio 4/3) se achica
     con la tarjeta sin distorsionarse. */
  .grid-productos { grid-template-columns: repeat(2, 1fr); gap: .6rem; }

  /* Auditoría UX: los filtros ocupaban las dos primeras pantallas enteras
     antes del primer producto — acá arranca colapsado detrás de "Filtrar",
     mostrando la grilla de entrada. app.js alterna .abierto al tocar el
     botón (mismo patrón que "Añadir vehículo" en Asociados). */
  .panel-filtros-cabecera h2 { margin-bottom: 0; }
  .btn-filtros-toggle { display: inline-flex; align-items: center; }
  .panel-filtros-cuerpo { display: none; margin-top: .9rem; }
  .panel-filtros-cuerpo.abierto { display: block; }

  /* Nav inferior para el pulgar: la barra de arriba queda solo para la marca
     y la sesión, y #nav (mismo elemento, sin nuevo id) se fija abajo — así
     ningún botón interactivo importante queda arriba, lejos del pulgar. */
  .barra { padding-right: .9rem; }

  .nav {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 20;
    background: var(--panel);
    border-top: 1px solid var(--linea);
    padding: .35rem .25rem calc(.35rem + env(safe-area-inset-bottom));
    gap: 0;
    justify-content: space-around;
  }

  .nav button {
    flex-direction: column;
    gap: .15rem;
    flex: 1;
    padding: .35rem .2rem;
    border-radius: var(--radio);
  }

  .nav-icono { font-size: 1.2rem; }
  .nav-etiqueta { font-size: .68rem; }

  /* Con #nav fijo abajo (ver arriba), el desplegable de categorías tiene
     que abrir hacia ARRIBA — top:100% (la regla de escritorio) lo mandaría
     fuera de la pantalla, debajo de la barra inferior fija. Se queda con
     left:0 de la regla de escritorio (no right:0): el trigger vive cerca
     del borde izquierdo de la barra, así que anclar por la derecha corría
     el panel fuera de la pantalla hacia la izquierda. */
  .nav-dropdown-menu {
    top: auto;
    bottom: calc(100% + .3rem);
  }
}

/* ---------------------------------------------- Centro de Operaciones */

.metricas {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  gap: .8rem;
  margin: 1rem 0 1.6rem;
}

.metrica {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .9rem 1rem;
}

.metrica .rotulo { display: block; font-size: .78rem; color: var(--suave); margin-bottom: .3rem; }
.metrica .cifra { display: block; font-size: 1.5rem; font-weight: 600; font-family: 'Space Grotesk', sans-serif; }
.metrica .cifra.alerta { color: var(--alerta); }
.metrica .cifra.urgencia { color: var(--urgencia); }
.metrica .cifra.vivo { color: var(--vivo); }

.analitica-columnas {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1.2rem;
  margin: 0 0 1.2rem;
}

.analitica-lista { list-style: none; margin: .4rem 0 0; padding: 0; display: flex; flex-direction: column; gap: .3rem; }

.analitica-lista li {
  display: flex;
  justify-content: space-between;
  gap: .6rem;
  padding: .5rem .7rem;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  font-size: .88rem;
}

.analitica-lista li strong { font-family: 'Space Grotesk', sans-serif; }

.analitica-barras {
  display: flex;
  align-items: flex-end;
  gap: .4rem;
  height: 8rem;
  margin: .6rem 0 1.6rem;
  padding: 0 .2rem;
}

.analitica-barra {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-end;
  gap: .3rem;
  height: 100%;
}

.analitica-barra .col {
  width: 100%;
  background: var(--vivo);
  border-radius: .2rem .2rem 0 0;
  min-height: 2px;
}

.analitica-barra .etiqueta { font-size: .65rem; color: var(--suave); white-space: nowrap; }

.alertas-lista { list-style: none; margin: 0 0 1.6rem; padding: 0; display: flex; flex-direction: column; gap: .5rem; }

.alerta-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  padding: .7rem .9rem;
  background: var(--urgencia-claro);
  border-left: 3px solid var(--urgencia);
  border-radius: var(--radio);
  font-size: .88rem;
  flex-wrap: wrap;
}

.alerta-item.grave { background: var(--alerta-claro); border-left-color: var(--alerta); }
.alerta-item.ok { background: var(--vivo-claro); border-left-color: var(--vivo); }
.alerta-item .tipo { font-weight: 600; }
.alerta-item .sub { color: var(--suave); }

.kanban {
  display: flex;
  gap: .9rem;
  overflow-x: auto;
  padding-bottom: .6rem;
  margin: 0 0 1.6rem;
}

.kanban-columna {
  flex: 0 0 15rem;
  background: var(--fondo);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .7rem;
  max-height: 26rem;
  display: flex;
  flex-direction: column;
}

.kanban-columna h4 {
  margin: 0 0 .6rem;
  font-size: .8rem;
  text-transform: uppercase;
  letter-spacing: .03em;
  color: var(--suave);
  display: flex;
  justify-content: space-between;
}

.kanban-columna h4 span { color: var(--tinta); font-weight: 600; }

.kanban-tarjetas { overflow-y: auto; display: flex; flex-direction: column; gap: .5rem; }

.kanban-tarjeta {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .55rem .65rem;
  font-size: .82rem;
}

.kanban-tarjeta .nombre { display: block; font-weight: 600; margin-bottom: .2rem; }
.kanban-tarjeta .sub { display: block; color: var(--suave); font-size: .78rem; }

/* ---------------------------------------------- Chat interno y Soporte (Fase 3) */

.chat-tabs { display: flex; gap: .5rem; flex-wrap: wrap; margin: 1rem 0; }

.chat-tab {
  padding: .4rem .9rem;
  border: 1px solid var(--linea);
  border-radius: 999px;
  background: var(--panel);
  color: var(--suave);
  font-size: .85rem;
  cursor: pointer;
}
.chat-tab.activa { background: var(--vivo); border-color: var(--vivo); color: var(--panel); font-weight: 600; }

.chat-mensajes {
  list-style: none;
  margin: 0 0 1rem;
  padding: 1rem;
  max-height: 24rem;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: .7rem;
  background: var(--fondo);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
}

.chat-mensaje {
  max-width: 80%;
  padding: .5rem .75rem;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  align-self: flex-start;
}
.chat-mensaje.propio { align-self: flex-end; background: var(--vivo-claro); border-color: var(--vivo); }

.chat-autor { display: block; font-size: .75rem; font-weight: 600; color: var(--suave); margin-bottom: .2rem; }
.chat-mensaje p { margin: 0; font-size: .9rem; word-break: break-word; }
.chat-hora { display: block; font-size: .7rem; color: var(--suave); margin-top: .25rem; }

.chat-form { display: flex; gap: .6rem; align-items: flex-end; }
.chat-form textarea { flex: 1; resize: vertical; }

/* ---------------- notificaciones (campana) ---------------- */

.notificaciones { position: relative; }
.campana {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.1rem;
  height: 2.1rem;
  border-radius: 999px;
  border: 0;
  background: none;
  color: var(--tinta);
  cursor: pointer;
}
.campana .contador-nav { position: absolute; top: 0; right: 0; }
.notificaciones-panel {
  position: absolute;
  top: calc(100% + .5rem);
  right: 0;
  width: 20rem;
  max-height: 24rem;
  overflow-y: auto;
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  padding: .75rem;
  z-index: 50;
}
.notificaciones-panel h3 { margin: 0 0 .5rem; font-size: .95rem; }
.notificaciones-panel .fila.sin-leer { background: var(--vivo-claro); border-radius: var(--radio); }

/* Bug real: "right: 0" ancla el panel al borde derecho de la CAMPANA, no
   de la pantalla — la campana vive cerca del borde IZQUIERDO de la barra
   superior (junto al toggle de tema), así que un panel de 20rem
   desbordaba por la izquierda, ilegible. En este ancho pasa a
   position: fixed, independiente de dónde esté la campana — left/right
   quedan fijos al viewport, nunca se salen de la pantalla. El "top" lo
   calcula btn-notificaciones al abrir (ver app.js), porque la altura
   real de la barra superior varía (con sesión, el logo y el bloque de
   usuario ya no caben en una sola fila y se parte en dos). Esta regla
   tiene que venir DESPUÉS de la de escritorio de arriba en el archivo —
   misma especificidad, y a especificidad igual gana la última en el
   orden del cascade, no la del media query más específico. */
@media (max-width: 34rem) {
  .notificaciones-panel {
    position: fixed;
    left: 1rem;
    right: 1rem;
    width: auto;
    max-width: none;
  }
}

/* ---------------- asistente virtual (IA) ---------------- */
/* Ver "Asistente de IA (Gemini)" en CLAUDE.md — oculto por defecto
   (`hidden`), aplicarDisponibilidadIA() en app.js lo revela solo si el
   servidor confirma iaDisponible. z-index 55: por debajo de #aviso (60,
   siempre debe ganar) pero por encima del resto de la interfaz. */
.asistente-boton {
  position: fixed;
  right: 1.2rem;
  bottom: 1.2rem;
  width: 3.4rem;
  height: 3.4rem;
  border-radius: 999px;
  border: 0;
  background: var(--vivo);
  color: #fff;
  box-shadow: var(--sombra);
  cursor: pointer;
  z-index: 55;
  display: flex;
  align-items: center;
  justify-content: center;
}
.asistente-boton .icono { width: 1.5rem; height: 1.5rem; }

.asistente-panel {
  position: fixed;
  right: 1.2rem;
  bottom: 1.2rem;
  width: min(22rem, calc(100vw - 2.4rem));
  height: min(30rem, calc(100vh - 4rem));
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  z-index: 55;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.asistente-cabecera {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: .8rem 1rem;
  background: var(--vivo);
  color: #fff;
  font-weight: 600;
}
.asistente-cabecera button { background: none; border: 0; color: #fff; font-size: 1.1rem; cursor: pointer; }

.asistente-mensajes {
  flex: 1;
  overflow-y: auto;
  padding: .8rem;
  display: flex;
  flex-direction: column;
  gap: .5rem;
}

.asistente-mensaje {
  margin: 0;
  padding: .5rem .7rem;
  border-radius: var(--radio);
  font-size: .88rem;
  max-width: 85%;
  white-space: pre-wrap;
}
.asistente-mensaje-bot { background: var(--fondo); align-self: flex-start; }
.asistente-mensaje-usuario { background: var(--vivo-claro); align-self: flex-end; }

.asistente-form { display: flex; gap: .4rem; padding: .7rem; border-top: 1px solid var(--linea); }
.asistente-form input { flex: 1; }
.asistente-form button { background: var(--vivo); color: #fff; border: 0; border-radius: var(--radio); width: 2.4rem; display: flex; align-items: center; justify-content: center; cursor: pointer; }
.asistente-form button .icono { width: 1.1rem; height: 1.1rem; }

/* Transcripción en el detalle del panel de admin (misma clase de burbuja
   que el widget flotante, sin el ancho fijo — ahí sí puede usar todo el
   espacio del panel). */
.asistente-transcripcion { display: flex; flex-direction: column; gap: .5rem; margin: .8rem 0; max-width: 40rem; }

/* En este ancho, con sesión iniciada, #nav (la barra de categorías/
   acciones) pasa a fijarse abajo de toda la pantalla, para el pulgar (ver
   ".nav" en el bloque de móvil más abajo) — sin cuenta no hay ese conflicto,
   así que acá solo se ajusta el margen lateral; el "bottom" que evita tapar
   #nav se calcula en JS (ajustarPosicionAsistente() en app.js), porque su
   altura varía según cuántos botones tenga esa cuenta (una fila o dos). */
@media (max-width: 34rem) {
  .asistente-panel { right: 1rem; height: min(26rem, calc(100vh - 8rem)); }
  .asistente-boton { right: 1rem; }
}

/* ---------------- perfil y tienda ---------------- */

.formulario-en-linea { display: flex; gap: .6rem; margin-bottom: 1rem; }
.formulario-en-linea input { flex: 1; }

/* object-fit: cover (no contain): la portada ya se recorta a esta misma
   proporción ANTES de subirla, con el recortador interactivo
   (abrirRecortador() en app.js) — el relleno a los lados que dejaba
   "contain" ya no hace falta, y "cover" evita una franja vacía en el
   pequeño margen de imágenes viejas que no pasaron por el recortador. */
.tienda-banner { width: 100%; height: 10rem; object-fit: cover; display: block; background: var(--vivo-claro); border-radius: var(--radio); }
/* position: relative (sin z-index) mueve esta caja al mismo nivel de
   apilado que .tienda-banner-caja.perfil-editable (que sí es position:
   relative, por el botón "Cambiar portada" encima) — sin esto, el logo
   pintaría DEBAJO de la portada en vez de montado encima de ella, porque
   un elemento posicionado siempre pinta después que uno sin posicionar,
   sin importar el orden en el HTML. No cambia nada en la tienda pública
   (ninguna de las dos cajas competía por apilado ahí). */
.tienda-cabecera { position: relative; display: flex; align-items: flex-end; gap: 1rem; margin-bottom: 1rem; flex-wrap: wrap; }
/* Solo el logo se monta sobre la portada — nunca el nombre, las insignias
   ni el botón de WhatsApp. Antes el margen negativo estaba en la CAJA de
   la portada (.tienda-banner-caja.con-banner), lo que arrastraba hacia
   arriba TODA la fila de abajo por igual — el botón de WhatsApp terminaba
   flotando encima de la foto en vez de debajo del nombre. Acá el corrimiento
   va solo en el logo (o en .perfil-logo-campo, su envoltorio en "Mi
   perfil"), activado por .con-banner en .tienda-cabecera (la puesta
   pintarCabeceraTienda() en app.js) — el resto de la fila sigue su alto
   normal, debajo de la portada. */
.tienda-cabecera.con-banner > .tienda-logo,
.tienda-cabecera.con-banner > .perfil-logo-campo {
  margin-top: -3rem;
}
.tienda-logo {
  width: 5.5rem;
  height: 5.5rem;
  border-radius: 999px;
  border: 3px solid var(--panel);
  background: var(--panel);
  object-fit: cover;
}
.tienda-cabecera h2 { margin: 0; }
.tienda-insignias { display: flex; gap: .4rem; flex-wrap: wrap; margin: .3rem 0; }
.tienda-calificacion { margin: 0; color: var(--suave); font-size: .9rem; }
.tienda-descripcion { color: var(--suave); margin-bottom: 1.5rem; max-width: 40rem; }

/* "Mi perfil" reutiliza el mismo .tienda-banner-caja/.tienda-cabecera de la
   tienda pública (ver #v-tienda) para que la vista previa sea pixel a
   pixel la misma que ve cualquier otra persona — .perfil-editable es lo
   único que le agrega los controles de edición encima. */
.tienda-banner-caja.perfil-editable {
  position: relative;
  min-height: 10rem;
  border-radius: var(--radio);
  background: var(--vivo-claro);
  border: 1px dashed var(--linea);
}
.tienda-banner-caja.perfil-editable.con-banner { border: 0; }

.perfil-cambiar-portada {
  position: absolute;
  right: .9rem;
  bottom: .9rem;
  padding: .45rem .9rem;
  border-radius: 999px;
  border: 1px solid var(--linea);
  background: var(--panel);
  color: var(--tinta);
  font-size: .82rem;
  font-weight: 600;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  box-shadow: var(--sombra);
  transition: border-color var(--rapido);
}
.perfil-cambiar-portada:hover { border-color: var(--vivo); color: var(--vivo); }

/* Recortador interactivo de portadas — ver abrirRecortador() en app.js.
   El ancho/alto reales de .recortar-visor los pone JS (aspect-ratio según
   la caja de portada que se esté editando); acá solo lo que no cambia. */
.recortar-visor {
  position: relative;
  overflow: hidden;
  border-radius: var(--radio);
  background: var(--fondo);
  margin: .8rem 0;
  touch-action: none;
  cursor: grab;
}
.recortar-visor:active { cursor: grabbing; }
#recortar-imagen { position: absolute; left: 0; top: 0; max-width: none; user-select: none; }
#recortar-zoom { width: 100%; }
.recortar-acciones { display: flex; justify-content: flex-end; gap: .6rem; margin-top: .8rem; }

/* Mismo motivo que el min-height de .tienda-banner-caja.perfil-editable:
   sin logo todavía, el <img> queda hidden y sin ancho/alto propio — sin un
   tamaño fijo acá, la caja entera colapsa a casi nada y el botón de
   cambiarlo termina apretado contra el borde en vez de ocupar el círculo
   completo donde va a aparecer el logo el día que lo suban. */
.perfil-logo-campo {
  position: relative;
  display: inline-flex;
  width: 5.5rem;
  height: 5.5rem;
  flex-shrink: 0;
  border-radius: 999px;
  background: var(--vivo-claro);
  border: 1px dashed var(--linea);
}
/* .con-logo la pone pintarCabeceraTienda() en app.js, mismo criterio que
   .con-banner: solo hay algo que mostrar dentro del círculo cuando SÍ hay
   logo subido. */
.perfil-logo-campo.con-logo { border: 0; }

.perfil-cambiar-logo {
  position: absolute;
  right: -.15rem;
  bottom: -.15rem;
  width: 1.9rem;
  height: 1.9rem;
  border-radius: 50%;
  border: 1px solid var(--linea);
  background: var(--panel);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: .85rem;
  box-shadow: var(--sombra);
  transition: border-color var(--rapido);
}
.perfil-cambiar-logo:hover { border-color: var(--vivo); }
.perfil-cambiar-logo .icono { width: 1rem; height: 1rem; }

/* ---------------- Mi tienda (rediseño del perfil de vendedor) ---------------- */

.tienda-encabezado { margin-bottom: 1.25rem; }
.tienda-encabezado h2 { margin-bottom: .3rem; }

.tienda-hero { margin-bottom: 1.5rem; }
.tienda-hero-info { flex: 1 1 12rem; min-width: 10rem; }
.tienda-hero-acciones { display: flex; gap: .6rem; flex-wrap: wrap; margin-top: 1.1rem; }
.tienda-hero-acciones button { display: inline-flex; align-items: center; gap: .45rem; }

/* Botón de acción secundaria (junto a .principal y .enlace): un contorno
   sutil para "Editar perfil"/"Ver perfil público" — necesitan más peso que
   un link de texto plano, pero no deben competir con la acción principal
   ("Publicar producto"). */
.secundario {
  font: inherit;
  font-size: .95rem;
  background: var(--panel);
  color: var(--tinta);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .56rem 1.05rem;
  cursor: pointer;
  transition: border-color var(--rapido), color var(--rapido);
}
.secundario:hover { border-color: var(--vivo); color: var(--vivo); }
.secundario:active { transform: scale(.97); }
.secundario[disabled] { opacity: .6; cursor: default; }

/* Variante más chica de .secundario — mismo lenguaje visual (contorno +
   fondo de panel), para acciones secundarias del detalle de una publicación
   ("Enviar mensaje", "Pedir contraentrega", "Reportar") que necesitan verse
   como un botón de verdad, no como texto subrayado (.enlace), pero sin
   competir en peso con "Contactar por WhatsApp"/"Comprar ahora". */
.secundario.chico {
  font-size: .82rem;
  padding: .4rem .75rem;
}

.contraentrega-ayuda {
  display: block;
  color: var(--suave);
  margin-bottom: .35rem;
  text-align: center;
}

/* Centrados a pedido: WhatsApp (la acción principal cuando no hay Compra
   Protegida) y las dos acciones secundarias sueltas que no viven dentro de
   .bloque-contraentrega junto al formulario (ese formulario sigue alineado
   a la izquierda como cualquier otro .formulario). width: fit-content es
   necesario porque un <button>/<a> normal ocupa todo el ancho al pasar a
   display: block — sin eso, margin: auto no tendría nada que centrar. */
#btn-contactar-whatsapp,
#btn-pedir-contraentrega,
#btn-reportar {
  display: block;
  width: fit-content;
  margin-left: auto;
  margin-right: auto;
}

/* Estadísticas reales (ver GET /api/usuarios/:id/perfil-publico) — nunca
   inventadas ni estimadas. */
.tienda-stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1rem;
  margin-bottom: 1.5rem;
}
.tienda-stat {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: 1rem .75rem;
  text-align: center;
}
.tienda-stat strong { display: block; font-size: 1.5rem; color: var(--vivo); line-height: 1.2; }
.tienda-stat span { font-size: .78rem; color: var(--suave); }

.tarjeta-panel {
  background: var(--panel);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  box-shadow: var(--sombra);
  padding: 1.25rem;
  margin-bottom: 1.25rem;
}
.tarjeta-panel h3 { margin-top: 0; }
.tarjeta-panel .formulario { margin-top: 1rem; }
.tarjeta-panel-header { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.tarjeta-panel-header h3 { margin: 0; }

.tienda-grid-dos {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 1.25rem;
  align-items: start;
}
.tienda-grid-dos .tarjeta-panel { margin-bottom: 0; }

.formulario-acciones { display: flex; gap: .6rem; align-items: center; }

/* Nombre/valor en modo lectura de "Información del perfil" y "Contacto" —
   .panel-lectura es lo que alternarPanelEdicion() en app.js oculta al
   entrar en modo edición de esa tarjeta. */
.info-lista { display: flex; flex-direction: column; gap: .75rem; margin: 0; }
.info-lista > div { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; padding-bottom: .75rem; border-bottom: 1px solid var(--linea); }
.info-lista > div:last-child { border-bottom: 0; padding-bottom: 0; }
.info-lista dt { color: var(--suave); font-size: .88rem; }
.info-lista dd { margin: 0; font-weight: 600; text-align: right; }

.acciones-rapidas { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }
.acciones-rapidas button {
  width: 100%;
  display: flex;
  align-items: center;
  gap: .6rem;
  font: inherit;
  font-size: .92rem;
  background: var(--fondo);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  padding: .7rem .9rem;
  cursor: pointer;
  color: var(--tinta);
  text-align: left;
  transition: border-color var(--rapido), color var(--rapido);
}
.acciones-rapidas button:hover { border-color: var(--vivo); color: var(--vivo); }

/* "Confianza del vendedor": únicamente señales reales (insignias ya
   implementadas + qué tan completo está el perfil) — ver
   pintarConfianzaVendedor() en app.js. Nada de esto se inventa ni se
   guarda aparte: se recalcula de los mismos datos de siempre. */
.confianza-checklist { list-style: none; margin: 0 0 1rem; padding: 0; display: flex; flex-direction: column; gap: .6rem; }
.confianza-checklist li { display: flex; align-items: center; gap: .55rem; color: var(--suave); font-size: .9rem; }
.confianza-checklist li.lograda { color: var(--tinta); }
.confianza-checklist li.lograda .icono { color: var(--vivo); }
.confianza-barra { height: .5rem; border-radius: 999px; background: var(--fondo); overflow: hidden; margin-bottom: .6rem; }
.confianza-barra-relleno { height: 100%; background: var(--vivo); border-radius: inherit; transition: width .3s ease; }

/* "¿Qué ofreces en LandCo?" — checkboxes sembrados desde opciones_landco
   (ver GET /api/opciones-landco), nunca una lista fija en el HTML. */
.tipos-oferta-lista { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: .6rem 1rem; margin-bottom: 1rem; }
.tipos-oferta-lista label { flex-direction: row !important; align-items: center; gap: .5rem; color: var(--tinta); font-size: .92rem; }
.tipos-oferta-lista input { width: auto; }

@media (max-width: 720px) {
  .tienda-stats { grid-template-columns: repeat(2, 1fr); }
  .tienda-grid-dos { grid-template-columns: 1fr; }
  .tienda-cabecera { flex-direction: column; align-items: flex-start; }
  .tienda-hero-acciones { flex-direction: column; align-items: stretch; }
  .tienda-hero-acciones button { justify-content: center; }
}

/* ---------------- video, ubicación y editar imágenes ---------------- */

.video-caja { aspect-ratio: 16/9; margin: 1rem 0; border-radius: var(--radio); overflow: hidden; background: var(--fondo); }
.video-caja iframe { width: 100%; height: 100%; border: 0; }
.ubicacion { color: var(--suave); font-size: .9rem; margin: -.5rem 0 .5rem; }

.editar-imagenes-lista { display: flex; gap: .75rem; flex-wrap: wrap; margin-top: .5rem; }
.editar-imagen-item { display: flex; flex-direction: column; align-items: center; gap: .3rem; }
.editar-imagen-item img { width: 5rem; height: 5rem; object-fit: cover; border-radius: var(--radio); border: 1px solid var(--linea); }
