@use '@angular/cdk';
@use '../core/tokens/token-utils';
@use '../core/tokens/m2/mdc/circular-progress' as tokens-mdc-circular-progress;

.mat-mdc-progress-spinner {
  // Explicitly set to `block` since the browser defaults custom elements to `inline`.
  display: block;

  // Prevents the spinning of the inner element from affecting layout outside of the spinner.
  overflow: hidden;

  // Spinners with a diameter less than half the existing line-height will become distorted.
  // Explicitly set the line-height to 0px to avoid this issue.
  line-height: 0;
  position: relative;
  direction: ltr;
  transition: opacity 250ms cubic-bezier(0.4, 0, 0.6, 1);

  circle {
    @include token-utils.use-tokens(
      tokens-mdc-circular-progress.$prefix,
      tokens-mdc-circular-progress.get-token-slots()
    ) {
      @include token-utils.create-token-slot(stroke-width, active-indicator-width);
    }
  }

  &._mat-animation-noopable {
    &, .mdc-circular-progress__determinate-circle {
      // The spinner itself has a transition on `opacity`.
      transition: none !important;
    }

    .mdc-circular-progress__indeterminate-circle-graphic,
    .mdc-circular-progress__spinner-layer,
    .mdc-circular-progress__indeterminate-container {
      // Disables the rotation animations.
      animation: none !important;
    }

    .mdc-circular-progress__indeterminate-container circle {
      // Render the indeterminate spinner as a complete circle when animations are off
      stroke-dasharray: 0 !important;
    }
  }

  @include cdk.high-contrast {
    .mdc-circular-progress__indeterminate-circle-graphic,
    .mdc-circular-progress__determinate-circle {
      // SVG colors aren't inverted automatically in high contrast mode. Set the
      // stroke to currentColor in order to respect the user's color settings.
      stroke: currentColor;
      // currentColor blends in with the background in Chromium-based browsers
      // so we have to fall back to `CanvasText` which isn't supported on IE.
      stroke: CanvasText;
    }
  }
}

.mdc-circular-progress__determinate-container,
.mdc-circular-progress__indeterminate-circle-graphic,
.mdc-circular-progress__indeterminate-container,
.mdc-circular-progress__spinner-layer {
  position: absolute;
  width: 100%;
  height: 100%;
}

.mdc-circular-progress__determinate-container {
  transform: rotate(-90deg);

  .mdc-circular-progress--indeterminate & {
    opacity: 0;
  }
}

.mdc-circular-progress__indeterminate-container {
  font-size: 0;
  letter-spacing: 0;
  white-space: nowrap;
  opacity: 0;

  .mdc-circular-progress--indeterminate & {
    opacity: 1;
    animation: mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite;
  }
}

.mdc-circular-progress__determinate-circle-graphic,
.mdc-circular-progress__indeterminate-circle-graphic {
  fill: transparent;
}

.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,
.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic {
  @include token-utils.use-tokens(
    tokens-mdc-circular-progress.$prefix,
    tokens-mdc-circular-progress.get-token-slots()
  ) {
    @include token-utils.create-token-slot(stroke, active-indicator-color);
  }

  @include cdk.high-contrast {
    stroke: CanvasText;
  }
}

.mdc-circular-progress__determinate-circle {
  transition: stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1);
}

.mdc-circular-progress__gap-patch {
  position: absolute;
  top: 0;
  left: 47.5%;
  box-sizing: border-box;
  width: 5%;
  height: 100%;
  overflow: hidden;
}

.mdc-circular-progress__indeterminate-circle-graphic {
  .mdc-circular-progress__gap-patch & {
    left: -900%;
    width: 2000%;
    transform: rotate(180deg);
  }

  .mdc-circular-progress__circle-clipper & {
    width: 200%;
  }

  .mdc-circular-progress__circle-right & {
    left: -100%;
  }

  .mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left & {
    animation: mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
  }

  .mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right & {
    animation: mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
  }
}

.mdc-circular-progress__circle-clipper {
  display: inline-flex;
  position: relative;
  width: 50%;
  height: 100%;
  overflow: hidden;
}

.mdc-circular-progress__spinner-layer {
  .mdc-circular-progress--indeterminate & {
    animation: mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1)
      infinite both;
  }
}

@keyframes mdc-circular-progress-container-rotate {
  to {
    transform: rotate(360deg);
  }
}

@keyframes mdc-circular-progress-spinner-layer-rotate {
  12.5% {
    transform: rotate(135deg);
  }

  25% {
    transform: rotate(270deg);
  }

  37.5% {
    transform: rotate(405deg);
  }

  50% {
    transform: rotate(540deg);
  }

  62.5% {
    transform: rotate(675deg);
  }

  75% {
    transform: rotate(810deg);
  }

  87.5% {
    transform: rotate(945deg);
  }

  100% {
    transform: rotate(1080deg);
  }
}

@keyframes mdc-circular-progress-left-spin {
  from {
    transform: rotate(265deg);
  }

  50% {
    transform: rotate(130deg);
  }

  to {
    transform: rotate(265deg);
  }
}

@keyframes mdc-circular-progress-right-spin {
  from {
    transform: rotate(-265deg);
  }

  50% {
    transform: rotate(-130deg);
  }

  to {
    transform: rotate(-265deg);
  }
}
