/* Global page / HTMX navigation loader — light + dark, RTL-safe, reduced-motion aware */

.tv-page-loader {
  --tv-pl-accent: #5eb8ff;
  --tv-pl-track: rgba(148, 163, 184, 0.35);
  /* Solid enough to mask the shell during nav — avoids blur-driven compositor flicker */
  --tv-pl-bg: rgba(248, 250, 252, 0.97);
  --tv-pl-text: #0f172a;
  --tv-pl-panel-shadow: 0 24px 48px rgba(15, 23, 42, 0.12);
}

html[data-theme="dark"] .tv-page-loader {
  --tv-pl-accent: #7dd3fc;
  --tv-pl-track: rgba(71, 85, 105, 0.45);
  --tv-pl-bg: rgba(13, 17, 23, 0.97);
  --tv-pl-text: #f8fafc;
  --tv-pl-panel-shadow: 0 24px 56px rgba(0, 0, 0, 0.55);
}

.tv-page-loader {
  position: fixed;
  inset: 0;
  /* Below Bootstrap modal (1055) so dialogs stay usable if ever overlapped */
  z-index: 1030;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--sp-6, 1.5rem);
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
  isolation: isolate;
  /* Fade-out only: instant show avoids a ~200ms “hole” where main is dimmed but overlay is still transparent */
  transition: opacity 0.18s cubic-bezier(0.4, 0, 0.2, 1), visibility 0.18s step-end;
}

.tv-page-loader.is-visible {
  pointer-events: auto;
  opacity: 1;
  visibility: visible;
  transition: none;
}

.tv-page-loader__backdrop {
  position: absolute;
  inset: 0;
  background: var(--tv-pl-bg);
}

.tv-page-loader__panel {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  max-width: 22rem;
  padding: var(--sp-8, 2rem) var(--sp-6, 1.5rem);
  border-radius: var(--tv-radius-lg, 12px);
  background: transparent;
}

.tv-page-loader__ring-wrap {
  width: 3.5rem;
  height: 3.5rem;
  margin-bottom: var(--sp-5, 1.25rem);
}

.tv-page-loader__ring {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  background: conic-gradient(
    from 0deg,
    var(--tv-pl-accent) 0deg,
    var(--tv-pl-accent) 88deg,
    var(--tv-pl-track) 88deg,
    var(--tv-pl-track) 360deg
  );
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2.5px));
  mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2.5px));
  animation: tv-page-loader-spin 0.85s linear infinite;
}

.tv-page-loader__text {
  margin: 0 0 var(--sp-3, 0.75rem);
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.45;
  letter-spacing: 0.01em;
  color: var(--tv-pl-text);
}

.tv-page-loader__dots {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
}

.tv-page-loader__dot {
  width: 0.4rem;
  height: 0.4rem;
  border-radius: 50%;
  background: var(--tv-pl-accent);
  opacity: 0.35;
  animation: tv-page-loader-dot 1.05s ease-in-out infinite;
}

.tv-page-loader__dot:nth-child(2) {
  animation-delay: 0.15s;
}

.tv-page-loader__dot:nth-child(3) {
  animation-delay: 0.3s;
}

@keyframes tv-page-loader-spin {
  to {
    transform: rotate(360deg);
  }
}

@keyframes tv-page-loader-dot {
  0%,
  100% {
    opacity: 0.3;
    transform: translateY(0);
  }
  50% {
    opacity: 1;
    transform: translateY(-3px);
  }
}

@media (prefers-reduced-motion: reduce) {
  .tv-page-loader__ring {
    animation: none;
    background: conic-gradient(
      from 0deg,
      var(--tv-pl-accent) 0deg,
      var(--tv-pl-accent) 88deg,
      var(--tv-pl-track) 88deg,
      var(--tv-pl-track) 360deg
    );
  }

  .tv-page-loader__dot {
    animation: none;
    opacity: 0.85;
  }
}
