(function(){ var cv=document.getElementById('dust'),cx=cv.getContext('2d'),W,H; function size(){W=cv.width=innerWidth;H=cv.height=innerHeight}size();addEventListener('resize',size); var P=[];var GOLD=[255,217,138],PERI=[159,176,255],WHITE=[240,243,255]; function spawn(x,y,opt){opt=opt||{};var c=[GOLD,PERI,WHITE][Math.random()*3|0]; P.push({x:x,y:y,vx:(Math.random()-.5)*(opt.sp||1.2),vy:(opt.vy!==undefined?opt.vy:(Math.random()-.5)*1.2),g:opt.g||0,life:1,decay:.012+Math.random()*.02,s:opt.s||(1+Math.random()*2.4),c:c,tw:Math.random()*6.28});} function burst(x,y,n){for(var i=0;i<n;i++){var a=Math.random()*6.28,sp=1+Math.random()*3.4;P.push({x:x,y:y,vx:Math.cos(a)*sp,vy:Math.sin(a)*sp-.6,g:.03,life:1,decay:.008+Math.random()*.012,s:1.2+Math.random()*2.6,c:[GOLD,PERI,WHITE][Math.random()*3|0],tw:Math.random()*6.28});}} var mx=-99,my=-99;addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;for(var i=0;i<3;i++)spawn(mx+(Math.random()-.5)*10,my+(Math.random()-.5)*10,{sp:.9});}); var lastY=scrollY;addEventListener('scroll',function(){var d=Math.min(Math.abs(scrollY-lastY),60);lastY=scrollY; var t=scrollY*.004;var x=W*.5+Math.sin(t)*W*.27;var y=H*.36+Math.cos(t*1.7)*40; for(var i=0;i<Math.min(2+d*.4,14);i++)spawn(x+(Math.random()-.5)*26,y+(Math.random()-.5)*26,{sp:1.6});},{passive:true}); var fin=document.getElementById('finale'),finOn=false; setInterval(function(){if(!finOn)return;var r=fin.querySelector('.bed').getBoundingClientRect(); for(var i=0;i<4;i++)spawn(r.left+Math.random()*r.width, r.top-90-Math.random()*120,{vy:1.4+Math.random(),sp:.4,s:1.4});},60); function loop(){cx.clearRect(0,0,W,H);cx.globalCompositeOperation='lighter'; for(var i=P.length-1;i>=0;i--){var p=P[i];p.x+=p.vx;p.y+=p.vy;p.vy+=p.g;p.life-=p.decay;p.tw+=.25; if(p.life<=0){P.splice(i,1);continue} var a=p.life*(.55+.45*Math.sin(p.tw)); var grd=cx.createRadialGradient(p.x,p.y,0,p.x,p.y,p.s*3.2); grd.addColorStop(0,'rgba('+p.c[0]+','+p.c[1]+','+p.c[2]+','+a+')'); grd.addColorStop(1,'rgba('+p.c[0]+','+p.c[1]+','+p.c[2]+',0)'); cx.fillStyle=grd;cx.beginPath();cx.arc(p.x,p.y,p.s*3.2,0,6.28);cx.fill();} requestAnimationFrame(loop);}loop(); var io=new IntersectionObserver(function(es){es.forEach(function(e){ if(e.isIntersecting){e.target.classList.add('awake'); if(e.target.hasAttribute('data-burst')){e.target.querySelectorAll('img').forEach(function(im){var r=im.getBoundingClientRect();burst(r.left+r.width/2,r.top+r.height/2,40);});} if(e.target.id==='finale')finOn=true;} else if(e.target.id==='finale')finOn=false; });},{threshold:.4}); document.querySelectorAll('.station,.balancers,.finale').forEach(function(s){io.observe(s)}); setInterval(function(){spawn(Math.random()*W,Math.random()*H*.5,{sp:.3,s:1});},300); })();