mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2024-11-20 10:40:29 +01:00
2b567de5c1
closes #652
233 lines
5.8 KiB
JavaScript
233 lines
5.8 KiB
JavaScript
addLoadEvent(function(){
|
|
var c = document.getElementById("fireworks");
|
|
var ctx = c.getContext("2d");
|
|
|
|
var cH;
|
|
var cW;
|
|
var bgColor = srvModel.animationColors[0];
|
|
var animations = [];
|
|
var circles = [];
|
|
|
|
var colorPicker = (function() {
|
|
var colors = srvModel.animationColors;
|
|
var index = 0;
|
|
function next() {
|
|
index = index++ < colors.length-1 ? index : 0;
|
|
return colors[index];
|
|
}
|
|
function current() {
|
|
return colors[index]
|
|
}
|
|
return {
|
|
next: next,
|
|
current: current
|
|
}
|
|
})();
|
|
|
|
function removeAnimation(animation) {
|
|
var index = animations.indexOf(animation);
|
|
if (index > -1) animations.splice(index, 1);
|
|
}
|
|
|
|
function calcPageFillRadius(x, y) {
|
|
var l = Math.max(x - 0, cW - x);
|
|
var h = Math.max(y - 0, cH - y);
|
|
return Math.sqrt(Math.pow(l, 2) + Math.pow(h, 2));
|
|
}
|
|
|
|
function addClickListeners() {
|
|
document.addEventListener("touchstart", handleEvent);
|
|
document.addEventListener("mousedown", handleEvent);
|
|
};
|
|
|
|
function handleEvent(e) {
|
|
if (e.touches) {
|
|
e.preventDefault();
|
|
e = e.touches[0];
|
|
}
|
|
var currentColor = colorPicker.current();
|
|
var nextColor = colorPicker.next();
|
|
var targetR = calcPageFillRadius(e.pageX, e.pageY);
|
|
var rippleSize = Math.min(200, (cW * .4));
|
|
var minCoverDuration = 750;
|
|
|
|
var pageFill = new Circle({
|
|
x: e.pageX,
|
|
y: e.pageY,
|
|
r: 0,
|
|
fill: nextColor
|
|
});
|
|
var fillAnimation = anime({
|
|
targets: pageFill,
|
|
r: targetR,
|
|
duration: Math.max(targetR / 2 , minCoverDuration ),
|
|
easing: "easeOutQuart",
|
|
complete: function(){
|
|
bgColor = pageFill.fill;
|
|
removeAnimation(fillAnimation);
|
|
}
|
|
});
|
|
|
|
var ripple = new Circle({
|
|
x: e.pageX,
|
|
y: e.pageY,
|
|
r: 0,
|
|
fill: currentColor,
|
|
stroke: {
|
|
width: 3,
|
|
color: currentColor
|
|
},
|
|
opacity: 1
|
|
});
|
|
var rippleAnimation = anime({
|
|
targets: ripple,
|
|
r: rippleSize,
|
|
opacity: 0,
|
|
easing: "easeOutExpo",
|
|
duration: 900,
|
|
complete: removeAnimation
|
|
});
|
|
|
|
var particles = [];
|
|
for (var i=0; i<32; i++) {
|
|
var particle = new Circle({
|
|
x: e.pageX,
|
|
y: e.pageY,
|
|
fill: currentColor,
|
|
r: anime.random(24, 48)
|
|
})
|
|
particles.push(particle);
|
|
}
|
|
var particlesAnimation = anime({
|
|
targets: particles,
|
|
x: function(particle){
|
|
return particle.x + anime.random(rippleSize, -rippleSize);
|
|
},
|
|
y: function(particle){
|
|
return particle.y + anime.random(rippleSize * 1.15, -rippleSize * 1.15);
|
|
},
|
|
r: 0,
|
|
easing: "easeOutExpo",
|
|
duration: anime.random(1000,1300),
|
|
complete: removeAnimation
|
|
});
|
|
animations.push(fillAnimation, rippleAnimation, particlesAnimation);
|
|
}
|
|
|
|
function extend(a, b){
|
|
for(var key in b) {
|
|
if(b.hasOwnProperty(key)) {
|
|
a[key] = b[key];
|
|
}
|
|
}
|
|
return a;
|
|
}
|
|
|
|
var Circle = function(opts) {
|
|
extend(this, opts);
|
|
}
|
|
|
|
Circle.prototype.draw = function() {
|
|
ctx.globalAlpha = this.opacity || 1;
|
|
ctx.beginPath();
|
|
ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false);
|
|
if (this.stroke) {
|
|
ctx.strokeStyle = this.stroke.color;
|
|
ctx.lineWidth = this.stroke.width;
|
|
ctx.stroke();
|
|
}
|
|
if (this.fill) {
|
|
ctx.fillStyle = this.fill;
|
|
ctx.fill();
|
|
}
|
|
ctx.closePath();
|
|
ctx.globalAlpha = 1;
|
|
}
|
|
|
|
var animate = anime({
|
|
duration: Infinity,
|
|
update: function() {
|
|
ctx.fillStyle = bgColor;
|
|
ctx.fillRect(0, 0, cW, cH);
|
|
animations.forEach(function(anim) {
|
|
anim.animatables.forEach(function(animatable) {
|
|
animatable.target.draw();
|
|
});
|
|
});
|
|
}
|
|
});
|
|
|
|
var resizeCanvas = function() {
|
|
cW = window.innerWidth;
|
|
cH = window.innerHeight;
|
|
c.width = cW * devicePixelRatio;
|
|
c.height = cH * devicePixelRatio;
|
|
ctx.scale(devicePixelRatio, devicePixelRatio);
|
|
};
|
|
|
|
(function init() {
|
|
resizeCanvas();
|
|
|
|
window.addEventListener("resize", resizeCanvas);
|
|
// addClickListeners();
|
|
|
|
// handleInactiveUser();
|
|
})();
|
|
|
|
function handleInactiveUser() {
|
|
var inactive = setTimeout(function(){
|
|
fauxClick(cW/2, cH/2);
|
|
}, 2000);
|
|
|
|
function clearInactiveTimeout() {
|
|
clearTimeout(inactive);
|
|
document.removeEventListener("mousedown", clearInactiveTimeout);
|
|
document.removeEventListener("touchstart", clearInactiveTimeout);
|
|
}
|
|
|
|
document.addEventListener("mousedown", clearInactiveTimeout);
|
|
document.addEventListener("touchstart", clearInactiveTimeout);
|
|
}
|
|
|
|
function startFauxClicking() {
|
|
setTimeout(function(){
|
|
fauxClick(anime.random( cW * .2, cW * .8), anime.random(cH * .2, cH * .8));
|
|
startFauxClicking();
|
|
}, anime.random(200, 900));
|
|
}
|
|
|
|
function fauxClick(x, y) {
|
|
var fauxClick = new Event("mousedown");
|
|
fauxClick.pageX = x;
|
|
fauxClick.pageY = y;
|
|
document.dispatchEvent(fauxClick);
|
|
}
|
|
|
|
window.fireworks = function(){
|
|
var fauxClick = new Event("mousedown");
|
|
fauxClick.pageX =anime.random( 0, cW );
|
|
fauxClick.pageY = anime.random(0, cH );
|
|
|
|
var middleSpaceX = cW * 0.6;
|
|
var middleSpaceY = cH * 0.6;
|
|
var middleSpaceX1 = middleSpaceX /2;
|
|
var middleSpaceX2 = middleSpaceX1 + middleSpaceX;
|
|
var middleSpaceY1 = middleSpaceY /2;
|
|
var middleSpaceY2 = middleSpaceY1 + middleSpaceY;
|
|
while(true){
|
|
if(fauxClick.pageX > middleSpaceX1 && fauxClick.pageX < middleSpaceX2){
|
|
fauxClick.pageX =anime.random( 0, cW );
|
|
continue;
|
|
}
|
|
if(fauxClick.pageY > middleSpaceY1 && fauxClick.pageY < middleSpaceY2){
|
|
fauxClick.pageY =anime.random( 0, cH );
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
handleEvent(fauxClick)
|
|
};
|
|
|
|
|
|
});
|