{"version":3,"file":"index.cjs","sources":["../src/ProgressBar.ts","../src/index.ts"],"sourcesContent":["export default class ProgressBar {\n\tvalue: number = 0;\n\tvisible: boolean = false;\n\thiding: boolean = false;\n\n\tclassName: string = 'progress-bar';\n\tstyleAttr: string = 'data-progressbar-styles data-swup-theme';\n\tanimationDuration: number = 300;\n\tminValue: number = 0.1;\n\tinitialValue: number = 0.25;\n\ttrickleValue: number = 0.03;\n\ttrickleInterval?: number;\n\n\tstyleElement: HTMLStyleElement;\n\tprogressElement: HTMLDivElement;\n\n\tconstructor({\n\t\tclassName,\n\t\tstyleAttr,\n\t\tanimationDuration,\n\t\tminValue,\n\t\tinitialValue,\n\t\ttrickleValue\n\t}: {\n\t\tclassName?: string;\n\t\tstyleAttr?: string;\n\t\tanimationDuration?: number;\n\t\tminValue?: number;\n\t\tinitialValue?: number;\n\t\ttrickleValue?: number;\n\t} = {}) {\n\t\tif (className !== undefined) {\n\t\t\tthis.className = String(className);\n\t\t}\n\t\tif (styleAttr !== undefined) {\n\t\t\tthis.styleAttr = String(styleAttr);\n\t\t}\n\t\tif (animationDuration !== undefined) {\n\t\t\tthis.animationDuration = Number(animationDuration);\n\t\t}\n\t\tif (minValue !== undefined) {\n\t\t\tthis.minValue = Number(minValue);\n\t\t}\n\t\tif (initialValue !== undefined) {\n\t\t\tthis.initialValue = Number(initialValue);\n\t\t}\n\t\tif (trickleValue !== undefined) {\n\t\t\tthis.trickleValue = Number(trickleValue);\n\t\t}\n\n\t\tthis.styleElement = this.createStyleElement();\n\t\tthis.progressElement = this.createProgressElement();\n\t}\n\n\tget defaultStyles(): string {\n\t\treturn `\n\t\t.${this.className} {\n\t\t\tposition: fixed;\n\t\t\tdisplay: block;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n      width: 100%;\n\t\t\theight: 3px;\n\t\t\tbackground-color: black;\n\t\t\tz-index: 9999;\n\t\t\ttransition:\n\t\t\t\ttransform ${this.animationDuration}ms ease-out,\n\t\t\t\topacity ${this.animationDuration / 2}ms ${this.animationDuration / 2}ms ease-in;\n\t  transform: translate3d(0, 0, 0) scaleX(var(--progress, 0));\n      transform-origin: 0;\n\t\t}\n\t`;\n\t}\n\n\tshow(): void {\n\t\tif (!this.visible) {\n\t\t\tthis.visible = true;\n\t\t\tthis.installStyleElement();\n\t\t\tthis.installProgressElement();\n\t\t\tthis.startTrickling();\n\t\t}\n\t}\n\n\thide(): void {\n\t\tif (this.visible && !this.hiding) {\n\t\t\tthis.hiding = true;\n\t\t\tthis.fadeProgressElement(() => {\n\t\t\t\tthis.uninstallProgressElement();\n\t\t\t\tthis.stopTrickling();\n\t\t\t\tthis.visible = false;\n\t\t\t\tthis.hiding = false;\n\t\t\t});\n\t\t}\n\t}\n\n\tsetValue(value: number): void {\n\t\tthis.value = Math.min(1, Math.max(this.minValue, value));\n\t\tthis.refresh();\n\t}\n\n\tprivate installStyleElement(): void {\n\t\tdocument.head.prepend(this.styleElement);\n\t}\n\n\tprivate installProgressElement(): void {\n\t\tthis.progressElement.style.setProperty('--progress', String(0));\n\t\tthis.progressElement.style.opacity = '1';\n\t\tdocument.body.prepend(this.progressElement);\n\t\tthis.progressElement.scrollTop = 0; // Force reflow to ensure the initial style takes effect\n\t\tthis.setValue(Math.random() * this.initialValue);\n\t}\n\n\tprivate fadeProgressElement(callback: () => void): void {\n\t\tthis.progressElement.style.opacity = '0';\n\t\tsetTimeout(callback, this.animationDuration * 1.5);\n\t}\n\n\tprivate uninstallProgressElement(): void {\n\t\tthis.progressElement.remove();\n\t}\n\n\tprivate startTrickling(): void {\n\t\tif (!this.trickleInterval) {\n\t\t\tthis.trickleInterval = window.setInterval(this.trickle, this.animationDuration);\n\t\t}\n\t}\n\n\tprivate stopTrickling(): void {\n\t\twindow.clearInterval(this.trickleInterval);\n\t\tdelete this.trickleInterval;\n\t}\n\n\tprivate trickle = (): void => {\n\t\tconst advance = Math.random() * this.trickleValue;\n\t\tthis.setValue(this.value + advance);\n\t};\n\n\tprivate refresh(): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.progressElement.style.setProperty('--progress', String(this.value));\n\t\t});\n\t}\n\n\tprivate createStyleElement(): HTMLStyleElement {\n\t\tconst element = document.createElement('style');\n\t\tthis.styleAttr.split(' ').forEach((attr) => element.setAttribute(attr, ''));\n\t\telement.textContent = this.defaultStyles;\n\t\treturn element;\n\t}\n\n\tprivate createProgressElement(): HTMLDivElement {\n\t\tconst element = document.createElement('div');\n\t\telement.className = this.className;\n\t\telement.setAttribute('aria-hidden', 'true');\n\t\treturn element;\n\t}\n}\n","import Plugin from '@swup/plugin';\nimport ProgressBar from './ProgressBar.js';\n\ntype Options = {\n\tclassName: string;\n\tdelay: number;\n\ttransition: number;\n\tminValue: number;\n\tinitialValue: number;\n\tfinishAnimation: boolean;\n};\n\nexport default class SwupProgressPlugin extends Plugin {\n\tname = 'SwupProgressPlugin';\n\n\tdefaults: Options = {\n\t\tclassName: 'swup-progress-bar',\n\t\tdelay: 300,\n\t\ttransition: 300,\n\t\tminValue: 0.1,\n\t\tinitialValue: 0.25,\n\t\tfinishAnimation: true\n\t};\n\toptions: Options;\n\n\tprogressBar: ProgressBar;\n\tshowProgressBarTimeout?: number;\n\thideProgressBarTimeout?: number;\n\n\tconstructor(options: Partial<Options> = {}) {\n\t\tsuper();\n\t\tthis.options = { ...this.defaults, ...options };\n\t\tconst { className, minValue, initialValue, transition: animationDuration } = this.options;\n\t\tthis.progressBar = new ProgressBar({\n\t\t\tclassName,\n\t\t\tminValue,\n\t\t\tinitialValue,\n\t\t\tanimationDuration\n\t\t});\n\t}\n\n\tmount() {\n\t\tthis.on('visit:start', this.startShowingProgress);\n\t\tthis.on('page:view', this.stopShowingProgress);\n\t}\n\n\tstartShowingProgress() {\n\t\tthis.progressBar.setValue(0);\n\t\tthis.showProgressBarAfterDelay();\n\t}\n\n\tstopShowingProgress() {\n\t\tthis.progressBar.setValue(1);\n\t\tif (this.options.finishAnimation) {\n\t\t\tthis.finishAnimationAndHideProgressBar();\n\t\t} else {\n\t\t\tthis.hideProgressBar();\n\t\t}\n\t}\n\n\tshowProgressBar() {\n\t\tthis.cancelHideProgressBarTimeout();\n\t\tthis.progressBar.show();\n\t}\n\n\tshowProgressBarAfterDelay() {\n\t\tthis.cancelShowProgressBarTimeout();\n\t\tthis.cancelHideProgressBarTimeout();\n\t\tthis.showProgressBarTimeout = window.setTimeout(\n\t\t\tthis.showProgressBar.bind(this),\n\t\t\tthis.options.delay\n\t\t);\n\t}\n\n\thideProgressBar() {\n\t\tthis.cancelShowProgressBarTimeout();\n\t\tthis.progressBar.hide();\n\t}\n\n\tfinishAnimationAndHideProgressBar() {\n\t\tthis.cancelShowProgressBarTimeout();\n\t\tthis.hideProgressBarTimeout = window.setTimeout(\n\t\t\tthis.hideProgressBar.bind(this),\n\t\t\tthis.options.transition\n\t\t);\n\t}\n\n\tcancelShowProgressBarTimeout() {\n\t\twindow.clearTimeout(this.showProgressBarTimeout);\n\t\tdelete this.showProgressBarTimeout;\n\t}\n\n\tcancelHideProgressBarTimeout() {\n\t\twindow.clearTimeout(this.hideProgressBarTimeout);\n\t\tdelete this.hideProgressBarTimeout;\n\t}\n}\n"],"names":["ProgressBar","constructor","className","styleAttr","animationDuration","minValue","initialValue","trickleValue","value","this","visible","hiding","trickleInterval","styleElement","progressElement","trickle","advance","Math","random","setValue","undefined","String","Number","createStyleElement","createProgressElement","defaultStyles","show","installStyleElement","installProgressElement","startTrickling","hide","fadeProgressElement","uninstallProgressElement","stopTrickling","min","max","refresh","document","head","prepend","style","setProperty","opacity","body","scrollTop","callback","setTimeout","remove","window","setInterval","clearInterval","requestAnimationFrame","element","createElement","split","forEach","attr","setAttribute","textContent","Plugin","options","super","name","defaults","delay","transition","finishAnimation","progressBar","showProgressBarTimeout","hideProgressBarTimeout","mount","on","startShowingProgress","stopShowingProgress","showProgressBarAfterDelay","finishAnimationAndHideProgressBar","hideProgressBar","showProgressBar","cancelHideProgressBarTimeout","cancelShowProgressBarTimeout","bind","clearTimeout"],"mappings":"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"}