*, *::before, *::after {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}

body {
  background-color: #000;
  min-height: 100vh;
  display: grid;
  place-items: center;
  perspective: 1000px;
  overflow: hidden;
  
  *:not(:empty) {
    transform-style: preserve-3d;
  }
}

.scene {
  position: relative;  
}

.dots {
  -webkit-animation: dots 32s infinite linear;
          animation: dots 32s infinite linear;

  div {
    position: absolute;
    inset: -50vmax;
    transform: translateZ(calc(var(--i) * 80px));
    background-image:
      radial-gradient(circle at 25% 25%, hsl(160 100% calc(var(--i) * 10%)) 1px, transparent 0),
      radial-gradient(circle at 25% 75%, hsl(180 100% calc(var(--i) * 10%)) 1px, transparent 0),
      radial-gradient(circle at 75% 25%, hsl(200 100% calc(var(--i) * 10%)) 1px, transparent 0),
      radial-gradient(circle at 75% 75%, hsl(220 100% calc(var(--i) * 10%)) 1px, transparent 0);
    background-size: 80px 80px;
  }
}

@-webkit-keyframes dots {
  from { transform: rotate(0deg) rotateX(30deg) rotate(360deg); }
  to { transform: rotate(360deg) rotateX(30deg) rotate(0deg); }
}

@keyframes dots {
  from { transform: rotate(0deg) rotateX(30deg) rotate(360deg); }
  to { transform: rotate(360deg) rotateX(30deg) rotate(0deg); }
}