
/* ==========================================================================
   SalesPro ERP 2.5.1 — política de carga e indicadores locales
   ========================================================================== */

/* El preloader global queda reservado para navegación y procesos largos. */
.global-page-loader{
  transition:opacity .18s ease,visibility .18s ease!important;
}

/* Indicador local genérico */
.sp-is-busy{
  position:relative!important;
  pointer-events:none!important;
  cursor:wait!important;
  opacity:.72!important;
}

button.sp-is-busy,
a.sp-is-busy{
  padding-right:38px!important;
}

button.sp-is-busy::after,
a.sp-is-busy::after,
.sp-local-loader::after{
  content:"";
  position:absolute;
  top:50%;
  right:13px;
  width:15px;
  height:15px;
  margin-top:-8px;
  border:2px solid currentColor;
  border-right-color:transparent;
  border-radius:50%;
  animation:spLocalSpinner .65s linear infinite;
}

.sp-local-loading{
  min-height:42px;
  display:flex;
  align-items:center;
  gap:9px;
  color:#64748b;
  font-size:12px;
  font-weight:750;
}

.sp-local-loading::before{
  content:"";
  width:15px;
  height:15px;
  flex:0 0 auto;
  border:2px solid #cbd5e1;
  border-right-color:#4f46e5;
  border-radius:50%;
  animation:spLocalSpinner .65s linear infinite;
}

/* Carga tenue dentro de tarjetas o paneles, sin bloquear toda la página. */
.sp-section-busy{
  position:relative;
  pointer-events:none;
}

.sp-section-busy::after{
  content:"";
  position:absolute;
  inset:0;
  z-index:6;
  border-radius:inherit;
  background:rgba(255,255,255,.58);
  backdrop-filter:blur(1px);
}

.sp-section-busy::before{
  content:"";
  position:absolute;
  z-index:7;
  top:50%;
  left:50%;
  width:22px;
  height:22px;
  margin:-11px 0 0 -11px;
  border:3px solid #cbd5e1;
  border-right-color:#4f46e5;
  border-radius:50%;
  animation:spLocalSpinner .65s linear infinite;
}

/* Productos: conservar sus estados locales sin invocar el overlay general. */
.route-products .product-row-v4.is-saving,
.route-products .stock-modal-v9.is-loading .stock-modal-body-v9{
  transition:opacity .18s ease;
}

/* POS: el buscador y las tarjetas pueden actualizarse sin cubrir la pantalla. */
.route-sales_pos [aria-busy="true"]{
  cursor:progress;
}

@keyframes spLocalSpinner{
  to{transform:rotate(360deg)}
}

@media(prefers-reduced-motion:reduce){
  button.sp-is-busy::after,
  a.sp-is-busy::after,
  .sp-local-loader::after,
  .sp-local-loading::before,
  .sp-section-busy::before{
    animation-duration:1.4s;
  }
}
