4 ;(
function(root, factory) {
6 if (typeof define ===
'function' && define.amd) {
8 }
else if (typeof exports ===
'object') {
9 module.exports = factory();
11 root.NProgress = factory();
17 NProgress.version =
'0.1.6';
19 var Settings = NProgress.settings = {
28 barSelector:
'[role="bar"]',
29 spinnerSelector:
'[role="spinner"]',
31 template:
'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'
41 NProgress.configure =
function(options) {
43 for (key in options) {
45 if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value;
55 NProgress.status = null;
64 NProgress.set =
function(n) {
65 var started = NProgress.isStarted();
67 n = clamp(n, Settings.minimum, 1);
68 NProgress.status = (n === 1 ? null : n);
70 var progress = NProgress.render(!started),
71 bar = progress.querySelector(Settings.barSelector),
72 speed = Settings.speed,
73 ease = Settings.easing;
77 queue(
function(next) {
79 if (Settings.positionUsing ===
'') Settings.positionUsing = NProgress.getPositioningCSS();
82 css(bar, barPositionCSS(n, speed, ease));
92 setTimeout(
function() {
94 transition:
'all ' + speed +
'ms linear',
97 setTimeout(
function() {
103 setTimeout(next, speed);
110 NProgress.isStarted =
function() {
111 return typeof NProgress.status ===
'number';
121 NProgress.start =
function() {
122 if (!NProgress.status) NProgress.set(0);
124 var work =
function() {
125 setTimeout(
function() {
126 if (!NProgress.status)
return;
129 }, Settings.trickleSpeed);
132 if (Settings.trickle) work();
149 NProgress.done =
function(force) {
150 if (!force && !NProgress.status)
return this;
152 return NProgress.inc(0.3 + 0.5 * Math.random()).
set(1);
159 NProgress.inc =
function(amount) {
160 var n = NProgress.status;
163 return NProgress.start();
165 if (typeof amount !==
'number') {
166 amount = (1 - n) * clamp(Math.random() * n, 0.1, 0.95);
169 n = clamp(n + amount, 0, 0.994);
170 return NProgress.set(n);
174 NProgress.trickle =
function() {
175 return NProgress.inc(Math.random() * Settings.trickleRate);
185 var initial = 0, current = 0;
187 NProgress.promise =
function($promise) {
188 if (!$promise || $promise.state() ==
"resolved") {
199 $promise.always(
function() {
205 NProgress.set((initial - current) / initial);
219 NProgress.render =
function(fromStart) {
220 if (NProgress.isRendered())
return document.getElementById(
'nprogress');
222 addClass(document.documentElement,
'nprogress-busy');
224 var progress = document.createElement(
'div');
225 progress.id =
'nprogress';
226 progress.innerHTML = Settings.template;
228 var bar = progress.querySelector(Settings.barSelector),
229 perc = fromStart ?
'-100' : toBarPerc(NProgress.status || 0),
230 parent = document.querySelector(Settings.parent),
234 transition:
'all 0 linear',
235 transform:
'translate3d(' + perc +
'%,0,0)'
238 if (!Settings.showSpinner) {
239 spinner = progress.querySelector(Settings.spinnerSelector);
240 spinner && removeElement(spinner);
243 if (parent != document.body) {
244 addClass(parent,
'nprogress-custom-parent');
247 parent.appendChild(progress);
255 NProgress.remove =
function() {
256 removeClass(document.documentElement,
'nprogress-busy');
257 removeClass(document.querySelector(Settings.parent),
'nprogress-custom-parent')
258 var progress = document.getElementById(
'nprogress');
259 progress && removeElement(progress);
266 NProgress.isRendered =
function() {
267 return !!document.getElementById(
'nprogress');
274 NProgress.getPositioningCSS =
function() {
276 var bodyStyle = document.body.style;
279 var vendorPrefix = (
'WebkitTransform' in bodyStyle) ?
'Webkit' :
280 (
'MozTransform' in bodyStyle) ?
'Moz' :
281 (
'msTransform' in bodyStyle) ?
'ms' :
282 (
'OTransform' in bodyStyle) ?
'O' :
'';
284 if (vendorPrefix +
'Perspective' in bodyStyle) {
286 return 'translate3d';
287 }
else if (vendorPrefix +
'Transform' in bodyStyle) {
300 function clamp(n, min, max) {
301 if (n < min)
return min;
302 if (n > max)
return max;
311 function toBarPerc(n) {
312 return (-1 + n) * 100;
321 function barPositionCSS(n, speed, ease) {
324 if (Settings.positionUsing ===
'translate3d') {
325 barCSS = { transform:
'translate3d('+toBarPerc(n)+
'%,0,0)' };
326 }
else if (Settings.positionUsing ===
'translate') {
327 barCSS = { transform:
'translate('+toBarPerc(n)+
'%,0)' };
329 barCSS = {
'margin-left': toBarPerc(n)+
'%' };
332 barCSS.transition =
'all '+speed+
'ms '+ease;
341 var queue = (
function() {
345 var fn = pending.shift();
351 return function(fn) {
353 if (pending.length == 1) next();
365 var
css = (
function() {
366 var cssPrefixes = [
'Webkit',
'O',
'Moz',
'ms' ],
369 function camelCase(
string) {
370 return string.replace(/^-ms-/,
'ms-').replace(/-([\da-z])/gi,
function(match, letter) {
371 return letter.toUpperCase();
375 function getVendorProp(name) {
376 var style = document.body.style;
377 if (name in style)
return name;
379 var i = cssPrefixes.length,
380 capName = name.charAt(0).toUpperCase() + name.slice(1),
383 vendorName = cssPrefixes[i] + capName;
384 if (vendorName in style)
return vendorName;
390 function getStyleProp(name) {
391 name = camelCase(name);
392 return cssProps[name] || (cssProps[name] = getVendorProp(name));
395 function applyCss(element, prop, value) {
396 prop = getStyleProp(prop);
397 element.style[prop] = value;
400 return function(element, properties) {
401 var args = arguments,
405 if (args.length == 2) {
406 for (prop in properties) {
407 value = properties[prop];
408 if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value);
411 applyCss(element, args[1], args[2]);
420 function hasClass(element, name) {
421 var list = typeof element ==
'string' ? element : classList(element);
422 return list.indexOf(
' ' + name +
' ') >= 0;
429 function addClass(element, name) {
430 var oldList = classList(element),
431 newList = oldList + name;
433 if (hasClass(oldList, name))
return;
436 element.className = newList.substring(1);
443 function removeClass(element, name) {
444 var oldList = classList(element),
447 if (!hasClass(element, name))
return;
450 newList = oldList.replace(
' ' + name +
' ',
' ');
453 element.className = newList.substring(1, newList.length - 1);
462 function classList(element) {
463 return (
' ' + (element.className ||
'') +
' ').replace(/\s+/gi,
' ');
470 function removeElement(element) {
471 element && element.parentNode && element.parentNode.removeChild(element);