//- change these three values to change the shape of the star
//- n is the number of star points (must be at least 3)
//- rf is a factor between 0 and 1; the smaller it is, the pointier the star
//- hf is a height factor that controls the height of the two star pyramids making up the star
- let n = 5, rf = .5, hf = .3;

//- computed values
- let m = 2*n, ba = Math.PI/n, cos_ba = Math.cos(ba);
- let rri = rf*cos_ba, rh = hf;
- let sq = 1 + Math.pow(rri, 2) - 2*rri*cos_ba;
- let re = Math.sqrt(sq);
- let cos_ax = .5*(1 + sq - Math.pow(rri, 2))/re;
- let rad_ax = Math.acos(cos_ax);
- let rad_ay = Math.atan(Math.sin(rad_ax)/rh);
- let rsw = +Math.hypot(rh, Math.sin(rad_ax)).toFixed(2);
- let rsh = +cos_ax.toFixed(2);
- let deg_ax = +(rad_ax*180/Math.PI).toFixed(2);
- let deg_ay = +(rad_ay*180/Math.PI).toFixed(2);
- let rcm = +(.5*(.5*Math.PI - rad_ax)/Math.PI).toFixed(3);

style
	| .arm { --q: 0 }
	| .arm:nth-child(n + #{n + 1}) { --q: 1 }
	- for(let i = 0; i < n; i++)
		| .arm:nth-child(#{n}n + #{i + 1}) { --i: #{i} }
div(class='⭐' style=`--n: ${n}; --re: ${+re.toFixed(2)}; --rsw: ${rsw}; --rsh: ${rsh}; --ax: ${deg_ax}deg; --ay: ${deg_ay}deg; --rcm: ${rcm}`)
	- for(let i = 0; i < m; i++)
		.arm
View Compiled
$ro: 16em;
$w: 4em;
$t: 12s;

@property --houdini {
	syntax: '<integer>';
	initial-value: 1;
	inherits: true
}

body, div { display: grid }

body {
	--s: var(--houdini, 0);
	--not-s: calc(1 - var(--s));
	overflow: hidden;
	margin: 0;
	height: 100vh;
	perspective: 35em;
	background: #000014
}

div, ::before, ::after { grid-area: 1/ 1 }

div { transform-style: preserve-3d }

.⭐ { animation: rot-y $t linear infinite }

@keyframes rot-y { to { transform: rotateY(1turn) } }

@property --int {
	syntax: '<integer>';
	initial-value: 0;
	inherits: false
}

.arm {
	--sgn-q: calc(2*var(--q) - 1);
	--p: calc(var(--i)/var(--n));
	--not-up: Min(1, var(--i));
	--up: calc(1 - var(--not-up));
	--dif: calc(2*var(--i) - var(--n));
	--not-dn: Min(1, Max(var(--dif), calc(-1*var(--dif))));
	--dn: calc(1 - var(--not-dn));
	place-self: center;
	height: 0;
	transform: rotatex(calc(var(--p)*1turn)) translatey(-$ro);
	
	&::before, &::after {
		--k: 0;
		--sgn-k: calc(2*var(--k) - 1);
		--sum: calc(var(--p) + var(--sgn-k)*var(--rcm) + 1);
		--int: calc(var(--sum) - .5);
		--mod: calc(var(--sum) - var(--int));
		--term: calc(var(--s)*var(--mod) + var(--not-s)*var(--p));
		--abs: Max(calc(var(--term) - .5), calc(.5 - var(--term)));
		--inc: calc(2*var(--abs) - .5);
		--sgn-j: calc(var(--dn)*var(--sgn-k) - 
									var(--up)*var(--sgn-k) + 
									var(--not-dn)*var(--not-up)*clamp(-1, var(--dif), 1));
		--j: calc(.5*(var(--sgn-j) + 1));
		--sh: calc(.25*(3*var(--q) - var(--sgn-q)*(1 - var(--j))));
		width: calc(2*var(--rsw)*#{$ro}); height: calc(var(--rsh)*#{$ro});
		transform-origin: 50% 0;
		transform: 
			rotatey(calc(var(--k)*.5turn)) 
			rotatex(var(--ax)) 
			scalex(calc(var(--sgn-q)*var(--sgn-k))) 
			rotatey(var(--ay));
		background: 
			repeating-radial-gradient(circle at 100% 100%, 
					transparent 0 5px, hsla(47, 100%, calc(44%*(1 + var(--inc))), .3), transparent 7px), 
			repeating-radial-gradient(circle at 100% 100%, 
					transparent 0 11px, hsla(48, 100%, calc(45%*(1 + var(--inc))), .3), transparent 13px), 
			repeating-radial-gradient(circle at 100% 100%, 
					transparent 0 17px, hsla(49, 100%, calc(47%*(1 + var(--inc))), .3), transparent 19px), 
			repeating-radial-gradient(circle at 100% 100%, 
					transparent 0 41px, hsla(41, 100%, calc(43%*(1 + var(--inc))), .3), transparent 43px), 
			linear-gradient(90deg, 
					transparent 50%, 
					hsl(40, 100%, calc(50%*(1 + var(--inc)))) 0, 
					hsl(55, 100%, calc(52%*(1 + var(--inc)))));
		background-blend-mode: multiply;
		clip-path: polygon(50% 0, 50% calc(var(--re)*#{$ro}), 100% 100%);
		animation: shade .5*$t ease-in-out calc((var(--sh) + .125)*#{-$t}) infinite alternate;
		content: ''
	}
		
	&::after { --k: 1 }
}

@keyframes shade { to { filter: brightness(.2) } }
View Compiled
/* absolutely no JS */
View Compiled

External CSS

  1. https://codepen.io/thebabydino/pen/evPbxv.scss

External JavaScript

  1. https://codepen.io/thebabydino/pen/evPbxv.js