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

body {
  height: 100dvh;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: steelblue;
}

.ball {
  position: relative;
  transform-style: preserve-3d;
  width: 60px;
  height: 60px;
  z-index: 1;
  animation: bounceBall 1.2s cubic-bezier(0.42, 0, 0.58, 1) infinite;
}

.ball::before {
  background: radial-gradient(circle at 36px 20px, #fd9833, #311800);
  width: calc(100% + 6px);
  height: calc(100% + 6px);
  content: "";
  position: absolute;
  border-radius: 50%;
  left: -3px;
  top: -3px;
  border: 2px solid #333;
}

@keyframes bounceBall {
  0% {
    transform: translateY(-70px) scale(1, 1);
  }

  15% {
    transform: translateY(-56px) scale(1, 1);
  }

  45% {
    transform: translateY(70px) scale(1, 1);
  }

  50% {
    transform: translateY(73.5px) scale(1, 0.92);
  }

  55% {
    transform: translateY(70px) scale(1, 0.95);
  }

  85% {
    transform: translateY(-56px) scale(1, 1);
  }

  95% {
    transform: translateY(-70px) scale(1, 1);
  }

  100% {
    transform: translateY(-70px) scale(1, 1);
  }
}

.ball .inner {
  border-radius: 50%;
  height: 100%;
  position: absolute;
  width: 100%;
  transform-style: preserve-3d;
  animation: rotateBall 25s linear infinite;
}

@keyframes rotateBall {
  0% {
    transform: rotateY(0deg) rotateX(0deg) rotateZ(0deg);
  }

  50% {
    transform: rotateY(360deg) rotateX(360deg) rotateZ(0deg);
  }

  100% {
    transform: rotateY(720deg) rotateX(720deg) rotateZ(360deg);
  }
}

.ball .line::before,
.ball .line::after {
  height: 100%;
  width: 100%;
  position: absolute;
  content: "";
  border: 2px solid #333;
  border-radius: 50%;
}

.shadow {
  position: absolute;
  width: 54px;
  height: 6px;
  background: black;
  border-radius: 50%;
  filter: blur(2px);
  transform: translateY(110px);
  animation: bounceShadow 1.2s cubic-bezier(0.42, 0, 0.58, 1) infinite;
}

@keyframes bounceShadow {
  0% {
    filter: blur(3px);
    opacity: 0.6;
    transform: translateY(110px) scale(0.5, 0.5);
  }

  45% {
    filter: blur(1px);
    opacity: 0.9;
    transform: translateY(110px) scale(1, 1);
  }

  55% {
    filter: blur(1px);
    opacity: 0.9;
    transform: translateY(110px) scale(1, 1);
  }

  100% {
    filter: blur(3px);
    opacity: 0.6;
    transform: translateY(110px) scale(0.5, 0.5);
  }
}

h1 {
  position: absolute;
  font-family: cursive;
  font-size: 32px;
  top: 120px;
  color: white;
}
