/* Pull to refresh — indicador y visibilidad del botón de refresh ------------ */

.ptr-ind {
  position: fixed;
  top: calc(env(safe-area-inset-top) + 6px);
  left: 50%;
  transform: translateX(-50%) translateY(-40px);
  z-index: 2500;
  width: 34px; height: 34px;
  display: flex; align-items: center; justify-content: center;
  background: var(--card, #fff);
  border: 1px solid var(--linea, #e6e6e6);
  border-radius: 50%;
  box-shadow: 0 2px 10px rgba(0,0,0,.10);
  opacity: 0;
  pointer-events: none;
}
.ptr-ind.ptr-anim { transition: transform .26s ease, opacity .26s ease; }
.ptr-spin {
  width: 17px; height: 17px;
  border: 2.4px solid var(--mies);
  border-top-color: transparent;
  border-radius: 50%;
}
.ptr-ind.ptr-run .ptr-spin { animation: ptr-rot .7s linear infinite; }
@keyframes ptr-rot { to { transform: rotate(360deg); } }

/* En mobile el gesto reemplaza al botón "Actualizar"; en desktop (sin gesto
   táctil) el botón se mantiene. */
@media (max-width: 1023px) {
  .bk[aria-label="Actualizar"] { display: none; }
  /* El refresh oculto tenía margin-left:auto en los headers de lista/agenda/caja/
     avisos. Ese empuje pasa a la HAMBURGUESA (primer botón del grupo derecho) para
     que hamburguesa + campana (o + trash) queden agrupadas a la derecha, idénticas
     al Home. Fallback: si no hay hamburguesa, la campana/trash toman el empuje. */
  .hdr .cfg-gear { margin-left: auto; }
  .hdr:not(:has(.cfg-gear)) .bell-btn,
  .hdr:not(:has(.cfg-gear)) [aria-label="Borrar avisos"] { margin-left: auto; }
}
