{"version":3,"sources":["jsdelivr-header.js","/npm/vanilla-toast@0.1.0/vanilla-toast.js"],"names":[],"mappings":"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","file":"/npm/vanilla-toast@0.1.0/vanilla-toast.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/vanilla-toast@0.1.0/vanilla-toast.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function() {\r\n  \"use strict\";\r\n\r\n  // VanillaToast class\r\n  var VanillaToast = (function() {\r\n    function VanillaToast() {\r\n      this.queue = new TaskQueue();\r\n      this.cancellationTokens = [];\r\n      this.element = null;\r\n    }\r\n\r\n    var constants = {\r\n      default: {\r\n        className: 'default',\r\n        fadeDuration: 400,\r\n        fadeInterval: 16,\r\n        duration: 2000,\r\n        closeButton: false,\r\n        immediately: false\r\n      },\r\n      success: {\r\n        className: 'success'\r\n      },\r\n      info: {\r\n        className: 'info'\r\n      },\r\n      warning: {\r\n        className: 'warning'\r\n      },\r\n      error: {\r\n        className: 'error',\r\n        duration: 3000,\r\n        closeButton: true\r\n      }\r\n    };\r\n\r\n    // create elements.\r\n    VanillaToast.prototype.initElement = function(selector) {\r\n      var container = document.createElement('div');\r\n      var toastBox = document.createElement('div');\r\n      var text = document.createElement('div');\r\n      var closeButton = document.createElement('span');\r\n\r\n      container.setAttribute(\"id\", \"vanilla-toast-container\");\r\n\r\n      toastBox.setAttribute(\"id\", \"vanilla-toast\");\r\n\r\n      text.setAttribute(\"id\", \"vanilla-toast-text\");\r\n\r\n      closeButton.setAttribute(\"id\", \"vanilla-toast-close-button\");\r\n      closeButton.innerHTML = '&#10006;';\r\n\r\n      toastBox.appendChild(text);\r\n      toastBox.appendChild(closeButton);\r\n      container.appendChild(toastBox);\r\n\r\n      if (selector) {\r\n        document.getElementById(seletor).appendChild(containter);\r\n      } else {\r\n        document.body.appendChild(container);\r\n      }\r\n\r\n      this.element = {\r\n        container: container,\r\n        toastBox: toastBox,\r\n        text: text,\r\n        closeButton: closeButton\r\n      };\r\n\r\n      _setStyle(this, constants.default);\r\n    };\r\n\r\n    // cancel current showing toast.\r\n    VanillaToast.prototype.cancel = function() {\r\n      if (this.cancellationTokens.length) this.cancellationTokens[0].cancel();\r\n    };\r\n\r\n    // cancel all enqueued toasts.\r\n    VanillaToast.prototype.cancelAll = function() {\r\n      var length = this.cancellationTokens.length;\r\n      for (var i = 0; i < length; ++i) {\r\n        (function(token) {\r\n          token.cancel();\r\n        })(this.cancellationTokens[length - i - 1]);\r\n      }\r\n    };\r\n\r\n    // show toast\r\n    VanillaToast.prototype.show = function(text, option, callback) {\r\n      var self = this;\r\n      if (!self.element) self.initElement();\r\n      if (!option) option = {};\r\n      // if immediately show option is on, cancel all previous toasts.\r\n      if (option.immediately) self.cancelAll();\r\n\r\n      var cancellationToken = new CancellationToken();\r\n      // enqueue\r\n      self.queue.enqueue(function(next) {\r\n        // time setting\r\n        var fadeDuration = option.fadeDuration || constants.default.fadeDuration;\r\n        var fadeInterval = option.fadeInterval || constants.default.fadeInterval;\r\n        var fadeStep = Math.min(fadeInterval / fadeDuration, 1);\r\n        var duration = option.duration || constants.default.duration;\r\n\r\n        // close button setting\r\n        self.element.closeButton.style.display =\r\n          option.closeButton ? 'inline' : 'none';\r\n\r\n        // set text\r\n        self.element.text.innerHTML = text;\r\n\r\n        // set visible\r\n        var s = self.element.toastBox.style;\r\n        s.opacity = 0;\r\n        s.display = 'inline-block';\r\n\r\n        // set styles\r\n        _setStyle(self, option);\r\n\r\n        // timeoutId\r\n        var timeoutId = null;\r\n\r\n        // duration timeout callback.\r\n        var timeoutCallback = function() {\r\n          timeoutId = null;\r\n          // release click clickHandler\r\n          self.element.toastBox.removeEventListener('click', cancelHandler);\r\n          _hide(self, option, cancellationToken, function() {\r\n            if (callback) callback();\r\n            self.cancellationTokens.shift().dispose();\r\n            next();\r\n          });\r\n        };\r\n\r\n        // click for close handler\r\n        var cancelHandler = function() {\r\n          if (!timeoutId) return;\r\n          clearTimeout(timeoutId);\r\n          timeoutCallback();\r\n        };\r\n\r\n        // start fade in.\r\n        _fade(s, fadeStep, fadeInterval, cancellationToken, function() {\r\n          // show while duration time and hide.\r\n          self.element.toastBox.addEventListener('click', cancelHandler);\r\n          if (cancellationToken.isCancellationRequested) {\r\n            timeoutCallback();\r\n          } else {\r\n            timeoutId = setTimeout(timeoutCallback, duration);\r\n            cancellationToken.register(function() {\r\n              cancelHandler();\r\n            });\r\n          }\r\n        });\r\n      });\r\n\r\n      self.cancellationTokens.push(cancellationToken);\r\n\r\n      return self;\r\n    };\r\n\r\n    // create preset methods\r\n    for (var item in constants) {\r\n      (function(preset) {\r\n        VanillaToast.prototype[preset] = function(text, option, callback) {\r\n          if (!option) option = {};\r\n\r\n          // copy preset options\r\n          for (var propertyName in constants[preset]) {\r\n            if (option[propertyName] === undefined)\r\n              option[propertyName] = constants[preset][propertyName];\r\n          }\r\n\r\n          return this.show(text, option, callback);\r\n        };\r\n      })(item);\r\n    }\r\n\r\n    // private methods.\r\n\r\n    // set style\r\n    function _setStyle(self, option) {\r\n      self.element.toastBox.className = option.className || constants.default.className;\r\n    };\r\n\r\n    // hide toast\r\n    function _hide(self, option, cancellationToken, callback) {\r\n      if (!option) option = {};\r\n\r\n      // time setting\r\n      var fadeDuration = option.fadeDuration || constants.default.fadeDuration;\r\n      var fadeInterval = option.fadeInterval || constants.default.fadeInterval;\r\n      var fadeStep = Math.min(fadeInterval / fadeDuration, 1);\r\n\r\n      // set visible\r\n      var s = self.element.toastBox.style;\r\n      s.opacity = 1;\r\n\r\n      // start fade out and call callback function.\r\n      _fade(s, -fadeStep, fadeInterval, cancellationToken, function() {\r\n        s.display = 'none';\r\n        if (callback) callback();\r\n      });\r\n\r\n      return self;\r\n    };\r\n\r\n    // run fade animation\r\n    function _fade(style, step, interval, cancellationToken, callback) {\r\n      (function fade() {\r\n        if (cancellationToken.isCancellationRequested) {\r\n          style.opacity = step < 0 ? 0 : 1;\r\n          if (callback) callback();\r\n          return;\r\n        }\r\n        style.opacity = Number(style.opacity) + step;\r\n        if (step < 0 && style.opacity < 0) {\r\n          if (callback) callback();\r\n        } else if (step > 0 && style.opacity >= 1) {\r\n          if (callback) callback();\r\n        } else {\r\n          var timeoutId = setTimeout(function() {\r\n            timeoutId = null;\r\n            fade();\r\n          }, interval);\r\n          cancellationToken.register(function() {\r\n            if (!timeoutId) return;\r\n            clearTimeout(timeoutId);\r\n            timeoutId = null;\r\n            if (callback) callback();\r\n          });\r\n        }\r\n      })();\r\n    };\r\n\r\n    return VanillaToast;\r\n  })();\r\n\r\n  // CancellationToken class\r\n  var CancellationToken = (function() {\r\n    function CancellationToken() {\r\n      this.isCancellationRequested = false;\r\n      this.cancelCallbacks = [];\r\n    }\r\n\r\n    CancellationToken.prototype.cancel = function() {\r\n      this.isCancellationRequested = true;\r\n      var copiedCallbacks = this.cancelCallbacks.slice();\r\n      while (copiedCallbacks.length) copiedCallbacks.shift()();\r\n    };\r\n\r\n    CancellationToken.prototype.register = function(callback) {\r\n      this.cancelCallbacks.push(callback);\r\n    };\r\n\r\n    CancellationToken.prototype.dispose = function() {\r\n      while (this.cancelCallbacks.length) this.cancelCallbacks.shift();\r\n    };\r\n\r\n    return CancellationToken;\r\n  })();\r\n\r\n  // TaskQueue class from https://github.com/talsu/async-task-queue\r\n  var TaskQueue = (function() {\r\n    function TaskQueue() {\r\n      this.queue = [];\r\n      this.isExecuting = false;\r\n    }\r\n\r\n    // enqueue job. run immediately.\r\n    TaskQueue.prototype.enqueue = function(job) {\r\n      // enqueue.\r\n      this.queue.push(job);\r\n      // call execute.\r\n      dequeueAndExecute(this);\r\n    };\r\n\r\n    // Dequeue and execute job.\r\n    function dequeueAndExecute(self) {\r\n      if (self.isExecuting) return;\r\n\r\n      // Dequeue Job.\r\n      var job = self.queue.shift();\r\n      if (!job) return;\r\n\r\n      //Execute Job.\r\n      self.isExecuting = true;\r\n\r\n      // Pass next job execute callback.\r\n      job(function() {\r\n        self.isExecuting = false;\r\n        dequeueAndExecute(self);\r\n      });\r\n    }\r\n\r\n    return TaskQueue;\r\n  })();\r\n\r\n  // export\r\n  if (typeof exports !== 'undefined') {\r\n    if (typeof module !== 'undefined' && module.exports) {\r\n      exports = module.exports = new VanillaToast();\r\n    }\r\n    exports.vanillaToast = new VanillaToast();\r\n  } else {\r\n    this.vanillaToast = new VanillaToast();\r\n  }\r\n}.call(this));\r\n"]}