:root {
  --pov: 66deg;
  --day: 14s;
  --sun-orbit-progress: .7;
  --circle-delay: calc(var(--day) / 3.97);
  --circular-ease: cubic-bezier(.37, 0, .63, 1);
  --bg-color: #111;
  --orbit-sphere-color: hsla(260, 80%, 60%, .6);
  --orbit-line-color: hsl(260 50% 66%);
  --orbit-line-thickness: .15rem;
  --orbit-plane-color: radial-gradient(
    circle at center,
    hsla(250, 70%, 75%, .025),
    hsla(250, 70%, 75%, .1)
  );
  --moon-orbit-size: 12dvmin;
  --mercury-orbit-size: 24dvmin;
  --venus-orbit-size: 36dvmin;
  --sun-orbit-size: 48dvmin;
  --mars-orbit-size: 60dvmin;
  --jupiter-orbit-size: 72dvmin;
  --saturn-orbit-size: 84dvmin;
  --stars-orbit-size: 96dvmin;
  --number-of-bodies: 10;
}

:nth-child(1 of :is(.orbit)) { --i: 0; }
:nth-child(2 of :is(.orbit)) { --i: 1; }
:nth-child(3 of :is(.orbit)) { --i: 2; }
:nth-child(4 of :is(.orbit)) { --i: 3; }
:nth-child(5 of :is(.orbit)) { --i: 4; }
:nth-child(6 of :is(.orbit)) { --i: 5; }
:nth-child(7 of :is(.orbit)) { --i: 6; }
:nth-child(8 of :is(.orbit)) { --i: 7; }

:nth-child(1 of :is(.body, .body-container)) { --i: 0; }
:nth-child(2 of :is(.body, .body-container)) { --i: 1; }
:nth-child(3 of :is(.body, .body-container)) { --i: 2; }
:nth-child(4 of :is(.body, .body-container)) { --i: 3; }
:nth-child(5 of :is(.body, .body-container)) { --i: 4; }
:nth-child(6 of :is(.body, .body-container)) { --i: 5; }
:nth-child(7 of :is(.body, .body-container)) { --i: 6; }
:nth-child(8 of :is(.body, .body-container)) { --i: 7; }
:nth-child(9 of :is(.body, .body-container)) { --i: 8; }
:nth-child(10 of :is(.body, .body-container)) { --i: 9; }

body {
  height: 100dvh;
  margin: 0;
  background: var(--bg-color);
  overflow: hidden;
}

.universe {
  height: 100%;
  perspective: 50000px;
  translate: 0 -5%;
  position: relative;
}

/* orbit line */
.orbit {
  --enter-delay: calc(.1s + var(--i) * (1s / 6));
  position: absolute;
  top: 50%;
  left: 50%;
  width: var(--size, 30dvmin);
  height: var(--size, 30dvmin);
  border-radius: 50%;
  background: var(--orbit-plane-color);
  box-shadow: 0 0 0 var(--orbit-line-thickness) var(--orbit-line-color);
  transform-style: preserve-3d;
  rotate: x var(--pov);
  translate: -50% -40%;
  opacity: 0;
  -webkit-animation: orbit-appear 1.5s var(--enter-delay, .1s) forwards;
          animation: orbit-appear 1.5s var(--enter-delay, .1s) forwards;
}

@-webkit-keyframes orbit-appear {
  to {
    opacity: 1;
    translate: -50% -50%;
  }
}

@keyframes orbit-appear {
  to {
    opacity: 1;
    translate: -50% -50%;
  }
}

/* orbit semi-sphere */
.orbit::after {
  --cutout: calc(var(--size) / 2 + var(--orbit-line-thickness));
  content: "";
  position: absolute;
  top: -75%;
  left: calc(-1 * var(--orbit-line-thickness));
  width: calc(100% + var(--orbit-line-thickness) * 2);
  height: 250%;
  background: radial-gradient(
    circle var(--cutout) at center,
    #0000 99.9%,
    var(--orbit-sphere-color)
  );
  border-radius: 50%;
  -webkit-clip-path: polygon(0 50%, 100% 50%, 100% 100%, 0 100%);
          clip-path: polygon(0 50%, 100% 50%, 100% 100%, 0 100%);
}

.orbit.moon {
  --size: var(--moon-orbit-size);
}

.orbit.mercury {
  --size: var(--mercury-orbit-size);
}

.orbit.venus {
  --size: var(--venus-orbit-size);
}

.orbit.sun {
  --size: var(--sun-orbit-size);
}

.orbit.mars {
  --size: var(--mars-orbit-size);
}

.orbit.jupiter {
  --size: var(--jupiter-orbit-size);
}

.orbit.saturn {
  --size: var(--saturn-orbit-size);
}

.orbit.stars {
  --size: var(--stars-orbit-size);
  --orbit-sphere-color: hsla(260, 80%, 20%, .6);
  --orbit-line-color: hsl(260 50% 60%);
}

.orbit.stars .star {
  --size: 8dvmin;
  --astronomical-unit: calc(
    var(--stars-orbit-size) / 2 -
    (var(--y) * var(--y)) * 14dvmin
  );
  --star-x-delay: calc(var(--j) * -.5s);
  content: "";
  position: absolute;
  z-index: 1;
  bottom: -8%;
  left: calc(50% + var(--astronomical-unit));
  width: calc(var(--size) * cos(var(--pov)));
  height: var(--size);
  background: #fff0ea99;
  mix-blend-mode: color-dodge;
  -webkit-clip-path: polygon(
    50% 0,
    55% 45%,
    100% 50%,
    55% 55%,
    50% 100%,
    45% 55%,
    0% 50%,
    45% 45%
  );
          clip-path: polygon(
    50% 0,
    55% 45%,
    100% 50%,
    55% 55%,
    50% 100%,
    45% 55%,
    0% 50%,
    45% 45%
  );
  translate: -50% calc(-50% + var(--y) * 800%);
  rotate: x calc(var(--y) * 80deg);
  scale:
    calc(1 - var(--y) / 1.5)
    calc(1 - var(--y) / 2);
  transform-style: preserve-3d;
  -webkit-animation:
    star-rise-and-shine
      var(--day)
      var(--star-x-delay)
      infinite,
    star-move-x
      var(--day)
      var(--star-x-delay)
      infinite var(--circular-ease),
    star-move-y
      var(--day)
      calc(0s - var(--circle-delay) + var(--star-x-delay))
      infinite var(--circular-ease);
          animation:
    star-rise-and-shine
      var(--day)
      var(--star-x-delay)
      infinite,
    star-move-x
      var(--day)
      var(--star-x-delay)
      infinite var(--circular-ease),
    star-move-y
      var(--day)
      calc(0s - var(--circle-delay) + var(--star-x-delay))
      infinite var(--circular-ease);
}

@-webkit-keyframes star-rise-and-shine {
  from, 52%, to {
    opacity: 0;
  }
  60%, 93% {
    opacity: 1;
  }
  63%, 67%, 71%, 76%, 81%, 86%, 91% {
    opacity: 1;
  }
  61%, 65%, 69%, 73%, 78%, 83%, 89% {
    opacity: max(.3, sin(var(--j)));
  }
}

@keyframes star-rise-and-shine {
  from, 52%, to {
    opacity: 0;
  }
  60%, 93% {
    opacity: 1;
  }
  63%, 67%, 71%, 76%, 81%, 86%, 91% {
    opacity: 1;
  }
  61%, 65%, 69%, 73%, 78%, 83%, 89% {
    opacity: max(.3, sin(var(--j)));
  }
}

@-webkit-keyframes star-move-x {
  from, to {
    transform: rotateY(-70deg);
  }
  50% {
    transform: rotateY(70deg);
    left: calc(50% - var(--astronomical-unit));
  }
}

@keyframes star-move-x {
  from, to {
    transform: rotateY(-70deg);
  }
  50% {
    transform: rotateY(70deg);
    left: calc(50% - var(--astronomical-unit));
  }
}

@-webkit-keyframes star-move-y {
  50% {
    bottom: calc(50% + var(--astronomical-unit) * cos(var(--pov)));
  }
}

@keyframes star-move-y {
  50% {
    bottom: calc(50% + var(--astronomical-unit) * cos(var(--pov)));
  }
}

.body, .body-container {
  --inner-orbit: 0;
  --orbit-progress: 0;
  --sunlight-delay: calc(var(--sun-orbit-progress) * var(--day) * -1);
  --orbit-delay: calc(var(--orbit-progress) * var(--day) * -1);
  --inverse-index: calc(var(--number-of-bodies) - var(--i));
  --shine-delay: calc(
    (var(--sunlight-delay) + var(--orbit-delay)) -
    (var(--day) * var(--inner-orbit))
  );
  --anim-body-reveal: body-reveal
    1.5s
    calc(1s + .09s * var(--i))
    forwards;
  --anim-body-index: body-index
    var(--day)
    var(--orbit-delay)
    infinite;
  --anim-body-shine: body-shine
    var(--day)
    var(--shine-delay)
    linear infinite;
  --anim-body-move-x: body-move-x
    var(--day)
    var(--orbit-delay)
    infinite var(--circular-ease);
  --anim-body-move-y: body-move-y
    var(--day)
    calc(var(--orbit-delay) - var(--circle-delay))
    infinite var(--circular-ease);
  position: absolute;
  left: calc(50% + var(--astronomical-unit));
  top: 0;
  opacity: 0;
  translate: -50% calc(-50% - (50% * sin(var(--pov))));
  width: var(--size);
  height: var(--size);
  background: radial-gradient(
    circle at center,
    var(--color-1, darkgray),
    var(--color-2, #333) 60%
  );
  background-size: 300%;
  background-position: center;
  border-radius: 50%;
  -webkit-animation:
    var(--anim-body-reveal),
    var(--anim-body-index),
    var(--anim-body-shine),
    var(--anim-body-move-x),
    var(--anim-body-move-y);
          animation:
    var(--anim-body-reveal),
    var(--anim-body-index),
    var(--anim-body-shine),
    var(--anim-body-move-x),
    var(--anim-body-move-y);
}

@-webkit-keyframes body-reveal {
  to {
    top: calc(50% + var(--astronomical-unit) * cos(var(--pov)));
    opacity: 1;
  }
}

@keyframes body-reveal {
  to {
    top: calc(50% + var(--astronomical-unit) * cos(var(--pov)));
    opacity: 1;
  }
}

@-webkit-keyframes body-index {
  from, 49% {
    z-index: var(--inverse-index);
  }
  50%, to {
    z-index: 0;
  }
}

@keyframes body-index {
  from, 49% {
    z-index: var(--inverse-index);
  }
  50%, to {
    z-index: 0;
  }
}

@-webkit-keyframes body-shine {
  to {
    background-position-x: -100%;
  }
}

@keyframes body-shine {
  to {
    background-position-x: -100%;
  }
}

@-webkit-keyframes body-move-x {
  50% {
    left: calc(50% - var(--astronomical-unit));
  }
}

@keyframes body-move-x {
  50% {
    left: calc(50% - var(--astronomical-unit));
  }
}

@-webkit-keyframes body-move-y {
  50% {
    top: calc(50% - var(--astronomical-unit) * cos(var(--pov)));
  }
}

@keyframes body-move-y {
  50% {
    top: calc(50% - var(--astronomical-unit) * cos(var(--pov)));
  }
}

.body-container.earth,
.body-container.moon,
.body-container.mercury,
.venus {
  --inner-orbit: 1;
}

.body-container.earth {
  --size: 4dvmin;
  --color-1: #67aecb;
  --color-2: mediumblue;
  --astronomical-unit: 0%;
  --orbit-progress: calc(1 - var(--sun-orbit-progress));
  -webkit-animation:
    var(--anim-body-reveal),
    var(--anim-body-index),
    var(--anim-body-shine),
    earth-night
      var(--day)
      var(--shine-delay)
      linear infinite;
          animation:
    var(--anim-body-reveal),
    var(--anim-body-index),
    var(--anim-body-shine),
    earth-night
      var(--day)
      var(--shine-delay)
      linear infinite;
}

@-webkit-keyframes earth-night {
  50% {
    box-shadow: inset 0 0 var(--size) calc(var(--size) / 5) #000b;
  }
}

@keyframes earth-night {
  50% {
    box-shadow: inset 0 0 var(--size) calc(var(--size) / 5) #000b;
  }
}

.body-container.earth .human-lights {
  --color: #fc07;
  --dim-color: #fc04;
  --px: .6em;
  --light: 0 var(--px) var(--color);
  --dim-light: 0 var(--px) var(--dim-color);
  --this-mad-city: 0 var(--px) #DB709388;
  font-size: calc(var(--size) / 50);
  position: absolute;
  top: 50%;
  left: 50%;
  display: block;
  width: 1em;
  height: 1em;
  translate: -50% -50%;
  border-radius: 50%;
  opacity: 0;
  mix-blend-mode: difference;
  box-shadow:
    -5em -16em var(--light),
    -4em -15em var(--light),
    -3em -16em var(--light),
    -5em -14em var(--dim-light),
    -6em -13em var(--dim-light),
    -3em -14em var(--dim-light),
    -2em -13em var(--light),
    -1em -18em var(--light),
    -1em -16em var(--light),
    -2em -16em var(--dim-light),
    1em -15em var(--light),
    0em -15em var(--dim-light),
    2em -15em var(--dim-light),
    4em -14em var(--light),
    8em -11em var(--dim-light),
    6em -12em var(--this-mad-city),
    8em -8em var(--light),
    7em -5em var(--light),
    4em -19em var(--dim-light),
    8em -17em var(--light),
    1em -13em var(--dim-light),
    8em -6em var(--dim-light),
    4em -4em var(--light),
    17em -10em var(--light),
    19em -7em var(--dim-light),
    -1em -4em var(--light),
    2em -4em var(--dim-light),
    6em -1em var(--dim-light),
    5em -3em var(--dim-light),
    6em 1em var(--light);
  -webkit-animation:
    earth-human-lights
      var(--day)
      var(--shine-delay)
      linear infinite;
          animation:
    earth-human-lights
      var(--day)
      var(--shine-delay)
      linear infinite;
}

@-webkit-keyframes earth-human-lights {
  50% {
    opacity: 1;
  }
}

@keyframes earth-human-lights {
  50% {
    opacity: 1;
  }
}

.body-container.earth::before,
.body-container.earth::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
}

/* continent */
.body-container.earth::before {
  translate: -45% -40%;
  width: calc(var(--size) / 2);
  height: calc(var(--size) / 1.8);
  border-radius: 50% 100%;
  -webkit-clip-path: polygon(
    0 0,
    100% 0,
    70% 100%,
    30% 100%,
    25% 40%,
    3% 35%,
    0 30%,
    3% 10%,
    4% 0
  );
          clip-path: polygon(
    0 0,
    100% 0,
    70% 100%,
    30% 100%,
    25% 40%,
    3% 35%,
    0 30%,
    3% 10%,
    4% 0
  );
  background: linear-gradient(
    to bottom,
    palegoldenrod 30%,
    darkgreen 60%,
    sienna
  );
  mix-blend-mode: soft-light;
  filter: blur(.1dvmin);
}

/* clouds */
.body-container.earth::after {
  width: 100%;
  height: 100%;
  translate: -50% -50%;
  border-radius: 50%;
  background:
    repeating-radial-gradient(
      circle at 50% 0%,
      #fff4 3%,
      #fff4 10%,
      #0000 11%,
      #0000 40%,
      #fff4 60%,
      #0000 80%,
      #0000 100%
    ),
    repeating-radial-gradient(
      ellipse
      calc(var(--size) / 1.5)
      calc(var(--size) / 6)
      at 30% 90%,
      #fff4,
      #fffa 1%,
      transparent 3%,
      #fff9 5%,
      transparent 7%,
      #fff4 9%,
      transparent 11%,
      transparent 100%
    );
  background-size: 200% 100%;
  background-position: right center;
  filter: blur(.1dvmin);
  mix-blend-mode: hard-light;
  -webkit-animation:
    earth-clouds
      calc(var(--day) * 3.1)
      linear infinite;
          animation:
    earth-clouds
      calc(var(--day) * 3.1)
      linear infinite;
}

@-webkit-keyframes earth-clouds {
  to {
    background-position-x: -100%;
  }
}

@keyframes earth-clouds {
  to {
    background-position-x: -100%;
  }
}

.body-container.moon {
  --size: 2dvmin;
  --color-1: #eee;
  --color-2: #333;
  --astronomical-unit: calc(var(--moon-orbit-size) / 2);
  --orbit-progress: .2;
  overflow: hidden;
}

.body-container.moon .crater {
  position: absolute;
  top: var(--y);
  left: var(--x);
  z-index: 1;
  translate: 0 -50%;
  width: calc(var(--size) * 100%);
  height: calc(var(--size) * 100%);
  background: #0003;
  transform-style: preserve-3d;
  transform-origin: left center;
  rotate: x calc(90deg - var(--pov));
  border-radius: 50%;
  box-shadow:
    .1dvmin .1dvmin .1dvmin #fff7,
    -.1dvmin -.1dvmin .1dvmin #0009;
  -webkit-animation:
    moon-crater
    var(--day)
    calc(var(--day) / -2.2)
    linear infinite;
          animation:
    moon-crater
    var(--day)
    calc(var(--day) / -2.2)
    linear infinite;
}

@-webkit-keyframes moon-crater {
  from {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * -100%)
      )
      rotateY(-90deg);
  }
  99.9% {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * 100%)
      )
      rotateY(90deg);
  }
  to {
    z-index: 0;
  }
}

@keyframes moon-crater {
  from {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * -100%)
      )
      rotateY(-90deg);
  }
  99.9% {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * 100%)
      )
      rotateY(90deg);
  }
  to {
    z-index: 0;
  }
}

.body-container.moon .crater-1 {
  --size: .3;
  --x: 30%;
  --y: 20%;
}

.body-container.moon .crater-2 {
  --size: .2;
  --x: 66%;
  --y: 55%;
}

.body-container.moon .crater-3 {
  --size: .15;
  --x: 55%;
  --y: 40%;
}

.body-container.moon .crater-4 {
  --size: .25;
  --x: 27%;
  --y: 50%;
}

.body-container.moon .crater-5 {
  --size: .1;
  --x: 60%;
  --y: 70%;
}

.body-container.moon .crater-6 {
  --size: .1;
  --x: 20%;
  --y: 40%;
}

.body-container.mercury {
  --size: 2dvmin;
  --color-1: #eed;
  --color-2: #443;
  --astronomical-unit: calc(var(--mercury-orbit-size) / 2);
  --orbit-progress: .35;
  overflow: hidden;
}

.body-container.mercury .crater {
  position: absolute;
  top: var(--y);
  left: var(--x);
  z-index: 1;
  rotate: x calc(90deg - var(--pov));
  translate: 0 -50%;
  transform-style: preserve-3d;
  transform-origin: left center;
  width: calc(var(--size) * 100%);
  height: calc(var(--size) * 100%);
  background: #fff7;
  border-radius: 50%;
  box-shadow: inset 0 0 .2dvmin .02dvmin #0006;
  -webkit-animation:
    mercury-crater
    var(--day)
    calc(var(--day) / -2)
    linear infinite;
          animation:
    mercury-crater
    var(--day)
    calc(var(--day) / -2)
    linear infinite;
}

@-webkit-keyframes mercury-crater {
  from {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * -100%)
      )
      rotateY(-90deg);
  }
  99.9% {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * 100%)
      )
      rotateY(90deg);
  }
  to {
    z-index: 0;
  }
}

@keyframes mercury-crater {
  from {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * -100%)
      )
      rotateY(-90deg);
  }
  99.9% {
    z-index: 1;
    transform:
      translateX(
        calc(1 / var(--size) * 100%)
      )
      rotateY(90deg);
  }
  to {
    z-index: 0;
  }
}

.body-container.mercury .crater-1 {
  --size: .1;
  --x: 35%;
  --y: 21%;
}

.body-container.mercury .crater-2 {
  --size: .15;
  --x: 68%;
  --y: 35%;
}

.body-container.mercury .crater-3 {
  --size: .17;
  --x: 50%;
  --y: 42%;
}

.body-container.mercury .crater-4 {
  --size: .12;
  --x: 22%;
  --y: 75%;
}

.body-container.mercury .crater-5 {
  --size: .2;
  --x: 37%;
  --y: 53%;
}

.body-container.mercury .crater-6 {
  --size: .16;
  --x: 17%;
  --y: 79%;
}

.body-container.mercury .crater-7 {
  --size: .13;
  --x: 18%;
  --y: 23%;
}

.body-container.mercury .crater-8 {
  --size: .17;
  --x: 83%;
  --y: 38%;
}

.body-container.mercury .crater-9 {
  --size: .11;
  --x: 60%;
  --y: 18%;
}

.body-container.mercury .crater-10 {
  --size: .1;
  --x: 42%;
  --y: 70%;
}

.body-container.mercury .crater-11 {
  --size: .14;
  --x: 75%;
  --y: 65%;
}

.body-container.mercury .crater-12 {
  --size: .2;
  --x: 86%;
  --y: 60%;
}

.body-container.mercury .crater-13 {
  --size: .15;
  --x: 76%;
  --y: 73%;
}

.body-container.mercury .crater-14 {
  --size: .14;
  --x: 20%;
  --y: 50%;
}

.body-container.mercury .crater-15 {
  --size: .17;
  --x: 27%;
  --y: 22%;
}

.body-container.mercury .crater-16 {
  --size: .11;
  --x: 16%;
  --y: 73%;
}

.body.venus {
  --size: 4dvmin;
  --color-1: #eed;
  --color-2: #553;
  --astronomical-unit: calc(var(--venus-orbit-size) / 2);
  --orbit-progress: .3;
}

.body.sun {
  --size: 6dvmin;
  --color-1: #fb3;
  --color-2: yellow;
  --astronomical-unit: calc(var(--sun-orbit-size) / 2);
  --orbit-progress: var(--sun-orbit-progress);
  box-shadow:
    0 0 1dvmin .2dvmin #ffd,
    0 0 3dvmin 1dvmin #fa3;
  -webkit-animation:
    var(--anim-body-reveal),
    var(--anim-body-index),
    var(--anim-body-move-x),
    var(--anim-body-move-y);
          animation:
    var(--anim-body-reveal),
    var(--anim-body-index),
    var(--anim-body-move-x),
    var(--anim-body-move-y);
}

.body-container.mars {
  --size: 3dvmin;
  --color-1: darkorange;
  --color-2: #750;
  --astronomical-unit: calc(var(--mars-orbit-size) / 2);
  --orbit-progress: .6;
  overflow: hidden;
}

.body-container.mars .ice-cap {
  position: absolute;
  width: calc(var(--size) / 2.5);
  height: calc(var(--size) / 2.5);
  top: 0;
  left: 50%;
  translate: -50% -40%;
  rotate: x var(--pov);
  background: radial-gradient(
    circle at center,
    #fff8,
    transparent
  );
  mix-blend-mode: overlay;
  border-radius: 50%;
  -webkit-clip-path: polygon(
    0 0,
    30% 0,
    32% 40%,
    34% 0,
    60% 0,
    82% 60%,
    84% 5%,
    90% 25%,
    70% 27%,
    88% 30%,
    95% 70%,
    60% 71%,
    93% 76%,
    100% 100%,
    66% 66%,
    33% 90%,
    0 100%
  );
          clip-path: polygon(
    0 0,
    30% 0,
    32% 40%,
    34% 0,
    60% 0,
    82% 60%,
    84% 5%,
    90% 25%,
    70% 27%,
    88% 30%,
    95% 70%,
    60% 71%,
    93% 76%,
    100% 100%,
    66% 66%,
    33% 90%,
    0 100%
  );
  -webkit-animation:
    mars-ice-cap
    var(--day)
    linear infinite;
          animation:
    mars-ice-cap
    var(--day)
    linear infinite;
}

@-webkit-keyframes mars-ice-cap {
  to {
    transform: rotate(-1turn);
  }
}

@keyframes mars-ice-cap {
  to {
    transform: rotate(-1turn);
  }
}

.body-container.mars::before,
.body-container.mars::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  filter: blur(1.33dvmin);
  background: #1a1300ff;
  mix-blend-mode: hard-light;
  -webkit-animation:
    mars-surface
    var(--day)
    linear infinite;
          animation:
    mars-surface
    var(--day)
    linear infinite;
}

@-webkit-keyframes mars-surface {
  from {
    transform: translateX(-200%);
  }
  to {
    transform: translateX(200%);
  }
}

@keyframes mars-surface {
  from {
    transform: translateX(-200%);
  }
  to {
    transform: translateX(200%);
  }
}

.body-container.mars::before {
  translate: -10% -20%;
  width: calc(var(--size) / 3.5);
  height: calc(var(--size) / 1.8);
  -webkit-clip-path: polygon(
    5% 19%,
    32% 32%,
    65% 39%,
    83% 38%,
    98% 48%,
    90% 65%,
    78% 64%,
    66% 77%,
    56% 69%,
    47% 67%,
    32% 72%,
    19% 76%,
    8% 68%,
    4% 53%,
    2% 39%
  );
          clip-path: polygon(
    5% 19%,
    32% 32%,
    65% 39%,
    83% 38%,
    98% 48%,
    90% 65%,
    78% 64%,
    66% 77%,
    56% 69%,
    47% 67%,
    32% 72%,
    19% 76%,
    8% 68%,
    4% 53%,
    2% 39%
  );
}

.body-container.mars::after {
  translate: -70% -40%;
  width: calc(var(--size) / 2.6);
  height: calc(var(--size) / 3.5);
  -webkit-clip-path: polygon(
    5% 19%,
    32% 32%,
    65% 39%,
    83% 38%,
    98% 48%,
    90% 65%,
    78% 64%,
    66% 77%,
    56% 69%,
    47% 67%,
    32% 72%,
    19% 76%,
    8% 68%,
    4% 53%,
    2% 39%
  );
          clip-path: polygon(
    5% 19%,
    32% 32%,
    65% 39%,
    83% 38%,
    98% 48%,
    90% 65%,
    78% 64%,
    66% 77%,
    56% 69%,
    47% 67%,
    32% 72%,
    19% 76%,
    8% 68%,
    4% 53%,
    2% 39%
  );
}

.body.jupiter {
  --size: 5dvmin;
  --color-1: #9f938f;
  --color-2: #321;
  --astronomical-unit: calc(var(--jupiter-orbit-size) / 2);
  --orbit-progress: .4;
  overflow: hidden;
}

.body.jupiter::after {
  --great-red-spot-width: calc(var(--size) / 8);
  --great-red-spot-height: calc(var(--size) / 10);
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background:
    radial-gradient(
      ellipse 140% 100% at center -5%,
      transparent 38%,
      #6526 41%,
      #6526 44%,
      transparent 45%,
      transparent 46%,
      #652a 46%,
      #652a 52%,
      transparent 53%,
      transparent 58%,
      #652a 60%,
      #652a 66%,
      transparent 67%
    );
  background-size: 200% 200%;
  background-position: center center;
  mix-blend-mode: soft-light;
}

.body.jupiter::before {
  --great-red-spot-width: calc(var(--size) / 10);
  --great-red-spot-height: calc(var(--size) / 12);
  content: "";
  position: absolute;
  z-index: 1;
  inset: 0;
  border-radius: 50%;
  box-shadow: inset 0 0 calc(var(--size) / 2) var(--color-1);
  background:
    radial-gradient(
      ellipse
      var(--great-red-spot-width)
      var(--great-red-spot-height)
      at 70% 68%,
      #5329, transparent
    ),
    radial-gradient(
      ellipse
      calc(var(--great-red-spot-width) / 2.5)
      calc(var(--great-red-spot-height) / 2.5)
      at 80% 60%,
      #fec6, transparent
    ),
    radial-gradient(
      ellipse
      calc(var(--great-red-spot-width) / 2.3)
      calc(var(--great-red-spot-height) / 2.3)
      at 45% 63%,
      #fec6, transparent
    ),
    radial-gradient(
      ellipse
      calc(var(--great-red-spot-width) / 2.1)
      calc(var(--great-red-spot-height) / 2.1)
      at 30% 36%,
      #fec6, transparent
    );
  background-size: 200% 100%;
  background-position: center center;
  mix-blend-mode: overlay;
  -webkit-animation:
    jupiter-clouds
    var(--day) calc(var(--day) / -1.2)
    linear infinite;
          animation:
    jupiter-clouds
    var(--day) calc(var(--day) / -1.2)
    linear infinite;
}

@-webkit-keyframes jupiter-clouds {
  from {
    background-position-x: left;
  }
  to {
    background-position-x: -200%;
  }
}

@keyframes jupiter-clouds {
  from {
    background-position-x: left;
  }
  to {
    background-position-x: -200%;
  }
}

.body-container.saturn {
  --size: 5dvmin;
  --color-1: #cb9;
  --color-2: #531;
  --astronomical-unit: calc(var(--saturn-orbit-size) / 2);
  --orbit-progress: .1;
  --ring-a-size: 180%;
  --ring-a-color: var(--color-1);
  --ring-b-size: 200%;
  --ring-b-color: var(--color-1);
}

.body-container.saturn .body-copy,
.body-container.saturn .storms {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: inherit;
  border-radius: inherit;
}

.body-container.saturn .storms {
  overflow: hidden;
}

.body-container.saturn .storm {
  position: absolute;
  width: var(--size);
  height: var(--size);
  top: 0;
  left: 50%;
  translate: -50% var(--y);
  rotate: x var(--pov);
  border-radius: inherit;
  mix-blend-mode: overlay;
  -webkit-clip-path: polygon(0 50%, 100% 50%, 100% 100%, 0 100%);
          clip-path: polygon(0 50%, 100% 50%, 100% 100%, 0 100%);
  background: var(--bg);
  filter: blur(var(--fuzz));
}

.body-container.saturn .storm:nth-child(1) {
  --y: -60%;
  --fuzz: .1dvmin;
  --bg: radial-gradient(
    circle at center,
    transparent 20%,
    #1323 40%,
    transparent
  );
}

.body-container.saturn .storm:nth-child(2) {
  --y: -35%;
  --fuzz: .1dvmin;
  --bg: radial-gradient(
    circle at center,
    transparent 55%,
    #3213
  );
}

.body-container.saturn .storm:nth-child(3) {
  --y: -15%;
  --fuzz: .25dvmin;
  --bg: radial-gradient(
    circle at center,
    transparent 25%,
    #fed2
  );
}

.body-container.saturn::before,
.body-container.saturn::after,
.body-container.saturn .ring-far {
  position: absolute;
  top: 50%;
  left: 50%;
  rotate: x var(--pov);
  border-radius: 50%;
}

.body-container.saturn::before,
.body-container.saturn::after {
  content: "";
  z-index: 1;
  translate: -50% -50%;
  -webkit-clip-path: polygon(
    0 100%,
    100% 100%,
    100% 50%,
    0 50%
  );
          clip-path: polygon(
    0 100%,
    100% 100%,
    100% 50%,
    0 50%
  );
}

.body-container.saturn .ring-far {
  translate: -50% -49%;
  -webkit-clip-path: polygon(
    0 0,
    100% 0,
    100% 50%,
    0 50%
  );
          clip-path: polygon(
    0 0,
    100% 0,
    100% 50%,
    0 50%
  );
}

.body-container.saturn::before,
.body-container.saturn .ring-far.a {
  width: var(--ring-a-size);
  height: var(--ring-a-size);
  background: radial-gradient(
    circle calc(var(--size) / 1.5) at center,
    #0000 99.9%,
    var(--ring-a-color)
  );
}

.body-container.saturn::after,
.body-container.saturn .ring-far.b {
  width: var(--ring-b-size);
  height: var(--ring-b-size);
  background: radial-gradient(
    circle calc(var(--size) / 1.05) at center,
    #0000 99.9%,
    var(--ring-b-color)
  );
}

.body-container.saturn .shadow {
  position: absolute;
  z-index: 2;
  top: 50%;
  left: 50%;
  background: radial-gradient(
    ellipse
      calc(var(--size) / 1.4)
      calc(var(--size) / 1.4 * 3)
      at center,
    #0000 18%,
    #000 18.1%
  );
  width: 100%;
  height: 75%;
  transform-style: preserve-3d;
  transform-origin: left center;
  rotate: x var(--pov);
  translate: 0 -50%;
  border-radius: 30%;
  border-top-right-radius: 50% 90%;
  border-bottom-right-radius: 50% 90%;
  -webkit-clip-path: polygon(
    50% 0,
    100% 0,
    100% 100%,
    50% 100%
  );
          clip-path: polygon(
    50% 0,
    100% 0,
    100% 100%,
    50% 100%
  );
  -webkit-animation:
    saturn-shadow
    var(--day)
    -2s
    linear infinite;
          animation:
    saturn-shadow
    var(--day)
    -2s
    linear infinite;
}

@-webkit-keyframes saturn-shadow {
  from, 40%, to {
    opacity: 0.8;
  }
  50%, 90% {
    opacity: 0.7;
  }
  to {
    transform: rotateZ(-1turn);
  }
  7.8%, 43.5% {
    z-index: 0;
  }
  43.6% {
    z-index: 2;
  }
}

@keyframes saturn-shadow {
  from, 40%, to {
    opacity: 0.8;
  }
  50%, 90% {
    opacity: 0.7;
  }
  to {
    transform: rotateZ(-1turn);
  }
  7.8%, 43.5% {
    z-index: 0;
  }
  43.6% {
    z-index: 2;
  }
}

.body-container.nebula {
  --size: .25dvmin;
  --color-1: white;
  --color-2: white;
  --astronomical-unit: calc(var(--stars-orbit-size) / 2);
  --orbit-progress: .85;
  --part-width: calc(var(--size) * 30);
  --part-height: calc(var(--size) * 20);
  --center-size: calc(var(--size) * 40);
  --part-bg-1: #4ad8;
  --part-bg-2: #b50a;
  --part-bg-3: #ec2a;
}

.body-container.nebula .body-copy {
  position: absolute;
  top: 0;
  left: 0;
  border-radius: inherit;
  width: 100%;
  height: 100%;
  width: var(--center-size);
  height: var(--center-size);
  translate: -50% -50%;
  background: inherit;
  background:
    radial-gradient(
      ellipse
        calc(var(--center-size) / 1.25)
        calc(var(--center-size) / 2)
        at center,
      transparent 20%,
      #fff3,
      transparent 60%
    );
}

.body-container.nebula .body-copy::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: calc(var(--size));
  height: calc(var(--size));
  -webkit-animation: nebula-stars-twinkle 3s linear infinite;
          animation: nebula-stars-twinkle 3s linear infinite;
}

@-webkit-keyframes nebula-stars-twinkle {
  from, 27%, 40%, 60%, 73%, to {
    box-shadow:
      -2dvmin -1.1dvmin 0 #fff2,
      -3.4dvmin -1dvmin 0 #fff4,
      -1.5dvmin -.5dvmin 0 #fff3,
      -1dvmin 1.3dvmin 0 #fff4,
      -4.2dvmin 1dvmin 0 #fff1,
      -1.5dvmin .5dvmin 0 #fff1,
      .6dvmin -.6dvmin 0 #fff2,
      1.9dvmin -1.4dvmin 0 #fff3,
      2.5dvmin -1dvmin 0 #fff4,
      1.5dvmin .5dvmin 0 #fff5,
      1.8dvmin 1.25dvmin 0 #fff2,
      3dvmin .9dvmin 0 #fff3;
  }
  33%, 66% {
    box-shadow:
      -2dvmin -1.1dvmin 0 #fff4,
      -3.4dvmin -1dvmin 0 #fff5,
      -1.5dvmin -.5dvmin 0 #fff4,
      -1dvmin 1.3dvmin 0 #fff2,
      -4.2dvmin 1dvmin 0 #fff2,
      -1.5dvmin .5dvmin 0 #fff4,
      .6dvmin -.6dvmin 0 #fff6,
      1.9dvmin -1.4dvmin 0 #fff4,
      2.5dvmin -1dvmin 0 #fff5,
      1.5dvmin .5dvmin 0 #fff3,
      1.8dvmin 1.25dvmin 0 #fff4,
      3dvmin .9dvmin 0 #fff7;
  }
}

@keyframes nebula-stars-twinkle {
  from, 27%, 40%, 60%, 73%, to {
    box-shadow:
      -2dvmin -1.1dvmin 0 #fff2,
      -3.4dvmin -1dvmin 0 #fff4,
      -1.5dvmin -.5dvmin 0 #fff3,
      -1dvmin 1.3dvmin 0 #fff4,
      -4.2dvmin 1dvmin 0 #fff1,
      -1.5dvmin .5dvmin 0 #fff1,
      .6dvmin -.6dvmin 0 #fff2,
      1.9dvmin -1.4dvmin 0 #fff3,
      2.5dvmin -1dvmin 0 #fff4,
      1.5dvmin .5dvmin 0 #fff5,
      1.8dvmin 1.25dvmin 0 #fff2,
      3dvmin .9dvmin 0 #fff3;
  }
  33%, 66% {
    box-shadow:
      -2dvmin -1.1dvmin 0 #fff4,
      -3.4dvmin -1dvmin 0 #fff5,
      -1.5dvmin -.5dvmin 0 #fff4,
      -1dvmin 1.3dvmin 0 #fff2,
      -4.2dvmin 1dvmin 0 #fff2,
      -1.5dvmin .5dvmin 0 #fff4,
      .6dvmin -.6dvmin 0 #fff6,
      1.9dvmin -1.4dvmin 0 #fff4,
      2.5dvmin -1dvmin 0 #fff5,
      1.5dvmin .5dvmin 0 #fff3,
      1.8dvmin 1.25dvmin 0 #fff4,
      3dvmin .9dvmin 0 #fff7;
  }
}

.body-container.nebula .part {
  position: absolute;
  top: 50%;
  left: 50%;
  translate: calc(-50% + var(--part-distance)) -50%;
  width: var(--part-width);
  height: var(--part-height);
  border-radius: 100%;
  filter: blur(.2dvmin);
  background:
    linear-gradient(
      var(--part-side),
      var(--part-bg-1) 15%,
      var(--part-bg-2),
      transparent
    ),
    linear-gradient(
      to bottom,
      var(--part-bg-3),
      transparent 20%,
      transparent 80%,
      var(--part-bg-3)
    ),
    radial-gradient(
      circle at center,
      transparent 50%,
      var(--part-bg-3)
    );
}

.body-container.nebula .part.a {
  --part-side: to left;
  --part-distance: -20%;
}

.body-container.nebula .part.b {
  --part-side: to right;
  --part-distance: 20%;
}

.body-container.galaxy {
  --size: .5dvmin;
  --color-1: white;
  --color-2: white;
  --astronomical-unit: calc(var(--stars-orbit-size) / 2);
  --orbit-progress: .35;
  --evolution-speed: calc(var(--day) / 3);
  --arm-thickness: .6dvmin;
}

.body-container.galaxy .arms {
  position: absolute;
  top: 50%;
  left: 50%;
  translate: -50% -50%;
  -webkit-animation: galaxy-rotation 5s linear infinite;
          animation: galaxy-rotation 5s linear infinite;
}

@-webkit-keyframes galaxy-rotation {
  to {
    transform: rotate(1turn);
  }
}

@keyframes galaxy-rotation {
  to {
    transform: rotate(1turn);
  }
}

:nth-child(1 of :is(.body-container.galaxy .arm)) { --i: 0; }
:nth-child(2 of :is(.body-container.galaxy .arm)) { --i: 1; }

.body-container.galaxy .arm {
  position: absolute;
  top: 50%;
  left: 50%;
  translate:
    calc(-42% + var(--i) * -15%)
    calc(-42% + var(--i) * -15%);
  rotate: calc(var(--i) * 180deg);
}

.body-container.galaxy .arm-depth {
  width: calc(var(--size) * 15);
  height: calc(var(--size) * 15);
  position: relative;
  transform: rotate(.4turn);
  -webkit-animation:
    galaxy-evolution
    var(--evolution-speed)
    ease-in-out infinite;
          animation:
    galaxy-evolution
    var(--evolution-speed)
    ease-in-out infinite;
}

@-webkit-keyframes galaxy-evolution {
  50% {
    transform: rotate(.6turn);
  }
}

@keyframes galaxy-evolution {
  50% {
    transform: rotate(.6turn);
  }
}

.body-container.galaxy .arm-depth::before {
  --arm-color: hsl(
    calc(245 + var(--d) * 20),
    30%,
    calc(60% + var(--d) * 5%)
  );
  content: "";
  position: absolute;
  inset: 0;
  border-top: var(--arm-thickness) solid var(--arm-color);
  border-right: var(--arm-thickness) solid var(--arm-color);
  border-radius: 100%;
  filter: blur(.2dvmin);
}

.body-container.galaxy .arm-depth::after {
  content: "";
  position: absolute;
  width: calc(var(--size) / 3);
  height: calc(var(--size) / 3);
  top: 50%;
  left: 50%;
  translate: -50% -50%;
  border-radius: 50%;
  box-shadow:
    .8dvmin 0 2dvmin 0 brown,
    -.8dvmin 0 2dvmin 0 brown,
    0 1.6dvmin 1dvmin 0 orange,
    0 -1.6dvmin 1dvmin 0 orange,
    2.4dvmin 0 .15dvmin 0 white,
    -2.4dvmin 0 .15dvmin 0 #fe9,
    0 3.2dvmin .15dvmin 0 white,
    0 -3.2dvmin .15dvmin 0 #aaf;
  -webkit-animation:
    galaxy-stars-dim
    var(--evolution-speed)
    ease-in-out infinite;
          animation:
    galaxy-stars-dim
    var(--evolution-speed)
    ease-in-out infinite;
}

@-webkit-keyframes galaxy-stars-dim {
  15%, 35%, 65%, 85% {
    opacity: .6;
  }
  25%, 75% {
    opacity: 0;
  }
}

@keyframes galaxy-stars-dim {
  15%, 35%, 65%, 85% {
    opacity: .6;
  }
  25%, 75% {
    opacity: 0;
  }
}

.body-container.galaxy .arm-depth .arm-depth {
  position: absolute;
  width: 61.8%;
  height: 61.8%;
  bottom: 6%;
  right: 5%;
}