vendor: 29,596 bytes, lines 1-1003
1var pJS=function(tag_id, params){ 2var canvas_el=document.querySelector('#'+tag_id+' > .particles-js-canvas-el'); 3this.pJS={ 4canvas: { 5el: canvas_el, 6w: canvas_el.offsetWidth, 7h: canvas_el.offsetHeight 8}, 9particles: { 10number: { 11value: 400, 12density: { 13enable: true, 14value_area: 800 15}}, 16color: { 17value: '#fff' 18}, 19shape: { 20type: 'circle', 21stroke: { 22width: 0, 23color: '#ff0000' 24}, 25polygon: { 26nb_sides: 5 27}, 28image: { 29src: '', 30width: 100, 31height: 100 32}}, 33opacity: { 34value: 1, 35random: false, 36anim: { 37enable: false, 38speed: 2, 39opacity_min: 0, 40sync: false 41}}, 42size: { 43value: 20, 44random: false, 45anim: { 46enable: false, 47speed: 20, 48size_min: 0, 49sync: false 50}}, 51line_linked: { 52enable: true, 53distance: 100, 54color: '#fff', 55opacity: 1, 56width: 1 57}, 58move: { 59enable: true, 60speed: 2, 61direction: 'none', 62random: false, 63straight: false, 64out_mode: 'out', 65bounce: false, 66attract: { 67enable: false, 68rotateX: 3000, 69rotateY: 3000 70}}, 71array: [] 72}, 73interactivity: { 74detect_on: 'canvas', 75events: { 76onhover: { 77enable: true, 78mode: 'grab' 79}, 80onclick: { 81enable: true, 82mode: 'push' 83}, 84resize: true 85}, 86modes: { 87grab:{ 88distance: 100, 89line_linked:{ 90opacity: 1 91}}, 92bubble:{ 93distance: 200, 94size: 80, 95duration: 0.4 96}, 97repulse:{ 98distance: 200, 99duration: 0.4 100}, 101push:{ 102particles_nb: 4 103}, 104remove:{ 105particles_nb: 2 106}}, 107mouse:{}}, 108retina_detect: false, 109fn: { 110interact: {}, 111modes: {}, 112vendors:{}}, 113tmp: {}}; 114var pJS=this.pJS; 115if(params){ 116Object.deepExtend(pJS, params); 117} 118pJS.tmp.obj={ 119size_value: pJS.particles.size.value, 120size_anim_speed: pJS.particles.size.anim.speed, 121move_speed: pJS.particles.move.speed, 122line_linked_distance: pJS.particles.line_linked.distance, 123line_linked_width: pJS.particles.line_linked.width, 124mode_grab_distance: pJS.interactivity.modes.grab.distance, 125mode_bubble_distance: pJS.interactivity.modes.bubble.distance, 126mode_bubble_size: pJS.interactivity.modes.bubble.size, 127mode_repulse_distance: pJS.interactivity.modes.repulse.distance 128}; 129pJS.fn.retinaInit=function(){ 130if(pJS.retina_detect&&window.devicePixelRatio > 1){ 131pJS.canvas.pxratio=window.devicePixelRatio; 132pJS.tmp.retina=true; 133}else{ 134pJS.canvas.pxratio=1; 135pJS.tmp.retina=false; 136} 137pJS.canvas.w=pJS.canvas.el.offsetWidth * pJS.canvas.pxratio; 138pJS.canvas.h=pJS.canvas.el.offsetHeight * pJS.canvas.pxratio; 139pJS.particles.size.value=pJS.tmp.obj.size_value * pJS.canvas.pxratio; 140pJS.particles.size.anim.speed=pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio; 141pJS.particles.move.speed=pJS.tmp.obj.move_speed * pJS.canvas.pxratio; 142pJS.particles.line_linked.distance=pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio; 143pJS.interactivity.modes.grab.distance=pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio; 144pJS.interactivity.modes.bubble.distance=pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio; 145pJS.particles.line_linked.width=pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio; 146pJS.interactivity.modes.bubble.size=pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio; 147pJS.interactivity.modes.repulse.distance=pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio; 148}; 149pJS.fn.canvasInit=function(){ 150pJS.canvas.ctx=pJS.canvas.el.getContext('2d'); 151}; 152pJS.fn.canvasSize=function(){ 153pJS.canvas.el.width=pJS.canvas.w; 154pJS.canvas.el.height=pJS.canvas.h; 155if(pJS&&pJS.interactivity.events.resize){ 156window.addEventListener('resize', function(){ 157pJS.canvas.w=pJS.canvas.el.offsetWidth; 158pJS.canvas.h=pJS.canvas.el.offsetHeight; 159if(pJS.tmp.retina){ 160pJS.canvas.w *=pJS.canvas.pxratio; 161pJS.canvas.h *=pJS.canvas.pxratio; 162} 163pJS.canvas.el.width=pJS.canvas.w; 164pJS.canvas.el.height=pJS.canvas.h; 165if(!pJS.particles.move.enable){ 166pJS.fn.particlesEmpty(); 167pJS.fn.particlesCreate(); 168pJS.fn.particlesDraw(); 169pJS.fn.vendors.densityAutoParticles(); 170} 171pJS.fn.vendors.densityAutoParticles(); 172}); 173}}; 174pJS.fn.canvasPaint=function(){ 175pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h); 176}; 177pJS.fn.canvasClear=function(){ 178pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); 179}; 180pJS.fn.particle=function(color, opacity, position){ 181this.radius=(pJS.particles.size.random ? Math.random():1) * pJS.particles.size.value; 182if(pJS.particles.size.anim.enable){ 183this.size_status=false; 184this.vs=pJS.particles.size.anim.speed / 100; 185if(!pJS.particles.size.anim.sync){ 186this.vs=this.vs * Math.random(); 187}} 188this.x=position ? position.x:Math.random() * pJS.canvas.w; 189this.y=position ? position.y:Math.random() * pJS.canvas.h; 190if(this.x > pJS.canvas.w - this.radius*2) this.x=this.x - this.radius; 191else if(this.x < this.radius*2) this.x=this.x + this.radius; 192if(this.y > pJS.canvas.h - this.radius*2) this.y=this.y - this.radius; 193else if(this.y < this.radius*2) this.y=this.y + this.radius; 194if(pJS.particles.move.bounce){ 195pJS.fn.vendors.checkOverlap(this, position); 196} 197this.color={}; 198if(typeof(color.value)=='object'){ 199if(color.value instanceof Array){ 200var color_selected=color.value[Math.floor(Math.random() * pJS.particles.color.value.length)]; 201this.color.rgb=hexToRgb(color_selected); 202}else{ 203if(color.value.r!=undefined&&color.value.g!=undefined&&color.value.b!=undefined){ 204this.color.rgb={ 205r: color.value.r, 206g: color.value.g, 207b: color.value.b 208}} 209if(color.value.h!=undefined&&color.value.s!=undefined&&color.value.l!=undefined){ 210this.color.hsl={ 211h: color.value.h, 212s: color.value.s, 213l: color.value.l 214}} 215}} 216else if(color.value=='random'){ 217this.color.rgb={ 218r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), 219g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), 220b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0) 221}} 222else if(typeof(color.value)=='string'){ 223this.color=color; 224this.color.rgb=hexToRgb(this.color.value); 225} 226this.opacity=(pJS.particles.opacity.random ? Math.random():1) * pJS.particles.opacity.value; 227if(pJS.particles.opacity.anim.enable){ 228this.opacity_status=false; 229this.vo=pJS.particles.opacity.anim.speed / 100; 230if(!pJS.particles.opacity.anim.sync){ 231this.vo=this.vo * Math.random(); 232}} 233var velbase={} 234switch(pJS.particles.move.direction){ 235case 'top': 236velbase={ x:0, y:-1 }; 237break; 238case 'top-right': 239velbase={ x:0.5, y:-0.5 }; 240break; 241case 'right': 242velbase={ x:1, y:-0 }; 243break; 244case 'bottom-right': 245velbase={ x:0.5, y:0.5 }; 246break; 247case 'bottom': 248velbase={ x:0, y:1 }; 249break; 250case 'bottom-left': 251velbase={ x:-0.5, y:1 }; 252break; 253case 'left': 254velbase={ x:-1, y:0 }; 255break; 256case 'top-left': 257velbase={ x:-0.5, y:-0.5 }; 258break; 259default: 260velbase={ x:0, y:0 }; 261break; 262} 263if(pJS.particles.move.straight){ 264this.vx=velbase.x; 265this.vy=velbase.y; 266if(pJS.particles.move.random){ 267this.vx=this.vx * (Math.random()); 268this.vy=this.vy * (Math.random()); 269}}else{ 270this.vx=velbase.x + Math.random()-0.5; 271this.vy=velbase.y + Math.random()-0.5; 272} 273this.vx_i=this.vx; 274this.vy_i=this.vy; 275var shape_type=pJS.particles.shape.type; 276if(typeof(shape_type)=='object'){ 277if(shape_type instanceof Array){ 278var shape_selected=shape_type[Math.floor(Math.random() * shape_type.length)]; 279this.shape=shape_selected; 280}}else{ 281this.shape=shape_type; 282} 283if(this.shape=='image'){ 284var sh=pJS.particles.shape; 285this.img={ 286src: sh.image.src, 287ratio: sh.image.width / sh.image.height 288} 289if(!this.img.ratio) this.img.ratio=1; 290if(pJS.tmp.img_type=='svg'&&pJS.tmp.source_svg!=undefined){ 291pJS.fn.vendors.createSvgImg(this); 292if(pJS.tmp.pushing){ 293this.img.loaded=false; 294}} 295}}; 296pJS.fn.particle.prototype.draw=function(){ 297var p=this; 298if(p.radius_bubble!=undefined){ 299var radius=p.radius_bubble; 300}else{ 301var radius=p.radius; 302} 303if(p.opacity_bubble!=undefined){ 304var opacity=p.opacity_bubble; 305}else{ 306var opacity=p.opacity; 307} 308if(p.color.rgb){ 309var color_value='rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+opacity+')'; 310}else{ 311var color_value='hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+opacity+')'; 312} 313pJS.canvas.ctx.fillStyle=color_value; 314pJS.canvas.ctx.beginPath(); 315switch(p.shape){ 316case 'circle': 317pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false); 318break; 319case 'edge': 320pJS.canvas.ctx.rect(p.x-radius, p.y-radius, radius*2, radius*2); 321break; 322case 'triangle': 323pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x-radius, p.y+radius / 1.66, radius*2, 3, 2); 324break; 325case 'polygon': 326pJS.fn.vendors.drawShape(pJS.canvas.ctx, 327p.x - radius / (pJS.particles.shape.polygon.nb_sides/3.5), 328p.y - radius / (2.66/3.5), 329radius*2.66 / (pJS.particles.shape.polygon.nb_sides/3), 330pJS.particles.shape.polygon.nb_sides, 3311 332); 333break; 334case 'star': 335pJS.fn.vendors.drawShape(pJS.canvas.ctx, 336p.x - radius*2 / (pJS.particles.shape.polygon.nb_sides/4), 337p.y - radius / (2*2.66/3.5), 338radius*2*2.66 / (pJS.particles.shape.polygon.nb_sides/3), 339pJS.particles.shape.polygon.nb_sides, 3402 341); 342break; 343case 'image': 344function draw(){ 345pJS.canvas.ctx.drawImage(img_obj, 346p.x-radius, 347p.y-radius, 348radius*2, 349radius*2 / p.img.ratio 350); 351} 352if(pJS.tmp.img_type=='svg'){ 353var img_obj=p.img.obj; 354}else{ 355var img_obj=pJS.tmp.img_obj; 356} 357if(img_obj){ 358draw(); 359} 360break; 361} 362pJS.canvas.ctx.closePath(); 363if(pJS.particles.shape.stroke.width > 0){ 364pJS.canvas.ctx.strokeStyle=pJS.particles.shape.stroke.color; 365pJS.canvas.ctx.lineWidth=pJS.particles.shape.stroke.width; 366pJS.canvas.ctx.stroke(); 367} 368pJS.canvas.ctx.fill(); 369}; 370pJS.fn.particlesCreate=function(){ 371for(var i=0; i < pJS.particles.number.value; i++){ 372pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value)); 373}}; 374pJS.fn.particlesUpdate=function(){ 375for(var i=0; i < pJS.particles.array.length; i++){ 376var p=pJS.particles.array[i]; 377if(pJS.particles.move.enable){ 378var ms=pJS.particles.move.speed/2; 379p.x +=p.vx * ms; 380p.y +=p.vy * ms; 381} 382if(pJS.particles.opacity.anim.enable){ 383if(p.opacity_status==true){ 384if(p.opacity >=pJS.particles.opacity.value) p.opacity_status=false; 385p.opacity +=p.vo; 386}else{ 387if(p.opacity <=pJS.particles.opacity.anim.opacity_min) p.opacity_status=true; 388p.opacity -=p.vo; 389} 390if(p.opacity < 0) p.opacity=0; 391} 392if(pJS.particles.size.anim.enable){ 393if(p.size_status==true){ 394if(p.radius >=pJS.particles.size.value) p.size_status=false; 395p.radius +=p.vs; 396}else{ 397if(p.radius <=pJS.particles.size.anim.size_min) p.size_status=true; 398p.radius -=p.vs; 399} 400if(p.radius < 0) p.radius=0; 401} 402if(pJS.particles.move.out_mode=='bounce'){ 403var new_pos={ 404x_left: p.radius, 405x_right: pJS.canvas.w, 406y_top: p.radius, 407y_bottom: pJS.canvas.h 408}}else{ 409var new_pos={ 410x_left: -p.radius, 411x_right: pJS.canvas.w + p.radius, 412y_top: -p.radius, 413y_bottom: pJS.canvas.h + p.radius 414}} 415if(p.x - p.radius > pJS.canvas.w){ 416p.x=new_pos.x_left; 417p.y=Math.random() * pJS.canvas.h; 418} 419else if(p.x + p.radius < 0){ 420p.x=new_pos.x_right; 421p.y=Math.random() * pJS.canvas.h; 422} 423if(p.y - p.radius > pJS.canvas.h){ 424p.y=new_pos.y_top; 425p.x=Math.random() * pJS.canvas.w; 426} 427else if(p.y + p.radius < 0){ 428p.y=new_pos.y_bottom; 429p.x=Math.random() * pJS.canvas.w; 430} 431switch(pJS.particles.move.out_mode){ 432case 'bounce': 433if(p.x + p.radius > pJS.canvas.w) p.vx=-p.vx; 434else if(p.x - p.radius < 0) p.vx=-p.vx; 435if(p.y + p.radius > pJS.canvas.h) p.vy=-p.vy; 436else if(p.y - p.radius < 0) p.vy=-p.vy; 437break; 438} 439if(isInArray('grab', pJS.interactivity.events.onhover.mode)){ 440pJS.fn.modes.grabParticle(p); 441} 442if(isInArray('bubble', pJS.interactivity.events.onhover.mode)||isInArray('bubble', pJS.interactivity.events.onclick.mode)){ 443pJS.fn.modes.bubbleParticle(p); 444} 445if(isInArray('repulse', pJS.interactivity.events.onhover.mode)||isInArray('repulse', pJS.interactivity.events.onclick.mode)){ 446pJS.fn.modes.repulseParticle(p); 447} 448if(pJS.particles.line_linked.enable||pJS.particles.move.attract.enable){ 449for(var j=i + 1; j < pJS.particles.array.length; j++){ 450var p2=pJS.particles.array[j]; 451if(pJS.particles.line_linked.enable){ 452pJS.fn.interact.linkParticles(p,p2); 453} 454if(pJS.particles.move.attract.enable){ 455pJS.fn.interact.attractParticles(p,p2); 456} 457if(pJS.particles.move.bounce){ 458pJS.fn.interact.bounceParticles(p,p2); 459}} 460}} 461}; 462pJS.fn.particlesDraw=function(){ 463pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); 464pJS.fn.particlesUpdate(); 465for(var i=0; i < pJS.particles.array.length; i++){ 466var p=pJS.particles.array[i]; 467p.draw(); 468}}; 469pJS.fn.particlesEmpty=function(){ 470pJS.particles.array=[]; 471}; 472pJS.fn.particlesRefresh=function(){ 473cancelRequestAnimFrame(pJS.fn.checkAnimFrame); 474cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 475pJS.tmp.source_svg=undefined; 476pJS.tmp.img_obj=undefined; 477pJS.tmp.count_svg=0; 478pJS.fn.particlesEmpty(); 479pJS.fn.canvasClear(); 480pJS.fn.vendors.start(); 481}; 482pJS.fn.interact.linkParticles=function(p1, p2){ 483var dx=p1.x - p2.x, 484dy=p1.y - p2.y, 485dist=Math.sqrt(dx*dx + dy*dy); 486if(dist <=pJS.particles.line_linked.distance){ 487var opacity_line=pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance; 488if(opacity_line > 0){ 489var color_line=pJS.particles.line_linked.color_rgb_line; 490pJS.canvas.ctx.strokeStyle='rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; 491pJS.canvas.ctx.lineWidth=pJS.particles.line_linked.width; 492pJS.canvas.ctx.beginPath(); 493pJS.canvas.ctx.moveTo(p1.x, p1.y); 494pJS.canvas.ctx.lineTo(p2.x, p2.y); 495pJS.canvas.ctx.stroke(); 496pJS.canvas.ctx.closePath(); 497}} 498}; 499pJS.fn.interact.attractParticles=function(p1, p2){ 500var dx=p1.x - p2.x, 501dy=p1.y - p2.y, 502dist=Math.sqrt(dx*dx + dy*dy); 503if(dist <=pJS.particles.line_linked.distance){ 504var ax=dx/(pJS.particles.move.attract.rotateX*1000), 505ay=dy/(pJS.particles.move.attract.rotateY*1000); 506p1.vx -=ax; 507p1.vy -=ay; 508p2.vx +=ax; 509p2.vy +=ay; 510}} 511pJS.fn.interact.bounceParticles=function(p1, p2){ 512var dx=p1.x - p2.x, 513dy=p1.y - p2.y, 514dist=Math.sqrt(dx*dx + dy*dy), 515dist_p=p1.radius+p2.radius; 516if(dist <=dist_p){ 517p1.vx=-p1.vx; 518p1.vy=-p1.vy; 519p2.vx=-p2.vx; 520p2.vy=-p2.vy; 521}} 522pJS.fn.modes.pushParticles=function(nb, pos){ 523pJS.tmp.pushing=true; 524for(var i=0; i < nb; i++){ 525pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, 526pJS.particles.opacity.value, 527{ 528'x': pos ? pos.pos_x:Math.random() * pJS.canvas.w, 529'y': pos ? pos.pos_y:Math.random() * pJS.canvas.h 530} 531) 532) 533if(i==nb-1){ 534if(!pJS.particles.move.enable){ 535pJS.fn.particlesDraw(); 536} 537pJS.tmp.pushing=false; 538}} 539}; 540pJS.fn.modes.removeParticles=function(nb){ 541pJS.particles.array.splice(0, nb); 542if(!pJS.particles.move.enable){ 543pJS.fn.particlesDraw(); 544}}; 545pJS.fn.modes.bubbleParticle=function(p){ 546if(pJS.interactivity.events.onhover.enable&&isInArray('bubble', pJS.interactivity.events.onhover.mode)){ 547var dx_mouse=p.x - pJS.interactivity.mouse.pos_x, 548dy_mouse=p.y - pJS.interactivity.mouse.pos_y, 549dist_mouse=Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), 550ratio=1 - dist_mouse / pJS.interactivity.modes.bubble.distance; 551function init(){ 552p.opacity_bubble=p.opacity; 553p.radius_bubble=p.radius; 554} 555if(dist_mouse <=pJS.interactivity.modes.bubble.distance){ 556if(ratio >=0&&pJS.interactivity.status=='mousemove'){ 557if(pJS.interactivity.modes.bubble.size!=pJS.particles.size.value){ 558if(pJS.interactivity.modes.bubble.size > pJS.particles.size.value){ 559var size=p.radius + (pJS.interactivity.modes.bubble.size*ratio); 560if(size >=0){ 561p.radius_bubble=size; 562}}else{ 563var dif=p.radius - pJS.interactivity.modes.bubble.size, 564size=p.radius - (dif*ratio); 565if(size > 0){ 566p.radius_bubble=size; 567}else{ 568p.radius_bubble=0; 569}} 570} 571if(pJS.interactivity.modes.bubble.opacity!=pJS.particles.opacity.value){ 572if(pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value){ 573var opacity=pJS.interactivity.modes.bubble.opacity*ratio; 574if(opacity > p.opacity&&opacity <=pJS.interactivity.modes.bubble.opacity){ 575p.opacity_bubble=opacity; 576}}else{ 577var opacity=p.opacity - (pJS.particles.opacity.value-pJS.interactivity.modes.bubble.opacity)*ratio; 578if(opacity < p.opacity&&opacity >=pJS.interactivity.modes.bubble.opacity){ 579p.opacity_bubble=opacity; 580}} 581}} 582}else{ 583init(); 584} 585if(pJS.interactivity.status=='mouseleave'){ 586init(); 587}} 588else if(pJS.interactivity.events.onclick.enable&&isInArray('bubble', pJS.interactivity.events.onclick.mode)){ 589if(pJS.tmp.bubble_clicking){ 590var dx_mouse=p.x - pJS.interactivity.mouse.click_pos_x, 591dy_mouse=p.y - pJS.interactivity.mouse.click_pos_y, 592dist_mouse=Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), 593time_spent=(new Date().getTime() - pJS.interactivity.mouse.click_time)/1000; 594if(time_spent > pJS.interactivity.modes.bubble.duration){ 595pJS.tmp.bubble_duration_end=true; 596} 597if(time_spent > pJS.interactivity.modes.bubble.duration*2){ 598pJS.tmp.bubble_clicking=false; 599pJS.tmp.bubble_duration_end=false; 600}} 601function process(bubble_param, particles_param, p_obj_bubble, p_obj, id){ 602if(bubble_param!=particles_param){ 603if(!pJS.tmp.bubble_duration_end){ 604if(dist_mouse <=pJS.interactivity.modes.bubble.distance){ 605if(p_obj_bubble!=undefined) var obj=p_obj_bubble; 606else var obj=p_obj; 607if(obj!=bubble_param){ 608var value=p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration); 609if(id=='size') p.radius_bubble=value; 610if(id=='opacity') p.opacity_bubble=value; 611}}else{ 612if(id=='size') p.radius_bubble=undefined; 613if(id=='opacity') p.opacity_bubble=undefined; 614}}else{ 615if(p_obj_bubble!=undefined){ 616var value_tmp=p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration), 617dif=bubble_param - value_tmp; 618value=bubble_param + dif; 619if(id=='size') p.radius_bubble=value; 620if(id=='opacity') p.opacity_bubble=value; 621}} 622}} 623if(pJS.tmp.bubble_clicking){ 624process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size'); 625process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity'); 626}} 627}; 628pJS.fn.modes.repulseParticle=function(p){ 629if(pJS.interactivity.events.onhover.enable&&isInArray('repulse', pJS.interactivity.events.onhover.mode)&&pJS.interactivity.status=='mousemove'){ 630var dx_mouse=p.x - pJS.interactivity.mouse.pos_x, 631dy_mouse=p.y - pJS.interactivity.mouse.pos_y, 632dist_mouse=Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); 633var normVec={x: dx_mouse/dist_mouse, y: dy_mouse/dist_mouse}, 634repulseRadius=pJS.interactivity.modes.repulse.distance, 635velocity=100, 636repulseFactor=clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50); 637var pos={ 638x: p.x + normVec.x * repulseFactor, 639y: p.y + normVec.y * repulseFactor 640} 641if(pJS.particles.move.out_mode=='bounce'){ 642if(pos.x - p.radius > 0&&pos.x + p.radius < pJS.canvas.w) p.x=pos.x; 643if(pos.y - p.radius > 0&&pos.y + p.radius < pJS.canvas.h) p.y=pos.y; 644}else{ 645p.x=pos.x; 646p.y=pos.y; 647}} 648else if(pJS.interactivity.events.onclick.enable&&isInArray('repulse', pJS.interactivity.events.onclick.mode)){ 649if(!pJS.tmp.repulse_finish){ 650pJS.tmp.repulse_count++; 651if(pJS.tmp.repulse_count==pJS.particles.array.length){ 652pJS.tmp.repulse_finish=true; 653}} 654if(pJS.tmp.repulse_clicking){ 655var repulseRadius=Math.pow(pJS.interactivity.modes.repulse.distance/6, 3); 656var dx=pJS.interactivity.mouse.click_pos_x - p.x, 657dy=pJS.interactivity.mouse.click_pos_y - p.y, 658d=dx*dx + dy*dy; 659var force=-repulseRadius / d * 1; 660function process(){ 661var f=Math.atan2(dy,dx); 662p.vx=force * Math.cos(f); 663p.vy=force * Math.sin(f); 664if(pJS.particles.move.out_mode=='bounce'){ 665var pos={ 666x: p.x + p.vx, 667y: p.y + p.vy 668} 669if(pos.x + p.radius > pJS.canvas.w) p.vx=-p.vx; 670else if(pos.x - p.radius < 0) p.vx=-p.vx; 671if(pos.y + p.radius > pJS.canvas.h) p.vy=-p.vy; 672else if(pos.y - p.radius < 0) p.vy=-p.vy; 673}} 674if(d <=repulseRadius){ 675process(); 676}}else{ 677if(pJS.tmp.repulse_clicking==false){ 678p.vx=p.vx_i; 679p.vy=p.vy_i; 680}} 681}} 682pJS.fn.modes.grabParticle=function(p){ 683if(pJS.interactivity.events.onhover.enable&&pJS.interactivity.status=='mousemove'){ 684var dx_mouse=p.x - pJS.interactivity.mouse.pos_x, 685dy_mouse=p.y - pJS.interactivity.mouse.pos_y, 686dist_mouse=Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); 687if(dist_mouse <=pJS.interactivity.modes.grab.distance){ 688var opacity_line=pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1/pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance; 689if(opacity_line > 0){ 690var color_line=pJS.particles.line_linked.color_rgb_line; 691pJS.canvas.ctx.strokeStyle='rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; 692pJS.canvas.ctx.lineWidth=pJS.particles.line_linked.width; 693pJS.canvas.ctx.beginPath(); 694pJS.canvas.ctx.moveTo(p.x, p.y); 695pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y); 696pJS.canvas.ctx.stroke(); 697pJS.canvas.ctx.closePath(); 698}} 699}}; 700pJS.fn.vendors.eventsListeners=function(){ 701if(pJS.interactivity.detect_on=='window'){ 702pJS.interactivity.el=window; 703}else{ 704pJS.interactivity.el=pJS.canvas.el; 705} 706if(pJS.interactivity.events.onhover.enable||pJS.interactivity.events.onclick.enable){ 707pJS.interactivity.el.addEventListener('mousemove', function(e){ 708if(pJS.interactivity.el==window){ 709var pos_x=e.clientX, 710pos_y=e.clientY; 711}else{ 712var pos_x=e.offsetX||e.clientX, 713pos_y=e.offsetY||e.clientY; 714} 715pJS.interactivity.mouse.pos_x=pos_x; 716pJS.interactivity.mouse.pos_y=pos_y; 717if(pJS.tmp.retina){ 718pJS.interactivity.mouse.pos_x *=pJS.canvas.pxratio; 719pJS.interactivity.mouse.pos_y *=pJS.canvas.pxratio; 720} 721pJS.interactivity.status='mousemove'; 722}); 723pJS.interactivity.el.addEventListener('mouseleave', function(e){ 724pJS.interactivity.mouse.pos_x=null; 725pJS.interactivity.mouse.pos_y=null; 726pJS.interactivity.status='mouseleave'; 727}); 728} 729if(pJS.interactivity.events.onclick.enable){ 730pJS.interactivity.el.addEventListener('click', function(){ 731pJS.interactivity.mouse.click_pos_x=pJS.interactivity.mouse.pos_x; 732pJS.interactivity.mouse.click_pos_y=pJS.interactivity.mouse.pos_y; 733pJS.interactivity.mouse.click_time=new Date().getTime(); 734if(pJS.interactivity.events.onclick.enable){ 735switch(pJS.interactivity.events.onclick.mode){ 736case 'push': 737if(pJS.particles.move.enable){ 738pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); 739}else{ 740if(pJS.interactivity.modes.push.particles_nb==1){ 741pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); 742} 743else if(pJS.interactivity.modes.push.particles_nb > 1){ 744pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb); 745}} 746break; 747case 'remove': 748pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb); 749break; 750case 'bubble': 751pJS.tmp.bubble_clicking=true; 752break; 753case 'repulse': 754pJS.tmp.repulse_clicking=true; 755pJS.tmp.repulse_count=0; 756pJS.tmp.repulse_finish=false; 757setTimeout(function(){ 758pJS.tmp.repulse_clicking=false; 759}, pJS.interactivity.modes.repulse.duration*1000) 760break; 761}} 762}); 763}}; 764pJS.fn.vendors.densityAutoParticles=function(){ 765if(pJS.particles.number.density.enable){ 766var area=pJS.canvas.el.width * pJS.canvas.el.height / 1000; 767if(pJS.tmp.retina){ 768area=area/(pJS.canvas.pxratio*2); 769} 770var nb_particles=area * pJS.particles.number.value / pJS.particles.number.density.value_area; 771var missing_particles=pJS.particles.array.length - nb_particles; 772if(missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles)); 773else pJS.fn.modes.removeParticles(missing_particles); 774}}; 775pJS.fn.vendors.checkOverlap=function(p1, position){ 776for(var i=0; i < pJS.particles.array.length; i++){ 777var p2=pJS.particles.array[i]; 778var dx=p1.x - p2.x, 779dy=p1.y - p2.y, 780dist=Math.sqrt(dx*dx + dy*dy); 781if(dist <=p1.radius + p2.radius){ 782p1.x=position ? position.x:Math.random() * pJS.canvas.w; 783p1.y=position ? position.y:Math.random() * pJS.canvas.h; 784pJS.fn.vendors.checkOverlap(p1); 785}} 786}; 787pJS.fn.vendors.createSvgImg=function(p){ 788var svgXml=pJS.tmp.source_svg, 789rgbHex=/#([0-9A-F]{3,6})/gi, 790coloredSvgXml=svgXml.replace(rgbHex, function (m, r, g, b){ 791if(p.color.rgb){ 792var color_value='rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+p.opacity+')'; 793}else{ 794var color_value='hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+p.opacity+')'; 795} 796return color_value; 797}); 798var svg=new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}), 799DOMURL=window.URL||window.webkitURL||window, 800url=DOMURL.createObjectURL(svg); 801var img=new Image(); 802img.addEventListener('load', function(){ 803p.img.obj=img; 804p.img.loaded=true; 805DOMURL.revokeObjectURL(url); 806pJS.tmp.count_svg++; 807}); 808img.src=url; 809}; 810pJS.fn.vendors.destroypJS=function(){ 811cancelAnimationFrame(pJS.fn.drawAnimFrame); 812canvas_el.remove(); 813pJSDom=null; 814}; 815pJS.fn.vendors.drawShape=function(c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator){ 816var sideCount=sideCountNumerator * sideCountDenominator; 817var decimalSides=sideCountNumerator / sideCountDenominator; 818var interiorAngleDegrees=(180 * (decimalSides - 2)) / decimalSides; 819var interiorAngle=Math.PI - Math.PI * interiorAngleDegrees / 180; 820c.save(); 821c.beginPath(); 822c.translate(startX, startY); 823c.moveTo(0,0); 824for (var i=0; i < sideCount; i++){ 825c.lineTo(sideLength,0); 826c.translate(sideLength,0); 827c.rotate(interiorAngle); 828} 829c.fill(); 830c.restore(); 831}; 832pJS.fn.vendors.exportImg=function(){ 833window.open(pJS.canvas.el.toDataURL('image/png'), '_blank'); 834}; 835pJS.fn.vendors.loadImg=function(type){ 836pJS.tmp.img_error=undefined; 837if(pJS.particles.shape.image.src!=''){ 838if(type=='svg'){ 839var xhr=new XMLHttpRequest(); 840xhr.open('GET', pJS.particles.shape.image.src); 841xhr.onreadystatechange=function (data){ 842if(xhr.readyState==4){ 843if(xhr.status==200){ 844pJS.tmp.source_svg=data.currentTarget.response; 845pJS.fn.vendors.checkBeforeDraw(); 846}else{ 847console.log('Error pJS - Image not found'); 848pJS.tmp.img_error=true; 849}} 850} 851xhr.send(); 852}else{ 853var img=new Image(); 854img.addEventListener('load', function(){ 855pJS.tmp.img_obj=img; 856pJS.fn.vendors.checkBeforeDraw(); 857}); 858img.src=pJS.particles.shape.image.src; 859}}else{ 860console.log('Error pJS - No image.src'); 861pJS.tmp.img_error=true; 862}}; 863pJS.fn.vendors.draw=function(){ 864if(pJS.particles.shape.type=='image'){ 865if(pJS.tmp.img_type=='svg'){ 866if(pJS.tmp.count_svg >=pJS.particles.number.value){ 867pJS.fn.particlesDraw(); 868if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 869else pJS.fn.drawAnimFrame=requestAnimFrame(pJS.fn.vendors.draw); 870}else{ 871if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame=requestAnimFrame(pJS.fn.vendors.draw); 872}}else{ 873if(pJS.tmp.img_obj!=undefined){ 874pJS.fn.particlesDraw(); 875if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 876else pJS.fn.drawAnimFrame=requestAnimFrame(pJS.fn.vendors.draw); 877}else{ 878if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame=requestAnimFrame(pJS.fn.vendors.draw); 879}} 880}else{ 881pJS.fn.particlesDraw(); 882if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); 883else pJS.fn.drawAnimFrame=requestAnimFrame(pJS.fn.vendors.draw); 884}}; 885pJS.fn.vendors.checkBeforeDraw=function(){ 886if(pJS.particles.shape.type=='image'){ 887if(pJS.tmp.img_type=='svg'&&pJS.tmp.source_svg==undefined){ 888pJS.tmp.checkAnimFrame=requestAnimFrame(check); 889}else{ 890cancelRequestAnimFrame(pJS.tmp.checkAnimFrame); 891if(!pJS.tmp.img_error){ 892pJS.fn.vendors.init(); 893pJS.fn.vendors.draw(); 894}} 895}else{ 896pJS.fn.vendors.init(); 897pJS.fn.vendors.draw(); 898}}; 899pJS.fn.vendors.init=function(){ 900pJS.fn.retinaInit(); 901pJS.fn.canvasInit(); 902pJS.fn.canvasSize(); 903pJS.fn.canvasPaint(); 904pJS.fn.particlesCreate(); 905pJS.fn.vendors.densityAutoParticles(); 906pJS.particles.line_linked.color_rgb_line=hexToRgb(pJS.particles.line_linked.color); 907}; 908pJS.fn.vendors.start=function(){ 909if(isInArray('image', pJS.particles.shape.type)){ 910pJS.tmp.img_type=pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3); 911pJS.fn.vendors.loadImg(pJS.tmp.img_type); 912}else{ 913pJS.fn.vendors.checkBeforeDraw(); 914}}; 915pJS.fn.vendors.eventsListeners(); 916pJS.fn.vendors.start(); 917}; 918Object.deepExtend=function(destination, source){ 919for (var property in source){ 920if(source[property]&&source[property].constructor && 921source[property].constructor===Object){ 922destination[property]=destination[property]||{}; 923arguments.callee(destination[property], source[property]); 924}else{ 925destination[property]=source[property]; 926}} 927return destination; 928}; 929window.requestAnimFrame=(function(){ 930return window.requestAnimationFrame || 931window.webkitRequestAnimationFrame || 932window.mozRequestAnimationFrame || 933window.oRequestAnimationFrame || 934window.msRequestAnimationFrame || 935function(callback){ 936window.setTimeout(callback, 1000 / 60); 937};})(); 938window.cancelRequestAnimFrame=(function(){ 939return window.cancelAnimationFrame || 940window.webkitCancelRequestAnimationFrame || 941window.mozCancelRequestAnimationFrame || 942window.oCancelRequestAnimationFrame || 943window.msCancelRequestAnimationFrame || 944clearTimeout 945})(); 946function hexToRgb(hex){ 947var shorthandRegex=/^#?([a-f\d])([a-f\d])([a-f\d])$/i; 948hex=hex.replace(shorthandRegex, function(m, r, g, b){ 949return r + r + g + g + b + b; 950}); 951var result=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); 952return result ? { 953r: parseInt(result[1], 16), 954g: parseInt(result[2], 16), 955b: parseInt(result[3], 16) 956}:null; 957}; 958function clamp(number, min, max){ 959return Math.min(Math.max(number, min), max); 960}; 961function isInArray(value, array){ 962return array.indexOf(value) > -1; 963} 964window.pJSDom=[]; 965window.particlesJS=function(tag_id, params){ 966if(typeof(tag_id)!='string'){ 967params=tag_id; 968tag_id='particles-js'; 969} 970if(!tag_id){ 971tag_id='particles-js'; 972} 973var pJS_tag=document.getElementById(tag_id), 974pJS_canvas_class='particles-js-canvas-el', 975exist_canvas=pJS_tag.getElementsByClassName(pJS_canvas_class); 976if(exist_canvas.length){ 977while(exist_canvas.length > 0){ 978pJS_tag.removeChild(exist_canvas[0]); 979}} 980var canvas_el=document.createElement('canvas'); 981canvas_el.className=pJS_canvas_class; 982canvas_el.style.width="100%"; 983canvas_el.style.height="100%"; 984var canvas=document.getElementById(tag_id).appendChild(canvas_el); 985if(canvas!=null){ 986pJSDom.push(new pJS(tag_id, params)); 987}}; 988window.particlesJS.load=function(tag_id, path_config_json, callback){ 989var xhr=new XMLHttpRequest(); 990xhr.open('GET', path_config_json); 991xhr.onreadystatechange=function (data){ 992if(xhr.readyState==4){ 993if(xhr.status==200){ 994var params=JSON.parse(data.currentTarget.response); 995window.particlesJS(tag_id, params); 996if(callback) callback(); 997}else{ 998console.log('Error pJS - XMLHttpRequest status: '+xhr.status); 999console.log('Error pJS - File config not found'); 1000}} 1001}; 1002xhr.send(); 1003};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.