/**
 * @prop --vm-loading-screen-z-index: The position in the UI z-axis stack inside the player.
 * @prop --vm-loading-screen-dot-color: The color of the animated loading dot. 
 * @prop --vm-loading-screen-dot-size: The size (wxh) of the dot in pixels.
 * @prop --vm-loading-screen-pulse-duration: The length of the pulse animation to complete one cycle.
 */
:host {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: var(--vm-loading-screen-z-index);
  display: flex;
  align-items: center;
  justify-content: center;
}

.loadingScreen {
  opacity: 100;
  transition: var(--vm-fade-transition);
}

.loadingScreen.inactive {
  opacity: 0;
}

/**
 * ==============================================
 * Dot Pulse - Thanks to Zongbin! (https://codepen.io/nzbin/pen/GGrXbp)
 * ==============================================
 */

.dotPulse {
  position: relative;
  left: -9999px;
  width: var(--vm-loading-screen-dot-size);
  height: var(--vm-loading-screen-dot-size);
  border-radius: calc(var(--vm-loading-screen-dot-size) / 2);
  background-color: var(--vm-loading-screen-dot-color);
  color: var(--vm-loading-screen-dot-color);
  box-shadow: 9999px 0 0 calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
    var(--vm-loading-screen-dot-color);
  animation: dotPulse var(--vm-loading-screen-pulse-duration) infinite linear;
  animation-delay: calc(var(--vm-loading-screen-pulse-duration) / 6);
}

.dotPulse::before,
.dotPulse::after {
  content: '';
  display: inline-block;
  position: absolute;
  top: 0;
  width: var(--vm-loading-screen-dot-size);
  height: var(--vm-loading-screen-dot-size);
  border-radius: calc(var(--vm-loading-screen-dot-size) / 2);
  background-color: var(--vm-loading-screen-dot-color);
  color: var(--vm-loading-screen-dot-color);
}

.dotPulse::before {
  box-shadow: 9984px 0 0 calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
    var(--vm-loading-screen-dot-color);
  animation: dotPulseBefore var(--vm-loading-screen-pulse-duration) infinite
    linear;
  animation-delay: 0s;
}

.dotPulse::after {
  box-shadow: 10014px 0 0 calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
    var(--vm-loading-screen-dot-color);
  animation: dotPulseAfter var(--vm-loading-screen-pulse-duration) infinite
    linear;
  animation-delay: calc(var(--vm-loading-screen-pulse-duration) / 3);
}

@keyframes dotPulseBefore {
  0% {
    box-shadow: 9984px 0 0
      calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
      var(--vm-loading-screen-dot-color);
  }
  30% {
    box-shadow: 9984px 0 0 2px var(--vm-loading-screen-dot-color);
  }
  60%,
  100% {
    box-shadow: 9984px 0 0
      calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
      var(--vm-loading-screen-dot-color);
  }
}

@keyframes dotPulse {
  0% {
    box-shadow: 9999px 0 0
      calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
      var(--vm-loading-screen-dot-color);
  }
  30% {
    box-shadow: 9999px 0 0 2px var(--vm-loading-screen-dot-color);
  }
  60%,
  100% {
    box-shadow: 9999px 0 0
      calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
      var(--vm-loading-screen-dot-color);
  }
}

@keyframes dotPulseAfter {
  0% {
    box-shadow: 10014px 0 0
      calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
      var(--vm-loading-screen-dot-color);
  }
  30% {
    box-shadow: 10014px 0 0 2px var(--vm-loading-screen-dot-color);
  }
  60%,
  100% {
    box-shadow: 10014px 0 0
      calc(calc(var(--vm-loading-screen-dot-size) / 2) * -1)
      var(--vm-loading-screen-dot-color);
  }
}
