@keyframes outer {
  0% { opacity: 0.3; }
  20% { opacity: 1; }
  100% { opacity: 0.3; }
}

@keyframes inner {
  0% { opacity: 0.4; }
  20% { opacity: 1; }
  100% { opacity: 0.4; }
}

@animationTime: 750ms;
@outerTriangles: 19;
@animationDelay: @animationTime / @outerTriangles;

.loader {

  path {
    stroke: #000;
    stroke-width: 0;
    opacity: 0;
  }
}

.l1 { animation: outer @animationTime linear infinite; }
.l2 { animation: inner @animationTime linear infinite; }

.mixin-loop (@i) when (@i > 0) {
  .d@{i} {
    opacity: @i / @outerTriangles;
    animation-delay: @i * @animationDelay;
  }
  .mixin-loop(@i - 1);
}

.mixin-loop(@outerTriangles);

