JSFiddle - React, Tailwind, and code Playground
by kotsoft
HTML
<canvas id="c"></canvas>
JavaScript
b=document.body;c=document.getElementsByTagName("canvas")[0];a=c.getContext("2d");
with(Math)S=sin,C=cos,R=random,Q=sqrt,M=max,N=min;for(Z in a)a[Z[0]+(Z[6]||Z[2])]=a[Z];m={};p=t=0;q=s=o=250;w=.02;onmousemove=function(w){q=w.pageX;s=w.pageY};setInterval('W=c.width=999;H=c.height=499;t+=.005;if(w>R()){e=m[p++]=[];u=R()*W;v=R()*o;g=e.e=5+9*R();for(j=20;j--;)d=e[j]={},d.f=d.x=u+g*C(j/4),d.g=d.y=v+g*S(j/4);e.k="hsl("+o*R()+",99%,50%)";e.j=6*g*g}for(l=p;e=m[--l];)for(j=p;d=m[--j];)if(g=e.e+d.e,h=d.a-e.a,f=d.b-e.b,l!=j&&h>-g*2&&h<g*2&&f>-g*2&&f<g*2){h/=z=Q(h*h+f*f);f/=z;z*=e.e/g;for(k=20;d=e[--k];)n=M(0,(d.x-e.a)*h+(d.y-e.b)*f-z),d.x-=n*h,d.y-=n*f}for(l=p;e=m[--l];){a.fillStyle=e.k;a.ba();a.mv(e[0].x,e[0].y);for(j=20;j--;)d=e[j],f=e[(j+1)%20],g=e[(j+2)%20],h=g.x-f.x,g=g.y-f.y,k=d.x-f.x,n=d.y-f.y,f.h=h+k,f.i=g+n,f.c=g-n,f.d=k-h,a.ln(d.x,d.y);a.sr();a.fl();k=g=h=e.a=e.b=0;for(j=20;j--;)d=e[j],f=e[(j+1)%20],h+=d.c*f.d-f.c*d.d,g+=d.x*f.d+d.c*f.y-f.x*d.d-f.c*d.y,k+=d.x*f.y-f.x*d.y;k=(Q(g*g-4*h*(k-e.j))-g)/2/h;for(j=20;j--;)d=e[j],d.x+=d.h/4+k*d.c,d.y+=d.i/4+k*d.d,h=q-d.x,f=s-d.y,g=M(h*h+f*f,5),h=d.x-d.f+h/g,f=d.y-d.g+w+f/g,d.f=d.x,d.g=d.y,e.a+=d.x=N(M(0,d.x+h),W),e.b+=d.y+=f,f=399+99*S(t+d.x/o)-d.y,f<0&&(d.x-=f/2*C(t+d.x/o),d.y=399+99*S(t+d.x/o));e.a/=20;e.b/=20}',8);