Spaces:
Sleeping
Sleeping
/** | |
* @license MIT | |
* topbar 2.0.0, 2023-02-04 | |
* https://buunguyen.github.io/topbar | |
* Copyright (c) 2021 Buu Nguyen | |
*/ | |
(function (window, document) { | |
"use strict"; | |
// https://gist.github.com/paulirish/1579671 | |
(function () { | |
var lastTime = 0; | |
var vendors = ["ms", "moz", "webkit", "o"]; | |
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { | |
window.requestAnimationFrame = | |
window[vendors[x] + "RequestAnimationFrame"]; | |
window.cancelAnimationFrame = | |
window[vendors[x] + "CancelAnimationFrame"] || | |
window[vendors[x] + "CancelRequestAnimationFrame"]; | |
} | |
if (!window.requestAnimationFrame) | |
window.requestAnimationFrame = function (callback, element) { | |
var currTime = new Date().getTime(); | |
var timeToCall = Math.max(0, 16 - (currTime - lastTime)); | |
var id = window.setTimeout(function () { | |
callback(currTime + timeToCall); | |
}, timeToCall); | |
lastTime = currTime + timeToCall; | |
return id; | |
}; | |
if (!window.cancelAnimationFrame) | |
window.cancelAnimationFrame = function (id) { | |
clearTimeout(id); | |
}; | |
})(); | |
var canvas, | |
currentProgress, | |
showing, | |
progressTimerId = null, | |
fadeTimerId = null, | |
delayTimerId = null, | |
addEvent = function (elem, type, handler) { | |
if (elem.addEventListener) elem.addEventListener(type, handler, false); | |
else if (elem.attachEvent) elem.attachEvent("on" + type, handler); | |
else elem["on" + type] = handler; | |
}, | |
options = { | |
autoRun: true, | |
barThickness: 3, | |
barColors: { | |
0: "rgba(26, 188, 156, .9)", | |
".25": "rgba(52, 152, 219, .9)", | |
".50": "rgba(241, 196, 15, .9)", | |
".75": "rgba(230, 126, 34, .9)", | |
"1.0": "rgba(211, 84, 0, .9)", | |
}, | |
shadowBlur: 10, | |
shadowColor: "rgba(0, 0, 0, .6)", | |
className: null, | |
}, | |
repaint = function () { | |
canvas.width = window.innerWidth; | |
canvas.height = options.barThickness * 5; // need space for shadow | |
var ctx = canvas.getContext("2d"); | |
ctx.shadowBlur = options.shadowBlur; | |
ctx.shadowColor = options.shadowColor; | |
var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); | |
for (var stop in options.barColors) | |
lineGradient.addColorStop(stop, options.barColors[stop]); | |
ctx.lineWidth = options.barThickness; | |
ctx.beginPath(); | |
ctx.moveTo(0, options.barThickness / 2); | |
ctx.lineTo( | |
Math.ceil(currentProgress * canvas.width), | |
options.barThickness / 2 | |
); | |
ctx.strokeStyle = lineGradient; | |
ctx.stroke(); | |
}, | |
createCanvas = function () { | |
canvas = document.createElement("canvas"); | |
var style = canvas.style; | |
style.position = "fixed"; | |
style.top = style.left = style.right = style.margin = style.padding = 0; | |
style.zIndex = 100001; | |
style.display = "none"; | |
if (options.className) canvas.classList.add(options.className); | |
document.body.appendChild(canvas); | |
addEvent(window, "resize", repaint); | |
}, | |
topbar = { | |
config: function (opts) { | |
for (var key in opts) | |
if (options.hasOwnProperty(key)) options[key] = opts[key]; | |
}, | |
show: function (delay) { | |
if (showing) return; | |
if (delay) { | |
if (delayTimerId) return; | |
delayTimerId = setTimeout(() => topbar.show(), delay); | |
} else { | |
showing = true; | |
if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); | |
if (!canvas) createCanvas(); | |
canvas.style.opacity = 1; | |
canvas.style.display = "block"; | |
topbar.progress(0); | |
if (options.autoRun) { | |
(function loop() { | |
progressTimerId = window.requestAnimationFrame(loop); | |
topbar.progress( | |
"+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) | |
); | |
})(); | |
} | |
} | |
}, | |
progress: function (to) { | |
if (typeof to === "undefined") return currentProgress; | |
if (typeof to === "string") { | |
to = | |
(to.indexOf("+") >= 0 || to.indexOf("-") >= 0 | |
? currentProgress | |
: 0) + parseFloat(to); | |
} | |
currentProgress = to > 1 ? 1 : to; | |
repaint(); | |
return currentProgress; | |
}, | |
hide: function () { | |
clearTimeout(delayTimerId); | |
delayTimerId = null; | |
if (!showing) return; | |
showing = false; | |
if (progressTimerId != null) { | |
window.cancelAnimationFrame(progressTimerId); | |
progressTimerId = null; | |
} | |
(function loop() { | |
if (topbar.progress("+.1") >= 1) { | |
canvas.style.opacity -= 0.05; | |
if (canvas.style.opacity <= 0.05) { | |
canvas.style.display = "none"; | |
fadeTimerId = null; | |
return; | |
} | |
} | |
fadeTimerId = window.requestAnimationFrame(loop); | |
})(); | |
}, | |
}; | |
if (typeof module === "object" && typeof module.exports === "object") { | |
module.exports = topbar; | |
} else if (typeof define === "function" && define.amd) { | |
define(function () { | |
return topbar; | |
}); | |
} else { | |
this.topbar = topbar; | |
} | |
}.call(this, window, document)); | |