{Array.from({length: p.count}, (_, i) => {
const a = (i / p.count) * Math.PI * 2 + rnd(i, 2) * 0.8;
const r = p.radius * (0.35 + rnd(i, 3) * 0.65);
const t0 = 0.05 + rnd(i, 4) * 0.45;
const k = outE(p01(t, t0, t0 + 0.45));
const life = p01(t, t0, t0 + 1.4 + rnd(i, 6) * 0.9);
const tw = Math.sin(Math.min(1, life) * Math.PI) * (0.85 + 0.15 * Math.sin(t * 14 + i));
const end = 1 - inOut(p01(t, total - 0.5, total - 0.1));
const size = (50 + rnd(i, 5) * 80) * tw * end;
if (size < 1) return null;
const col = p.colors[i % p.colors.length];
return
;
})}
{/* a big one in the middle */}
{(() => {
const k = outE(p01(t, 0, 0.35));
const tw = Math.sin(p01(t, 0, 1.3) * Math.PI);
return
;
})()}
{/* dust */}
{Array.from({length: 18}, (_, i) => {
const a = rnd(i, 11) * Math.PI * 2;
const t0 = 0.1 + rnd(i, 12) * 0.6;
const k = outE(p01(t, t0, t0 + 1.6));
const r = lerp(40, p.radius * (0.6 + rnd(i, 13) * 0.6), k);
const o = Math.sin(k * Math.PI);
const s = 6 + rnd(i, 14) * 8;
if (o <= 0.01) return null;
return
;
})}