/* Занятость видно всегда и одинаково на всех страницах.

   26 октября 2026 владелец нажал «Удалить пробные поездки» и ждал полминуты,
   не понимая, нажалась ли кнопка. Без этого ответа человек жмёт второй раз и
   третий, а повтор платного шага стоит денег. */

/* Полоса наверху окна: бежит, пока идёт хоть один запрос к серверу. */
.net-bar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  overflow: hidden;
  pointer-events: none;
  z-index: 2000;
}

.net-bar::before {
  content: "";
  display: block;
  height: 100%;
  width: 34%;
  border-radius: 0 3px 3px 0;
  background: var(--gold, #b8843a);
  opacity: 0;
}

.net-bar.on::before {
  opacity: 0.95;
  animation: net-run 1.15s linear infinite;
}

@keyframes net-run {
  from { transform: translateX(-100%); }
  to { transform: translateX(400%); }
}

/* Нажатие видно сразу, ещё до ответа сервера. */
button:not(:disabled):active { transform: translateY(1px); }

/* Кнопка в работе: кружок рядом с подписью и никаких повторных нажатий. */
button.is-busy {
  cursor: progress;
  opacity: 0.85;
}

button.is-busy::before {
  content: "";
  display: inline-block;
  width: 0.85em;
  height: 0.85em;
  margin-right: 0.5em;
  vertical-align: -0.1em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: busy-spin 0.7s linear infinite;
}

@keyframes busy-spin {
  to { transform: rotate(360deg); }
}

/* Ожидание на месте таблицы или списка: строка «Загружаю…» и тот же кружок. */
.waiting::before {
  content: "";
  display: inline-block;
  width: 0.85em;
  height: 0.85em;
  margin-right: 0.5em;
  vertical-align: -0.1em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: busy-spin 0.7s linear infinite;
}

@media (prefers-reduced-motion: reduce) {
  .net-bar.on::before,
  button.is-busy::before,
  .waiting::before { animation: none; }
  .net-bar.on::before { width: 100%; }
  button:not(:disabled):active { transform: none; }
}
