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

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

.scene {
	position: relative;
	-webkit-animation: rotate 90s infinite linear;
	animation: rotate 90s infinite linear;
}
@-webkit-keyframes rotate {
	from {
		transform: rotateX(60deg) rotateZ(-210deg);
	}
	to {
		transform: rotateX(60deg) rotateZ(150deg);
	}
}
@keyframes rotate {
	from {
		transform: rotateX(60deg) rotateZ(-210deg);
	}
	to {
		transform: rotateX(60deg) rotateZ(150deg);
	}
}

.floor {
	position: absolute;
	inset: -40em;
	background-image: radial-gradient(circle, transparent, #000 40em), repeating-conic-gradient(#567 0 35deg, #678 0 55deg, #789 0 90deg);
	background-size: 100% 100%, 4.5em 4.5em;
	transform: translateZ(-2px);
	-webkit-animation: floorPos 1.5s infinite linear;
	animation: floorPos 1.5s infinite linear;
}
@-webkit-keyframes floorPos {
	to {
		background-position-x: center, -4.5em;
	}
}
@keyframes floorPos {
	to {
		background-position-x: center, -4.5em;
	}
}

.links {
	position: absolute;
	display: flex;
	gap: 0.5em;
	transform: translateX(-50%);
}

.link {
	width: 3em;
	height: 2em;
	-webkit-animation: cubeX 2s var(--delay, 0s) infinite ease-in-out;
	animation: cubeX 2s var(--delay, 0s) infinite ease-in-out;
}
.link > div {
	position: absolute;
	inset: 0;
	-webkit-animation: cubeZ 2s var(--delay, 0s) infinite ease-in-out;
	animation: cubeZ 2s var(--delay, 0s) infinite ease-in-out;
}
.link > div > div {
	position: absolute;
	inset: 0;
	background-color: #789;
	box-shadow: 0 0 1em #0008 inset;
	transform-style: preserve-3d;
	-webkit-animation: cubeR 2s var(--delay, 0s) infinite ease-in-out;
	animation: cubeR 2s var(--delay, 0s) infinite ease-in-out;
}
.link > div > div::before, .link > div > div::after {
	content: "";
	position: absolute;
	inset: 0;
	box-shadow: 0 0 1em #0008 inset;
}
.link > div > div::before {
	background-image: linear-gradient(#789, #def);
	transform: rotatex(60deg);
	transform-origin: top;
}
.link > div > div::after {
	background-image: linear-gradient(#def, #789);
	transform: rotatex(-60deg);
	transform-origin: bottom;
}
@-webkit-keyframes cubeZ {
	0%, 50%, 100% {
		transform: translateZ(0em);
	}
	25% {
		transform: translateZ(6em);
	}
}
@keyframes cubeZ {
	0%, 50%, 100% {
		transform: translateZ(0em);
	}
	25% {
		transform: translateZ(6em);
	}
}
@-webkit-keyframes cubeX {
	0%, 100% {
		transform: translateX(0em);
	}
	50% {
		transform: translateX(3em);
		-webkit-animation-timing-function: linear;
		animation-timing-function: linear;
	}
}
@keyframes cubeX {
	0%, 100% {
		transform: translateX(0em);
	}
	50% {
		transform: translateX(3em);
		-webkit-animation-timing-function: linear;
		animation-timing-function: linear;
	}
}
@-webkit-keyframes cubeR {
	0%, 50%, 100% {
		transform: rotateY(0deg);
	}
	12.5% {
		transform: rotateY(45deg);
	}
	37.5% {
		transform: rotateY(-45deg);
	}
}
@keyframes cubeR {
	0%, 50%, 100% {
		transform: rotateY(0deg);
	}
	12.5% {
		transform: rotateY(45deg);
	}
	37.5% {
		transform: rotateY(-45deg);
	}
}
.link:nth-child(1) {
	--delay: -2s ;
}
.link:nth-child(2) {
	--delay: -1.8666666667s ;
}
.link:nth-child(3) {
	--delay: -1.7333333333s ;
}
.link:nth-child(4) {
	--delay: -1.6s ;
}
.link:nth-child(5) {
	--delay: -1.4666666667s ;
}
.link:nth-child(6) {
	--delay: -1.3333333333s ;
}
.link:nth-child(7) {
	--delay: -1.2s ;
}
.link:nth-child(8) {
	--delay: -1.0666666667s ;
}
.link:nth-child(9) {
	--delay: -0.9333333333s ;
}
.link::after {
	content: "";
	position: absolute;
	inset: 0;
	background-color: #000;
	filter: blur(0.75em);
	transform: scale(1.1) translateZ(-1px);
	-webkit-animation: shadowOpacity 2s var(--delay, 0s) infinite ease-in-out;
	animation: shadowOpacity 2s var(--delay, 0s) infinite ease-in-out;
}
@-webkit-keyframes shadowOpacity {
	0%, 50%, 100% {
		opacity: 0.8;
		transform: scale(1.1) translateZ(-1px);
	}
	25% {
		opacity: 0.2;
		transform: scale(2) translateZ(-1px);
	}
}
@keyframes shadowOpacity {
	0%, 50%, 100% {
		opacity: 0.8;
		transform: scale(1.1) translateZ(-1px);
	}
	25% {
		opacity: 0.2;
		transform: scale(2) translateZ(-1px);
	}
}