const canvas=document.createElement('canvas');
document.body.appendChild(canvas);
const ctx=canvas.getContext('2d');
function resize(){
canvas.width=innerWidth; canvas.height=innerHeight;
ctx.fillStyle='#05050a';
ctx.fillRect(0,0,canvas.width,canvas.height);
}
addEventListener('resize',resize); resize();
const N=14;
const particles=[];
for(let i=0;i<N;i++){
const lane=i%2;
particles.push({
lane,
y: lane===0 ? 0.32+Math.random()*0.08 : 0.6+Math.random()*0.08,
x: Math.random(),
speed: 0.0035+Math.random()*0.0035,
color: lane===0 ? '255,255,255' : '255,70,70',
});
}
function frame(){
ctx.fillStyle='rgba(5,5,10,0.09)';
ctx.fillRect(0,0,canvas.width,canvas.height);
particles.forEach(p=>{
const w=canvas.width,h=canvas.height;
p.x += p.lane===0 ? p.speed : -p.speed;
if(p.x>1.05) p.x=-0.05;
if(p.x<-0.05) p.x=1.05;
const px=p.x*w, py=p.y*h;
const grad=ctx.createRadialGradient(px,py,0,px,py,10);
grad.addColorStop(0,'rgba('+p.color+',0.9)');
grad.addColorStop(1,'rgba('+p.color+',0)');
ctx.fillStyle=grad;
ctx.beginPath(); ctx.arc(px,py,10,0,Math.PI*2); ctx.fill();
ctx.fillStyle='rgba('+p.color+',1)';
ctx.beginPath(); ctx.arc(px,py,2.2,0,Math.PI*2); ctx.fill();
});
requestAnimationFrame(frame);
}
frame();