diff --git a/docs/index.063a0a63.js.map b/docs/index.063a0a63.js.map deleted file mode 100644 index 01848f7..0000000 --- a/docs/index.063a0a63.js.map +++ /dev/null @@ -1 +0,0 @@ -{"mappings":"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","sources":["","src/js/main.js","node_modules/@georapbox/clipboard-copy-element/dist/clipboard-copy-defined.js","node_modules/@georapbox/clipboard-copy-element/dist/","node_modules/@georapbox/clipboard-copy-element/dist/src/clipboard-copy-defined.js","node_modules/@georapbox/clipboard-copy-element/dist/src/clipboard-copy.js","node_modules/@georapbox/web-share-element/dist/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/","node_modules/@georapbox/web-share-element/dist/src/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/src/web-share.js","node_modules/@georapbox/files-dropzone-element/dist/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/is-valid-file.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/files-selector.js","node_modules/@georapbox/a-tab-group/dist/a-tab-group.js","node_modules/@georapbox/a-tab-group/dist/","node_modules/@georapbox/a-tab-group/dist/src/a-tab-group.js","node_modules/@georapbox/a-tab-group/dist/src/a-tab.js","node_modules/@georapbox/a-tab-group/dist/src/utils/uid.js","node_modules/@georapbox/a-tab-group/dist/src/utils/upgrade-property.js","node_modules/@georapbox/a-tab-group/dist/src/a-tab-panel.js","node_modules/@georapbox/modal-element/dist/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/","node_modules/@georapbox/modal-element/dist/src/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/src/modal-element.js","node_modules/construct-style-sheets-polyfill/dist/adoptedStyleSheets.js","src/js/helpers/styles.js","node_modules/@parcel/runtime-js/lib/runtime-557dd8d58a6f9ba9.js","node_modules/@parcel/runtime-js/lib/runtime-86db7f69c6493fa8.js","src/js/components/add-feed.js","src/js/helpers/storage.js","node_modules/idb-keyval/dist/compat.js","src/js/utils/canParseURL.js","src/js/components/feeds-list.js","node_modules/sortablejs/modular/sortable.core.esm.js","src/js/utils/debounce.js","src/js/components/import-feeds.js","src/js/components/export-feeds.js","node_modules/@georapbox/web-share-element/dist/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/src/is-web-share-supported.js","src/js/components/feed-reader.js","src/js/helpers/fetch-feeds.js"],"sourcesContent":["Object.defineProperty({}, \"ClipboardCopy\", {\n get: function() {\n return $7664cb16aa99b643$export$ea3b71af1761ff40;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $7664cb16aa99b643$var$t = \"clipboard-copy\", $7664cb16aa99b643$var$e = \"success\", $7664cb16aa99b643$var$o = \"error\", $7664cb16aa99b643$var$s = document.createElement(\"template\");\n$7664cb16aa99b643$var$s.innerHTML = `\n \n\n \n`;\nclass $7664cb16aa99b643$export$ea3b71af1761ff40 extends HTMLElement {\n #t = null;\n #e;\n #o;\n #s;\n #i;\n constructor(){\n super(), this.shadowRoot || (this.attachShadow({\n mode: \"open\"\n }), this.shadowRoot.appendChild($7664cb16aa99b643$var$s.content.cloneNode(!0))), this.#e = this.shadowRoot.querySelector(\"button\"), this.#o = this.shadowRoot.querySelector('slot[name=\"copy\"]'), this.#s = this.shadowRoot.querySelector('slot[name=\"success\"]'), this.#i = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#r(\"value\"), this.#r(\"from\"), this.#r(\"disabled\"), this.#r(\"feedbackDuration\"), this.#e.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#e.removeEventListener(\"click\", this.#n), this.#a();\n }\n attributeChangedCallback(t) {\n \"disabled\" === t && (this.#e.disabled = this.disabled, this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n get value() {\n return this.getAttribute(\"value\");\n }\n set value(t) {\n this.setAttribute(\"value\", t);\n }\n get from() {\n return this.getAttribute(\"from\");\n }\n set from(t) {\n this.setAttribute(\"from\", t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n t ? this.setAttribute(\"disabled\", \"\") : this.removeAttribute(\"disabled\");\n }\n get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || 1e3;\n }\n set feedbackDuration(t) {\n this.setAttribute(\"feedback-duration\", t);\n }\n async #l() {\n if (this.value || this.from) try {\n let o = \"\";\n if (this.value) o = this.value;\n else if (this.from) {\n let t = \"getRootNode\" in Element.prototype ? this.#e.getRootNode({\n composed: !0\n }) : this.#e.ownerDocument;\n if (!t || !(t instanceof Document || t instanceof ShadowRoot)) return;\n let e = t.querySelector(this.from);\n if (!e) return;\n o = e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement ? e.value : e instanceof HTMLAnchorElement && e.hasAttribute(\"href\") ? e.href : e.textContent;\n }\n await navigator.clipboard.writeText(o), this.#d($7664cb16aa99b643$var$e), this.dispatchEvent(new CustomEvent(`${$7664cb16aa99b643$var$t}-success`, {\n bubbles: !0,\n composed: !0,\n detail: {\n value: o\n }\n }));\n } catch (e) {\n this.#d($7664cb16aa99b643$var$o), this.dispatchEvent(new CustomEvent(`${$7664cb16aa99b643$var$t}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.#t || this.#l();\n };\n #d(t) {\n this.#o.hidden = !0, this.#s.hidden = t !== $7664cb16aa99b643$var$e, this.#i.hidden = t !== $7664cb16aa99b643$var$o, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\"), this.#e.part.add(`button--${t}`), this.#t && clearTimeout(this.#t), this.#t = setTimeout(()=>{\n this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(`button--${t}`), this.#t = null;\n }, this.feedbackDuration);\n }\n #a() {\n this.#t && clearTimeout(this.#t), this.#t = null, this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\");\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(e = $7664cb16aa99b643$var$t) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $7664cb16aa99b643$export$ea3b71af1761ff40);\n }\n}\n$7664cb16aa99b643$export$ea3b71af1761ff40.defineCustomElement();\n\n\nObject.defineProperty({}, \"WebShare\", {\n get: function() {\n return $cd62c5572235e737$export$30b344bef3e55b67;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $cd62c5572235e737$var$t = `\n :host {\n display: inline-block;\n }\n`, $cd62c5572235e737$var$e = document.createElement(\"template\");\n$cd62c5572235e737$var$e.innerHTML = `\n \n \n`;\nclass $cd62c5572235e737$export$30b344bef3e55b67 extends HTMLElement {\n #t;\n #e;\n #s = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($cd62c5572235e737$var$e.content.cloneNode(!0)), this.#t = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#e = this.#i();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"disabled\" === t && e !== s && this.#e && (this.#e.toggleAttribute(\"disabled\", this.disabled), this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part && this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#r(\"shareUrl\"), this.#r(\"shareTitle\"), this.#r(\"shareText\"), this.#r(\"shareFiles\"), this.#r(\"disabled\"), this.#t?.addEventListener(\"slotchange\", this.#a), this.#e?.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"slotchange\", this.#a), this.#e?.removeEventListener(\"click\", this.#n);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#s;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#s = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && \"AbortError\" === t.name) {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.share();\n };\n #a = (t)=>{\n t.target && \"button\" === t.target.name && (this.#e?.removeEventListener(\"click\", this.#n), this.#e = this.#i(), this.#e && (this.#e.addEventListener(\"click\", this.#n), \"BUTTON\" === this.#e.nodeName || this.#e.hasAttribute(\"role\") || this.#e.setAttribute(\"role\", \"button\")));\n };\n #i() {\n return this.#t && this.#t.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"button\" === t.getAttribute(\"slot\")) || null;\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $cd62c5572235e737$export$30b344bef3e55b67);\n }\n}\n$cd62c5572235e737$export$30b344bef3e55b67.defineCustomElement();\n\n\nObject.defineProperty({}, \"FilesDropzone\", {\n get: function() {\n return $9351176e8d763a78$export$6ccd1735166caad9;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $9351176e8d763a78$var$e = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $9351176e8d763a78$var$t = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $9351176e8d763a78$var$o = (t)=>{\n let { name: o } = t;\n if (o && -1 !== o.lastIndexOf(\".\") && !t.type) {\n let i = (o.split(\".\").pop() || \"\").toLowerCase(), r = $9351176e8d763a78$var$e.get(i);\n r && Object.defineProperty(t, \"type\", {\n value: r,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $9351176e8d763a78$var$i = (e, t)=>{\n let i = $9351176e8d763a78$var$o(e);\n if (\"string\" != typeof i.path) {\n let { webkitRelativePath: o } = e;\n Object.defineProperty(i, \"path\", {\n value: \"string\" == typeof t ? t : o || e.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return i;\n}, $9351176e8d763a78$var$r = async (e)=>await new Promise((t, o)=>{\n e.readEntries(t, o);\n }), $9351176e8d763a78$var$a = async (e)=>{\n let t = [], o = await $9351176e8d763a78$var$r(e);\n for(; o.length > 0;)t.push(...o), o = await $9351176e8d763a78$var$r(e);\n return t;\n}, $9351176e8d763a78$var$n = (e)=>new Promise((t, o)=>{\n e.file((o)=>t($9351176e8d763a78$var$i(o, e.fullPath)), o);\n }), $9351176e8d763a78$var$s = async (e)=>{\n let o = [], i = [];\n for (let t of e){\n if (\"file\" !== t.kind) continue;\n let e = t.getAsEntry ? t.getAsEntry() : t.webkitGetAsEntry();\n i.push(e);\n }\n for(; i.length > 0;){\n let e = i.shift();\n if (e) {\n if (e.isFile) {\n let i = await $9351176e8d763a78$var$n(e);\n -1 === $9351176e8d763a78$var$t.indexOf(i.name) && o.push(i);\n } else e.isDirectory && i.push(...await $9351176e8d763a78$var$a(e.createReader()));\n }\n }\n return o;\n}, $9351176e8d763a78$var$d = async (e)=>{\n let o = [];\n for (let r of e)-1 === $9351176e8d763a78$var$t.indexOf(r.name) && o.push($9351176e8d763a78$var$i(r));\n return o;\n}, $9351176e8d763a78$var$l = async (e)=>e.dataTransfer ? e.dataTransfer.items ? await $9351176e8d763a78$var$s(e.dataTransfer.items) : await $9351176e8d763a78$var$d(e.dataTransfer.files) : await $9351176e8d763a78$var$d(e.target.files), $9351176e8d763a78$var$p = \"files-dropzone\", $9351176e8d763a78$var$c = \"TOO_MANY_FILES\", $9351176e8d763a78$var$h = document.createElement(\"template\"), $9351176e8d763a78$var$u = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$9351176e8d763a78$var$h.innerHTML = `\n \n\n \n\n
\n Drag 'n' drop files here, or click to select files\n
\n`;\nclass $9351176e8d763a78$export$6ccd1735166caad9 extends HTMLElement {\n #e = null;\n #t = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($9351176e8d763a78$var$h.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.getElementById(\"file-input\"), this.#t = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n \"accept\" === e && t !== o && this.#e && (this.#e.accept = this.accept), \"disabled\" === e && t !== o && this.#e && (this.#e.disabled = this.disabled, this.disabled ? (this.#t?.removeAttribute(\"tabindex\"), this.#t?.setAttribute(\"aria-disabled\", \"true\")) : (this.#t?.setAttribute(\"tabindex\", \"0\"), this.#t?.setAttribute(\"aria-disabled\", \"false\"))), \"multiple\" === e && t !== o && this.#e && (this.#e.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#e?.addEventListener(\"change\", this.#i), this.#t?.addEventListener(\"dragenter\", this.#r), this.#t?.addEventListener(\"dragover\", this.#a), this.#t?.addEventListener(\"dragleave\", this.#n), this.#t?.addEventListener(\"drop\", this.#s), this.#t?.addEventListener(\"click\", this.#d), this.#t?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#t?.focus();\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"change\", this.#i), this.#t?.removeEventListener(\"dragenter\", this.#r), this.#t?.removeEventListener(\"dragover\", this.#a), this.#t?.removeEventListener(\"dragleave\", this.#n), this.#t?.removeEventListener(\"drop\", this.#s), this.#t?.removeEventListener(\"click\", this.#d), this.#t?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", null != e ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", null != e ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (null === e) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", null != e ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (null === e) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", null != e ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#p(await $9351176e8d763a78$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #a = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#t && (this.#t.classList.add(\"dropzone--dragover\"), this.#t.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #s = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\"));\n try {\n this.#p(await $9351176e8d763a78$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#e?.click();\n };\n #l = (e)=>{\n this.disabled || \" \" !== e.key && \"Enter\" !== e.key || this.#e?.click();\n };\n #p(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], o = [], i = e.length;\n if (!this.multiple && i > 1) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $9351176e8d763a78$var$c,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && i > this.maxFiles) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $9351176e8d763a78$var$c,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let i of e){\n let e = function(e, t = \"\") {\n if (!t) return !0;\n let o = [\n ...new Set(t.split(\",\").map((e)=>e.trim()).filter(Boolean))\n ], i = e.type, r = i.replace(/\\/.*$/, \"\");\n for (let t of o)if (\".\" === t.charAt(0)) {\n if (-1 !== e.name.toLowerCase().indexOf(t.toLowerCase(), e.name.length - t.length)) return !0;\n } else if (/\\/\\*$/.test(t)) {\n if (r === t.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === t) return !0;\n return !1;\n }(i, this.accept), r = i.size > this.maxSize, a = i.size < this.minSize;\n if (!e || r || a) {\n let t = [];\n e || t.push({\n code: \"INVALID_MIME_TYPE\",\n message: `File type \"${i.type}\" is not accepted.`\n }), r && t.push({\n code: \"FILE_TOO_LARGE\",\n message: `File size ${i.size} exceeds the maximum size of ${this.maxSize}.`\n }), a && t.push({\n code: \"FILE_TOO_SMALL\",\n message: `File size ${i.size} is smaller than the minimum size of ${this.minSize}.`\n }), o.push({\n file: i,\n errors: t\n });\n } else t.push(i);\n }\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: o\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), o.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: o\n }\n })), this.#e && (this.#e.value = this.#e.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#e?.click();\n }\n #o(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n static defineCustomElement(e = $9351176e8d763a78$var$p) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $9351176e8d763a78$export$6ccd1735166caad9);\n }\n}\n$9351176e8d763a78$export$6ccd1735166caad9.defineCustomElement();\n\n\nlet $5a53255ef6289be5$var$t = (t = \"\", e = \"\")=>{\n let s = Math.random().toString(36).substring(2, 8);\n return `${\"string\" == typeof t && \"\" !== t ? t + \"-\" : \"\"}${s}${\"string\" == typeof e && \"\" !== e ? \"-\" + e : \"\"}`;\n}, $5a53255ef6289be5$var$e = (t, e)=>{\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let s = e[t];\n delete e[t], e[t] = s;\n }\n}, $5a53255ef6289be5$var$s = 0, $5a53255ef6289be5$var$o = `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`, $5a53255ef6289be5$var$a = document.createElement(\"template\");\n$5a53255ef6289be5$var$a.innerHTML = `\n \n\n
\n \n
\n`;\nclass $5a53255ef6289be5$var$l extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($5a53255ef6289be5$var$a.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n if (\"selected\" === t && e !== s && this.setAttribute(\"aria-selected\", this.selected.toString()), \"disabled\" === t && e !== s && (this.setAttribute(\"aria-disabled\", this.disabled.toString()), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\")), \"closable\" === t && e !== s) {\n if (this.closable) {\n let t = document.createElement(\"span\");\n t.className = \"tab__close\", t.setAttribute(\"part\", \"close-tab\"), t.innerHTML = '', this.shadowRoot?.querySelector(\".tab\")?.appendChild(t), t.addEventListener(\"click\", this.#t);\n } else {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t), t?.remove();\n }\n }\n }\n connectedCallback() {\n this.#e(\"selected\"), this.#e(\"disabled\"), this.#e(\"closable\"), this.id || (this.id = $5a53255ef6289be5$var$t(\"tab\", (++$5a53255ef6289be5$var$s).toString())), this.setAttribute(\"slot\", \"tab\"), this.setAttribute(\"role\", \"tab\"), this.setAttribute(\"aria-selected\", \"false\"), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t);\n }\n get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(t) {\n this.toggleAttribute(\"selected\", !!t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(t) {\n this.toggleAttribute(\"closable\", !!t);\n }\n #t = (t)=>{\n t.stopPropagation(), this.dispatchEvent(new CustomEvent(\"a-tab-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: this.id\n }\n }));\n };\n #e(t) {\n return $5a53255ef6289be5$var$e(t, this);\n }\n static defineCustomElement(t = \"a-tab\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $5a53255ef6289be5$var$l);\n }\n}\n$5a53255ef6289be5$var$l.defineCustomElement();\nlet $5a53255ef6289be5$var$i = 0, $5a53255ef6289be5$var$r = `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`, $5a53255ef6289be5$var$n = document.createElement(\"template\");\n$5a53255ef6289be5$var$n.innerHTML = `\n \n\n
\n \n
\n`;\nclass $5a53255ef6289be5$var$c extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($5a53255ef6289be5$var$n.content.cloneNode(!0));\n }\n connectedCallback() {\n this.setAttribute(\"slot\", \"panel\"), this.setAttribute(\"role\", \"tabpanel\"), this.setAttribute(\"hidden\", \"\"), this.id || (this.id = $5a53255ef6289be5$var$t(\"panel\", (++$5a53255ef6289be5$var$i).toString()));\n }\n static defineCustomElement(t = \"a-tab-panel\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $5a53255ef6289be5$var$c);\n }\n}\n$5a53255ef6289be5$var$c.defineCustomElement();\nlet $5a53255ef6289be5$var$d = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n}, $5a53255ef6289be5$var$h = Object.entries($5a53255ef6289be5$var$d).map(([, t])=>t), $5a53255ef6289be5$var$b = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n}, $5a53255ef6289be5$var$u = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n}, $5a53255ef6289be5$var$p = `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$5a53255ef6289be5$var$d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$5a53255ef6289be5$var$d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$5a53255ef6289be5$var$d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`, $5a53255ef6289be5$var$g = document.createElement(\"template\");\n$5a53255ef6289be5$var$g.innerHTML = `\n \n\n
\n
\n \n\n
\n \n
\n\n \n
\n\n
\n \n
\n
\n`;\nclass $5a53255ef6289be5$export$85fd4ed3b8ca1010 extends HTMLElement {\n #s = null;\n #o = null;\n #a = !1;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($5a53255ef6289be5$var$g.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"placement\" === t && e !== s && this.#l(), \"no-scroll-controls\" === t && e !== s && this.#l();\n }\n get placement() {\n return this.getAttribute(\"placement\") || $5a53255ef6289be5$var$d.TOP;\n }\n set placement(t) {\n null != t && this.setAttribute(\"placement\", t);\n }\n get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(t) {\n this.toggleAttribute(\"no-scroll-controls\", !!t);\n }\n get scrollDistance() {\n return Math.abs(Number(this.getAttribute(\"scroll-distance\"))) || 200;\n }\n set scrollDistance(t) {\n this.setAttribute(\"scroll-distance\", Math.abs(t).toString() || \"200\");\n }\n get activation() {\n return this.getAttribute(\"activation\") || $5a53255ef6289be5$var$b.AUTO;\n }\n set activation(t) {\n this.setAttribute(\"activation\", t || $5a53255ef6289be5$var$b.AUTO);\n }\n get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(t) {\n this.toggleAttribute(\"no-tab-cycling\", !!t);\n }\n connectedCallback() {\n this.#e(\"placement\"), this.#e(\"noScrollControls\"), this.#e(\"scrollDistance\"), this.#e(\"activation\"), this.#e(\"noTabCycling\");\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = this.shadowRoot?.querySelector(\".tab-group__nav\"), a = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.addEventListener(\"slotchange\", this.#i), e?.addEventListener(\"slotchange\", this.#i), s?.addEventListener(\"click\", this.#r), s?.addEventListener(\"keydown\", this.#n), a.forEach((t)=>t.addEventListener(\"click\", this.#c)), this.addEventListener(\"a-tab-close\", this.#d), \"ResizeObserver\" in window && (this.#s = new ResizeObserver((t)=>{\n this.#o = window.requestAnimationFrame(()=>{\n let e = t?.[0], s = e?.target, l = s?.scrollWidth > s?.clientWidth;\n a.forEach((t)=>t.toggleAttribute(\"hidden\", !l)), o?.part.toggle(\"nav--has-scroll-controls\", l), o?.classList.toggle(\"tab-group__nav--has-scroll-controls\", l);\n });\n })), this.#h(), this.#l();\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.removeEventListener(\"slotchange\", this.#i), e?.removeEventListener(\"slotchange\", this.#i), s?.removeEventListener(\"click\", this.#r), s?.removeEventListener(\"keydown\", this.#n), o.forEach((t)=>t.removeEventListener(\"click\", this.#c)), this.removeEventListener(\"a-tab-close\", this.#d), this.#b();\n }\n #u() {\n if (!this.#s) return;\n let t = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n t && (this.#s.unobserve(t), this.#s.observe(t));\n }\n #b() {\n this.#s && (this.#s.disconnect(), null !== this.#o && (window.cancelAnimationFrame(this.#o), this.#o = null));\n }\n #p() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n #h() {\n this.hidden = 0 === this.#g().length;\n }\n #m() {\n let t = this.#g();\n this.#h(), t.forEach((t)=>{\n let e = t.nextElementSibling;\n if (!e || \"a-tab-panel\" !== e.tagName.toLowerCase()) return console.error(`Tab #${t.id} is not a sibling of a `);\n t.setAttribute(\"aria-controls\", e.id), e.setAttribute(\"aria-labelledby\", t.id);\n });\n }\n #v() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n #g() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n #f(t) {\n let e = t.getAttribute(\"aria-controls\");\n return this.querySelector(`#${e}`);\n }\n #w() {\n return this.#g().find((t)=>!t.disabled) || null;\n }\n #T() {\n let t = this.#g();\n for(let e = t.length - 1; e >= 0; e--)if (!t[e].disabled) return t[e];\n return null;\n }\n #y() {\n let t = this.#g(), e = this.activation === $5a53255ef6289be5$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) - 1 : t.findIndex((t)=>t.selected) - 1;\n for(; t[(e + t.length) % t.length].disabled;)e--;\n return this.noTabCycling && e < 0 ? null : t[(e + t.length) % t.length];\n }\n #A() {\n let t = this.#g(), e = this.activation === $5a53255ef6289be5$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) + 1 : t.findIndex((t)=>t.selected) + 1;\n for(; t[e % t.length].disabled;)e++;\n return this.noTabCycling && e >= t.length ? null : t[e % t.length];\n }\n #_() {\n let t = this.#g(), e = this.#v();\n t.forEach((t)=>t.selected = !1), e.forEach((t)=>t.hidden = !0);\n }\n #l() {\n let t = this.shadowRoot?.querySelector(\".tab-group__nav\"), e = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n this.noScrollControls || this.placement === $5a53255ef6289be5$var$d.START || this.placement === $5a53255ef6289be5$var$d.END ? (this.#b(), e.forEach((t)=>t.hidden = !0), t?.part.remove(\"nav--has-scroll-controls\"), t?.classList.remove(\"tab-group__nav--has-scroll-controls\")) : (this.#u(), e.forEach((t)=>t.hidden = !1));\n }\n #E() {\n let t = this.#g(), e = t.find((t)=>t.selected && !t.disabled) || t.find((t)=>!t.disabled);\n e && (this.#a && !e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.#C(e));\n }\n #C(t) {\n this.#_(), t && (t.selected = !0);\n let e = this.#f(t);\n e && (e.hidden = !1);\n }\n #i = (t)=>{\n this.#m(), this.#l(), this.#E(), \"tab\" === t.target.name && (this.#a = !0);\n };\n #n = (t)=>{\n if (\"a-tab\" !== t.target.tagName.toLowerCase() || t.altKey) return;\n let e = $5a53255ef6289be5$var$h.includes(this.placement || \"\") ? this.placement : $5a53255ef6289be5$var$d.TOP, s = [\n $5a53255ef6289be5$var$d.TOP,\n $5a53255ef6289be5$var$d.BOTTOM\n ].includes(e || \"\") ? \"horizontal\" : \"vertical\", o = this.#p(), a = null;\n switch(t.key){\n case $5a53255ef6289be5$var$u.LEFT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#y() : this.#A()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.RIGHT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#A() : this.#y()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.UP:\n \"vertical\" === s && (a = this.#y()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.DOWN:\n \"vertical\" === s && (a = this.#A()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.HOME:\n (a = this.#w()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.END:\n (a = this.#T()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.ENTER:\n case $5a53255ef6289be5$var$u.SPACE:\n (a = t.target) && this.selectTab(a);\n break;\n default:\n return;\n }\n t.preventDefault();\n };\n #r = (t)=>{\n let e = t.target.closest(\"a-tab\");\n e && this.selectTab(e);\n };\n #c = (t)=>{\n let e = t.target.closest(\".tab-group__scroll-button\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!e || !s) return;\n let o = e.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1, a = s.scrollLeft;\n s.scrollTo({\n left: a + o * this.scrollDistance\n });\n };\n #d = (t)=>{\n let e = t.target, s = this.#f(e);\n e && (e.remove(), e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n }))), s && \"a-tab-panel\" === s.tagName.toLowerCase() && s.remove();\n };\n #e(t) {\n return $5a53255ef6289be5$var$e(t, this);\n }\n selectTabByIndex(t) {\n let e = this.#g()[t];\n e && this.selectTab(e);\n }\n selectTabById(t) {\n let e = this.#g().find((e)=>e.id === t);\n e && this.selectTab(e);\n }\n selectTab(t) {\n let e = this.#g().find((t)=>t.selected);\n !t || t.disabled || t.selected || \"a-tab\" !== t.tagName.toLowerCase() || (this.#C(t), window.requestAnimationFrame(()=>{\n t.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n }), t.focus();\n }), e && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: t.id\n }\n })));\n }\n static defineCustomElement(t = \"a-tab-group\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $5a53255ef6289be5$export$85fd4ed3b8ca1010);\n }\n}\n$5a53255ef6289be5$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nObject.defineProperty({}, \"ModalElement\", {\n get: function() {\n return $d9c5053bade2d3f8$export$32589115725b904b;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $d9c5053bade2d3f8$var$e = document.createElement(\"template\"), $d9c5053bade2d3f8$var$t = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$d9c5053bade2d3f8$var$e.innerHTML = /* html */ `\n \n\n \n
\n
\n \n\n
\n \n
\n
\n\n \n\n
\n \n
\n
\n
\n`; /**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ \nclass $d9c5053bade2d3f8$export$32589115725b904b extends HTMLElement {\n #e = null;\n #t = null;\n #o = void 0;\n constructor(){\n if (super(), !this.shadowRoot) {\n let t = this.attachShadow({\n mode: \"open\"\n });\n t.appendChild($d9c5053bade2d3f8$var$e.content.cloneNode(!0));\n }\n this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#t = this.shadowRoot.querySelector('slot[name=\"footer\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n if (null !== this.#e) {\n if (\"open\" === e && t !== o && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n }))) : this.#e.close()), \"no-header\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__header\");\n null !== e && (e.hidden = this.noHeader);\n }\n if (\"no-animations\" === e && t !== o && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), \"no-close-button\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__close\");\n null !== e && (e.hidden = this.noCloseButton);\n }\n }\n }\n connectedCallback() {\n this.#i(\"open\"), this.#i(\"staticBackdrop\"), this.#i(\"noHeader\"), this.#i(\"noAnimations\"), this.#i(\"noCloseButton\"), this.#i(\"fullscreen\"), this.#e?.addEventListener(\"click\", this.#a), this.#e?.addEventListener(\"close\", this.#l), this.#e?.addEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#n), this.#t?.addEventListener(\"slotchange\", this.#r);\n }\n disconnectedCallback() {\n this.#o && clearTimeout(this.#o), this.#e?.addEventListener(\"click\", this.#a), this.#e?.removeEventListener(\"close\", this.#l), this.#e?.removeEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#n), this.#t?.removeEventListener(\"slotchange\", this.#r);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n e ? this.setAttribute(\"open\", \"\") : this.removeAttribute(\"open\");\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n e ? this.setAttribute(\"static-backdrop\", \"\") : this.removeAttribute(\"static-backdrop\");\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n e ? this.setAttribute(\"no-header\", \"\") : this.removeAttribute(\"no-header\");\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n e ? this.setAttribute(\"no-animations\", \"\") : this.removeAttribute(\"no-animations\");\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n e ? this.setAttribute(\"no-close-button\", \"\") : this.removeAttribute(\"no-close-button\");\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n e ? this.setAttribute(\"fullscreen\", \"\") : this.removeAttribute(\"fullscreen\");\n }\n #d() {\n this.#o || (this.#e?.classList.add(\"dialog--pulse\"), this.#o = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#o), this.#o = void 0;\n }, 300));\n }\n #l = ()=>{\n // the open property when the dialog is closed by the user.\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n }));\n };\n #s = (e)=>{\n let t = this.#c(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #n = (e)=>{\n let t = this.#c(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #a = (e)=>{\n if (e.target !== e.currentTarget) return;\n let t = this.#c(\"backdrop-click\");\n if (this.dispatchEvent(t), t.defaultPrevented || this.staticBackdrop) {\n this.noAnimations || this.#d();\n return;\n }\n this.#e?.close();\n };\n #r = ()=>{\n if (null === this.#e) return; /** @type {Nullable} */ \n let e = this.#e.querySelector(\".dialog__footer\");\n if (null === e) return;\n let t = this.#t?.assignedNodes(), o = !!t && t.length > 0;\n e.hidden = !o;\n };\n #c(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #i(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $d9c5053bade2d3f8$export$32589115725b904b);\n }\n}\n$d9c5053bade2d3f8$export$32589115725b904b.defineCustomElement();\n //# sourceMappingURL=modal-element-defined.js.map\n\n\n(function() {\n \"use strict\";\n if (typeof document === \"undefined\" || \"adoptedStyleSheets\" in document) return;\n var hasShadyCss = \"ShadyCSS\" in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument(\"\");\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === \"object\" ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, \"\");\n if (_contents !== contents) console.warn(\"@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418\");\n return _contents.trim();\n }\n function isElementConnected(element) {\n return \"isConnected\" in element ? element.isConnected : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function(value, index) {\n return arr.indexOf(value) === index;\n });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function(value) {\n return arr2.indexOf(value) === -1;\n });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n var cssStyleSheetMethods = [\n \"addRule\",\n \"deleteRule\",\n \"insertRule\",\n \"removeRule\"\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function() {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function() {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? proto$1.isPrototypeOf(instance) || nonConstructedProto.isPrototypeOf(instance) : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? nonConstructedProto.isPrototypeOf(instance) : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement(\"style\");\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function(_location) {\n return _location !== location;\n }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function() {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods.get(sheet).forEach(function(command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) throw new TypeError(\"Illegal invocation\");\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement(\"style\");\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n } catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === \"string\") {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function(location) {\n if (location.isConnected()) restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n });\n }\n };\n defineProperty(proto$1, \"cssRules\", {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n }\n });\n defineProperty(proto$1, \"media\", {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n }\n });\n cssStyleSheetMethods.forEach(function(method) {\n proto$1[method] = function() {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({\n method: method,\n args: args\n });\n $locations.get(self).forEach(function(location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance\n });\n var defaultObserverOptions = {\n childList: true,\n subtree: true\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, \"adoptedStyleSheets\", {\n configurable: true,\n enumerable: true,\n get: function() {\n return getAssociatedLocation(this).sheets;\n },\n set: function(sheets) {\n getAssociatedLocation(this).update(sheets);\n }\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function(foundNode) {\n return getShadowRoot(foundNode) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, null, false);\n for(var next = void 0; next = iter.nextNode();)callback(getShadowRoot(next));\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return element instanceof HTMLStyleElement && $uniqueSheets.get(self).some(function(sheet) {\n return getAdopterByLocation(sheet, self);\n });\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function(sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function(sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function(mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function(mutation) {\n if (!hasShadyCss) forEach.call(mutation.addedNodes, function(node) {\n if (!(node instanceof Element)) return;\n traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).connect();\n });\n });\n forEach.call(mutation.removedNodes, function(node) {\n if (!(node instanceof Element)) return;\n if (isExistingAdopter(self, node)) adopt(self);\n if (!hasShadyCss) traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).disconnect();\n });\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function() {\n var element = $element.get(this);\n return element instanceof Document ? element.readyState !== \"loading\" : isElementConnected(element.host);\n },\n connect: function() {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) adopt(this);\n traverseWebComponents(container, function(root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function() {\n $observer.get(this).disconnect();\n },\n update: function(sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? \"Document\" : \"ShadowRoot\";\n if (!Array.isArray(sheets)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n if (!sheets.every(isCSSStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n if (sheets.some(isNonConstructedStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function(sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) adopt(self);\n }\n };\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if (\"ShadowRoot\" in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === \"closed\") closedShadowRootRegistry.set(this, root);\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) documentLocation.connect();\n else document.addEventListener(\"DOMContentLoaded\", documentLocation.connect.bind(documentLocation));\n})();\n\n\nvar $1df650bc12a3679b$exports = {};\n$1df650bc12a3679b$exports = new URL(\"bootstrap.33ff2998.css\", import.meta.url).toString();\n\n\nvar $9f1ef1895b1352ed$exports = {};\n$9f1ef1895b1352ed$exports = new URL(\"main.2238cf96.css\", import.meta.url).toString();\n\n\nconst $4ffc15d651e12514$var$styleURLs = [\n $1df650bc12a3679b$exports,\n $9f1ef1895b1352ed$exports\n];\nconst $4ffc15d651e12514$export$4b9cd30c41328fdd = [];\nfor(let i = 0; i < $4ffc15d651e12514$var$styleURLs.length; i += 1)$4ffc15d651e12514$export$4b9cd30c41328fdd.push(new CSSStyleSheet());\n(async function() {\n const styles = await Promise.all($4ffc15d651e12514$var$styleURLs.map(async (styleURL)=>{\n const res = await fetch(styleURL);\n return res.text();\n }));\n for(let i = 0; i < styles.length; i += 1)await $4ffc15d651e12514$export$4b9cd30c41328fdd[i].replace(styles[i]);\n document.body.style.visibility = \"visible\";\n})();\n\n\n\nfunction $dc2f4a51b83babfd$var$_slicedToArray(arr, i) {\n return $dc2f4a51b83babfd$var$_arrayWithHoles(arr) || $dc2f4a51b83babfd$var$_iterableToArrayLimit(arr, i) || $dc2f4a51b83babfd$var$_unsupportedIterableToArray(arr, i) || $dc2f4a51b83babfd$var$_nonIterableRest();\n}\nfunction $dc2f4a51b83babfd$var$_nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction $dc2f4a51b83babfd$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $dc2f4a51b83babfd$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $dc2f4a51b83babfd$var$_arrayLikeToArray(o, minLen);\n}\nfunction $dc2f4a51b83babfd$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $dc2f4a51b83babfd$var$_iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction $dc2f4a51b83babfd$var$_arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction $dc2f4a51b83babfd$export$b327150396135fe7(request) {\n return new Promise(function(resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function() {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n request.onabort = request.onerror = function() {\n return reject(request.error);\n };\n });\n}\nfunction $dc2f4a51b83babfd$export$f51a9068ac82ea43(dbName, storeName) {\n var request = indexedDB.open(dbName);\n request.onupgradeneeded = function() {\n return request.result.createObjectStore(storeName);\n };\n var dbp = $dc2f4a51b83babfd$export$b327150396135fe7(request);\n return function(txMode, callback) {\n return dbp.then(function(db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\nvar $dc2f4a51b83babfd$var$defaultGetStoreFunc;\nfunction $dc2f4a51b83babfd$var$defaultGetStore() {\n if (!$dc2f4a51b83babfd$var$defaultGetStoreFunc) $dc2f4a51b83babfd$var$defaultGetStoreFunc = $dc2f4a51b83babfd$export$f51a9068ac82ea43(\"keyval-store\", \"keyval\");\n return $dc2f4a51b83babfd$var$defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$3988ae62b71be9a3(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$adaa4cf7ef1b65be(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.put(value, key);\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$daa0a5170277c7a8(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n entries.forEach(function(entry) {\n return store.put(entry[1], entry[0]);\n });\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$5df405cccea42673(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return Promise.all(keys.map(function(key) {\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$722fbec263ad908a(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n return(// If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function(resolve, reject) {\n store.get(key).onsuccess = function() {\n try {\n store.put(updater(this.result), key);\n resolve($dc2f4a51b83babfd$export$b327150396135fe7(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n }));\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$1d2f21e549771e67(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.delete(key);\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$c8aa84257229cac8(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n keys.forEach(function(key) {\n return store.delete(key);\n });\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$42ffd38884aecdac() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.clear();\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\nfunction $dc2f4a51b83babfd$var$eachCursor(store, callback) {\n store.openCursor().onsuccess = function() {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$ed97f33186d4b816() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAllKeys) return $dc2f4a51b83babfd$export$b327150396135fe7(store.getAllKeys());\n var items = [];\n return $dc2f4a51b83babfd$var$eachCursor(store, function(cursor) {\n return items.push(cursor.key);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$68c286be0e7e55b7() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAll) return $dc2f4a51b83babfd$export$b327150396135fe7(store.getAll());\n var items = [];\n return $dc2f4a51b83babfd$var$eachCursor(store, function(cursor) {\n return items.push(cursor.value);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$3e9f948b41964866() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) return Promise.all([\n $dc2f4a51b83babfd$export$b327150396135fe7(store.getAllKeys()),\n $dc2f4a51b83babfd$export$b327150396135fe7(store.getAll())\n ]).then(function(_ref) {\n var _ref2 = $dc2f4a51b83babfd$var$_slicedToArray(_ref, 2), keys = _ref2[0], values = _ref2[1];\n return keys.map(function(key, i) {\n return [\n key,\n values[i]\n ];\n });\n });\n var items = [];\n return customStore(\"readonly\", function(store) {\n return $dc2f4a51b83babfd$var$eachCursor(store, function(cursor) {\n return items.push([\n cursor.key,\n cursor.value\n ]);\n }).then(function() {\n return items;\n });\n });\n });\n}\n\n\nconst $bad480a01f35862b$var$STORAGE_PREFIX = \"rss-reader/\";\nconst $bad480a01f35862b$var$STORAGE_FEEDS_KEY = $bad480a01f35862b$var$STORAGE_PREFIX + \"feeds\";\nconst $bad480a01f35862b$var$getItem = async (key)=>{\n try {\n return {\n value: await (0, $dc2f4a51b83babfd$export$3988ae62b71be9a3)(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error: error\n };\n }\n};\nconst $bad480a01f35862b$var$setItem = async (key, data)=>{\n try {\n await (0, $dc2f4a51b83babfd$export$adaa4cf7ef1b65be)(key, data);\n return {\n error: void 0\n };\n } catch (error) {\n return {\n error: error\n };\n }\n};\nconst $bad480a01f35862b$export$4890c08c4ffbd57b = async ()=>{\n return $bad480a01f35862b$var$getItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY);\n};\nconst $bad480a01f35862b$export$a8ce8a4ec117f05e = async (feeds, shouldDispatchEvent = true)=>{\n if (!Array.isArray(feeds)) return;\n const { error: error } = await $bad480a01f35862b$var$setItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"set\",\n feeds: feeds\n }\n }));\n return {\n error: error\n };\n};\nconst $bad480a01f35862b$export$4b77448646caf424 = async (feed, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $bad480a01f35862b$export$4890c08c4ffbd57b();\n const foundFeed = feeds.find((f)=>f.url === feed.url);\n let action = \"\";\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = \"update\";\n } else {\n feeds.push(feed);\n action = \"create\";\n }\n const { error: error } = await $bad480a01f35862b$var$setItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: action,\n feed: feed\n }\n }));\n return {\n error: error\n };\n};\nconst $bad480a01f35862b$export$4e54c6fd9fa8b09b = async (feedUrl, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $bad480a01f35862b$export$4890c08c4ffbd57b();\n const filteredFeeds = feeds.filter((f)=>f.url !== feedUrl);\n const { error: error } = await $bad480a01f35862b$var$setItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY, filteredFeeds);\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) await (0, $dc2f4a51b83babfd$export$1d2f21e549771e67)($bad480a01f35862b$var$STORAGE_FEEDS_KEY);\n document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"delete\",\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n return {\n error: error\n };\n};\n\n\n/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */ const $e998bc9dc264f90b$export$981c5d1bd3894713 = (url)=>{\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n\n\nconst $e50da86101e29f72$var$template = document.createElement(\"template\");\n$e50da86101e29f72$var$template.innerHTML = /* html */ `\n \n\n
\n
\n \n
\n
\n \n
\n
\n`;\nclass $e50da86101e29f72$var$AddFeed extends HTMLElement {\n #formEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($e50da86101e29f72$var$template.content.cloneNode(true));\n }\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n connectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n disconnectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n const input = evt.target[\"feed-url\"];\n const url = input.value.trim();\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n const urlExists = Boolean(feeds.find((feed)=>feed.url === url));\n const isValidURL = (0, $e998bc9dc264f90b$export$981c5d1bd3894713)(url);\n if (!urlExists && isValidURL) await (0, $bad480a01f35862b$export$4b77448646caf424)({\n url: url,\n title: \"\" // Title is not available at this point; it will be fetched later.\n });\n input.value = \"\";\n }\n}\nif (!window.customElements.get(\"add-feed\")) window.customElements.define(\"add-feed\", $e50da86101e29f72$var$AddFeed);\n\n\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */ function $2c4dfe5b2b5ff94a$var$ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction $2c4dfe5b2b5ff94a$var$_objectSpread2(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) $2c4dfe5b2b5ff94a$var$ownKeys(Object(source), true).forEach(function(key) {\n $2c4dfe5b2b5ff94a$var$_defineProperty(target, key, source[key]);\n });\n else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else $2c4dfe5b2b5ff94a$var$ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction $2c4dfe5b2b5ff94a$var$_typeof(obj) {\n \"@babel/helpers - typeof\";\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") $2c4dfe5b2b5ff94a$var$_typeof = function(obj) {\n return typeof obj;\n };\n else $2c4dfe5b2b5ff94a$var$_typeof = function(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n return $2c4dfe5b2b5ff94a$var$_typeof(obj);\n}\nfunction $2c4dfe5b2b5ff94a$var$_defineProperty(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction $2c4dfe5b2b5ff94a$var$_extends() {\n $2c4dfe5b2b5ff94a$var$_extends = Object.assign || function(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n return target;\n };\n return $2c4dfe5b2b5ff94a$var$_extends.apply(this, arguments);\n}\nfunction $2c4dfe5b2b5ff94a$var$_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction $2c4dfe5b2b5ff94a$var$_objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = $2c4dfe5b2b5ff94a$var$_objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceSymbolKeys.length; i++){\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction $2c4dfe5b2b5ff94a$var$_toConsumableArray(arr) {\n return $2c4dfe5b2b5ff94a$var$_arrayWithoutHoles(arr) || $2c4dfe5b2b5ff94a$var$_iterableToArray(arr) || $2c4dfe5b2b5ff94a$var$_unsupportedIterableToArray(arr) || $2c4dfe5b2b5ff94a$var$_nonIterableSpread();\n}\nfunction $2c4dfe5b2b5ff94a$var$_arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(arr);\n}\nfunction $2c4dfe5b2b5ff94a$var$_iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction $2c4dfe5b2b5ff94a$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(o, minLen);\n}\nfunction $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $2c4dfe5b2b5ff94a$var$_nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nvar $2c4dfe5b2b5ff94a$var$version = \"1.15.2\";\nfunction $2c4dfe5b2b5ff94a$var$userAgent(pattern) {\n if (typeof window !== \"undefined\" && window.navigator) return !!/*@__PURE__*/ navigator.userAgent.match(pattern);\n}\nvar $2c4dfe5b2b5ff94a$var$IE11OrLess = $2c4dfe5b2b5ff94a$var$userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar $2c4dfe5b2b5ff94a$var$Edge = $2c4dfe5b2b5ff94a$var$userAgent(/Edge/i);\nvar $2c4dfe5b2b5ff94a$var$FireFox = $2c4dfe5b2b5ff94a$var$userAgent(/firefox/i);\nvar $2c4dfe5b2b5ff94a$var$Safari = $2c4dfe5b2b5ff94a$var$userAgent(/safari/i) && !$2c4dfe5b2b5ff94a$var$userAgent(/chrome/i) && !$2c4dfe5b2b5ff94a$var$userAgent(/android/i);\nvar $2c4dfe5b2b5ff94a$var$IOS = $2c4dfe5b2b5ff94a$var$userAgent(/iP(ad|od|hone)/i);\nvar $2c4dfe5b2b5ff94a$var$ChromeForAndroid = $2c4dfe5b2b5ff94a$var$userAgent(/chrome/i) && $2c4dfe5b2b5ff94a$var$userAgent(/android/i);\nvar $2c4dfe5b2b5ff94a$var$captureMode = {\n capture: false,\n passive: false\n};\nfunction $2c4dfe5b2b5ff94a$var$on(el, event, fn) {\n el.addEventListener(event, fn, !$2c4dfe5b2b5ff94a$var$IE11OrLess && $2c4dfe5b2b5ff94a$var$captureMode);\n}\nfunction $2c4dfe5b2b5ff94a$var$off(el, event, fn) {\n el.removeEventListener(event, fn, !$2c4dfe5b2b5ff94a$var$IE11OrLess && $2c4dfe5b2b5ff94a$var$captureMode);\n}\nfunction $2c4dfe5b2b5ff94a$var$matches(/**HTMLElement*/ el, /**String*/ selector) {\n if (!selector) return;\n selector[0] === \">\" && (selector = selector.substring(1));\n if (el) try {\n if (el.matches) return el.matches(selector);\n else if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n } catch (_) {\n return false;\n }\n return false;\n}\nfunction $2c4dfe5b2b5ff94a$var$getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction $2c4dfe5b2b5ff94a$var$closest(/**HTMLElement*/ el, /**String*/ selector, /**HTMLElement*/ ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === \">\" ? el.parentNode === ctx && $2c4dfe5b2b5ff94a$var$matches(el, selector) : $2c4dfe5b2b5ff94a$var$matches(el, selector)) || includeCTX && el === ctx) return el;\n if (el === ctx) break;\n /* jshint boss:true */ }while (el = $2c4dfe5b2b5ff94a$var$getParentOrHost(el));\n }\n return null;\n}\nvar $2c4dfe5b2b5ff94a$var$R_SPACE = /\\s+/g;\nfunction $2c4dfe5b2b5ff94a$var$toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) el.classList[state ? \"add\" : \"remove\"](name);\n else {\n var className = (\" \" + el.className + \" \").replace($2c4dfe5b2b5ff94a$var$R_SPACE, \" \").replace(\" \" + name + \" \", \" \");\n el.className = (className + (state ? \" \" + name : \"\")).replace($2c4dfe5b2b5ff94a$var$R_SPACE, \" \");\n }\n }\n}\nfunction $2c4dfe5b2b5ff94a$var$css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) val = document.defaultView.getComputedStyle(el, \"\");\n else if (el.currentStyle) val = el.currentStyle;\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf(\"webkit\") === -1) prop = \"-webkit-\" + prop;\n style[prop] = val + (typeof val === \"string\" ? \"\" : \"px\");\n }\n }\n}\nfunction $2c4dfe5b2b5ff94a$var$matrix(el, selfOnly) {\n var appliedTransforms = \"\";\n if (typeof el === \"string\") appliedTransforms = el;\n else do {\n var transform = $2c4dfe5b2b5ff94a$var$css(el, \"transform\");\n if (transform && transform !== \"none\") appliedTransforms = transform + \" \" + appliedTransforms;\n /* jshint boss:true */ }while (!selfOnly && (el = el.parentNode));\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */ return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction $2c4dfe5b2b5ff94a$var$find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;\n if (iterator) for(; i < n; i++)iterator(list[i], i);\n return list;\n }\n return [];\n}\nfunction $2c4dfe5b2b5ff94a$var$getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) return scrollingElement;\n else return document.documentElement;\n}\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */ function $2c4dfe5b2b5ff94a$var$getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== $2c4dfe5b2b5ff94a$var$getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!$2c4dfe5b2b5ff94a$var$IE11OrLess) {\n do if (container && container.getBoundingClientRect && ($2c4dfe5b2b5ff94a$var$css(container, \"transform\") !== \"none\" || relativeToNonStaticParent && $2c4dfe5b2b5ff94a$var$css(container, \"position\") !== \"static\")) {\n var containerRect = container.getBoundingClientRect();\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt($2c4dfe5b2b5ff94a$var$css(container, \"border-top-width\"));\n left -= containerRect.left + parseInt($2c4dfe5b2b5ff94a$var$css(container, \"border-left-width\"));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = $2c4dfe5b2b5ff94a$var$matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */ function $2c4dfe5b2b5ff94a$var$isScrolledPast(el, elSide, parentSide) {\n var parent = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(el, true), elSideVal = $2c4dfe5b2b5ff94a$var$getRect(el)[elSide];\n /* jshint boss:true */ while(parent){\n var parentSideVal = $2c4dfe5b2b5ff94a$var$getRect(parent)[parentSide], visible = void 0;\n if (parentSide === \"top\" || parentSide === \"left\") visible = elSideVal >= parentSideVal;\n else visible = elSideVal <= parentSideVal;\n if (!visible) return parent;\n if (parent === $2c4dfe5b2b5ff94a$var$getWindowScrollingElement()) break;\n parent = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */ function $2c4dfe5b2b5ff94a$var$getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0, i = 0, children = el.children;\n while(i < children.length){\n if (children[i].style.display !== \"none\" && children[i] !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost && (includeDragEl || children[i] !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged) && $2c4dfe5b2b5ff94a$var$closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) return children[i];\n currentChild++;\n }\n i++;\n }\n return null;\n}\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */ function $2c4dfe5b2b5ff94a$var$lastChild(el, selector) {\n var last = el.lastElementChild;\n while(last && (last === $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost || $2c4dfe5b2b5ff94a$var$css(last, \"display\") === \"none\" || selector && !$2c4dfe5b2b5ff94a$var$matches(last, selector)))last = last.previousElementSibling;\n return last || null;\n}\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */ function $2c4dfe5b2b5ff94a$var$index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) return -1;\n /* jshint boss:true */ while(el = el.previousElementSibling)if (el.nodeName.toUpperCase() !== \"TEMPLATE\" && el !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.clone && (!selector || $2c4dfe5b2b5ff94a$var$matches(el, selector))) index++;\n return index;\n}\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */ function $2c4dfe5b2b5ff94a$var$getRelativeScrollOffset(el) {\n var offsetLeft = 0, offsetTop = 0, winScroller = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n if (el) do {\n var elMatrix = $2c4dfe5b2b5ff94a$var$matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n }while (el !== winScroller && (el = el.parentNode));\n return [\n offsetLeft,\n offsetTop\n ];\n}\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */ function $2c4dfe5b2b5ff94a$var$indexOfObject(arr, obj) {\n for(var i in arr){\n if (!arr.hasOwnProperty(i)) continue;\n for(var key in obj){\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = $2c4dfe5b2b5ff94a$var$css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == \"auto\" || elemCSS.overflowX == \"scroll\") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == \"auto\" || elemCSS.overflowY == \"scroll\")) {\n if (!elem.getBoundingClientRect || elem === document.body) return $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n while (elem = elem.parentNode);\n return $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n}\nfunction $2c4dfe5b2b5ff94a$var$extend(dst, src) {\n if (dst && src) {\n for(var key in src)if (src.hasOwnProperty(key)) dst[key] = src[key];\n }\n return dst;\n}\nfunction $2c4dfe5b2b5ff94a$var$isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar $2c4dfe5b2b5ff94a$var$_throttleTimeout;\nfunction $2c4dfe5b2b5ff94a$var$throttle(callback, ms) {\n return function() {\n if (!$2c4dfe5b2b5ff94a$var$_throttleTimeout) {\n var args = arguments, _this = this;\n if (args.length === 1) callback.call(_this, args[0]);\n else callback.apply(_this, args);\n $2c4dfe5b2b5ff94a$var$_throttleTimeout = setTimeout(function() {\n $2c4dfe5b2b5ff94a$var$_throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction $2c4dfe5b2b5ff94a$var$cancelThrottle() {\n clearTimeout($2c4dfe5b2b5ff94a$var$_throttleTimeout);\n $2c4dfe5b2b5ff94a$var$_throttleTimeout = void 0;\n}\nfunction $2c4dfe5b2b5ff94a$var$scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction $2c4dfe5b2b5ff94a$var$clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) return Polymer.dom(el).cloneNode(true);\n else if ($) return $(el).clone(true)[0];\n else return el.cloneNode(true);\n}\nfunction $2c4dfe5b2b5ff94a$var$setRect(el, rect) {\n $2c4dfe5b2b5ff94a$var$css(el, \"position\", \"absolute\");\n $2c4dfe5b2b5ff94a$var$css(el, \"top\", rect.top);\n $2c4dfe5b2b5ff94a$var$css(el, \"left\", rect.left);\n $2c4dfe5b2b5ff94a$var$css(el, \"width\", rect.width);\n $2c4dfe5b2b5ff94a$var$css(el, \"height\", rect.height);\n}\nfunction $2c4dfe5b2b5ff94a$var$unsetRect(el) {\n $2c4dfe5b2b5ff94a$var$css(el, \"position\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"top\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"left\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"width\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"height\", \"\");\n}\nfunction $2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function(child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!$2c4dfe5b2b5ff94a$var$closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = $2c4dfe5b2b5ff94a$var$getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar $2c4dfe5b2b5ff94a$var$expando = \"Sortable\" + new Date().getTime();\nfunction $2c4dfe5b2b5ff94a$var$AnimationStateManager() {\n var animationStates = [], animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function(child) {\n if ($2c4dfe5b2b5ff94a$var$css(child, \"display\") === \"none\" || child === $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost) return;\n animationStates.push({\n target: child,\n rect: $2c4dfe5b2b5ff94a$var$getRect(child)\n });\n var fromRect = $2c4dfe5b2b5ff94a$var$_objectSpread2({}, animationStates[animationStates.length - 1].rect);\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = $2c4dfe5b2b5ff94a$var$matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice($2c4dfe5b2b5ff94a$var$indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === \"function\") callback();\n return;\n }\n var animating = false, animationTime = 0;\n animationStates.forEach(function(state) {\n var time = 0, target = state.target, fromRect = target.fromRect, toRect = $2c4dfe5b2b5ff94a$var$getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = $2c4dfe5b2b5ff94a$var$matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) // Could also check if animatingRect is between fromRect and toRect\n {\n if ($2c4dfe5b2b5ff94a$var$isRectEqual(prevFromRect, toRect) && !$2c4dfe5b2b5ff94a$var$isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) // If returning to same place as started from animation and on same axis\n time = $2c4dfe5b2b5ff94a$var$calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n // if fromRect != toRect: animate\n if (!$2c4dfe5b2b5ff94a$var$isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) time = _this.options.animation;\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function() {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === \"function\") callback();\n } else animationCallbackId = setTimeout(function() {\n if (typeof callback === \"function\") callback();\n }, animationTime);\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n $2c4dfe5b2b5ff94a$var$css(target, \"transition\", \"\");\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"\");\n var elMatrix = $2c4dfe5b2b5ff94a$var$matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"translate3d(\" + translateX + \"px,\" + translateY + \"px,0)\");\n this.forRepaintDummy = $2c4dfe5b2b5ff94a$var$repaint(target); // repaint\n $2c4dfe5b2b5ff94a$var$css(target, \"transition\", \"transform \" + duration + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\"));\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"translate3d(0,0,0)\");\n typeof target.animated === \"number\" && clearTimeout(target.animated);\n target.animated = setTimeout(function() {\n $2c4dfe5b2b5ff94a$var$css(target, \"transition\", \"\");\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"\");\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction $2c4dfe5b2b5ff94a$var$repaint(target) {\n return target.offsetWidth;\n}\nfunction $2c4dfe5b2b5ff94a$var$calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\nvar $2c4dfe5b2b5ff94a$var$plugins = [];\nvar $2c4dfe5b2b5ff94a$var$defaults = {\n initializeByDefault: true\n};\nvar $2c4dfe5b2b5ff94a$var$PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for(var option in $2c4dfe5b2b5ff94a$var$defaults)if ($2c4dfe5b2b5ff94a$var$defaults.hasOwnProperty(option) && !(option in plugin)) plugin[option] = $2c4dfe5b2b5ff94a$var$defaults[option];\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(p) {\n if (p.pluginName === plugin.pluginName) throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n });\n $2c4dfe5b2b5ff94a$var$plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function() {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + \"Global\";\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) sortable[plugin.pluginName][eventNameGlobal]($2c4dfe5b2b5ff94a$var$_objectSpread2({\n sortable: sortable\n }, evt));\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) sortable[plugin.pluginName][eventName]($2c4dfe5b2b5ff94a$var$_objectSpread2({\n sortable: sortable\n }, evt));\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n // Add default options from plugin\n $2c4dfe5b2b5ff94a$var$_extends(defaults, initialized.defaults);\n });\n for(var option in sortable.options){\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== \"undefined\") sortable.options[option] = modified;\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n if (typeof plugin.eventProperties !== \"function\") return;\n $2c4dfe5b2b5ff94a$var$_extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === \"function\") modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n });\n return modifiedValue;\n }\n};\nfunction $2c4dfe5b2b5ff94a$var$dispatchEvent(_ref) {\n var sortable = _ref.sortable, rootEl = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex = _ref.oldIndex, newIndex = _ref.newIndex, oldDraggableIndex = _ref.oldDraggableIndex, newDraggableIndex = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[$2c4dfe5b2b5ff94a$var$expando];\n if (!sortable) return;\n var evt, options = sortable.options, onName = \"on\" + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$2c4dfe5b2b5ff94a$var$IE11OrLess && !$2c4dfe5b2b5ff94a$var$Edge) evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = $2c4dfe5b2b5ff94a$var$_objectSpread2($2c4dfe5b2b5ff94a$var$_objectSpread2({}, extraEventProperties), $2c4dfe5b2b5ff94a$var$PluginManager.getEventProperties(name, sortable));\n for(var option in allEventProperties)evt[option] = allEventProperties[option];\n if (rootEl) rootEl.dispatchEvent(evt);\n if (options[onName]) options[onName].call(sortable, evt);\n}\nvar $2c4dfe5b2b5ff94a$var$_excluded = [\n \"evt\"\n];\nvar $2c4dfe5b2b5ff94a$var$pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, originalEvent = _ref.evt, data = $2c4dfe5b2b5ff94a$var$_objectWithoutProperties(_ref, $2c4dfe5b2b5ff94a$var$_excluded);\n $2c4dfe5b2b5ff94a$var$PluginManager.pluginEvent.bind($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423)(eventName, sortable, $2c4dfe5b2b5ff94a$var$_objectSpread2({\n dragEl: $2c4dfe5b2b5ff94a$var$dragEl,\n parentEl: $2c4dfe5b2b5ff94a$var$parentEl,\n ghostEl: $2c4dfe5b2b5ff94a$var$ghostEl,\n rootEl: $2c4dfe5b2b5ff94a$var$rootEl,\n nextEl: $2c4dfe5b2b5ff94a$var$nextEl,\n lastDownEl: $2c4dfe5b2b5ff94a$var$lastDownEl,\n cloneEl: $2c4dfe5b2b5ff94a$var$cloneEl,\n cloneHidden: $2c4dfe5b2b5ff94a$var$cloneHidden,\n dragStarted: $2c4dfe5b2b5ff94a$var$moved,\n putSortable: $2c4dfe5b2b5ff94a$var$putSortable,\n activeSortable: $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active,\n originalEvent: originalEvent,\n oldIndex: $2c4dfe5b2b5ff94a$var$oldIndex,\n oldDraggableIndex: $2c4dfe5b2b5ff94a$var$oldDraggableIndex,\n newIndex: $2c4dfe5b2b5ff94a$var$newIndex,\n newDraggableIndex: $2c4dfe5b2b5ff94a$var$newDraggableIndex,\n hideGhostForTarget: $2c4dfe5b2b5ff94a$var$_hideGhostForTarget,\n unhideGhostForTarget: $2c4dfe5b2b5ff94a$var$_unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n $2c4dfe5b2b5ff94a$var$cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n $2c4dfe5b2b5ff94a$var$cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction $2c4dfe5b2b5ff94a$var$_dispatchEvent(info) {\n $2c4dfe5b2b5ff94a$var$dispatchEvent($2c4dfe5b2b5ff94a$var$_objectSpread2({\n putSortable: $2c4dfe5b2b5ff94a$var$putSortable,\n cloneEl: $2c4dfe5b2b5ff94a$var$cloneEl,\n targetEl: $2c4dfe5b2b5ff94a$var$dragEl,\n rootEl: $2c4dfe5b2b5ff94a$var$rootEl,\n oldIndex: $2c4dfe5b2b5ff94a$var$oldIndex,\n oldDraggableIndex: $2c4dfe5b2b5ff94a$var$oldDraggableIndex,\n newIndex: $2c4dfe5b2b5ff94a$var$newIndex,\n newDraggableIndex: $2c4dfe5b2b5ff94a$var$newDraggableIndex\n }, info));\n}\nvar $2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$parentEl, $2c4dfe5b2b5ff94a$var$ghostEl, $2c4dfe5b2b5ff94a$var$rootEl, $2c4dfe5b2b5ff94a$var$nextEl, $2c4dfe5b2b5ff94a$var$lastDownEl, $2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$cloneHidden, $2c4dfe5b2b5ff94a$var$oldIndex, $2c4dfe5b2b5ff94a$var$newIndex, $2c4dfe5b2b5ff94a$var$oldDraggableIndex, $2c4dfe5b2b5ff94a$var$newDraggableIndex, $2c4dfe5b2b5ff94a$var$activeGroup, $2c4dfe5b2b5ff94a$var$putSortable, $2c4dfe5b2b5ff94a$var$awaitingDragStarted = false, $2c4dfe5b2b5ff94a$var$ignoreNextClick = false, $2c4dfe5b2b5ff94a$var$sortables = [], $2c4dfe5b2b5ff94a$var$tapEvt, $2c4dfe5b2b5ff94a$var$touchEvt, $2c4dfe5b2b5ff94a$var$lastDx, $2c4dfe5b2b5ff94a$var$lastDy, $2c4dfe5b2b5ff94a$var$tapDistanceLeft, $2c4dfe5b2b5ff94a$var$tapDistanceTop, $2c4dfe5b2b5ff94a$var$moved, $2c4dfe5b2b5ff94a$var$lastTarget, $2c4dfe5b2b5ff94a$var$lastDirection, $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = false, $2c4dfe5b2b5ff94a$var$isCircumstantialInvert = false, $2c4dfe5b2b5ff94a$var$targetMoveDistance, // For positioning ghost absolutely\n$2c4dfe5b2b5ff94a$var$ghostRelativeParent, $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll = [], // (left, top)\n$2c4dfe5b2b5ff94a$var$_silent = false, $2c4dfe5b2b5ff94a$var$savedInputChecked = [];\n/** @const */ var $2c4dfe5b2b5ff94a$var$documentExists = typeof document !== \"undefined\", $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely = $2c4dfe5b2b5ff94a$var$IOS, $2c4dfe5b2b5ff94a$var$CSSFloatProperty = $2c4dfe5b2b5ff94a$var$Edge || $2c4dfe5b2b5ff94a$var$IE11OrLess ? \"cssFloat\" : \"float\", // This will not pass for IE9, because IE9 DnD only works on anchors\n$2c4dfe5b2b5ff94a$var$supportDraggable = $2c4dfe5b2b5ff94a$var$documentExists && !$2c4dfe5b2b5ff94a$var$ChromeForAndroid && !$2c4dfe5b2b5ff94a$var$IOS && \"draggable\" in document.createElement(\"div\"), $2c4dfe5b2b5ff94a$var$supportCssPointerEvents = function() {\n if (!$2c4dfe5b2b5ff94a$var$documentExists) return;\n // false when <= IE11\n if ($2c4dfe5b2b5ff94a$var$IE11OrLess) return false;\n var el = document.createElement(\"x\");\n el.style.cssText = \"pointer-events:auto\";\n return el.style.pointerEvents === \"auto\";\n}(), $2c4dfe5b2b5ff94a$var$_detectDirection = function _detectDirection(el, options) {\n var elCSS = $2c4dfe5b2b5ff94a$var$css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = $2c4dfe5b2b5ff94a$var$getChild(el, 0, options), child2 = $2c4dfe5b2b5ff94a$var$getChild(el, 1, options), firstChildCSS = child1 && $2c4dfe5b2b5ff94a$var$css(child1), secondChildCSS = child2 && $2c4dfe5b2b5ff94a$var$css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + $2c4dfe5b2b5ff94a$var$getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + $2c4dfe5b2b5ff94a$var$getRect(child2).width;\n if (elCSS.display === \"flex\") return elCSS.flexDirection === \"column\" || elCSS.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n if (elCSS.display === \"grid\") return elCSS.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== \"none\") {\n var touchingSideChild2 = firstChildCSS[\"float\"] === \"left\" ? \"left\" : \"right\";\n return child2 && (secondChildCSS.clear === \"both\" || secondChildCSS.clear === touchingSideChild2) ? \"vertical\" : \"horizontal\";\n }\n return child1 && (firstChildCSS.display === \"block\" || firstChildCSS.display === \"flex\" || firstChildCSS.display === \"table\" || firstChildCSS.display === \"grid\" || firstChildWidth >= elWidth && elCSS[$2c4dfe5b2b5ff94a$var$CSSFloatProperty] === \"none\" || child2 && elCSS[$2c4dfe5b2b5ff94a$var$CSSFloatProperty] === \"none\" && firstChildWidth + secondChildWidth > elWidth) ? \"vertical\" : \"horizontal\";\n}, $2c4dfe5b2b5ff94a$var$_dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n}, /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */ $2c4dfe5b2b5ff94a$var$_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n $2c4dfe5b2b5ff94a$var$sortables.some(function(sortable) {\n var threshold = sortable[$2c4dfe5b2b5ff94a$var$expando].options.emptyInsertThreshold;\n if (!threshold || $2c4dfe5b2b5ff94a$var$lastChild(sortable)) return;\n var rect = $2c4dfe5b2b5ff94a$var$getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) return ret = sortable;\n });\n return ret;\n}, $2c4dfe5b2b5ff94a$var$_prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function(to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) // Default pull value\n // Default pull and put value if same group\n return true;\n else if (value == null || value === false) return false;\n else if (pull && value === \"clone\") return value;\n else if (typeof value === \"function\") return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === \"string\" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || $2c4dfe5b2b5ff94a$var$_typeof(originalGroup) != \"object\") originalGroup = {\n name: originalGroup\n };\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n}, $2c4dfe5b2b5ff94a$var$_hideGhostForTarget = function _hideGhostForTarget() {\n if (!$2c4dfe5b2b5ff94a$var$supportCssPointerEvents && $2c4dfe5b2b5ff94a$var$ghostEl) $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"display\", \"none\");\n}, $2c4dfe5b2b5ff94a$var$_unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!$2c4dfe5b2b5ff94a$var$supportCssPointerEvents && $2c4dfe5b2b5ff94a$var$ghostEl) $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"display\", \"\");\n};\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif ($2c4dfe5b2b5ff94a$var$documentExists && !$2c4dfe5b2b5ff94a$var$ChromeForAndroid) document.addEventListener(\"click\", function(evt) {\n if ($2c4dfe5b2b5ff94a$var$ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n $2c4dfe5b2b5ff94a$var$ignoreNextClick = false;\n return false;\n }\n}, true);\nvar $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if ($2c4dfe5b2b5ff94a$var$dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = $2c4dfe5b2b5ff94a$var$_detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for(var i in evt)if (evt.hasOwnProperty(i)) event[i] = evt[i];\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[$2c4dfe5b2b5ff94a$var$expando]._onDragOver(event);\n }\n }\n};\nvar $2c4dfe5b2b5ff94a$var$_checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if ($2c4dfe5b2b5ff94a$var$dragEl) $2c4dfe5b2b5ff94a$var$dragEl.parentNode[$2c4dfe5b2b5ff94a$var$expando]._isOutsideThisEl(evt.target);\n};\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ function $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) throw \"Sortable: `el` must be an HTMLElement, not \".concat(({}).toString.call(el));\n this.el = el; // root element\n this.options = options = $2c4dfe5b2b5ff94a$var$_extends({}, options);\n // Export instance\n el[$2c4dfe5b2b5ff94a$var$expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? \">li\" : \">*\",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return $2c4dfe5b2b5ff94a$var$_detectDirection(el, this.options);\n },\n ghostClass: \"sortable-ghost\",\n chosenClass: \"sortable-chosen\",\n dragClass: \"sortable-drag\",\n ignore: \"a, img\",\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData(\"Text\", dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: \"data-id\",\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: \"sortable-fallback\",\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.supportPointer !== false && \"PointerEvent\" in window && !$2c4dfe5b2b5ff94a$var$Safari,\n emptyInsertThreshold: 5\n };\n $2c4dfe5b2b5ff94a$var$PluginManager.initializePlugins(this, el, defaults);\n // Set default options\n for(var name in defaults)!(name in options) && (options[name] = defaults[name]);\n $2c4dfe5b2b5ff94a$var$_prepareGroup(options);\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : $2c4dfe5b2b5ff94a$var$supportDraggable;\n if (this.nativeDraggable) // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n // Bind events\n if (options.supportPointer) $2c4dfe5b2b5ff94a$var$on(el, \"pointerdown\", this._onTapStart);\n else {\n $2c4dfe5b2b5ff94a$var$on(el, \"mousedown\", this._onTapStart);\n $2c4dfe5b2b5ff94a$var$on(el, \"touchstart\", this._onTapStart);\n }\n if (this.nativeDraggable) {\n $2c4dfe5b2b5ff94a$var$on(el, \"dragover\", this);\n $2c4dfe5b2b5ff94a$var$on(el, \"dragenter\", this);\n }\n $2c4dfe5b2b5ff94a$var$sortables.push(this.el);\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n // Add animation state manager\n $2c4dfe5b2b5ff94a$var$_extends(this, $2c4dfe5b2b5ff94a$var$AnimationStateManager());\n}\n$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.prototype = /** @lends Sortable.prototype */ {\n constructor: $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) $2c4dfe5b2b5ff94a$var$lastTarget = null;\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === \"function\" ? this.options.direction.call(this, evt, target, $2c4dfe5b2b5ff94a$var$dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(/** Event|TouchEvent */ evt) {\n if (!evt.cancelable) return;\n var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === \"touch\" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter;\n $2c4dfe5b2b5ff94a$var$_saveInputCheckedState(el);\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if ($2c4dfe5b2b5ff94a$var$dragEl) return;\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) return; // only left button and enabled\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) return;\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && $2c4dfe5b2b5ff94a$var$Safari && target && target.tagName.toUpperCase() === \"SELECT\") return;\n target = $2c4dfe5b2b5ff94a$var$closest(target, options.draggable, el, false);\n if (target && target.animated) return;\n if ($2c4dfe5b2b5ff94a$var$lastDownEl === target) // Ignoring duplicate `down`\n return;\n // Get the index of the dragged element within its parent\n $2c4dfe5b2b5ff94a$var$oldIndex = $2c4dfe5b2b5ff94a$var$index(target);\n $2c4dfe5b2b5ff94a$var$oldDraggableIndex = $2c4dfe5b2b5ff94a$var$index(target, options.draggable);\n // Check filter\n if (typeof filter === \"function\") {\n if (filter.call(this, evt, target, this)) {\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: \"filter\",\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(\",\").some(function(criteria) {\n criteria = $2c4dfe5b2b5ff94a$var$closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: \"filter\",\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !$2c4dfe5b2b5ff94a$var$closest(originalTarget, options.handle, el, false)) return;\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(/** Event */ evt, /** Touch */ touch, /** HTMLElement */ target) {\n var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;\n if (target && !$2c4dfe5b2b5ff94a$var$dragEl && target.parentNode === el) {\n var dragRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n $2c4dfe5b2b5ff94a$var$rootEl = el;\n $2c4dfe5b2b5ff94a$var$dragEl = target;\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$dragEl.parentNode;\n $2c4dfe5b2b5ff94a$var$nextEl = $2c4dfe5b2b5ff94a$var$dragEl.nextSibling;\n $2c4dfe5b2b5ff94a$var$lastDownEl = target;\n $2c4dfe5b2b5ff94a$var$activeGroup = options.group;\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged = $2c4dfe5b2b5ff94a$var$dragEl;\n $2c4dfe5b2b5ff94a$var$tapEvt = {\n target: $2c4dfe5b2b5ff94a$var$dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n $2c4dfe5b2b5ff94a$var$tapDistanceLeft = $2c4dfe5b2b5ff94a$var$tapEvt.clientX - dragRect.left;\n $2c4dfe5b2b5ff94a$var$tapDistanceTop = $2c4dfe5b2b5ff94a$var$tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n $2c4dfe5b2b5ff94a$var$dragEl.style[\"will-change\"] = \"all\";\n dragStartFn = function dragStartFn() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"delayEnded\", _this, {\n evt: evt\n });\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!$2c4dfe5b2b5ff94a$var$FireFox && _this.nativeDraggable) $2c4dfe5b2b5ff94a$var$dragEl.draggable = true;\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n // Drag start event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n name: \"choose\",\n originalEvent: evt\n });\n // Chosen item\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.chosenClass, true);\n };\n // Disable \"draggable\"\n options.ignore.split(\",\").forEach(function(criteria) {\n $2c4dfe5b2b5ff94a$var$find($2c4dfe5b2b5ff94a$var$dragEl, criteria.trim(), $2c4dfe5b2b5ff94a$var$_disableDraggable);\n });\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"dragover\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mousemove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchmove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mouseup\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchend\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchcancel\", _this._onDrop);\n // Make dragEl draggable (must be before delay for FireFox)\n if ($2c4dfe5b2b5ff94a$var$FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n $2c4dfe5b2b5ff94a$var$dragEl.draggable = true;\n }\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"delayStart\", this, {\n evt: evt\n });\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !($2c4dfe5b2b5ff94a$var$Edge || $2c4dfe5b2b5ff94a$var$IE11OrLess))) {\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mouseup\", _this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchend\", _this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchcancel\", _this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mousemove\", _this._delayedDragTouchMoveHandler);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchmove\", _this._delayedDragTouchMoveHandler);\n options.supportPointer && $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"pointermove\", _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else dragStartFn();\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(/** TouchEvent|PointerEvent **/ e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) this._disableDelayedDrag();\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n $2c4dfe5b2b5ff94a$var$dragEl && $2c4dfe5b2b5ff94a$var$_disableDraggable($2c4dfe5b2b5ff94a$var$dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"mouseup\", this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchend\", this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchcancel\", this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"mousemove\", this._delayedDragTouchMoveHandler);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchmove\", this._delayedDragTouchMoveHandler);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"pointermove\", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(/** Event */ evt, /** Touch */ touch) {\n touch = touch || evt.pointerType == \"touch\" && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) $2c4dfe5b2b5ff94a$var$on(document, \"pointermove\", this._onTouchMove);\n else if (touch) $2c4dfe5b2b5ff94a$var$on(document, \"touchmove\", this._onTouchMove);\n else $2c4dfe5b2b5ff94a$var$on(document, \"mousemove\", this._onTouchMove);\n } else {\n $2c4dfe5b2b5ff94a$var$on($2c4dfe5b2b5ff94a$var$dragEl, \"dragend\", this);\n $2c4dfe5b2b5ff94a$var$on($2c4dfe5b2b5ff94a$var$rootEl, \"dragstart\", this._onDragStart);\n }\n try {\n if (document.selection) // Timeout neccessary for IE9\n $2c4dfe5b2b5ff94a$var$_nextTick(function() {\n document.selection.empty();\n });\n else window.getSelection().removeAllRanges();\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n $2c4dfe5b2b5ff94a$var$awaitingDragStarted = false;\n if ($2c4dfe5b2b5ff94a$var$rootEl && $2c4dfe5b2b5ff94a$var$dragEl) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"dragStarted\", this, {\n evt: evt\n });\n if (this.nativeDraggable) $2c4dfe5b2b5ff94a$var$on(document, \"dragover\", $2c4dfe5b2b5ff94a$var$_checkOutsideTargetEl);\n var options = this.options;\n // Apply effect\n !fallback && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.dragClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.ghostClass, true);\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active = this;\n fallback && this._appendGhost();\n // Drag start event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"start\",\n originalEvent: evt\n });\n } else this._nulling();\n },\n _emulateDragOver: function _emulateDragOver() {\n if ($2c4dfe5b2b5ff94a$var$touchEvt) {\n this._lastX = $2c4dfe5b2b5ff94a$var$touchEvt.clientX;\n this._lastY = $2c4dfe5b2b5ff94a$var$touchEvt.clientY;\n $2c4dfe5b2b5ff94a$var$_hideGhostForTarget();\n var target = document.elementFromPoint($2c4dfe5b2b5ff94a$var$touchEvt.clientX, $2c4dfe5b2b5ff94a$var$touchEvt.clientY);\n var parent = target;\n while(target && target.shadowRoot){\n target = target.shadowRoot.elementFromPoint($2c4dfe5b2b5ff94a$var$touchEvt.clientX, $2c4dfe5b2b5ff94a$var$touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n $2c4dfe5b2b5ff94a$var$dragEl.parentNode[$2c4dfe5b2b5ff94a$var$expando]._isOutsideThisEl(target);\n if (parent) do {\n if (parent[$2c4dfe5b2b5ff94a$var$expando]) {\n var inserted = void 0;\n inserted = parent[$2c4dfe5b2b5ff94a$var$expando]._onDragOver({\n clientX: $2c4dfe5b2b5ff94a$var$touchEvt.clientX,\n clientY: $2c4dfe5b2b5ff94a$var$touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) break;\n }\n target = parent; // store last element\n }while (parent = parent.parentNode);\n $2c4dfe5b2b5ff94a$var$_unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(/**TouchEvent*/ evt) {\n if ($2c4dfe5b2b5ff94a$var$tapEvt) {\n var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = $2c4dfe5b2b5ff94a$var$ghostEl && $2c4dfe5b2b5ff94a$var$matrix($2c4dfe5b2b5ff94a$var$ghostEl, true), scaleX = $2c4dfe5b2b5ff94a$var$ghostEl && ghostMatrix && ghostMatrix.a, scaleY = $2c4dfe5b2b5ff94a$var$ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely && $2c4dfe5b2b5ff94a$var$ghostRelativeParent && $2c4dfe5b2b5ff94a$var$getRelativeScrollOffset($2c4dfe5b2b5ff94a$var$ghostRelativeParent), dx = (touch.clientX - $2c4dfe5b2b5ff94a$var$tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - $2c4dfe5b2b5ff94a$var$tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n // only set the status to dragging, when we are actually dragging\n if (!$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active && !$2c4dfe5b2b5ff94a$var$awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) return;\n this._onDragStart(evt, true);\n }\n if ($2c4dfe5b2b5ff94a$var$ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - ($2c4dfe5b2b5ff94a$var$lastDx || 0);\n ghostMatrix.f += dy - ($2c4dfe5b2b5ff94a$var$lastDy || 0);\n } else ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"webkitTransform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"mozTransform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"msTransform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$lastDx = dx;\n $2c4dfe5b2b5ff94a$var$lastDy = dy;\n $2c4dfe5b2b5ff94a$var$touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!$2c4dfe5b2b5ff94a$var$ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : $2c4dfe5b2b5ff94a$var$rootEl, rect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl, true, $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely, true, container), options = this.options;\n // Position absolutely\n if ($2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely) {\n // Get relatively positioned parent\n $2c4dfe5b2b5ff94a$var$ghostRelativeParent = container;\n while($2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostRelativeParent, \"position\") === \"static\" && $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostRelativeParent, \"transform\") === \"none\" && $2c4dfe5b2b5ff94a$var$ghostRelativeParent !== document)$2c4dfe5b2b5ff94a$var$ghostRelativeParent = $2c4dfe5b2b5ff94a$var$ghostRelativeParent.parentNode;\n if ($2c4dfe5b2b5ff94a$var$ghostRelativeParent !== document.body && $2c4dfe5b2b5ff94a$var$ghostRelativeParent !== document.documentElement) {\n if ($2c4dfe5b2b5ff94a$var$ghostRelativeParent === document) $2c4dfe5b2b5ff94a$var$ghostRelativeParent = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n rect.top += $2c4dfe5b2b5ff94a$var$ghostRelativeParent.scrollTop;\n rect.left += $2c4dfe5b2b5ff94a$var$ghostRelativeParent.scrollLeft;\n } else $2c4dfe5b2b5ff94a$var$ghostRelativeParent = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll = $2c4dfe5b2b5ff94a$var$getRelativeScrollOffset($2c4dfe5b2b5ff94a$var$ghostRelativeParent);\n }\n $2c4dfe5b2b5ff94a$var$ghostEl = $2c4dfe5b2b5ff94a$var$dragEl.cloneNode(true);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$ghostEl, options.ghostClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$ghostEl, options.fallbackClass, true);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$ghostEl, options.dragClass, true);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transition\", \"\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transform\", \"\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"box-sizing\", \"border-box\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"margin\", 0);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"top\", rect.top);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"left\", rect.left);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"width\", rect.width);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"height\", rect.height);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"opacity\", \"0.8\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"position\", $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely ? \"absolute\" : \"fixed\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"zIndex\", \"100000\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"pointerEvents\", \"none\");\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost = $2c4dfe5b2b5ff94a$var$ghostEl;\n container.appendChild($2c4dfe5b2b5ff94a$var$ghostEl);\n // Set transform-origin\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transform-origin\", $2c4dfe5b2b5ff94a$var$tapDistanceLeft / parseInt($2c4dfe5b2b5ff94a$var$ghostEl.style.width) * 100 + \"% \" + $2c4dfe5b2b5ff94a$var$tapDistanceTop / parseInt($2c4dfe5b2b5ff94a$var$ghostEl.style.height) * 100 + \"%\");\n }\n },\n _onDragStart: function _onDragStart(/**Event*/ evt, /**boolean*/ fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"dragStart\", this, {\n evt: evt\n });\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"setupClone\", this);\n if (!$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n $2c4dfe5b2b5ff94a$var$cloneEl = $2c4dfe5b2b5ff94a$var$clone($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$cloneEl.removeAttribute(\"id\");\n $2c4dfe5b2b5ff94a$var$cloneEl.draggable = false;\n $2c4dfe5b2b5ff94a$var$cloneEl.style[\"will-change\"] = \"\";\n this._hideClone();\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$cloneEl, this.options.chosenClass, false);\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.clone = $2c4dfe5b2b5ff94a$var$cloneEl;\n }\n // #1143: IFrame support workaround\n _this.cloneId = $2c4dfe5b2b5ff94a$var$_nextTick(function() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"clone\", _this);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$dragEl);\n _this._hideClone();\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n name: \"clone\"\n });\n });\n !fallback && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.dragClass, true);\n // Set proper drop events\n if (fallback) {\n $2c4dfe5b2b5ff94a$var$ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n $2c4dfe5b2b5ff94a$var$off(document, \"mouseup\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchend\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchcancel\", _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = \"move\";\n options.setData && options.setData.call(_this, dataTransfer, $2c4dfe5b2b5ff94a$var$dragEl);\n }\n $2c4dfe5b2b5ff94a$var$on(document, \"drop\", _this);\n // #1276 fix:\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$dragEl, \"transform\", \"translateZ(0)\");\n }\n $2c4dfe5b2b5ff94a$var$awaitingDragStarted = true;\n _this._dragStartId = $2c4dfe5b2b5ff94a$var$_nextTick(_this._dragStarted.bind(_this, fallback, evt));\n $2c4dfe5b2b5ff94a$var$on(document, \"selectstart\", _this);\n $2c4dfe5b2b5ff94a$var$moved = true;\n if ($2c4dfe5b2b5ff94a$var$Safari) $2c4dfe5b2b5ff94a$var$css(document.body, \"user-select\", \"none\");\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(/**Event*/ evt) {\n var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active, isOwner = $2c4dfe5b2b5ff94a$var$activeGroup === group, canSort = options.sort, fromSortable = $2c4dfe5b2b5ff94a$var$putSortable || activeSortable, vertical, _this = this, completedFired = false;\n if ($2c4dfe5b2b5ff94a$var$_silent) return;\n function dragOverEvent(name, extra) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(name, _this, $2c4dfe5b2b5ff94a$var$_objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? \"vertical\" : \"horizontal\",\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return $2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, $2c4dfe5b2b5ff94a$var$getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n // Capture animation state\n function capture() {\n dragOverEvent(\"dragOverAnimationCapture\");\n _this.captureAnimationState();\n if (_this !== fromSortable) fromSortable.captureAnimationState();\n }\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent(\"dragOverCompleted\", {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n else activeSortable._showClone(_this);\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$putSortable ? $2c4dfe5b2b5ff94a$var$putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.ghostClass, true);\n }\n if ($2c4dfe5b2b5ff94a$var$putSortable !== _this && _this !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active) $2c4dfe5b2b5ff94a$var$putSortable = _this;\n else if (_this === $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active && $2c4dfe5b2b5ff94a$var$putSortable) $2c4dfe5b2b5ff94a$var$putSortable = null;\n // Animation\n if (fromSortable === _this) _this._ignoreWhileAnimating = target;\n _this.animateAll(function() {\n dragOverEvent(\"dragOverAnimationComplete\");\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n // Null lastTarget if it is not inside a previously swapped element\n if (target === $2c4dfe5b2b5ff94a$var$dragEl && !$2c4dfe5b2b5ff94a$var$dragEl.animated || target === el && !target.animated) $2c4dfe5b2b5ff94a$var$lastTarget = null;\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n $2c4dfe5b2b5ff94a$var$dragEl.parentNode[$2c4dfe5b2b5ff94a$var$expando]._isOutsideThisEl(evt.target);\n // Do not detect for empty insert if already inserted\n !insertion && $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n // Call when dragEl has been inserted\n function changed() {\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl, options.draggable);\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n name: \"change\",\n toEl: el,\n newIndex: $2c4dfe5b2b5ff94a$var$newIndex,\n newDraggableIndex: $2c4dfe5b2b5ff94a$var$newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) evt.cancelable && evt.preventDefault();\n target = $2c4dfe5b2b5ff94a$var$closest(target, options.draggable, el, true);\n dragOverEvent(\"dragOver\");\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if ($2c4dfe5b2b5ff94a$var$dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) return completed(false);\n $2c4dfe5b2b5ff94a$var$ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = $2c4dfe5b2b5ff94a$var$parentEl !== $2c4dfe5b2b5ff94a$var$rootEl // Reverting item into the original list\n ) : $2c4dfe5b2b5ff94a$var$putSortable === this || (this.lastPutMode = $2c4dfe5b2b5ff94a$var$activeGroup.checkPull(this, activeSortable, $2c4dfe5b2b5ff94a$var$dragEl, evt)) && group.checkPut(this, activeSortable, $2c4dfe5b2b5ff94a$var$dragEl, evt))) {\n vertical = this._getDirection(evt, target) === \"vertical\";\n dragRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl);\n dragOverEvent(\"dragOverValid\");\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if (revert) {\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent(\"revert\");\n if (!$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n if ($2c4dfe5b2b5ff94a$var$nextEl) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$nextEl);\n else $2c4dfe5b2b5ff94a$var$rootEl.appendChild($2c4dfe5b2b5ff94a$var$dragEl);\n }\n return completed(true);\n }\n var elLastChild = $2c4dfe5b2b5ff94a$var$lastChild(el, options.draggable);\n if (!elLastChild || $2c4dfe5b2b5ff94a$var$_ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === $2c4dfe5b2b5ff94a$var$dragEl) return completed(false);\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) target = elLastChild;\n if (target) targetRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n if ($2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) // the last draggable element is not the last node\n el.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, elLastChild.nextSibling);\n else el.appendChild($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (elLastChild && $2c4dfe5b2b5ff94a$var$_ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = $2c4dfe5b2b5ff94a$var$getChild(el, 0, options, true);\n if (firstChild === $2c4dfe5b2b5ff94a$var$dragEl) return completed(false);\n target = firstChild;\n targetRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n if ($2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, firstChild);\n $2c4dfe5b2b5ff94a$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n var direction = 0, targetBeforeFirstSwap, differentLevel = $2c4dfe5b2b5ff94a$var$dragEl.parentNode !== el, differentRowCol = !$2c4dfe5b2b5ff94a$var$_dragElInRowColumn($2c4dfe5b2b5ff94a$var$dragEl.animated && $2c4dfe5b2b5ff94a$var$dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? \"top\" : \"left\", scrolledPastTop = $2c4dfe5b2b5ff94a$var$isScrolledPast(target, \"top\", \"top\") || $2c4dfe5b2b5ff94a$var$isScrolledPast($2c4dfe5b2b5ff94a$var$dragEl, \"top\", \"top\"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if ($2c4dfe5b2b5ff94a$var$lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = false;\n $2c4dfe5b2b5ff94a$var$isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = $2c4dfe5b2b5ff94a$var$_getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, $2c4dfe5b2b5ff94a$var$isCircumstantialInvert, $2c4dfe5b2b5ff94a$var$lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n do {\n dragIndex -= direction;\n sibling = $2c4dfe5b2b5ff94a$var$parentEl.children[dragIndex];\n }while (sibling && ($2c4dfe5b2b5ff94a$var$css(sibling, \"display\") === \"none\" || sibling === $2c4dfe5b2b5ff94a$var$ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) return completed(false);\n $2c4dfe5b2b5ff94a$var$lastTarget = target;\n $2c4dfe5b2b5ff94a$var$lastDirection = direction;\n var nextSibling = target.nextElementSibling, after = false;\n after = direction === 1;\n var moveVector = $2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) after = moveVector === 1;\n $2c4dfe5b2b5ff94a$var$_silent = true;\n setTimeout($2c4dfe5b2b5ff94a$var$_unsilent, 30);\n capture();\n if (after && !nextSibling) el.appendChild($2c4dfe5b2b5ff94a$var$dragEl);\n else target.parentNode.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, after ? nextSibling : target);\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) $2c4dfe5b2b5ff94a$var$scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$dragEl.parentNode; // actualization\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !$2c4dfe5b2b5ff94a$var$isCircumstantialInvert) $2c4dfe5b2b5ff94a$var$targetMoveDistance = Math.abs(targetBeforeFirstSwap - $2c4dfe5b2b5ff94a$var$getRect(target)[side1]);\n changed();\n return completed(true);\n }\n }\n if (el.contains($2c4dfe5b2b5ff94a$var$dragEl)) return completed(false);\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n $2c4dfe5b2b5ff94a$var$off(document, \"mousemove\", this._onTouchMove);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchmove\", this._onTouchMove);\n $2c4dfe5b2b5ff94a$var$off(document, \"pointermove\", this._onTouchMove);\n $2c4dfe5b2b5ff94a$var$off(document, \"dragover\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$off(document, \"mousemove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchmove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"mouseup\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchend\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"pointerup\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchcancel\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(document, \"selectstart\", this);\n },\n _onDrop: function _onDrop(/**Event*/ evt) {\n var el = this.el, options = this.options;\n // Get the index of the dragged element within its parent\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl, options.draggable);\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"drop\", this, {\n evt: evt\n });\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$dragEl && $2c4dfe5b2b5ff94a$var$dragEl.parentNode;\n // Get again after plugin event\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl, options.draggable);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n this._nulling();\n return;\n }\n $2c4dfe5b2b5ff94a$var$awaitingDragStarted = false;\n $2c4dfe5b2b5ff94a$var$isCircumstantialInvert = false;\n $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n $2c4dfe5b2b5ff94a$var$_cancelNextTick(this.cloneId);\n $2c4dfe5b2b5ff94a$var$_cancelNextTick(this._dragStartId);\n // Unbind events\n if (this.nativeDraggable) {\n $2c4dfe5b2b5ff94a$var$off(document, \"drop\", this);\n $2c4dfe5b2b5ff94a$var$off(el, \"dragstart\", this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if ($2c4dfe5b2b5ff94a$var$Safari) $2c4dfe5b2b5ff94a$var$css(document.body, \"user-select\", \"\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$dragEl, \"transform\", \"\");\n if (evt) {\n if ($2c4dfe5b2b5ff94a$var$moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n $2c4dfe5b2b5ff94a$var$ghostEl && $2c4dfe5b2b5ff94a$var$ghostEl.parentNode && $2c4dfe5b2b5ff94a$var$ghostEl.parentNode.removeChild($2c4dfe5b2b5ff94a$var$ghostEl);\n if ($2c4dfe5b2b5ff94a$var$rootEl === $2c4dfe5b2b5ff94a$var$parentEl || $2c4dfe5b2b5ff94a$var$putSortable && $2c4dfe5b2b5ff94a$var$putSortable.lastPutMode !== \"clone\") // Remove clone(s)\n $2c4dfe5b2b5ff94a$var$cloneEl && $2c4dfe5b2b5ff94a$var$cloneEl.parentNode && $2c4dfe5b2b5ff94a$var$cloneEl.parentNode.removeChild($2c4dfe5b2b5ff94a$var$cloneEl);\n if ($2c4dfe5b2b5ff94a$var$dragEl) {\n if (this.nativeDraggable) $2c4dfe5b2b5ff94a$var$off($2c4dfe5b2b5ff94a$var$dragEl, \"dragend\", this);\n $2c4dfe5b2b5ff94a$var$_disableDraggable($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$dragEl.style[\"will-change\"] = \"\";\n // Remove classes\n // ghostClass is added in dragStarted\n if ($2c4dfe5b2b5ff94a$var$moved && !$2c4dfe5b2b5ff94a$var$awaitingDragStarted) $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$putSortable ? $2c4dfe5b2b5ff94a$var$putSortable.options.ghostClass : this.options.ghostClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, this.options.chosenClass, false);\n // Drag stop event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"unchoose\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if ($2c4dfe5b2b5ff94a$var$rootEl !== $2c4dfe5b2b5ff94a$var$parentEl) {\n if ($2c4dfe5b2b5ff94a$var$newIndex >= 0) {\n // Add event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n rootEl: $2c4dfe5b2b5ff94a$var$parentEl,\n name: \"add\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n fromEl: $2c4dfe5b2b5ff94a$var$rootEl,\n originalEvent: evt\n });\n // Remove event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"remove\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n // drag from one list and drop into another\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n rootEl: $2c4dfe5b2b5ff94a$var$parentEl,\n name: \"sort\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n fromEl: $2c4dfe5b2b5ff94a$var$rootEl,\n originalEvent: evt\n });\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n }\n $2c4dfe5b2b5ff94a$var$putSortable && $2c4dfe5b2b5ff94a$var$putSortable.save();\n } else {\n if ($2c4dfe5b2b5ff94a$var$newIndex !== $2c4dfe5b2b5ff94a$var$oldIndex) {\n if ($2c4dfe5b2b5ff94a$var$newIndex >= 0) {\n // drag & drop within the same list\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"update\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active) {\n /* jshint eqnull:true */ if ($2c4dfe5b2b5ff94a$var$newIndex == null || $2c4dfe5b2b5ff94a$var$newIndex === -1) {\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$oldIndex;\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$oldDraggableIndex;\n }\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"end\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"nulling\", this);\n $2c4dfe5b2b5ff94a$var$rootEl = $2c4dfe5b2b5ff94a$var$dragEl = $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$ghostEl = $2c4dfe5b2b5ff94a$var$nextEl = $2c4dfe5b2b5ff94a$var$cloneEl = $2c4dfe5b2b5ff94a$var$lastDownEl = $2c4dfe5b2b5ff94a$var$cloneHidden = $2c4dfe5b2b5ff94a$var$tapEvt = $2c4dfe5b2b5ff94a$var$touchEvt = $2c4dfe5b2b5ff94a$var$moved = $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$oldIndex = $2c4dfe5b2b5ff94a$var$oldDraggableIndex = $2c4dfe5b2b5ff94a$var$lastTarget = $2c4dfe5b2b5ff94a$var$lastDirection = $2c4dfe5b2b5ff94a$var$putSortable = $2c4dfe5b2b5ff94a$var$activeGroup = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.clone = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active = null;\n $2c4dfe5b2b5ff94a$var$savedInputChecked.forEach(function(el) {\n el.checked = true;\n });\n $2c4dfe5b2b5ff94a$var$savedInputChecked.length = $2c4dfe5b2b5ff94a$var$lastDx = $2c4dfe5b2b5ff94a$var$lastDy = 0;\n },\n handleEvent: function handleEvent(/**Event*/ evt) {\n switch(evt.type){\n case \"drop\":\n case \"dragend\":\n this._onDrop(evt);\n break;\n case \"dragenter\":\n case \"dragover\":\n if ($2c4dfe5b2b5ff94a$var$dragEl) {\n this._onDragOver(evt);\n $2c4dfe5b2b5ff94a$var$_globalDragOver(evt);\n }\n break;\n case \"selectstart\":\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */ toArray: function toArray() {\n var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;\n for(; i < n; i++){\n el = children[i];\n if ($2c4dfe5b2b5ff94a$var$closest(el, options.draggable, this.el, false)) order.push(el.getAttribute(options.dataIdAttr) || $2c4dfe5b2b5ff94a$var$_generateId(el));\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */ sort: function sort(order, useAnimation) {\n var items = {}, rootEl = this.el;\n this.toArray().forEach(function(id, i) {\n var el = rootEl.children[i];\n if ($2c4dfe5b2b5ff94a$var$closest(el, this.options.draggable, rootEl, false)) items[id] = el;\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function(id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */ save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */ closest: function closest$1(el, selector) {\n return $2c4dfe5b2b5ff94a$var$closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */ option: function option(name, value) {\n var options = this.options;\n if (value === void 0) return options[name];\n else {\n var modifiedValue = $2c4dfe5b2b5ff94a$var$PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== \"undefined\") options[name] = modifiedValue;\n else options[name] = value;\n if (name === \"group\") $2c4dfe5b2b5ff94a$var$_prepareGroup(options);\n }\n },\n /**\r\n * Destroy\r\n */ destroy: function destroy() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"destroy\", this);\n var el = this.el;\n el[$2c4dfe5b2b5ff94a$var$expando] = null;\n $2c4dfe5b2b5ff94a$var$off(el, \"mousedown\", this._onTapStart);\n $2c4dfe5b2b5ff94a$var$off(el, \"touchstart\", this._onTapStart);\n $2c4dfe5b2b5ff94a$var$off(el, \"pointerdown\", this._onTapStart);\n if (this.nativeDraggable) {\n $2c4dfe5b2b5ff94a$var$off(el, \"dragover\", this);\n $2c4dfe5b2b5ff94a$var$off(el, \"dragenter\", this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll(\"[draggable]\"), function(el) {\n el.removeAttribute(\"draggable\");\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n $2c4dfe5b2b5ff94a$var$sortables.splice($2c4dfe5b2b5ff94a$var$sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!$2c4dfe5b2b5ff94a$var$cloneHidden) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"hideClone\", this);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return;\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$cloneEl, \"display\", \"none\");\n if (this.options.removeCloneOnHide && $2c4dfe5b2b5ff94a$var$cloneEl.parentNode) $2c4dfe5b2b5ff94a$var$cloneEl.parentNode.removeChild($2c4dfe5b2b5ff94a$var$cloneEl);\n $2c4dfe5b2b5ff94a$var$cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== \"clone\") {\n this._hideClone();\n return;\n }\n if ($2c4dfe5b2b5ff94a$var$cloneHidden) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"showClone\", this);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return;\n // show clone at dragEl or original position\n if ($2c4dfe5b2b5ff94a$var$dragEl.parentNode == $2c4dfe5b2b5ff94a$var$rootEl && !this.options.group.revertClone) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$dragEl);\n else if ($2c4dfe5b2b5ff94a$var$nextEl) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$nextEl);\n else $2c4dfe5b2b5ff94a$var$rootEl.appendChild($2c4dfe5b2b5ff94a$var$cloneEl);\n if (this.options.group.revertClone) this.animate($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$cloneEl);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$cloneEl, \"display\", \"\");\n $2c4dfe5b2b5ff94a$var$cloneHidden = false;\n }\n }\n};\nfunction $2c4dfe5b2b5ff94a$var$_globalDragOver(/**Event*/ evt) {\n if (evt.dataTransfer) evt.dataTransfer.dropEffect = \"move\";\n evt.cancelable && evt.preventDefault();\n}\nfunction $2c4dfe5b2b5ff94a$var$_onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt, sortable = fromEl[$2c4dfe5b2b5ff94a$var$expando], onMoveFn = sortable.options.onMove, retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$2c4dfe5b2b5ff94a$var$IE11OrLess && !$2c4dfe5b2b5ff94a$var$Edge) evt = new CustomEvent(\"move\", {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(\"move\", true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || $2c4dfe5b2b5ff94a$var$getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) retVal = onMoveFn.call(sortable, evt, originalEvent);\n return retVal;\n}\nfunction $2c4dfe5b2b5ff94a$var$_disableDraggable(el) {\n el.draggable = false;\n}\nfunction $2c4dfe5b2b5ff94a$var$_unsilent() {\n $2c4dfe5b2b5ff94a$var$_silent = false;\n}\nfunction $2c4dfe5b2b5ff94a$var$_ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = $2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement(sortable.el, sortable.options, $2c4dfe5b2b5ff94a$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction $2c4dfe5b2b5ff94a$var$_ghostIsLast(evt, vertical, sortable) {\n var lastElRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = $2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement(sortable.el, sortable.options, $2c4dfe5b2b5ff94a$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction $2c4dfe5b2b5ff94a$var$_getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && $2c4dfe5b2b5ff94a$var$targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!$2c4dfe5b2b5ff94a$var$pastFirstInvertThresh && ($2c4dfe5b2b5ff94a$var$lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = true;\n if (!$2c4dfe5b2b5ff94a$var$pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if ($2c4dfe5b2b5ff94a$var$lastDirection === 1 ? mouseOnAxis < targetS1 + $2c4dfe5b2b5ff94a$var$targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - $2c4dfe5b2b5ff94a$var$targetMoveDistance) return -$2c4dfe5b2b5ff94a$var$lastDirection;\n } else invert = true;\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) return $2c4dfe5b2b5ff94a$var$_getInsertDirection(target);\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n return 0;\n}\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */ function $2c4dfe5b2b5ff94a$var$_getInsertDirection(target) {\n if ($2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl) < $2c4dfe5b2b5ff94a$var$index(target)) return 1;\n else return -1;\n}\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */ function $2c4dfe5b2b5ff94a$var$_generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;\n while(i--)sum += str.charCodeAt(i);\n return sum.toString(36);\n}\nfunction $2c4dfe5b2b5ff94a$var$_saveInputCheckedState(root) {\n $2c4dfe5b2b5ff94a$var$savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName(\"input\");\n var idx = inputs.length;\n while(idx--){\n var el = inputs[idx];\n el.checked && $2c4dfe5b2b5ff94a$var$savedInputChecked.push(el);\n }\n}\nfunction $2c4dfe5b2b5ff94a$var$_nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction $2c4dfe5b2b5ff94a$var$_cancelNextTick(id) {\n return clearTimeout(id);\n}\n// Fixed #973:\nif ($2c4dfe5b2b5ff94a$var$documentExists) $2c4dfe5b2b5ff94a$var$on(document, \"touchmove\", function(evt) {\n if (($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active || $2c4dfe5b2b5ff94a$var$awaitingDragStarted) && evt.cancelable) evt.preventDefault();\n});\n// Export utils\n$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.utils = {\n on: $2c4dfe5b2b5ff94a$var$on,\n off: $2c4dfe5b2b5ff94a$var$off,\n css: $2c4dfe5b2b5ff94a$var$css,\n find: $2c4dfe5b2b5ff94a$var$find,\n is: function is(el, selector) {\n return !!$2c4dfe5b2b5ff94a$var$closest(el, selector, el, false);\n },\n extend: $2c4dfe5b2b5ff94a$var$extend,\n throttle: $2c4dfe5b2b5ff94a$var$throttle,\n closest: $2c4dfe5b2b5ff94a$var$closest,\n toggleClass: $2c4dfe5b2b5ff94a$var$toggleClass,\n clone: $2c4dfe5b2b5ff94a$var$clone,\n index: $2c4dfe5b2b5ff94a$var$index,\n nextTick: $2c4dfe5b2b5ff94a$var$_nextTick,\n cancelNextTick: $2c4dfe5b2b5ff94a$var$_cancelNextTick,\n detectDirection: $2c4dfe5b2b5ff94a$var$_detectDirection,\n getChild: $2c4dfe5b2b5ff94a$var$getChild\n};\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */ $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.get = function(element) {\n return element[$2c4dfe5b2b5ff94a$var$expando];\n};\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */ $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.mount = function() {\n for(var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++)plugins[_key] = arguments[_key];\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function(plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) throw \"Sortable: Mounted plugin must be a constructor function, not \".concat(({}).toString.call(plugin));\n if (plugin.utils) $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.utils = $2c4dfe5b2b5ff94a$var$_objectSpread2($2c4dfe5b2b5ff94a$var$_objectSpread2({}, $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.utils), plugin.utils);\n $2c4dfe5b2b5ff94a$var$PluginManager.mount(plugin);\n });\n};\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.create = function(el, options) {\n return new $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423(el, options);\n};\n// Export\n$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.version = $2c4dfe5b2b5ff94a$var$version;\nvar $2c4dfe5b2b5ff94a$var$autoScrolls = [], $2c4dfe5b2b5ff94a$var$scrollEl, $2c4dfe5b2b5ff94a$var$scrollRootEl, $2c4dfe5b2b5ff94a$var$scrolling = false, $2c4dfe5b2b5ff94a$var$lastAutoScrollX, $2c4dfe5b2b5ff94a$var$lastAutoScrollY, $2c4dfe5b2b5ff94a$var$touchEvt$1, $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval;\nfunction $2c4dfe5b2b5ff94a$export$3fb39aee5567f02e() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) $2c4dfe5b2b5ff94a$var$on(document, \"dragover\", this._handleAutoScroll);\n else {\n if (this.options.supportPointer) $2c4dfe5b2b5ff94a$var$on(document, \"pointermove\", this._handleFallbackAutoScroll);\n else if (originalEvent.touches) $2c4dfe5b2b5ff94a$var$on(document, \"touchmove\", this._handleFallbackAutoScroll);\n else $2c4dfe5b2b5ff94a$var$on(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) this._handleAutoScroll(originalEvent);\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) $2c4dfe5b2b5ff94a$var$off(document, \"dragover\", this._handleAutoScroll);\n else {\n $2c4dfe5b2b5ff94a$var$off(document, \"pointermove\", this._handleFallbackAutoScroll);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchmove\", this._handleFallbackAutoScroll);\n $2c4dfe5b2b5ff94a$var$off(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n $2c4dfe5b2b5ff94a$var$clearPointerElemChangedInterval();\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n $2c4dfe5b2b5ff94a$var$cancelThrottle();\n },\n nulling: function nulling() {\n $2c4dfe5b2b5ff94a$var$touchEvt$1 = $2c4dfe5b2b5ff94a$var$scrollRootEl = $2c4dfe5b2b5ff94a$var$scrollEl = $2c4dfe5b2b5ff94a$var$scrolling = $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval = $2c4dfe5b2b5ff94a$var$lastAutoScrollX = $2c4dfe5b2b5ff94a$var$lastAutoScrollY = null;\n $2c4dfe5b2b5ff94a$var$autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y);\n $2c4dfe5b2b5ff94a$var$touchEvt$1 = evt;\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || $2c4dfe5b2b5ff94a$var$Edge || $2c4dfe5b2b5ff94a$var$IE11OrLess || $2c4dfe5b2b5ff94a$var$Safari) {\n $2c4dfe5b2b5ff94a$var$autoScroll(evt, this.options, elem, fallback);\n // Listener for pointer element change\n var ogElemScroller = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(elem, true);\n if ($2c4dfe5b2b5ff94a$var$scrolling && (!$2c4dfe5b2b5ff94a$var$pointerElemChangedInterval || x !== $2c4dfe5b2b5ff94a$var$lastAutoScrollX || y !== $2c4dfe5b2b5ff94a$var$lastAutoScrollY)) {\n $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval && $2c4dfe5b2b5ff94a$var$clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval = setInterval(function() {\n var newElem = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n }\n $2c4dfe5b2b5ff94a$var$autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n $2c4dfe5b2b5ff94a$var$lastAutoScrollX = x;\n $2c4dfe5b2b5ff94a$var$lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(elem, true) === $2c4dfe5b2b5ff94a$var$getWindowScrollingElement()) {\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n return;\n }\n $2c4dfe5b2b5ff94a$var$autoScroll(evt, this.options, $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return $2c4dfe5b2b5ff94a$var$_extends(AutoScroll, {\n pluginName: \"scroll\",\n initializeByDefault: true\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$clearAutoScrolls() {\n $2c4dfe5b2b5ff94a$var$autoScrolls.forEach(function(autoScroll) {\n clearInterval(autoScroll.pid);\n });\n $2c4dfe5b2b5ff94a$var$autoScrolls = [];\n}\nfunction $2c4dfe5b2b5ff94a$var$clearPointerElemChangedInterval() {\n clearInterval($2c4dfe5b2b5ff94a$var$pointerElemChangedInterval);\n}\nvar $2c4dfe5b2b5ff94a$var$autoScroll = $2c4dfe5b2b5ff94a$var$throttle(function(evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n var scrollThisInstance = false, scrollCustomFn;\n // New scroll root, set scrollEl\n if ($2c4dfe5b2b5ff94a$var$scrollRootEl !== rootEl) {\n $2c4dfe5b2b5ff94a$var$scrollRootEl = rootEl;\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n $2c4dfe5b2b5ff94a$var$scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if ($2c4dfe5b2b5ff94a$var$scrollEl === true) $2c4dfe5b2b5ff94a$var$scrollEl = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(rootEl, true);\n }\n var layersOut = 0;\n var currentParent = $2c4dfe5b2b5ff94a$var$scrollEl;\n do {\n var el = currentParent, rect = $2c4dfe5b2b5ff94a$var$getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = $2c4dfe5b2b5ff94a$var$css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\" || elCSS.overflowX === \"visible\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\" || elCSS.overflowY === \"visible\");\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\");\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!$2c4dfe5b2b5ff94a$var$autoScrolls[layersOut]) {\n for(var i = 0; i <= layersOut; i++)if (!$2c4dfe5b2b5ff94a$var$autoScrolls[i]) $2c4dfe5b2b5ff94a$var$autoScrolls[i] = {};\n }\n if ($2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vx != vx || $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vy != vy || $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].el !== el) {\n $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].el = el;\n $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vx = vx;\n $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vy = vy;\n clearInterval($2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */ $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].pid = setInterval((function() {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active._onTouchMove($2c4dfe5b2b5ff94a$var$touchEvt$1); // To move ghost if it is positioned absolutely\n var scrollOffsetY = $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vy ? $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vx ? $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === \"function\") {\n if (scrollCustomFn.call($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged.parentNode[$2c4dfe5b2b5ff94a$var$expando], scrollOffsetX, scrollOffsetY, evt, $2c4dfe5b2b5ff94a$var$touchEvt$1, $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].el) !== \"continue\") return;\n }\n $2c4dfe5b2b5ff94a$var$scrollBy($2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }).bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n }while (options.bubbleScroll && currentParent !== winScroller && (currentParent = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(currentParent, false)));\n $2c4dfe5b2b5ff94a$var$scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\nvar $2c4dfe5b2b5ff94a$var$drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, dragEl = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent(\"spill\");\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction $2c4dfe5b2b5ff94a$var$Revert() {}\n$2c4dfe5b2b5ff94a$var$Revert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl, putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) putSortable.captureAnimationState();\n var nextSibling = $2c4dfe5b2b5ff94a$var$getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) this.sortable.el.insertBefore(dragEl, nextSibling);\n else this.sortable.el.appendChild(dragEl);\n this.sortable.animateAll();\n if (putSortable) putSortable.animateAll();\n },\n drop: $2c4dfe5b2b5ff94a$var$drop\n};\n$2c4dfe5b2b5ff94a$var$_extends($2c4dfe5b2b5ff94a$var$Revert, {\n pluginName: \"revertOnSpill\"\n});\nfunction $2c4dfe5b2b5ff94a$var$Remove() {}\n$2c4dfe5b2b5ff94a$var$Remove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl, putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: $2c4dfe5b2b5ff94a$var$drop\n};\n$2c4dfe5b2b5ff94a$var$_extends($2c4dfe5b2b5ff94a$var$Remove, {\n pluginName: \"removeOnSpill\"\n});\nvar $2c4dfe5b2b5ff94a$export$55b3d9f7b2513474 = [\n $2c4dfe5b2b5ff94a$var$Remove,\n $2c4dfe5b2b5ff94a$var$Revert\n];\nvar $2c4dfe5b2b5ff94a$var$lastSwapEl;\nfunction $2c4dfe5b2b5ff94a$export$bdb5f0a1b77546f4() {\n function Swap() {\n this.defaults = {\n swapClass: \"sortable-swap-highlight\"\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n $2c4dfe5b2b5ff94a$var$lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed, target = _ref2.target, onMove = _ref2.onMove, activeSortable = _ref2.activeSortable, changed = _ref2.changed, cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el, options = this.options;\n if (target && target !== el) {\n var prevSwapEl = $2c4dfe5b2b5ff94a$var$lastSwapEl;\n if (onMove(target) !== false) {\n $2c4dfe5b2b5ff94a$var$toggleClass(target, options.swapClass, true);\n $2c4dfe5b2b5ff94a$var$lastSwapEl = target;\n } else $2c4dfe5b2b5ff94a$var$lastSwapEl = null;\n if (prevSwapEl && prevSwapEl !== $2c4dfe5b2b5ff94a$var$lastSwapEl) $2c4dfe5b2b5ff94a$var$toggleClass(prevSwapEl, options.swapClass, false);\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable, putSortable = _ref3.putSortable, dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n $2c4dfe5b2b5ff94a$var$lastSwapEl && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$lastSwapEl, options.swapClass, false);\n if ($2c4dfe5b2b5ff94a$var$lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== $2c4dfe5b2b5ff94a$var$lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n $2c4dfe5b2b5ff94a$var$swapNodes(dragEl, $2c4dfe5b2b5ff94a$var$lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n $2c4dfe5b2b5ff94a$var$lastSwapEl = null;\n }\n };\n return $2c4dfe5b2b5ff94a$var$_extends(Swap, {\n pluginName: \"swap\",\n eventProperties: function eventProperties() {\n return {\n swapItem: $2c4dfe5b2b5ff94a$var$lastSwapEl\n };\n }\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$swapNodes(n1, n2) {\n var p1 = n1.parentNode, p2 = n2.parentNode, i1, i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = $2c4dfe5b2b5ff94a$var$index(n1);\n i2 = $2c4dfe5b2b5ff94a$var$index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) i2++;\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\nvar $2c4dfe5b2b5ff94a$var$multiDragElements = [], $2c4dfe5b2b5ff94a$var$multiDragClones = [], $2c4dfe5b2b5ff94a$var$lastMultiDragSelect, // for selection with modifier key down (SHIFT)\n$2c4dfe5b2b5ff94a$var$multiDragSortable, $2c4dfe5b2b5ff94a$var$initialFolding = false, // Initial multi-drag fold when drag started\n$2c4dfe5b2b5ff94a$var$folding = false, // Folding any other time\n$2c4dfe5b2b5ff94a$var$dragStarted = false, $2c4dfe5b2b5ff94a$var$dragEl$1, $2c4dfe5b2b5ff94a$var$clonesFromRect, $2c4dfe5b2b5ff94a$var$clonesHidden;\nfunction $2c4dfe5b2b5ff94a$export$18e5d2a5d1df842d() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) $2c4dfe5b2b5ff94a$var$on(document, \"pointerup\", this._deselectMultiDrag);\n else {\n $2c4dfe5b2b5ff94a$var$on(document, \"mouseup\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$on(document, \"touchend\", this._deselectMultiDrag);\n }\n }\n $2c4dfe5b2b5ff94a$var$on(document, \"keydown\", this._checkKeyDown);\n $2c4dfe5b2b5ff94a$var$on(document, \"keyup\", this._checkKeyUp);\n this.defaults = {\n selectedClass: \"sortable-selected\",\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = \"\";\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length && $2c4dfe5b2b5ff94a$var$multiDragSortable === sortable) $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement, i) {\n data += (!i ? \"\" : \", \") + multiDragElement.textContent;\n });\n else data = dragEl.textContent;\n dataTransfer.setData(\"Text\", data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n $2c4dfe5b2b5ff94a$var$dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable, cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for(var i = 0; i < $2c4dfe5b2b5ff94a$var$multiDragElements.length; i++){\n $2c4dfe5b2b5ff94a$var$multiDragClones.push($2c4dfe5b2b5ff94a$var$clone($2c4dfe5b2b5ff94a$var$multiDragElements[i]));\n $2c4dfe5b2b5ff94a$var$multiDragClones[i].sortableIndex = $2c4dfe5b2b5ff94a$var$multiDragElements[i].sortableIndex;\n $2c4dfe5b2b5ff94a$var$multiDragClones[i].draggable = false;\n $2c4dfe5b2b5ff94a$var$multiDragClones[i].style[\"will-change\"] = \"\";\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$multiDragClones[i], this.options.selectedClass, false);\n $2c4dfe5b2b5ff94a$var$multiDragElements[i] === $2c4dfe5b2b5ff94a$var$dragEl$1 && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable, rootEl = _ref3.rootEl, dispatchSortableEvent = _ref3.dispatchSortableEvent, cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length && $2c4dfe5b2b5ff94a$var$multiDragSortable === sortable) {\n $2c4dfe5b2b5ff94a$var$insertMultiDragClones(true, rootEl);\n dispatchSortableEvent(\"clone\");\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown, rootEl = _ref4.rootEl, cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n $2c4dfe5b2b5ff94a$var$insertMultiDragClones(false, rootEl);\n $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n $2c4dfe5b2b5ff94a$var$css(clone, \"display\", \"\");\n });\n cloneNowShown();\n $2c4dfe5b2b5ff94a$var$clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable, cloneNowHidden = _ref5.cloneNowHidden, cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n $2c4dfe5b2b5ff94a$var$css(clone, \"display\", \"none\");\n if (_this.options.removeCloneOnHide && clone.parentNode) clone.parentNode.removeChild(clone);\n });\n cloneNowHidden();\n $2c4dfe5b2b5ff94a$var$clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && $2c4dfe5b2b5ff94a$var$multiDragSortable) $2c4dfe5b2b5ff94a$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.sortableIndex = $2c4dfe5b2b5ff94a$var$index(multiDragElement);\n });\n // Sort multi-drag elements\n $2c4dfe5b2b5ff94a$var$multiDragElements = $2c4dfe5b2b5ff94a$var$multiDragElements.sort(function(a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n $2c4dfe5b2b5ff94a$var$dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n if (this.options.animation) {\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n $2c4dfe5b2b5ff94a$var$css(multiDragElement, \"position\", \"absolute\");\n });\n var dragRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl$1, false, true, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n $2c4dfe5b2b5ff94a$var$setRect(multiDragElement, dragRect);\n });\n $2c4dfe5b2b5ff94a$var$folding = true;\n $2c4dfe5b2b5ff94a$var$initialFolding = true;\n }\n }\n sortable.animateAll(function() {\n $2c4dfe5b2b5ff94a$var$folding = false;\n $2c4dfe5b2b5ff94a$var$initialFolding = false;\n if (_this2.options.animation) $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n $2c4dfe5b2b5ff94a$var$unsetRect(multiDragElement);\n });\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target, completed = _ref8.completed, cancel = _ref8.cancel;\n if ($2c4dfe5b2b5ff94a$var$folding && ~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable, rootEl = _ref9.rootEl, sortable = _ref9.sortable, dragRect = _ref9.dragRect;\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length > 1) {\n // Setup unfold animation\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: $2c4dfe5b2b5ff94a$var$folding ? $2c4dfe5b2b5ff94a$var$getRect(multiDragElement) : dragRect\n });\n $2c4dfe5b2b5ff94a$var$unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n $2c4dfe5b2b5ff94a$var$folding = false;\n $2c4dfe5b2b5ff94a$var$insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable, isOwner = _ref10.isOwner, insertion = _ref10.insertion, activeSortable = _ref10.activeSortable, parentEl = _ref10.parentEl, putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n $2c4dfe5b2b5ff94a$var$initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && $2c4dfe5b2b5ff94a$var$multiDragElements.length > 1 && ($2c4dfe5b2b5ff94a$var$folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl$1, false, true, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n $2c4dfe5b2b5ff94a$var$setRect(multiDragElement, dragRectAbsolute);\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n $2c4dfe5b2b5ff94a$var$folding = true;\n }\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!$2c4dfe5b2b5ff94a$var$folding) $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length > 1) {\n var clonesHiddenBefore = $2c4dfe5b2b5ff94a$var$clonesHidden;\n activeSortable._showClone(sortable);\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !$2c4dfe5b2b5ff94a$var$clonesHidden && clonesHiddenBefore) $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: $2c4dfe5b2b5ff94a$var$clonesFromRect\n });\n clone.fromRect = $2c4dfe5b2b5ff94a$var$clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n } else activeSortable._showClone(sortable);\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect, isOwner = _ref11.isOwner, activeSortable = _ref11.activeSortable;\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n $2c4dfe5b2b5ff94a$var$clonesFromRect = $2c4dfe5b2b5ff94a$var$_extends({}, dragRect);\n var dragMatrix = $2c4dfe5b2b5ff94a$var$matrix($2c4dfe5b2b5ff94a$var$dragEl$1, true);\n $2c4dfe5b2b5ff94a$var$clonesFromRect.top -= dragMatrix.f;\n $2c4dfe5b2b5ff94a$var$clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if ($2c4dfe5b2b5ff94a$var$folding) {\n $2c4dfe5b2b5ff94a$var$folding = false;\n $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent, rootEl = _ref12.rootEl, parentEl = _ref12.parentEl, sortable = _ref12.sortable, dispatchSortableEvent = _ref12.dispatchSortableEvent, oldIndex = _ref12.oldIndex, putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options, children = parentEl.children;\n // Multi-drag selection\n if (!$2c4dfe5b2b5ff94a$var$dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) this._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl$1, options.selectedClass, !~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1));\n if (!~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1)) {\n $2c4dfe5b2b5ff94a$var$multiDragElements.push($2c4dfe5b2b5ff94a$var$dragEl$1);\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: $2c4dfe5b2b5ff94a$var$dragEl$1,\n originalEvent: evt\n });\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && $2c4dfe5b2b5ff94a$var$lastMultiDragSelect && sortable.el.contains($2c4dfe5b2b5ff94a$var$lastMultiDragSelect)) {\n var lastIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$lastMultiDragSelect), currentIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for(; i < n; i++){\n if (~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(children[i])) continue;\n $2c4dfe5b2b5ff94a$var$toggleClass(children[i], options.selectedClass, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.push(children[i]);\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else $2c4dfe5b2b5ff94a$var$lastMultiDragSelect = $2c4dfe5b2b5ff94a$var$dragEl$1;\n $2c4dfe5b2b5ff94a$var$multiDragSortable = toSortable;\n } else {\n $2c4dfe5b2b5ff94a$var$multiDragElements.splice($2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1), 1);\n $2c4dfe5b2b5ff94a$var$lastMultiDragSelect = null;\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"deselect\",\n targetEl: $2c4dfe5b2b5ff94a$var$dragEl$1,\n originalEvent: evt\n });\n }\n }\n // Multi-drag drop\n if ($2c4dfe5b2b5ff94a$var$dragStarted && this.isMultiDrag) {\n $2c4dfe5b2b5ff94a$var$folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[$2c4dfe5b2b5ff94a$var$expando].options.sort || parentEl !== rootEl) && $2c4dfe5b2b5ff94a$var$multiDragElements.length > 1) {\n var dragRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl$1), multiDragIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl$1, \":not(.\" + this.options.selectedClass + \")\");\n if (!$2c4dfe5b2b5ff94a$var$initialFolding && options.animation) $2c4dfe5b2b5ff94a$var$dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!$2c4dfe5b2b5ff94a$var$initialFolding) {\n if (options.animation) {\n $2c4dfe5b2b5ff94a$var$dragEl$1.fromRect = dragRect;\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== $2c4dfe5b2b5ff94a$var$dragEl$1) {\n var rect = $2c4dfe5b2b5ff94a$var$folding ? $2c4dfe5b2b5ff94a$var$getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (children[multiDragIndex]) parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n else parentEl.appendChild(multiDragElement);\n multiDragIndex++;\n });\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl$1)) {\n var update = false;\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement.sortableIndex !== $2c4dfe5b2b5ff94a$var$index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent(\"update\");\n dispatchSortableEvent(\"sort\");\n }\n }\n }\n // Must be done after capturing individual rects (scroll bar)\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n $2c4dfe5b2b5ff94a$var$unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n $2c4dfe5b2b5ff94a$var$multiDragSortable = toSortable;\n }\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== \"clone\") $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = $2c4dfe5b2b5ff94a$var$dragStarted = false;\n $2c4dfe5b2b5ff94a$var$multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$off(document, \"pointerup\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$off(document, \"mouseup\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchend\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$off(document, \"keydown\", this._checkKeyDown);\n $2c4dfe5b2b5ff94a$var$off(document, \"keyup\", this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof $2c4dfe5b2b5ff94a$var$dragStarted !== \"undefined\" && $2c4dfe5b2b5ff94a$var$dragStarted) return;\n // Only deselect if selection is in this sortable\n if ($2c4dfe5b2b5ff94a$var$multiDragSortable !== this.sortable) return;\n // Only deselect if target is not item in this sortable\n if (evt && $2c4dfe5b2b5ff94a$var$closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while($2c4dfe5b2b5ff94a$var$multiDragElements.length){\n var el = $2c4dfe5b2b5ff94a$var$multiDragElements[0];\n $2c4dfe5b2b5ff94a$var$toggleClass(el, this.options.selectedClass, false);\n $2c4dfe5b2b5ff94a$var$multiDragElements.shift();\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: \"deselect\",\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = true;\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = false;\n }\n };\n return $2c4dfe5b2b5ff94a$var$_extends(MultiDrag, {\n // Static methods & properties\n pluginName: \"multiDrag\",\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */ select: function select(el) {\n var sortable = el.parentNode[$2c4dfe5b2b5ff94a$var$expando];\n if (!sortable || !sortable.options.multiDrag || ~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(el)) return;\n if ($2c4dfe5b2b5ff94a$var$multiDragSortable && $2c4dfe5b2b5ff94a$var$multiDragSortable !== sortable) {\n $2c4dfe5b2b5ff94a$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$multiDragSortable = sortable;\n }\n $2c4dfe5b2b5ff94a$var$toggleClass(el, sortable.options.selectedClass, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */ deselect: function deselect(el) {\n var sortable = el.parentNode[$2c4dfe5b2b5ff94a$var$expando], index = $2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n $2c4dfe5b2b5ff94a$var$toggleClass(el, sortable.options.selectedClass, false);\n $2c4dfe5b2b5ff94a$var$multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [], newIndicies = [];\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n // multiDragElements will already be sorted if folding\n var newIndex;\n if ($2c4dfe5b2b5ff94a$var$folding && multiDragElement !== $2c4dfe5b2b5ff94a$var$dragEl$1) newIndex = -1;\n else if ($2c4dfe5b2b5ff94a$var$folding) newIndex = $2c4dfe5b2b5ff94a$var$index(multiDragElement, \":not(.\" + _this3.options.selectedClass + \")\");\n else newIndex = $2c4dfe5b2b5ff94a$var$index(multiDragElement);\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: $2c4dfe5b2b5ff94a$var$_toConsumableArray($2c4dfe5b2b5ff94a$var$multiDragElements),\n clones: [].concat($2c4dfe5b2b5ff94a$var$multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === \"ctrl\") key = \"Control\";\n else if (key.length > 1) key = key.charAt(0).toUpperCase() + key.substr(1);\n return key;\n }\n }\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$insertMultiDragElements(clonesInserted, rootEl) {\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(multiDragElement, target);\n else rootEl.appendChild(multiDragElement);\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */ function $2c4dfe5b2b5ff94a$var$insertMultiDragClones(elementsInserted, rootEl) {\n $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(clone, target);\n else rootEl.appendChild(clone);\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$removeMultiDragElements() {\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\nvar $2c4dfe5b2b5ff94a$export$2e2bcd8739ae039 = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423;\n\n\n\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */ const $4481690a5b2e12d6$export$61fc7d43ac8f84b0 = (fn, wait = 0, immediate = false)=>{\n let timerId = null;\n if (typeof fn !== \"function\") throw new TypeError(\"Expected a function for first argument\");\n return (...args)=>{\n clearTimeout(timerId);\n if (immediate && !timerId) fn(...args);\n timerId = setTimeout(()=>{\n timerId = null;\n if (!immediate) fn(...args);\n }, wait);\n };\n};\n\n\n\n\n\nconst $884937fee35c0707$var$template = document.createElement(\"template\");\n$884937fee35c0707$var$template.innerHTML = /* html */ `\n \n\n \n From file\n \n
\n \n Drag 'n' drop a file, or click to select file to import\n
\n (Only JSON files are allowed)\n
\n
\n
\n\n From text\n \n
\n \n \n
\n
\n
\n`;\nclass $884937fee35c0707$var$ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($884937fee35c0707$var$template.content.cloneNode(true));\n }\n this.#dropzoneEl = this.shadowRoot.querySelector(\"files-dropzone\");\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n }\n connectedCallback() {\n this.#dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n #handleFilesDropzoneDropAccepted = (evt)=>{\n const { acceptedFiles: acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n if (!file) return;\n const reader = new FileReader();\n reader.readAsText(file, \"utf-8\");\n reader.onload = this.#handleFileReaderLoad;\n };\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) return alert(\"Invalid file or no feeds found.\");\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n for (const feed of feedsToImport){\n const feedExists = Boolean(feeds.find((f)=>f.url === feed.url));\n const { url: url, title: title } = feed;\n const isValidURL = (0, $e998bc9dc264f90b$export$981c5d1bd3894713)(url);\n if (!feedExists && isValidURL) await (0, $bad480a01f35862b$export$4b77448646caf424)({\n url: url,\n title: title\n });\n }\n this.dispatchEvent(new Event(\"feeds-imported\", {\n bubbles: true,\n composed: true\n }));\n }\n #handleFileReaderLoad = async (evt)=>{\n try {\n const { result: result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert(\"The file is not valid.\");\n }\n };\n #handleImportFormSubmit = async (evt)=>{\n evt.preventDefault();\n const formData = new FormData(evt.target);\n const data = formData.get(\"import-data\");\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert(\"The data is not valid.\");\n }\n };\n}\nif (!window.customElements.get(\"import-feeds\")) window.customElements.define(\"import-feeds\", $884937fee35c0707$var$ImportFeeds);\n\n\nfunction $7a2aca835bb05064$export$c37129e465f64ef0(a) {\n return null !== a && \"object\" == typeof a ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\n\n\nconst $74fb585f2eaf8e2d$var$template = document.createElement(\"template\");\n$74fb585f2eaf8e2d$var$template.innerHTML = /* html */ `\n \n\n
\n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
\n\n
\n
\n
\n
\n
\n\n \n`;\nclass $74fb585f2eaf8e2d$var$ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($74fb585f2eaf8e2d$var$template.content.cloneNode(true));\n }\n this.#exportCodeEl = this.shadowRoot.getElementById(\"exportCode\");\n this.#clipboardCopyEl = this.shadowRoot.querySelector(\"clipboard-copy\");\n this.#webShareEl = this.shadowRoot.querySelector(\"web-share\");\n this.#downloadButton = this.shadowRoot.getElementById(\"downloadButton\");\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feeds\"\n ];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"feeds\" && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n connectedCallback() {\n this.#downloadButton.addEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n disconnectedCallback() {\n this.#downloadButton.removeEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n get feeds() {\n return this.getAttribute(\"feeds\");\n }\n set feeds(value) {\n this.setAttribute(\"feeds\", value);\n }\n #getFeedsToExportString() {\n let feedsToExport = \"\";\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n return feedsToExport;\n }\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([\n data\n ], {\n type: \"application/json\"\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n #handleDownloadButtonClick = async ()=>{\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n this.#exportFeeds(feeds);\n };\n}\nif (!window.customElements.get(\"export-feeds\")) window.customElements.define(\"export-feeds\", $74fb585f2eaf8e2d$var$ExportFeeds);\n\n\nconst $26a2e0c8216738ce$var$template = document.createElement(\"template\");\n$26a2e0c8216738ce$var$template.innerHTML = /* html */ `\n \n\n
\n
\n
\n \n \n \n \n \n\n \n\n \n
\n\n
\n \n\n \n\n \n
\n
\n\n
    \n
    \n\n
    \n

    \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

    \n\n

    \n \n

    \n
    \n\n \n

    Import feeds

    \n \n
    \n\n \n

    Export feeds

    \n \n
    \n`;\nclass $26a2e0c8216738ce$var$FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($26a2e0c8216738ce$var$template.content.cloneNode(true));\n }\n this.#isEditable = false;\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n this.#feedsContainerEl = this.shadowRoot.getElementById(\"feedsContainer\");\n this.#feedsListEl = this.shadowRoot.getElementById(\"feedsList\");\n this.#editBtn = this.shadowRoot.getElementById(\"editBtn\");\n this.#importBtn = this.shadowRoot.getElementById(\"importBtn\");\n this.#importAltBtn = this.shadowRoot.getElementById(\"importAltBtn\");\n this.#exportBtn = this.shadowRoot.getElementById(\"exportBtn\");\n this.#searchInput = this.shadowRoot.getElementById(\"searchInput\");\n this.#searchClearBtn = this.shadowRoot.getElementById(\"searchClearBtn\");\n this.#importDialog = this.shadowRoot.getElementById(\"importDialog\");\n this.#exportDialog = this.shadowRoot.getElementById(\"exportDialog\");\n this.#importFeedsEl = this.shadowRoot.querySelector(\"import-feeds\");\n this.#exportFeedsEl = this.shadowRoot.querySelector(\"export-feeds\");\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById(\"noFeedsDisclaimer\");\n }\n async connectedCallback() {\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n feeds.forEach((feed)=>this.#addFeed(feed));\n this.#toggleFeedsVisibility();\n this.#feedsListEl.addEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.addEventListener(\"click\", this.#handleEditRequest);\n this.#importAltBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#importBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.addEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.addEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.addEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener(\"me-close\", this.#handleExportDialogClose);\n this.addEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.addEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n new (0, $2c4dfe5b2b5ff94a$export$2e2bcd8739ae039)(this.#feedsListEl, {\n animation: 150,\n handle: \".sort-handler\",\n onEnd: async (evt)=>{\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll(\"li\"), (el)=>{\n return {\n url: el.getAttribute(\"data-url\"),\n title: el.getAttribute(\"data-title\") || \"\"\n };\n });\n await (0, $bad480a01f35862b$export$a8ce8a4ec117f05e)(feeds, false);\n }\n });\n }\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.removeEventListener(\"click\", this.#handleEditRequest);\n this.#importBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#importAltBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.removeEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.removeEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.removeEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-close\", this.#handleExportDialogClose);\n this.removeEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.removeEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n }\n #searchFeeds = (searchValue = \"\")=>{\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n if (feedEls.length === 0) return;\n feedEls.forEach((el)=>{\n const url = (el.getAttribute(\"data-url\") || \"\").toLowerCase();\n const title = (el.getAttribute(\"data-title\") || \"\").toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n #debounceSearchFeeds = (0, $4481690a5b2e12d6$export$61fc7d43ac8f84b0)(this.#searchFeeds, 250);\n #handleSearchInputDebounced = (evt)=>{\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle(\"d-none\", !value);\n return this.#debounceSearchFeeds(value);\n };\n #handleSearchClear = ()=>{\n this.#searchInput.value = \"\";\n this.#searchInput.dispatchEvent(new Event(\"input\"));\n };\n #handleEditRequest = (evt)=>{\n this.#isEditable = !this.#isEditable;\n evt.currentTarget.classList.toggle(\"active\");\n this.shadowRoot.querySelectorAll(\".sort-handler, .delete-button\").forEach((el)=>{\n el.hidden = !el.hidden;\n });\n };\n #handleImportRequest = ()=>{\n this.#importDialog.open = true;\n };\n #handleExportRequest = ()=>{\n this.#exportDialog.open = true;\n };\n #handleImportDialogOpen = ()=>{\n try {\n this.#importFeedsEl.shadowRoot.querySelector(\"a-tab-group\").selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector(\"textarea\").value = \"\";\n } catch {\n // Fail silently\n }\n };\n #handleExportDialogOpen = async ()=>{\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n this.#exportFeedsEl.setAttribute(\"feeds\", JSON.stringify(feeds));\n };\n #handleExportDialogClose = ()=>{\n this.#exportFeedsEl.removeAttribute(\"feeds\");\n };\n #handleFeedsImported = ()=>{\n this.#importDialog.open = false;\n };\n #handleFeedsUpdateSuccess = (evt)=>{\n if (evt.detail.action === \"delete\") this.#removeFeed(evt.detail.feed);\n if (evt.detail.action === \"create\") {\n this.#addFeed(evt.detail.feed);\n if (this.#searchInput.value) {\n this.#searchInput.value = \"\";\n this.#searchFeeds(\"\");\n }\n }\n if (evt.detail.action === \"update\") {\n const { url: url, title: title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n if (feedEl) {\n const linkContent = feedEl.querySelector(\".link-content\");\n feedEl.setAttribute(\"data-title\", title || \"\");\n if (linkContent) linkContent.innerHTML = title ? `${title}
    ${url}` : url;\n }\n }\n };\n #handleActionsClick = (evt)=>{\n const target = evt.target;\n const deleteBtn = target.closest(\"button.delete-button\");\n const linkEl = target.closest(\"a.link\");\n if (!linkEl && !deleteBtn) return;\n const feedItem = target.closest(\"li\");\n const feedUrl = feedItem.getAttribute(\"data-url\");\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) (0, $bad480a01f35862b$export$4e54c6fd9fa8b09b)(feedUrl);\n }\n if (linkEl) {\n evt.preventDefault();\n document.querySelector(\"feed-reader\").feedUrl = feedUrl;\n }\n };\n #addFeed(feed) {\n const { url: url, title: title } = feed;\n const link = document.createElement(\"a\");\n link.className = \"link text-decoration-none d-flex align-items-center h-100\";\n link.style.flex = \"1\";\n link.style.minWidth = 0;\n link.style.color = \"inherit\";\n link.href = url;\n const linkContent = document.createElement(\"div\");\n linkContent.className = \"text-truncate link-content\";\n linkContent.innerHTML = title ? `${title}
    ${url}` : url;\n const deleteButton = document.createElement(\"button\");\n deleteButton.type = \"button\";\n deleteButton.title = \"Delete feed\";\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = \"delete-button btn btn-default text-danger p-0\";\n deleteButton.style.lineHeight = \"1\";\n deleteButton.innerHTML = /* html */ `\n \n \n \n Delete\n `;\n const listItem = document.createElement(\"li\");\n listItem.className = \"list-group-item p-0 d-flex justify-content-between align-items-center\";\n listItem.style.height = \"var(--list-item-height)\";\n listItem.setAttribute(\"data-url\", url || \"\");\n listItem.setAttribute(\"data-title\", title || \"\");\n const sortHandler = document.createElement(\"div\");\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = \"sort-handler text-primary\";\n sortHandler.innerHTML = /* html */ `\n \n \n \n Reorder\n `;\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n this.#feedsListEl.appendChild(listItem);\n this.#toggleFeedsVisibility();\n }\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n this.#feedsContainerEl.classList.toggle(\"d-none\", feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle(\"d-none\", feeds.length > 0);\n }\n}\nif (!window.customElements.get(\"feeds-list\")) window.customElements.define(\"feeds-list\", $26a2e0c8216738ce$var$FeedsList);\n\n\n\nconst $72c9c9ace8c869ec$var$cache = new Map();\nconst $72c9c9ace8c869ec$export$5b107dfb127cada8 = async (url, requestOptions = {})=>{\n const cachedFeed = $72c9c9ace8c869ec$var$cache.get(url);\n if (cachedFeed) return cachedFeed;\n const res = await fetch(\"https://api.rss2json.com/v1/api.json?rss_url=\" + url, requestOptions);\n if (!res.ok) throw new Error(\"Error fetching data\");\n const json = await res.json();\n $72c9c9ace8c869ec$var$cache.set(url, json);\n return json;\n};\n\n\n\nlet $b35f94fa505d7279$var$controller;\nconst $b35f94fa505d7279$var$template = document.createElement(\"template\");\n$b35f94fa505d7279$var$template.innerHTML = /* html */ `\n \n\n \n

    \n\n

    \n\n
    \n
    \n \n Please wait...\n
    \n\n
    \n \n \n \n There was an error while fetching the feed.\n
    \n\n
    \n
    \n
    \n`;\nclass $b35f94fa505d7279$var$FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($b35f94fa505d7279$var$template.content.cloneNode(true));\n }\n this.#spinnerEl = this.shadowRoot.getElementById(\"spinner\");\n this.#dialogEl = this.shadowRoot.querySelector(\"modal-element\");\n this.#modalTitle = this.#dialogEl.querySelector(\"#feedTitle\");\n this.#feedsViewer = this.shadowRoot.getElementById(\"feedsViewer\");\n this.#errorEl = this.shadowRoot.getElementById(\"error\");\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feed-url\"\n ];\n }\n attributeChangedCallback(name) {\n if (name === \"feed-url\") this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n connectedCallback() {\n this.#dialogEl.addEventListener(\"me-close\", this.#handleFeedClose);\n }\n disconnectedCallback() {\n this.#dialogEl.removeEventListener(\"me-close\", this.#handleFeedClose);\n }\n get feedUrl() {\n return this.getAttribute(\"feed-url\");\n }\n set feedUrl(value) {\n if (value) this.setAttribute(\"feed-url\", value);\n else this.removeAttribute(\"feed-url\");\n }\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n #handleFeedClose = ()=>{\n $b35f94fa505d7279$var$controller && $b35f94fa505d7279$var$controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll(\".card\").forEach((el)=>el.remove());\n this.#modalTitle.innerHTML = \"\";\n this.#spinnerEl.classList.add(\"d-none\");\n this.#errorEl.classList.add(\"d-none\");\n }\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove(\"d-none\");\n $b35f94fa505d7279$var$controller = new AbortController();\n try {\n const data = await (0, $72c9c9ace8c869ec$export$5b107dfb127cada8)(feedUrl, {\n signal: $b35f94fa505d7279$var$controller.signal\n });\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n const currentFeed = feeds.find((feed)=>feed.url === feedUrl);\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) await (0, $bad480a01f35862b$export$4b77448646caf424)({\n url: feedUrl,\n title: data.feed.title || \"\"\n });\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n data.items.forEach((item)=>{\n this.#feedsViewer.insertAdjacentHTML(\"beforeend\", this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n this.#modalTitle.textContent = \"\";\n this.#errorEl.classList.remove(\"d-none\");\n }\n } finally{\n this.#spinnerEl.classList.add(\"d-none\");\n }\n }\n #feedsReaderTemplate(item) {\n const { link: link, title: title, description: description, author: author, pubDate: pubDate, thumbnail: thumbnail } = item;\n let formattedDate = \"\";\n try {\n formattedDate = new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\"\n }).format(new Date(pubDate));\n } catch {\n formattedDate = \"-\";\n }\n return /* html */ `\n
    \n \n
    \n `;\n }\n}\nif (!window.customElements.get(\"feed-reader\")) window.customElements.define(\"feed-reader\", $b35f94fa505d7279$var$FeedReader);\n\n\ndocument.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\ndocument.addEventListener(\"me-open\", ()=>document.body.classList.add(\"overflow-hidden\"));\ndocument.addEventListener(\"me-close\", ()=>document.body.classList.remove(\"overflow-hidden\"));\n\n\n//# sourceMappingURL=index.063a0a63.js.map\n","import '@georapbox/clipboard-copy-element/dist/clipboard-copy-defined.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport '@georapbox/a-tab-group/dist/a-tab-group.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport 'construct-style-sheets-polyfill/dist/adoptedStyleSheets.js';\nimport { styleSheets } from './helpers/styles.js';\nimport './components/add-feed.js';\nimport './components/feeds-list.js';\nimport './components/feed-reader.js';\n\ndocument.adoptedStyleSheets = styleSheets;\ndocument.addEventListener('me-open', () => document.body.classList.add('overflow-hidden'));\ndocument.addEventListener('me-close', () => document.body.classList.remove('overflow-hidden'));\n","Object.defineProperty({},\"ClipboardCopy\",{get:function(){return i},set:void 0,enumerable:!0,configurable:!0});let t=\"clipboard-copy\",e=\"success\",o=\"error\",s=document.createElement(\"template\");s.innerHTML=`\n \n\n \n`;class i extends HTMLElement{#t=null;#e;#o;#s;#i;constructor(){super(),this.shadowRoot||(this.attachShadow({mode:\"open\"}),this.shadowRoot.appendChild(s.content.cloneNode(!0))),this.#e=this.shadowRoot.querySelector(\"button\"),this.#o=this.shadowRoot.querySelector('slot[name=\"copy\"]'),this.#s=this.shadowRoot.querySelector('slot[name=\"success\"]'),this.#i=this.shadowRoot.querySelector('slot[name=\"error\"]')}static get observedAttributes(){return[\"disabled\"]}connectedCallback(){this.#r(\"value\"),this.#r(\"from\"),this.#r(\"disabled\"),this.#r(\"feedbackDuration\"),this.#e.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#e.removeEventListener(\"click\",this.#n),this.#a()}attributeChangedCallback(t){\"disabled\"===t&&(this.#e.disabled=this.disabled,this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}get value(){return this.getAttribute(\"value\")}set value(t){this.setAttribute(\"value\",t)}get from(){return this.getAttribute(\"from\")}set from(t){this.setAttribute(\"from\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get feedbackDuration(){return Number(this.getAttribute(\"feedback-duration\"))||1e3}set feedbackDuration(t){this.setAttribute(\"feedback-duration\",t)}async #l(){if(this.value||this.from)try{let o=\"\";if(this.value)o=this.value;else if(this.from){let t=\"getRootNode\"in Element.prototype?this.#e.getRootNode({composed:!0}):this.#e.ownerDocument;if(!t||!(t instanceof Document||t instanceof ShadowRoot))return;let e=t.querySelector(this.from);if(!e)return;o=e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement?e.value:e instanceof HTMLAnchorElement&&e.hasAttribute(\"href\")?e.href:e.textContent}await navigator.clipboard.writeText(o),this.#d(e),this.dispatchEvent(new CustomEvent(`${t}-success`,{bubbles:!0,composed:!0,detail:{value:o}}))}catch(e){this.#d(o),this.dispatchEvent(new CustomEvent(`${t}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}#n=t=>{t.preventDefault(),this.disabled||this.#t||this.#l()};#d(t){this.#o.hidden=!0,this.#s.hidden=t!==e,this.#i.hidden=t!==o,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\"),this.#e.part.add(`button--${t}`),this.#t&&clearTimeout(this.#t),this.#t=setTimeout(()=>{this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(`button--${t}`),this.#t=null},this.feedbackDuration)}#a(){this.#t&&clearTimeout(this.#t),this.#t=null,this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\")}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(e=t){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,i)}}i.defineCustomElement();export{i as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $a4c1285108bf4a9d$exports = {};\n\n$parcel$export($a4c1285108bf4a9d$exports, \"ClipboardCopy\", function () { return $a4c1285108bf4a9d$export$ea3b71af1761ff40; });\nconst $a4c1285108bf4a9d$var$COMPONENT_NAME = \"clipboard-copy\";\nconst $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION = 1000;\nconst $a4c1285108bf4a9d$var$SUCCESS_STATUS = \"success\";\nconst $a4c1285108bf4a9d$var$ERROR_STATUS = \"error\";\nconst $a4c1285108bf4a9d$var$template = document.createElement(\"template\");\n$a4c1285108bf4a9d$var$template.innerHTML = /* html */ `\n \n\n \n`;\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */ class $a4c1285108bf4a9d$export$ea3b71af1761ff40 extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($a4c1285108bf4a9d$var$template.content.cloneNode(true));\n }\n this.#buttonEl = this.shadowRoot.querySelector(\"button\");\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#upgradeProperty(\"value\");\n this.#upgradeProperty(\"from\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"feedbackDuration\");\n this.#buttonEl.addEventListener(\"click\", this.#handleClick);\n }\n disconnectedCallback() {\n this.#buttonEl.removeEventListener(\"click\", this.#handleClick);\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n attributeChangedCallback(name) {\n if (name === \"disabled\") {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute(\"aria-disabled\", this.disabled.toString());\n if (this.#buttonEl.part.contains(\"button\")) this.#buttonEl.part.toggle(\"button--disabled\", this.disabled);\n }\n }\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */ get value() {\n return this.getAttribute(\"value\");\n }\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */ set value(value) {\n this.setAttribute(\"value\", value);\n }\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */ get from() {\n return this.getAttribute(\"from\");\n }\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */ set from(value) {\n this.setAttribute(\"from\", value);\n }\n /**\n * Getter for the disabled state.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */ set disabled(value) {\n if (value) this.setAttribute(\"disabled\", \"\");\n else this.removeAttribute(\"disabled\");\n }\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */ get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION;\n }\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */ set feedbackDuration(value) {\n this.setAttribute(\"feedback-duration\", value);\n }\n /**\n * Copies the value to the clipboard and handles success or error states.\n */ async #copy() {\n if (!this.value && !this.from) return;\n try {\n let copyValue = \"\";\n if (this.value) copyValue = this.value;\n else if (this.from) {\n const root = \"getRootNode\" in Element.prototype ? this.#buttonEl.getRootNode({\n composed: true\n }) : this.#buttonEl.ownerDocument;\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) return;\n const element = root.querySelector(this.from);\n if (!element) return;\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) copyValue = element.value;\n else if (element instanceof HTMLAnchorElement && element.hasAttribute(\"href\")) copyValue = element.href;\n else copyValue = element.textContent;\n }\n await navigator.clipboard.writeText(copyValue);\n this.#showStatus($a4c1285108bf4a9d$var$SUCCESS_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: {\n value: copyValue\n }\n }));\n } catch (error) {\n this.#showStatus($a4c1285108bf4a9d$var$ERROR_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */ #handleClick = (evt)=>{\n evt.preventDefault();\n if (this.disabled || this.#timeout) return;\n this.#copy();\n };\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */ #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== $a4c1285108bf4a9d$var$SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== $a4c1285108bf4a9d$var$ERROR_STATUS;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n this.#buttonEl.part.add(`button--${status}`);\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = setTimeout(()=>{\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(`button--${status}`);\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */ #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n }\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */ #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */ static defineCustomElement(elementName = $a4c1285108bf4a9d$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $a4c1285108bf4a9d$export$ea3b71af1761ff40);\n }\n}\n\n\n(0, $a4c1285108bf4a9d$export$ea3b71af1761ff40).defineCustomElement();\n\n\nexport {$a4c1285108bf4a9d$export$ea3b71af1761ff40 as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","import { ClipboardCopy } from './clipboard-copy.js';\n\nClipboardCopy.defineCustomElement();\n\nexport { ClipboardCopy };\n","const COMPONENT_NAME = 'clipboard-copy';\nconst DEFAULT_FEEDBACK_DURATION = 1000;\nconst SUCCESS_STATUS = 'success';\nconst ERROR_STATUS = 'error';\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n`;\n\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */\nclass ClipboardCopy extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonEl = this.shadowRoot.querySelector('button');\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n connectedCallback() {\n this.#upgradeProperty('value');\n this.#upgradeProperty('from');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('feedbackDuration');\n\n this.#buttonEl.addEventListener('click', this.#handleClick);\n }\n\n disconnectedCallback() {\n this.#buttonEl.removeEventListener('click', this.#handleClick);\n\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n\n attributeChangedCallback(name) {\n if (name === 'disabled') {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */\n get value() {\n return this.getAttribute('value');\n }\n\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */\n set value(value) {\n this.setAttribute('value', value);\n }\n\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */\n get from() {\n return this.getAttribute('from');\n }\n\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */\n set from(value) {\n this.setAttribute('from', value);\n }\n\n /**\n * Getter for the disabled state.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */\n set disabled(value) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */\n get feedbackDuration() {\n return Number(this.getAttribute('feedback-duration')) || DEFAULT_FEEDBACK_DURATION;\n }\n\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */\n set feedbackDuration(value) {\n this.setAttribute('feedback-duration', value);\n }\n\n /**\n * Copies the value to the clipboard and handles success or error states.\n */\n async #copy() {\n if (!this.value && !this.from) {\n return;\n }\n\n try {\n let copyValue = '';\n\n if (this.value) {\n copyValue = this.value;\n } else if (this.from) {\n const root = 'getRootNode' in Element.prototype\n ? this.#buttonEl.getRootNode({ composed: true })\n : this.#buttonEl.ownerDocument;\n\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) {\n return;\n }\n\n const element = root.querySelector(this.from);\n\n if (!element) {\n return;\n }\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n copyValue = element.value;\n } else if (element instanceof HTMLAnchorElement && element.hasAttribute('href')) {\n copyValue = element.href;\n } else {\n copyValue = element.textContent;\n }\n }\n\n await navigator.clipboard.writeText(copyValue);\n\n this.#showStatus(SUCCESS_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: { value: copyValue }\n }));\n } catch (error) {\n this.#showStatus(ERROR_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled || this.#timeout) {\n return;\n }\n\n this.#copy();\n };\n\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */\n #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== ERROR_STATUS;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n this.#buttonEl.part.add(`button--${status}`);\n\n this.#timeout && clearTimeout(this.#timeout);\n\n this.#timeout = setTimeout(() => {\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove(`button--${status}`);\n\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */\n #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n }\n\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */\n #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ClipboardCopy);\n }\n }\n}\n\nexport { ClipboardCopy };\n","Object.defineProperty({},\"WebShare\",{get:function(){return s},set:void 0,enumerable:!0,configurable:!0});let t=`\n :host {\n display: inline-block;\n }\n`,e=document.createElement(\"template\");e.innerHTML=`\n \n \n`;class s extends HTMLElement{#t;#e;#s=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(e.content.cloneNode(!0)),this.#t=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#e=this.#i()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,s){\"disabled\"===t&&e!==s&&this.#e&&(this.#e.toggleAttribute(\"disabled\",this.disabled),this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part&&this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#r(\"shareUrl\"),this.#r(\"shareTitle\"),this.#r(\"shareText\"),this.#r(\"shareFiles\"),this.#r(\"disabled\"),this.#t?.addEventListener(\"slotchange\",this.#a),this.#e?.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#t?.removeEventListener(\"slotchange\",this.#a),this.#e?.removeEventListener(\"click\",this.#n)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#s}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#s=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&\"AbortError\"===t.name){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#n=t=>{t.preventDefault(),this.disabled||this.share()};#a=t=>{t.target&&\"button\"===t.target.name&&(this.#e?.removeEventListener(\"click\",this.#n),this.#e=this.#i(),this.#e&&(this.#e.addEventListener(\"click\",this.#n),\"BUTTON\"===this.#e.nodeName||this.#e.hasAttribute(\"role\")||this.#e.setAttribute(\"role\",\"button\")))};#i(){return this.#t&&this.#t.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"button\"===t.getAttribute(\"slot\"))||null}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(t=\"web-share\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,s)}}s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */ function $442be162a818aed4$export$c37129e465f64ef0(options) {\n if (options !== null && typeof options === \"object\") return \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(options);\n return \"share\" in navigator;\n}\n\n\nexport {$442be162a818aed4$export$c37129e465f64ef0 as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */`\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles)\n && this.shareFiles.length > 0\n && navigator.canShare\n && navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n\n return;\n }\n\n this.dispatchEvent(new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","Object.defineProperty({},\"FilesDropzone\",{get:function(){return m},set:void 0,enumerable:!0,configurable:!0});let e=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),t=[\".DS_Store\",\"Thumbs.db\"],o=t=>{let{name:o}=t;if(o&&-1!==o.lastIndexOf(\".\")&&!t.type){let i=(o.split(\".\").pop()||\"\").toLowerCase(),r=e.get(i);r&&Object.defineProperty(t,\"type\",{value:r,writable:!1,configurable:!1,enumerable:!0})}return t},i=(e,t)=>{let i=o(e);if(\"string\"!=typeof i.path){let{webkitRelativePath:o}=e;Object.defineProperty(i,\"path\",{value:\"string\"==typeof t?t:o||e.name,writable:!1,configurable:!1,enumerable:!0})}return i},r=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),a=async e=>{let t=[],o=await r(e);for(;o.length>0;)t.push(...o),o=await r(e);return t},n=e=>new Promise((t,o)=>{e.file(o=>t(i(o,e.fullPath)),o)}),s=async e=>{let o=[],i=[];for(let t of e){if(\"file\"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();i.push(e)}for(;i.length>0;){let e=i.shift();if(e){if(e.isFile){let i=await n(e);-1===t.indexOf(i.name)&&o.push(i)}else e.isDirectory&&i.push(...await a(e.createReader()))}}return o},d=async e=>{let o=[];for(let r of e)-1===t.indexOf(r.name)&&o.push(i(r));return o},l=async e=>e.dataTransfer?e.dataTransfer.items?await s(e.dataTransfer.items):await d(e.dataTransfer.files):await d(e.target.files),p=\"files-dropzone\",c=\"TOO_MANY_FILES\",h=document.createElement(\"template\"),u=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;h.innerHTML=`\n \n\n \n\n
    \n Drag 'n' drop files here, or click to select files\n
    \n`;class m extends HTMLElement{#e=null;#t=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(h.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.getElementById(\"file-input\"),this.#t=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,o){\"accept\"===e&&t!==o&&this.#e&&(this.#e.accept=this.accept),\"disabled\"===e&&t!==o&&this.#e&&(this.#e.disabled=this.disabled,this.disabled?(this.#t?.removeAttribute(\"tabindex\"),this.#t?.setAttribute(\"aria-disabled\",\"true\")):(this.#t?.setAttribute(\"tabindex\",\"0\"),this.#t?.setAttribute(\"aria-disabled\",\"false\"))),\"multiple\"===e&&t!==o&&this.#e&&(this.#e.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#e?.addEventListener(\"change\",this.#i),this.#t?.addEventListener(\"dragenter\",this.#r),this.#t?.addEventListener(\"dragover\",this.#a),this.#t?.addEventListener(\"dragleave\",this.#n),this.#t?.addEventListener(\"drop\",this.#s),this.#t?.addEventListener(\"click\",this.#d),this.#t?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#t?.focus()}disconnectedCallback(){this.#e?.removeEventListener(\"change\",this.#i),this.#t?.removeEventListener(\"dragenter\",this.#r),this.#t?.removeEventListener(\"dragover\",this.#a),this.#t?.removeEventListener(\"dragleave\",this.#n),this.#t?.removeEventListener(\"drop\",this.#s),this.#t?.removeEventListener(\"click\",this.#d),this.#t?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",null!=e?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",null!=e?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${p}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#t&&(this.#t.classList.add(\"dropzone--dragover\"),this.#t.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragleave`,{bubbles:!0,composed:!0})))};#s=async e=>{if(!this.disabled){e.preventDefault(),this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\"));try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#d=()=>{this.disabled||this.#e?.click()};#l=e=>{this.disabled||\" \"!==e.key&&\"Enter\"!==e.key||this.#e?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:c,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:c,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let i of e){let e=function(e,t=\"\"){if(!t)return!0;let o=[...new Set(t.split(\",\").map(e=>e.trim()).filter(Boolean))],i=e.type,r=i.replace(/\\/.*$/,\"\");for(let t of o)if(\".\"===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\\/\\*$/.test(t)){if(r===t.replace(/\\/.*$/,\"\"))return!0}else if(i===t)return!0;return!1}(i,this.accept),r=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${p}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${p}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#e&&(this.#e.value=this.#e.defaultValue)}openFileDialog(){this.disabled||this.#e?.click()}#o(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=p){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,m)}}m.defineCustomElement();export{m as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $862aa3736b0514bc$exports = {};\n\n$parcel$export($862aa3736b0514bc$exports, \"FilesDropzone\", function () { return $862aa3736b0514bc$export$6ccd1735166caad9; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ // @ts-check\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */ function $38f222170fd4d21a$export$7c47054fed488f80(file, acceptedTypeSpecifiers = \"\") {\n if (!acceptedTypeSpecifiers) return true;\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(\",\").map((v)=>v.trim()).filter(Boolean))\n ];\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, \"\");\n for (const validType of acceptedMimeTypesList){\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n } else {\n if (fileMimeType === validType) return true;\n }\n }\n return false;\n}\n\n\n// @ts-check\n/**\n * A map of common file extensions and their associated MIME types.\n */ const $f31161edf38949e9$var$COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n // Others\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]);\nconst $f31161edf38949e9$var$FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n \".DS_Store\",\n \"Thumbs.db\" // Windows\n];\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */ const $f31161edf38949e9$var$toFileWithMimeType = (file)=>{\n const { name: name } = file;\n const hasExtension = name && name.lastIndexOf(\".\") !== -1;\n if (hasExtension && !file.type) {\n const extension = (name.split(\".\").pop() || \"\").toLowerCase();\n const type = $f31161edf38949e9$var$COMMON_MIME_TYPES.get(extension);\n if (type) Object.defineProperty(file, \"type\", {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return file;\n};\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */ const $f31161edf38949e9$var$toFileWithPath = (file, path)=>{\n const fileWithMimeType = $f31161edf38949e9$var$toFileWithMimeType(file);\n // @ts-ignore\n if (typeof fileWithMimeType.path !== \"string\") {\n const { webkitRelativePath: webkitRelativePath } = file;\n Object.defineProperty(fileWithMimeType, \"path\", {\n value: typeof path === \"string\" ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return fileWithMimeType;\n};\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readEntriesPromise = async (directoryReader)=>{\n return await new Promise((resolve, reject)=>{\n directoryReader.readEntries(resolve, reject);\n });\n};\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readAllDirectoryEntries = async (directoryReader)=>{\n const entries = [];\n let readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n while(readEntries.length > 0){\n entries.push(...readEntries);\n readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n }\n return entries;\n};\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */ const $f31161edf38949e9$var$getFileFromFileEntry = (fileEntry)=>{\n return new Promise((resolve, reject)=>{\n fileEntry.file((file)=>resolve($f31161edf38949e9$var$toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromDataTransferItemList = async (dataTransferItemList)=>{\n const files = [];\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n for (const item of dataTransferItemList){\n if (item.kind !== \"file\") continue;\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n queue.push(entry);\n }\n while(queue.length > 0){\n const entry = queue.shift();\n if (!entry) continue;\n else if (entry.isFile) {\n const file = await $f31161edf38949e9$var$getFileFromFileEntry(entry);\n if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push(file);\n } else if (entry.isDirectory) queue.push(...await $f31161edf38949e9$var$readAllDirectoryEntries(entry.createReader()));\n }\n return files;\n};\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromFileList = async (fileList)=>{\n const files = [];\n for (const file of fileList)if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push($f31161edf38949e9$var$toFileWithPath(file));\n return files;\n};\nconst $f31161edf38949e9$export$6d52664cd15c442 = async (evt)=>{\n if (evt.dataTransfer) return evt.dataTransfer.items ? await $f31161edf38949e9$var$getFilesFromDataTransferItemList(evt.dataTransfer.items) : await $f31161edf38949e9$var$getFilesFromFileList(evt.dataTransfer.files);\n return await $f31161edf38949e9$var$getFilesFromFileList(evt.target.files);\n};\n\n\nconst $862aa3736b0514bc$var$COMPONENT_NAME = \"files-dropzone\";\nconst $862aa3736b0514bc$var$TOO_MANY_FILES = \"TOO_MANY_FILES\";\nconst $862aa3736b0514bc$var$FILE_TOO_LARGE = \"FILE_TOO_LARGE\";\nconst $862aa3736b0514bc$var$FILE_TOO_SMALL = \"FILE_TOO_SMALL\";\nconst $862aa3736b0514bc$var$INVALID_MIME_TYPE = \"INVALID_MIME_TYPE\";\nconst $862aa3736b0514bc$var$template = document.createElement(\"template\");\nconst $862aa3736b0514bc$var$styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$862aa3736b0514bc$var$template.innerHTML = /* html */ `\n \n\n \n\n
    \n Drag 'n' drop files here, or click to select files\n
    \n`;\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */ class $862aa3736b0514bc$export$6ccd1735166caad9 extends HTMLElement {\n /** @type {Nullable} */ #fileInput = null;\n /** @type {Nullable} */ #dropzoneEl = null;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($862aa3736b0514bc$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ this.shadowRoot.getElementById(\"file-input\");\n this.#dropzoneEl = this.shadowRoot.getElementById(\"dropzone\");\n }\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"accept\" && oldValue !== newValue && this.#fileInput) this.#fileInput.accept = this.accept;\n if (name === \"disabled\" && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute(\"tabindex\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.#dropzoneEl?.setAttribute(\"tabindex\", \"0\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"false\");\n }\n }\n if (name === \"multiple\" && oldValue !== newValue && this.#fileInput) this.#fileInput.multiple = this.multiple;\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"accept\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"maxFiles\");\n this.#upgradeProperty(\"maxSize\");\n this.#upgradeProperty(\"minSize\");\n this.#upgradeProperty(\"multiple\");\n this.#upgradeProperty(\"autoFocus\");\n this.#upgradeProperty(\"noStyle\");\n this.#fileInput?.addEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.addEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.addEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.addEventListener(\"keyup\", this.#handleKeyUp);\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#fileInput?.removeEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.removeEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.removeEventListener(\"keyup\", this.#handleKeyUp);\n }\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */ get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(value) {\n this.setAttribute(\"accept\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */ get maxFiles() {\n const num = Number(this.getAttribute(\"max-files\")) || 0;\n if (num <= 0) return Infinity;\n return Math.floor(Math.abs(num));\n }\n set maxFiles(value) {\n this.setAttribute(\"max-files\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */ get maxSize() {\n const value = this.getAttribute(\"max-size\");\n if (value === null) return Infinity;\n const num = Number(value);\n return Number.isNaN(num) ? Infinity : num;\n }\n set maxSize(value) {\n this.setAttribute(\"max-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */ get minSize() {\n const value = this.getAttribute(\"min-size\");\n if (value === null) return 0;\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n set minSize(value) {\n this.setAttribute(\"min-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */ get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(value) {\n this.toggleAttribute(\"multiple\", !!value);\n }\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */ get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(value) {\n this.toggleAttribute(\"auto-focus\", !!value);\n }\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */ get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(value) {\n this.toggleAttribute(\"no-style\", !!value);\n }\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */ #handleFileInputChange = async (evt)=>{\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the dragenter event of the dropzone.\n */ #handleDragEnter = ()=>{\n if (this.disabled) return;\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDragOver = (evt)=>{\n evt.preventDefault();\n if (this.disabled) {\n evt.dataTransfer.dropEffect = \"none\";\n return;\n }\n evt.dataTransfer.dropEffect = \"copy\";\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add(\"dropzone--dragover\");\n this.#dropzoneEl.part.add(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragleave event of the dropzone.\n */ #handleDragLeave = ()=>{\n if (this.disabled) return;\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDrop = async (evt)=>{\n if (this.disabled) return;\n evt.preventDefault();\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the click event of the dropzone.\n */ #handleClick = ()=>{\n if (this.disabled) return;\n this.#fileInput?.click();\n };\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleKeyUp = (evt)=>{\n if (this.disabled) return;\n if (evt.key === \" \" || evt.key === \"Enter\") this.#fileInput?.click();\n };\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */ #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) return;\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n else if (this.multiple && filesLength > this.maxFiles) // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files){\n const fileHasValidType = (0, $38f222170fd4d21a$export$7c47054fed488f80)(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) acceptedFiles.push(file);\n else {\n const errors = [];\n if (!fileHasValidType) errors.push({\n code: $862aa3736b0514bc$var$INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n if (fileExceedsMaxSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n if (fileIsSmallerThanMinSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n rejectedFiles.push({\n file: file,\n errors: errors\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles,\n rejectedFiles: rejectedFiles\n }\n }));\n if (acceptedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles\n }\n }));\n if (rejectedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles: rejectedFiles\n }\n }));\n if (this.#fileInput) this.#fileInput.value = this.#fileInput.defaultValue;\n }\n /**\n * Opens the file dialog programmatically.\n */ openFileDialog() {\n if (this.disabled) return;\n this.#fileInput?.click();\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */ static defineCustomElement(elementName = $862aa3736b0514bc$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $862aa3736b0514bc$export$6ccd1735166caad9);\n }\n}\n\n\n(0, $862aa3736b0514bc$export$6ccd1735166caad9).defineCustomElement();\n\n\nexport {$862aa3736b0514bc$export$6ccd1735166caad9 as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n
    \n Drag 'n' drop files here, or click to select files\n
    \n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */(this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n }));\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n }));\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n }));\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(',').map(v => v.trim()).filter(Boolean))\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...await readAllDirectoryEntries(entry.createReader()));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","let t=(t=\"\",e=\"\")=>{let s=Math.random().toString(36).substring(2,8);return`${\"string\"==typeof t&&\"\"!==t?t+\"-\":\"\"}${s}${\"string\"==typeof e&&\"\"!==e?\"-\"+e:\"\"}`},e=(t,e)=>{if(Object.prototype.hasOwnProperty.call(e,t)){let s=e[t];delete e[t],e[t]=s}},s=0,o=`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`,a=document.createElement(\"template\");a.innerHTML=`\n \n\n
    \n \n
    \n`;class l extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(a.content.cloneNode(!0))}static get observedAttributes(){return[\"selected\",\"disabled\",\"closable\"]}attributeChangedCallback(t,e,s){if(\"selected\"===t&&e!==s&&this.setAttribute(\"aria-selected\",this.selected.toString()),\"disabled\"===t&&e!==s&&(this.setAttribute(\"aria-disabled\",this.disabled.toString()),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")),\"closable\"===t&&e!==s){if(this.closable){let t=document.createElement(\"span\");t.className=\"tab__close\",t.setAttribute(\"part\",\"close-tab\"),t.innerHTML='',this.shadowRoot?.querySelector(\".tab\")?.appendChild(t),t.addEventListener(\"click\",this.#t)}else{let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t),t?.remove()}}}connectedCallback(){this.#e(\"selected\"),this.#e(\"disabled\"),this.#e(\"closable\"),this.id||(this.id=t(\"tab\",(++s).toString())),this.setAttribute(\"slot\",\"tab\"),this.setAttribute(\"role\",\"tab\"),this.setAttribute(\"aria-selected\",\"false\"),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t)}get selected(){return this.hasAttribute(\"selected\")}set selected(t){this.toggleAttribute(\"selected\",!!t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get closable(){return this.hasAttribute(\"closable\")}set closable(t){this.toggleAttribute(\"closable\",!!t)}#t=t=>{t.stopPropagation(),this.dispatchEvent(new CustomEvent(\"a-tab-close\",{bubbles:!0,composed:!0,detail:{tabId:this.id}}))};#e(t){return e(t,this)}static defineCustomElement(t=\"a-tab\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,l)}}l.defineCustomElement();let i=0,r=`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`,n=document.createElement(\"template\");n.innerHTML=`\n \n\n
    \n \n
    \n`;class c extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(n.content.cloneNode(!0))}connectedCallback(){this.setAttribute(\"slot\",\"panel\"),this.setAttribute(\"role\",\"tabpanel\"),this.setAttribute(\"hidden\",\"\"),this.id||(this.id=t(\"panel\",(++i).toString()))}static defineCustomElement(t=\"a-tab-panel\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,c)}}c.defineCustomElement();let d={TOP:\"top\",BOTTOM:\"bottom\",START:\"start\",END:\"end\"},h=Object.entries(d).map(([,t])=>t),b={AUTO:\"auto\",MANUAL:\"manual\"},u={DOWN:\"ArrowDown\",LEFT:\"ArrowLeft\",RIGHT:\"ArrowRight\",UP:\"ArrowUp\",HOME:\"Home\",END:\"End\",ENTER:\"Enter\",SPACE:\" \"},p=`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`,g=document.createElement(\"template\");g.innerHTML=`\n \n\n
    \n
    \n \n\n
    \n \n
    \n\n \n
    \n\n
    \n \n
    \n
    \n`;class m extends HTMLElement{#s=null;#o=null;#a=!1;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(g.content.cloneNode(!0))}static get observedAttributes(){return[\"placement\",\"no-scroll-controls\"]}attributeChangedCallback(t,e,s){\"placement\"===t&&e!==s&&this.#l(),\"no-scroll-controls\"===t&&e!==s&&this.#l()}get placement(){return this.getAttribute(\"placement\")||d.TOP}set placement(t){null!=t&&this.setAttribute(\"placement\",t)}get noScrollControls(){return this.hasAttribute(\"no-scroll-controls\")}set noScrollControls(t){this.toggleAttribute(\"no-scroll-controls\",!!t)}get scrollDistance(){return Math.abs(Number(this.getAttribute(\"scroll-distance\")))||200}set scrollDistance(t){this.setAttribute(\"scroll-distance\",Math.abs(t).toString()||\"200\")}get activation(){return this.getAttribute(\"activation\")||b.AUTO}set activation(t){this.setAttribute(\"activation\",t||b.AUTO)}get noTabCycling(){return this.hasAttribute(\"no-tab-cycling\")}set noTabCycling(t){this.toggleAttribute(\"no-tab-cycling\",!!t)}connectedCallback(){this.#e(\"placement\"),this.#e(\"noScrollControls\"),this.#e(\"scrollDistance\"),this.#e(\"activation\"),this.#e(\"noTabCycling\");let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=this.shadowRoot?.querySelector(\".tab-group__nav\"),a=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.addEventListener(\"slotchange\",this.#i),e?.addEventListener(\"slotchange\",this.#i),s?.addEventListener(\"click\",this.#r),s?.addEventListener(\"keydown\",this.#n),a.forEach(t=>t.addEventListener(\"click\",this.#c)),this.addEventListener(\"a-tab-close\",this.#d),\"ResizeObserver\"in window&&(this.#s=new ResizeObserver(t=>{this.#o=window.requestAnimationFrame(()=>{let e=t?.[0],s=e?.target,l=s?.scrollWidth>s?.clientWidth;a.forEach(t=>t.toggleAttribute(\"hidden\",!l)),o?.part.toggle(\"nav--has-scroll-controls\",l),o?.classList.toggle(\"tab-group__nav--has-scroll-controls\",l)})})),this.#h(),this.#l()}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.removeEventListener(\"slotchange\",this.#i),e?.removeEventListener(\"slotchange\",this.#i),s?.removeEventListener(\"click\",this.#r),s?.removeEventListener(\"keydown\",this.#n),o.forEach(t=>t.removeEventListener(\"click\",this.#c)),this.removeEventListener(\"a-tab-close\",this.#d),this.#b()}#u(){if(!this.#s)return;let t=this.shadowRoot?.querySelector(\".tab-group__tabs\");t&&(this.#s.unobserve(t),this.#s.observe(t))}#b(){this.#s&&(this.#s.disconnect(),null!==this.#o&&(window.cancelAnimationFrame(this.#o),this.#o=null))}#p(){return getComputedStyle(this).direction||\"ltr\"}#h(){this.hidden=0===this.#g().length}#m(){let t=this.#g();this.#h(),t.forEach(t=>{let e=t.nextElementSibling;if(!e||\"a-tab-panel\"!==e.tagName.toLowerCase())return console.error(`Tab #${t.id} is not a sibling of a `);t.setAttribute(\"aria-controls\",e.id),e.setAttribute(\"aria-labelledby\",t.id)})}#v(){return Array.from(this.querySelectorAll(\"a-tab-panel\"))}#g(){return Array.from(this.querySelectorAll(\"a-tab\"))}#f(t){let e=t.getAttribute(\"aria-controls\");return this.querySelector(`#${e}`)}#w(){return this.#g().find(t=>!t.disabled)||null}#T(){let t=this.#g();for(let e=t.length-1;e>=0;e--)if(!t[e].disabled)return t[e];return null}#y(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))-1:t.findIndex(t=>t.selected)-1;for(;t[(e+t.length)%t.length].disabled;)e--;return this.noTabCycling&&e<0?null:t[(e+t.length)%t.length]}#A(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))+1:t.findIndex(t=>t.selected)+1;for(;t[e%t.length].disabled;)e++;return this.noTabCycling&&e>=t.length?null:t[e%t.length]}#_(){let t=this.#g(),e=this.#v();t.forEach(t=>t.selected=!1),e.forEach(t=>t.hidden=!0)}#l(){let t=this.shadowRoot?.querySelector(\".tab-group__nav\"),e=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);this.noScrollControls||this.placement===d.START||this.placement===d.END?(this.#b(),e.forEach(t=>t.hidden=!0),t?.part.remove(\"nav--has-scroll-controls\"),t?.classList.remove(\"tab-group__nav--has-scroll-controls\")):(this.#u(),e.forEach(t=>t.hidden=!1))}#E(){let t=this.#g(),e=t.find(t=>t.selected&&!t.disabled)||t.find(t=>!t.disabled);e&&(this.#a&&!e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.#C(e))}#C(t){this.#_(),t&&(t.selected=!0);let e=this.#f(t);e&&(e.hidden=!1)}#i=t=>{this.#m(),this.#l(),this.#E(),\"tab\"===t.target.name&&(this.#a=!0)};#n=t=>{if(\"a-tab\"!==t.target.tagName.toLowerCase()||t.altKey)return;let e=h.includes(this.placement||\"\")?this.placement:d.TOP,s=[d.TOP,d.BOTTOM].includes(e||\"\")?\"horizontal\":\"vertical\",o=this.#p(),a=null;switch(t.key){case u.LEFT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#y():this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.RIGHT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#A():this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.UP:\"vertical\"===s&&(a=this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.DOWN:\"vertical\"===s&&(a=this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.HOME:(a=this.#w())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.END:(a=this.#T())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.ENTER:case u.SPACE:(a=t.target)&&this.selectTab(a);break;default:return}t.preventDefault()};#r=t=>{let e=t.target.closest(\"a-tab\");e&&this.selectTab(e)};#c=t=>{let e=t.target.closest(\".tab-group__scroll-button\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\");if(!e||!s)return;let o=e.classList.contains(\"tab-group__scroll-button--start\")?-1:1,a=s.scrollLeft;s.scrollTo({left:a+o*this.scrollDistance})};#d=t=>{let e=t.target,s=this.#f(e);e&&(e.remove(),e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}}))),s&&\"a-tab-panel\"===s.tagName.toLowerCase()&&s.remove()};#e(t){return e(t,this)}selectTabByIndex(t){let e=this.#g()[t];e&&this.selectTab(e)}selectTabById(t){let e=this.#g().find(e=>e.id===t);e&&this.selectTab(e)}selectTab(t){let e=this.#g().find(t=>t.selected);!t||t.disabled||t.selected||\"a-tab\"!==t.tagName.toLowerCase()||(this.#C(t),window.requestAnimationFrame(()=>{t.scrollIntoView({inline:\"nearest\",block:\"nearest\"}),t.focus()}),e&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:t.id}})))}static defineCustomElement(t=\"a-tab-group\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,m)}}m.defineCustomElement();export{m as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /** @typedef {import('./a-tab').Tab} Tab */ /** @typedef {import('./a-tab-panel').TabPanel} TabPanel */ // @ts-check\n// @ts-check\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $aa07eeb3067ea186$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n// @ts-check\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */ const $2b7397b7d9d03d51$export$f7b23927dede22b3 = (prop, instance)=>{\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\n\nlet $4b127c96b8d62b28$var$tabCounter = 0;\nconst $4b127c96b8d62b28$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\nconst $4b127c96b8d62b28$var$template = document.createElement(\"template\");\n$4b127c96b8d62b28$var$template.innerHTML = /* html */ `\n \n\n
    \n \n
    \n`;\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */ class $4b127c96b8d62b28$export$3e41faf802a29e71 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($4b127c96b8d62b28$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"selected\" && oldValue !== newValue) this.setAttribute(\"aria-selected\", this.selected.toString());\n if (name === \"disabled\" && oldValue !== newValue) {\n this.setAttribute(\"aria-disabled\", this.disabled.toString());\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n if (name === \"closable\" && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement(\"span\");\n closeButton.className = \"tab__close\";\n closeButton.setAttribute(\"part\", \"close-tab\");\n closeButton.innerHTML = /* html */ ``;\n this.shadowRoot?.querySelector(\".tab\")?.appendChild(closeButton);\n closeButton.addEventListener(\"click\", this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"selected\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"closable\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"tab\", (++$4b127c96b8d62b28$var$tabCounter).toString());\n this.setAttribute(\"slot\", \"tab\");\n this.setAttribute(\"role\", \"tab\");\n this.setAttribute(\"aria-selected\", \"false\");\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n }\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */ get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(value) {\n this.toggleAttribute(\"selected\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */ get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(value) {\n this.toggleAttribute(\"closable\", !!value);\n }\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n evt.stopPropagation();\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: {\n tabId: this.id\n }\n }));\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n static defineCustomElement(elementName = \"a-tab\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $4b127c96b8d62b28$export$3e41faf802a29e71);\n }\n}\n$4b127c96b8d62b28$export$3e41faf802a29e71.defineCustomElement();\n\n\n// @ts-check\n\nlet $17a63ddf0f11756d$var$panelCounter = 0;\nconst $17a63ddf0f11756d$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\nconst $17a63ddf0f11756d$var$template = document.createElement(\"template\");\n$17a63ddf0f11756d$var$template.innerHTML = /* html */ `\n \n\n
    \n \n
    \n`;\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */ class $17a63ddf0f11756d$export$3d96ec278d3efce4 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($17a63ddf0f11756d$var$template.content.cloneNode(true));\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.setAttribute(\"slot\", \"panel\");\n this.setAttribute(\"role\", \"tabpanel\");\n this.setAttribute(\"hidden\", \"\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"panel\", (++$17a63ddf0f11756d$var$panelCounter).toString());\n }\n static defineCustomElement(elementName = \"a-tab-panel\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $17a63ddf0f11756d$export$3d96ec278d3efce4);\n }\n}\n$17a63ddf0f11756d$export$3d96ec278d3efce4.defineCustomElement();\n\n\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */ const $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE = 200;\n/**\n * The available placements for the tabs.\n */ const $6ed9897cfe6c2018$var$PLACEMENT = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n};\n/**\n * The valid placements for the tabs.\n */ const $6ed9897cfe6c2018$var$validPlacements = Object.entries($6ed9897cfe6c2018$var$PLACEMENT).map(([, value])=>value);\n/**\n * The available activation modes for the tabs.\n */ const $6ed9897cfe6c2018$var$ACTIVATION = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n};\n/**\n * Defines key codes to help with handling keyboard events.\n */ const $6ed9897cfe6c2018$var$KEYCODE = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n};\nconst $6ed9897cfe6c2018$var$styles = /* css */ `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\nconst $6ed9897cfe6c2018$var$template = document.createElement(\"template\");\n$6ed9897cfe6c2018$var$template.innerHTML = /* html */ `\n \n\n
    \n
    \n \n\n
    \n \n
    \n\n \n
    \n\n
    \n \n
    \n
    \n`;\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */ class $6ed9897cfe6c2018$export$85fd4ed3b8ca1010 extends HTMLElement {\n /** @type {Nullable} */ #resizeObserver = null;\n /** @type {Nullable} */ #rafId = null;\n /** @type {boolean} */ #hasTabSlotChangedOnce = false;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($6ed9897cfe6c2018$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"placement\" && oldValue !== newValue) this.#syncNav();\n if (name === \"no-scroll-controls\" && oldValue !== newValue) this.#syncNav();\n }\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */ get placement() {\n return this.getAttribute(\"placement\") || $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n }\n set placement(value) {\n if (value != null) this.setAttribute(\"placement\", value);\n }\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */ get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(value) {\n this.toggleAttribute(\"no-scroll-controls\", !!value);\n }\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */ get scrollDistance() {\n const value = Number(this.getAttribute(\"scroll-distance\"));\n return Math.abs(value) || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE;\n }\n set scrollDistance(value) {\n this.setAttribute(\"scroll-distance\", Math.abs(value).toString() || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE.toString());\n }\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */ get activation() {\n return this.getAttribute(\"activation\") || $6ed9897cfe6c2018$var$ACTIVATION.AUTO;\n }\n set activation(value) {\n this.setAttribute(\"activation\", value || $6ed9897cfe6c2018$var$ACTIVATION.AUTO);\n }\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */ get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(value) {\n this.toggleAttribute(\"no-tab-cycling\", !!value);\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"placement\");\n this.#upgradeProperty(\"noScrollControls\");\n this.#upgradeProperty(\"scrollDistance\");\n this.#upgradeProperty(\"activation\");\n this.#upgradeProperty(\"noTabCycling\");\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.addEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.addEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.addEventListener(\"click\", this.#handleScrollButtonClick));\n this.addEventListener(\"a-tab-close\", this.#handleTabClose);\n if (\"ResizeObserver\" in window) this.#resizeObserver = new ResizeObserver((entries)=>{\n this.#rafId = window.requestAnimationFrame(()=>{\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach((el)=>el.toggleAttribute(\"hidden\", !isElementScrollable));\n navContainer?.part.toggle(\"nav--has-scroll-controls\", isElementScrollable);\n navContainer?.classList.toggle(\"tab-group__nav--has-scroll-controls\", isElementScrollable);\n });\n });\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.removeEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.removeEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.removeEventListener(\"click\", this.#handleScrollButtonClick));\n this.removeEventListener(\"a-tab-close\", this.#handleTabClose);\n this.#stopResizeObserver();\n }\n /**\n * Starts observing the tabs container for resize events.\n */ #startResizeObserver() {\n if (!this.#resizeObserver) return;\n const scrollElement = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n /**\n * Stops observing the tabs container for resize events.\n */ #stopResizeObserver() {\n if (!this.#resizeObserver) return;\n this.#resizeObserver.disconnect();\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */ #getDirection() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n /**\n * Hides the tab group if there are no tabs.\n */ #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */ #linkPanels() {\n const tabs = this.#allTabs();\n this.#hideEmptyTabGroup();\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach((tab)=>{\n const panel = tab.nextElementSibling;\n if (!panel || panel.tagName.toLowerCase() !== \"a-tab-panel\") return console.error(`Tab #${tab.id} is not a sibling of a `);\n tab.setAttribute(\"aria-controls\", panel.id);\n panel.setAttribute(\"aria-labelledby\", tab.id);\n });\n }\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */ #allPanels() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */ #allTabs() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */ #panelForTab(tab) {\n const panelId = tab.getAttribute(\"aria-controls\");\n return this.querySelector(`#${panelId}`);\n }\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */ #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find((tab)=>!tab.disabled) || null;\n }\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */ #lastTab() {\n const tabs = this.#allTabs();\n for(let i = tabs.length - 1; i >= 0; i--){\n if (!tabs[i].disabled) return tabs[i];\n }\n return null;\n }\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */ #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) - 1 : tabs.findIndex((tab)=>tab.selected) - 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[(newIdx + tabs.length) % tabs.length].disabled)newIdx--;\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) return null;\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */ #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) + 1 : tabs.findIndex((tab)=>tab.selected) + 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[newIdx % tabs.length].disabled)newIdx++;\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) return null;\n return tabs[newIdx % tabs.length];\n }\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */ #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n tabs.forEach((tab)=>tab.selected = false);\n panels.forEach((panel)=>panel.hidden = true);\n }\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */ #syncNav() {\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n /** @type {HTMLButtonElement[]} */ const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n if (this.noScrollControls || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.START || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = true);\n navContainer?.part.remove(\"nav--has-scroll-controls\");\n navContainer?.classList.remove(\"tab-group__nav--has-scroll-controls\");\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = false);\n }\n }\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */ #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find((tab)=>tab.selected && !tab.disabled) || tabs.find((tab)=>!tab.disabled);\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n this.#setSelectedTab(tab);\n }\n }\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */ #setSelectedTab(tab) {\n this.#reset();\n if (tab) tab.selected = true;\n const panel = this.#panelForTab(tab);\n if (panel) panel.hidden = false;\n }\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */ #handleSlotChange = (evt)=>{\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n if (evt.target.name === \"tab\") this.#hasTabSlotChangedOnce = true;\n };\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */ #handleKeyDown = (evt)=>{\n if (evt.target.tagName.toLowerCase() !== \"a-tab\" // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) return;\n const placement = $6ed9897cfe6c2018$var$validPlacements.includes(this.placement || \"\") ? this.placement : $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n const orientation = [\n $6ed9897cfe6c2018$var$PLACEMENT.TOP,\n $6ed9897cfe6c2018$var$PLACEMENT.BOTTOM\n ].includes(placement || \"\") ? \"horizontal\" : \"vertical\";\n const direction = this.#getDirection();\n let tab = null;\n switch(evt.key){\n case $6ed9897cfe6c2018$var$KEYCODE.LEFT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#prevTab() : this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.RIGHT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#nextTab() : this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.UP:\n if (orientation === \"vertical\") {\n tab = this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.DOWN:\n if (orientation === \"vertical\") {\n tab = this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.END:\n tab = this.#lastTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.ENTER:\n case $6ed9897cfe6c2018$var$KEYCODE.SPACE:\n tab = evt.target;\n if (tab) this.selectTab(tab);\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */ #handleTabClick = (evt)=>{\n const tab = evt.target.closest(\"a-tab\");\n if (tab) this.selectTab(tab);\n };\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */ #handleScrollButtonClick = (evt)=>{\n const scrollButton = evt.target.closest(\".tab-group__scroll-button\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!scrollButton || !tabsContainer) return;\n const sign = scrollButton.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */ #handleTabClose = (evt)=>{\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n if (tab) {\n tab.remove();\n tab.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n if (panel && panel.tagName.toLowerCase() === \"a-tab-panel\") panel.remove();\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */ selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */ selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find((tab)=>tab.id === id);\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */ selectTab(tab) {\n const oldTab = this.#allTabs().find((t)=>t.selected);\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== \"a-tab\") return;\n this.#setSelectedTab(tab);\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(()=>{\n tab.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n });\n tab.focus();\n });\n if (oldTab) this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: oldTab.id\n }\n }));\n this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n static defineCustomElement(elementName = \"a-tab-group\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $6ed9897cfe6c2018$export$85fd4ed3b8ca1010);\n }\n}\n$6ed9897cfe6c2018$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nexport {$6ed9897cfe6c2018$export$85fd4ed3b8ca1010 as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/** @typedef {import('./a-tab').Tab} Tab */\n/** @typedef {import('./a-tab-panel').TabPanel} TabPanel */\n\nimport './a-tab.js';\nimport './a-tab-panel.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */\nconst DEFAULT_SCROLL_DISTANCE = 200;\n\n/**\n * The available placements for the tabs.\n */\nconst PLACEMENT = {\n TOP: 'top',\n BOTTOM: 'bottom',\n START: 'start',\n END: 'end'\n};\n\n/**\n * The valid placements for the tabs.\n */\nconst validPlacements = Object.entries(PLACEMENT).map(([, value]) => value);\n\n/**\n * The available activation modes for the tabs.\n */\nconst ACTIVATION = {\n AUTO: 'auto',\n MANUAL: 'manual'\n};\n\n/**\n * Defines key codes to help with handling keyboard events.\n */\nconst KEYCODE = {\n DOWN: 'ArrowDown',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n HOME: 'Home',\n END: 'End',\n ENTER: 'Enter',\n SPACE: ' '\n};\n\nconst styles = /* css */`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
    \n
    \n \n\n
    \n \n
    \n\n \n
    \n\n
    \n \n
    \n
    \n`;\n\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */\nclass TabGroup extends HTMLElement {\n /** @type {Nullable} */\n #resizeObserver = null;\n\n /** @type {Nullable} */\n #rafId = null;\n\n /** @type {boolean} */\n #hasTabSlotChangedOnce = false;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['placement', 'no-scroll-controls'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'placement' && oldValue !== newValue) {\n this.#syncNav();\n }\n\n if (name === 'no-scroll-controls' && oldValue !== newValue) {\n this.#syncNav();\n }\n }\n\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || PLACEMENT.TOP;\n }\n\n set placement(value) {\n if (value != null) {\n this.setAttribute('placement', value);\n }\n }\n\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */\n get noScrollControls() {\n return this.hasAttribute('no-scroll-controls');\n }\n\n set noScrollControls(value) {\n this.toggleAttribute('no-scroll-controls', !!value);\n }\n\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */\n get scrollDistance() {\n const value = Number(this.getAttribute('scroll-distance'));\n return Math.abs(value) || DEFAULT_SCROLL_DISTANCE;\n }\n\n set scrollDistance(value) {\n this.setAttribute('scroll-distance', Math.abs(value).toString() || DEFAULT_SCROLL_DISTANCE.toString());\n }\n\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */\n get activation() {\n return this.getAttribute('activation') || ACTIVATION.AUTO;\n }\n\n set activation(value) {\n this.setAttribute('activation', value || ACTIVATION.AUTO);\n }\n\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */\n get noTabCycling() {\n return this.hasAttribute('no-tab-cycling');\n }\n\n set noTabCycling(value) {\n this.toggleAttribute('no-tab-cycling', !!value);\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('placement');\n this.#upgradeProperty('noScrollControls');\n this.#upgradeProperty('scrollDistance');\n this.#upgradeProperty('activation');\n this.#upgradeProperty('noTabCycling');\n\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.addEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.addEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.addEventListener('click', this.#handleTabClick);\n tabsContainer?.addEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.addEventListener('click', this.#handleScrollButtonClick));\n this.addEventListener('a-tab-close', this.#handleTabClose);\n\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(entries => {\n this.#rafId = window.requestAnimationFrame(() => {\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach(el => el.toggleAttribute('hidden', !isElementScrollable));\n navContainer?.part.toggle('nav--has-scroll-controls', isElementScrollable);\n navContainer?.classList.toggle('tab-group__nav--has-scroll-controls', isElementScrollable);\n });\n });\n }\n\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.removeEventListener('click', this.#handleTabClick);\n tabsContainer?.removeEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.removeEventListener('click', this.#handleScrollButtonClick));\n this.removeEventListener('a-tab-close', this.#handleTabClose);\n this.#stopResizeObserver();\n }\n\n /**\n * Starts observing the tabs container for resize events.\n */\n #startResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n const scrollElement = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n\n /**\n * Stops observing the tabs container for resize events.\n */\n #stopResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n this.#resizeObserver.disconnect();\n\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */\n #getDirection() {\n return getComputedStyle(this).direction || 'ltr';\n }\n\n /**\n * Hides the tab group if there are no tabs.\n */\n #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */\n #linkPanels() {\n const tabs = this.#allTabs();\n\n this.#hideEmptyTabGroup();\n\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach(tab => {\n const panel = tab.nextElementSibling;\n\n if (!panel || panel.tagName.toLowerCase() !== 'a-tab-panel') {\n return console.error(`Tab #${tab.id} is not a sibling of a `);\n }\n\n tab.setAttribute('aria-controls', panel.id);\n panel.setAttribute('aria-labelledby', tab.id);\n });\n }\n\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */\n #allPanels() {\n return Array.from(this.querySelectorAll('a-tab-panel'));\n }\n\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */\n #allTabs() {\n return Array.from(this.querySelectorAll('a-tab'));\n }\n\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */\n #panelForTab(tab) {\n const panelId = tab.getAttribute('aria-controls');\n return this.querySelector(`#${panelId}`);\n }\n\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */\n #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find(tab => !tab.disabled) || null;\n }\n\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */\n #lastTab() {\n const tabs = this.#allTabs();\n\n for (let i = tabs.length - 1; i >= 0; i--) {\n if (!tabs[i].disabled) {\n return tabs[i];\n }\n }\n\n return null;\n }\n\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */\n #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) - 1\n : tabs.findIndex(tab => tab.selected) - 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[(newIdx + tabs.length) % tabs.length].disabled) {\n newIdx--;\n }\n\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) {\n return null;\n }\n\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */\n #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) + 1\n : tabs.findIndex(tab => tab.selected) + 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[newIdx % tabs.length].disabled) {\n newIdx++;\n }\n\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) {\n return null;\n }\n\n return tabs[newIdx % tabs.length];\n }\n\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */\n #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n\n tabs.forEach(tab => tab.selected = false);\n panels.forEach(panel => panel.hidden = true);\n }\n\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */\n #syncNav() {\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n\n /** @type {HTMLButtonElement[]} */\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n if (this.noScrollControls || this.placement === PLACEMENT.START || this.placement === PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach(el => el.hidden = true);\n navContainer?.part.remove('nav--has-scroll-controls');\n navContainer?.classList.remove('tab-group__nav--has-scroll-controls');\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach(el => el.hidden = false);\n }\n }\n\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */\n #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find(tab => tab.selected && !tab.disabled) || tabs.find(tab => !tab.disabled);\n\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) {\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n this.#setSelectedTab(tab);\n }\n }\n\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n #setSelectedTab(tab) {\n this.#reset();\n\n if (tab) {\n tab.selected = true;\n }\n\n const panel = this.#panelForTab(tab);\n\n if (panel) {\n panel.hidden = false;\n }\n }\n\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */\n #handleSlotChange = evt => {\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n\n if (evt.target.name === 'tab') {\n this.#hasTabSlotChangedOnce = true;\n }\n };\n\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */\n #handleKeyDown = evt => {\n if (\n evt.target.tagName.toLowerCase() !== 'a-tab' // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) {\n return;\n }\n\n const placement = validPlacements.includes(this.placement || '') ? this.placement : PLACEMENT.TOP;\n const orientation = [PLACEMENT.TOP, PLACEMENT.BOTTOM].includes(placement || '') ? 'horizontal' : 'vertical';\n const direction = this.#getDirection();\n let tab = null;\n\n switch (evt.key) {\n case KEYCODE.LEFT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#prevTab() : this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.RIGHT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#nextTab() : this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.UP:\n if (orientation === 'vertical') {\n tab = this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.DOWN:\n if (orientation === 'vertical') {\n tab = this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.END:\n tab = this.#lastTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.ENTER:\n case KEYCODE.SPACE:\n tab = evt.target;\n if (tab) {\n this.selectTab(tab);\n }\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClick = evt => {\n const tab = evt.target.closest('a-tab');\n\n if (tab) {\n this.selectTab(tab);\n }\n };\n\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleScrollButtonClick = evt => {\n const scrollButton = evt.target.closest('.tab-group__scroll-button');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (!scrollButton || !tabsContainer) {\n return;\n }\n\n const sign = scrollButton.classList.contains('tab-group__scroll-button--start') ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClose = evt => {\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n\n if (tab) {\n tab.remove();\n\n tab.selected && this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n if (panel && panel.tagName.toLowerCase() === 'a-tab-panel') {\n panel.remove();\n }\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */\n selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */\n selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find(tab => tab.id === id);\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n selectTab(tab) {\n const oldTab = this.#allTabs().find(t => t.selected);\n\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== 'a-tab') {\n return;\n }\n\n this.#setSelectedTab(tab);\n\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(() => {\n tab.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n tab.focus();\n });\n\n if (oldTab) {\n this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: oldTab.id }\n }));\n }\n\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n static defineCustomElement(elementName = 'a-tab-group') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabGroup);\n }\n }\n}\n\nTabGroup.defineCustomElement();\n\nexport { TabGroup };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\nlet tabCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
    \n \n
    \n`;\n\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */\nclass Tab extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['selected', 'disabled', 'closable'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'selected' && oldValue !== newValue) {\n this.setAttribute('aria-selected', this.selected.toString());\n }\n\n if (name === 'disabled' && oldValue !== newValue) {\n this.setAttribute('aria-disabled', this.disabled.toString());\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n if (name === 'closable' && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement('span');\n closeButton.className = 'tab__close';\n closeButton.setAttribute('part', 'close-tab');\n closeButton.innerHTML = /* html */``;\n this.shadowRoot?.querySelector('.tab')?.appendChild(closeButton);\n closeButton.addEventListener('click', this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('selected');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('closable');\n\n if (!this.id) {\n this.id = uid('tab', (++tabCounter).toString());\n }\n\n this.setAttribute('slot', 'tab');\n this.setAttribute('role', 'tab');\n this.setAttribute('aria-selected', 'false');\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n }\n\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */\n get selected() {\n return this.hasAttribute('selected');\n }\n\n set selected(value) {\n this.toggleAttribute('selected', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */\n get closable() {\n return this.hasAttribute('closable');\n }\n\n set closable(value) {\n this.toggleAttribute('closable', !!value);\n }\n\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n evt.stopPropagation();\n\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: { tabId: this.id }\n }));\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n static defineCustomElement(elementName = 'a-tab') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, Tab);\n }\n }\n}\n\nTab.defineCustomElement();\n\nexport { Tab };\n","// @ts-check\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","// @ts-check\n\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */\nconst upgradeProperty = (prop, instance) => {\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\nexport { upgradeProperty };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\n\nlet panelCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
    \n \n
    \n`;\n\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */\nclass TabPanel extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.setAttribute('slot', 'panel');\n this.setAttribute('role', 'tabpanel');\n this.setAttribute('hidden', '');\n\n if (!this.id) {\n this.id = uid('panel', (++panelCounter).toString());\n }\n }\n\n static defineCustomElement(elementName = 'a-tab-panel') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabPanel);\n }\n }\n}\n\nTabPanel.defineCustomElement();\n\nexport { TabPanel };\n","Object.defineProperty({},\"ModalElement\",{get:function(){return o},set:void 0,enumerable:!0,configurable:!0});let e=document.createElement(\"template\"),t=/* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;e.innerHTML=/* html */`\n \n\n \n
    \n
    \n \n\n
    \n \n
    \n
    \n\n \n\n
    \n \n
    \n
    \n
    \n`;/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */class o extends HTMLElement{/** @type {Nullable} */#e=null;/** @type {Nullable} */#t=null;/** @type {ReturnType | undefined} */#o=void 0;constructor(){if(super(),!this.shadowRoot){let t=this.attachShadow({mode:\"open\"});t.appendChild(e.content.cloneNode(!0))}this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#t=this.shadowRoot.querySelector('slot[name=\"footer\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\"]}/**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */attributeChangedCallback(e,t,o){if(null!==this.#e){if(\"open\"===e&&t!==o&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}}))):this.#e.close()),\"no-header\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__header\");null!==e&&(e.hidden=this.noHeader)}if(\"no-animations\"===e&&t!==o&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),\"no-close-button\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__close\");null!==e&&(e.hidden=this.noCloseButton)}}}/**\n * Lifecycle method that is called when the element is added to the DOM.\n */connectedCallback(){this.#i(\"open\"),this.#i(\"staticBackdrop\"),this.#i(\"noHeader\"),this.#i(\"noAnimations\"),this.#i(\"noCloseButton\"),this.#i(\"fullscreen\"),this.#e?.addEventListener(\"click\",this.#a),this.#e?.addEventListener(\"close\",this.#l),this.#e?.addEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#n),this.#t?.addEventListener(\"slotchange\",this.#r)}/**\n * Lifecycle method that is called when the element is removed from the DOM.\n */disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#e?.addEventListener(\"click\",this.#a),this.#e?.removeEventListener(\"close\",this.#l),this.#e?.removeEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#n),this.#t?.removeEventListener(\"slotchange\",this.#r)}/**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */get open(){return this.hasAttribute(\"open\")}set open(e){e?this.setAttribute(\"open\",\"\"):this.removeAttribute(\"open\")}/**\n * Determines if the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){e?this.setAttribute(\"static-backdrop\",\"\"):this.removeAttribute(\"static-backdrop\")}/**\n * Determines if the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){e?this.setAttribute(\"no-header\",\"\"):this.removeAttribute(\"no-header\")}/**\n * Determines if the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){e?this.setAttribute(\"no-animations\",\"\"):this.removeAttribute(\"no-animations\")}/**\n * Determines if the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){e?this.setAttribute(\"no-close-button\",\"\"):this.removeAttribute(\"no-close-button\")}/**\n * Determines if the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){e?this.setAttribute(\"fullscreen\",\"\"):this.removeAttribute(\"fullscreen\")}/**\n * Applies a pulse effect on the dialog.\n */#d(){this.#o||(this.#e?.classList.add(\"dialog--pulse\"),this.#o=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#o),this.#o=void 0},300))}/**\n * Handles the close event of the dialog.\n */#l=()=>{// This is needed because the dialog element does not reset\n// the open property when the dialog is closed by the user.\nthis.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}}))};/**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */#s=e=>{let t=this.#c(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */#n=e=>{let t=this.#c(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */#a=e=>{if(e.target!==e.currentTarget)return;let t=this.#c(\"backdrop-click\");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#e?.close()};/**\n * Handles the slotchange event of the footer slot.\n */#r=()=>{if(null===this.#e)return;/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__footer\");if(null===e)return;let t=this.#t?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};/**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */#c(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen'} prop - The property to upgrade.\n */#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}/**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */show(){this.open||(this.open=!0)}/**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */hide(){this.open&&(this.open=!1)}/**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */static defineCustomElement(e=\"modal-element\"){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,o)}}o.defineCustomElement();export{o as ModalElement};//# sourceMappingURL=modal-element-defined.js.map\n\n//# sourceMappingURL=modal-element-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $180b6dcf923bafc7$exports = {};\n\n$parcel$export($180b6dcf923bafc7$exports, \"ModalElement\", function () { return $180b6dcf923bafc7$export$32589115725b904b; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ const $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION = 300;\nconst $180b6dcf923bafc7$var$template = document.createElement(\"template\");\nconst $180b6dcf923bafc7$var$styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${$180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$180b6dcf923bafc7$var$template.innerHTML = /* html */ `\n \n\n \n
    \n
    \n \n\n
    \n \n
    \n
    \n\n \n\n
    \n \n
    \n
    \n
    \n`;\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ class $180b6dcf923bafc7$export$32589115725b904b extends HTMLElement {\n /** @type {Nullable} */ #dialogEl = null;\n /** @type {Nullable} */ #footerSlotEl = null;\n /** @type {ReturnType | undefined} */ #pulseAnimationTimeout = void 0;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($180b6dcf923bafc7$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector(\"dialog\");\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) return;\n if (name === \"open\" && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n } else this.#dialogEl.close();\n }\n if (name === \"no-header\" && oldValue !== newValue) {\n /** @type {Nullable} */ const headerEl = this.#dialogEl.querySelector(\".dialog__header\");\n if (headerEl !== null) headerEl.hidden = this.noHeader;\n }\n if (name === \"no-animations\" && oldValue !== newValue) this.#dialogEl.classList.toggle(\"dialog--no-animations\", this.noAnimations);\n if (name === \"no-close-button\" && oldValue !== newValue) {\n /** @type {Nullable} */ const closeBtnEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeBtnEl !== null) closeBtnEl.hidden = this.noCloseButton;\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"open\");\n this.#upgradeProperty(\"staticBackdrop\");\n this.#upgradeProperty(\"noHeader\");\n this.#upgradeProperty(\"noAnimations\");\n this.#upgradeProperty(\"noCloseButton\");\n this.#upgradeProperty(\"fullscreen\");\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.addEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.addEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.removeEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.removeEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */ get open() {\n return this.hasAttribute(\"open\");\n }\n set open(value) {\n if (value) this.setAttribute(\"open\", \"\");\n else this.removeAttribute(\"open\");\n }\n /**\n * Determines if the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */ get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(value) {\n if (value) this.setAttribute(\"static-backdrop\", \"\");\n else this.removeAttribute(\"static-backdrop\");\n }\n /**\n * Determines if the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */ get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(value) {\n if (value) this.setAttribute(\"no-header\", \"\");\n else this.removeAttribute(\"no-header\");\n }\n /**\n * Determines if the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */ get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(value) {\n if (value) this.setAttribute(\"no-animations\", \"\");\n else this.removeAttribute(\"no-animations\");\n }\n /**\n * Determines if the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */ get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(value) {\n if (value) this.setAttribute(\"no-close-button\", \"\");\n else this.removeAttribute(\"no-close-button\");\n }\n /**\n * Determines if the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */ get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(value) {\n if (value) this.setAttribute(\"fullscreen\", \"\");\n else this.removeAttribute(\"fullscreen\");\n }\n /**\n * Applies a pulse effect on the dialog.\n */ #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) return;\n this.#dialogEl?.classList.add(\"dialog--pulse\");\n this.#pulseAnimationTimeout = setTimeout(()=>{\n this.#dialogEl?.classList.remove(\"dialog--pulse\");\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION);\n }\n /**\n * Handles the close event of the dialog.\n */ #handleDialogClose = ()=>{\n // This is needed because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n };\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */ #handleDialogCancel = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"escape-key\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"close-button\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */ #handleDialogClick = (evt)=>{\n if (evt.target !== evt.currentTarget) return;\n const requestCloseEvent = this.#createRequestCloseEvent(\"backdrop-click\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n this.#dialogEl?.close();\n };\n /**\n * Handles the slotchange event of the footer slot.\n */ #handleFooterSlotChange = ()=>{\n if (this.#dialogEl === null) return;\n /** @type {Nullable} */ const footerEl = this.#dialogEl.querySelector(\".dialog__footer\");\n if (footerEl === null) return;\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n footerEl.hidden = !hasFooterSlotNodes;\n };\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */ #createRequestCloseEvent(reason) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason: reason,\n element: this\n }\n });\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */ show() {\n if (this.open) return;\n this.open = true;\n }\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */ hide() {\n if (!this.open) return;\n this.open = false;\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */ static defineCustomElement(elementName = \"modal-element\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $180b6dcf923bafc7$export$32589115725b904b);\n }\n}\n\n\n(0, $180b6dcf923bafc7$export$32589115725b904b).defineCustomElement();\n\n\nexport {$180b6dcf923bafc7$export$32589115725b904b as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nconst PULSE_ANIMATION_DURATION = 300;\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n
    \n
    \n \n\n
    \n \n
    \n
    \n\n \n\n
    \n \n
    \n
    \n
    \n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n if (value) {\n this.setAttribute('open', '');\n } else {\n this.removeAttribute('open');\n }\n }\n\n /**\n * Determines if the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n if (value) {\n this.setAttribute('static-backdrop', '');\n } else {\n this.removeAttribute('static-backdrop');\n }\n }\n\n /**\n * Determines if the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n if (value) {\n this.setAttribute('no-header', '');\n } else {\n this.removeAttribute('no-header');\n }\n }\n\n /**\n * Determines if the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n if (value) {\n this.setAttribute('no-animations', '');\n } else {\n this.removeAttribute('no-animations');\n }\n }\n\n /**\n * Determines if the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n if (value) {\n this.setAttribute('no-close-button', '');\n } else {\n this.removeAttribute('no-close-button');\n }\n }\n\n /**\n * Determines if the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n if (value) {\n this.setAttribute('fullscreen', '');\n } else {\n this.removeAttribute('fullscreen');\n }\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is needed because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n if (evt.target !== evt.currentTarget) {\n return;\n }\n\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n\n this.#dialogEl?.close();\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","(function () {\n 'use strict';\n\n if (typeof document === 'undefined' || 'adoptedStyleSheets' in document) { return; }\n\n var hasShadyCss = 'ShadyCSS' in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument('');\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === 'object' ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, '');\n if (_contents !== contents) {\n console.warn('@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418');\n }\n return _contents.trim();\n }\n function isElementConnected(element) {\n return 'isConnected' in element\n ? element.isConnected\n : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function (value, index) { return arr.indexOf(value) === index; });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function (value) { return arr2.indexOf(value) === -1; });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n\n var cssStyleSheetMethods = [\n 'addRule',\n 'deleteRule',\n 'insertRule',\n 'removeRule',\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function () {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function () {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? proto$1.isPrototypeOf(instance) ||\n nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement('style');\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function (_location) { return _location !== location; }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function () {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods\n .get(sheet)\n .forEach(function (command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) {\n throw new TypeError('Illegal invocation');\n }\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement('style');\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n }\n catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === 'string') {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function (location) {\n if (location.isConnected()) {\n restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n }\n });\n }\n };\n defineProperty(proto$1, 'cssRules', {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n },\n });\n defineProperty(proto$1, 'media', {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n },\n });\n cssStyleSheetMethods.forEach(function (method) {\n proto$1[method] = function () {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({ method: method, args: args });\n $locations.get(self).forEach(function (location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance,\n });\n\n var defaultObserverOptions = {\n childList: true,\n subtree: true,\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, 'adoptedStyleSheets', {\n configurable: true,\n enumerable: true,\n get: function () {\n return getAssociatedLocation(this).sheets;\n },\n set: function (sheets) {\n getAssociatedLocation(this).update(sheets);\n },\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function (foundNode) {\n return getShadowRoot(foundNode)\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_REJECT;\n },\n null, false);\n for (var next = void 0; (next = iter.nextNode());) {\n callback(getShadowRoot(next));\n }\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return (element instanceof HTMLStyleElement &&\n $uniqueSheets.get(self).some(function (sheet) { return getAdopterByLocation(sheet, self); }));\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function (sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function (sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function (mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function (mutation) {\n if (!hasShadyCss) {\n forEach.call(mutation.addedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).connect();\n });\n });\n }\n forEach.call(mutation.removedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n if (isExistingAdopter(self, node)) {\n adopt(self);\n }\n if (!hasShadyCss) {\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).disconnect();\n });\n }\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function () {\n var element = $element.get(this);\n return element instanceof Document\n ? element.readyState !== 'loading'\n : isElementConnected(element.host);\n },\n connect: function () {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) {\n adopt(this);\n }\n traverseWebComponents(container, function (root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function () {\n $observer.get(this).disconnect();\n },\n update: function (sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? 'Document' : 'ShadowRoot';\n if (!Array.isArray(sheets)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n }\n if (!sheets.every(isCSSStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n }\n if (sheets.some(isNonConstructedStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n }\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function (sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) {\n adopt(self);\n }\n },\n };\n\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if ('ShadowRoot' in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === 'closed') {\n closedShadowRootRegistry.set(this, root);\n }\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) {\n documentLocation.connect();\n }\n else {\n document.addEventListener('DOMContentLoaded', documentLocation.connect.bind(documentLocation));\n }\n\n}());\n","import * as bootstrapStyleSheet from 'url:bootstrap/dist/css/bootstrap.css';\nimport * as mainStyleSheet from 'url:../../../src/css/main.css';\n\nconst styleURLs = [bootstrapStyleSheet, mainStyleSheet];\n\nconst styleSheets = [];\n\nfor (let i = 0; i < styleURLs.length; i += 1) {\n styleSheets.push(new CSSStyleSheet());\n}\n\n(async function () {\n const styles = await Promise.all(styleURLs.map(async styleURL => {\n const res = await fetch(styleURL);\n return res.text();\n }));\n\n for (let i = 0; i < styles.length; i += 1) {\n await styleSheets[i].replace(styles[i]);\n }\n\n document.body.style.visibility = 'visible';\n}());\n\nexport { styleSheets };\n","module.exports = new __parcel__URL__(\"bootstrap.33ff2998.css\").toString();","module.exports = new __parcel__URL__(\"main.2238cf96.css\").toString();","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n`;\n\nclass AddFeed extends HTMLElement {\n #formEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n\n connectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n disconnectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n\n const input = evt.target['feed-url'];\n const url = input.value.trim();\n const { value: feeds = [] } = await getFeeds();\n const urlExists = Boolean(feeds.find(feed => feed.url === url));\n const isValidURL = canParseURL(url);\n\n if (!urlExists && isValidURL) {\n await saveFeed({\n url,\n title: '' // Title is not available at this point; it will be fetched later.\n });\n }\n\n input.value = '';\n }\n}\n\nif (!window.customElements.get('add-feed')) {\n window.customElements.define('add-feed', AddFeed);\n}\n","import { set, get, del } from 'idb-keyval';\n\nconst STORAGE_PREFIX = 'rss-reader/';\nconst STORAGE_FEEDS_KEY = STORAGE_PREFIX + 'feeds';\n\nconst getItem = async key => {\n try {\n return {\n value: await get(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error\n };\n }\n};\n\nconst setItem = async (key, data) => {\n try {\n await set(key, data);\n\n return {\n error: void 0\n };\n } catch (error) {\n return { error };\n }\n};\n\nexport const getFeeds = async () => {\n return getItem(STORAGE_FEEDS_KEY);\n};\n\nexport const setFeeds = async (feeds, shouldDispatchEvent = true) => {\n if (!Array.isArray(feeds)) {\n return;\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'set',\n feeds\n }\n }));\n }\n\n return { error };\n};\n\nexport const saveFeed = async (feed, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const foundFeed = feeds.find(f => f.url === feed.url);\n let action = '';\n\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = 'update';\n } else {\n feeds.push(feed);\n action = 'create';\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action,\n feed\n }\n }));\n }\n\n return { error };\n};\n\nexport const deleteFeed = async (feedUrl, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const filteredFeeds = feeds.filter(f => f.url !== feedUrl);\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, filteredFeeds);\n\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) {\n await del(STORAGE_FEEDS_KEY);\n }\n\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'delete',\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n\n return { error };\n};\n","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction promisifyRequest(request) {\n return new Promise(function (resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function () {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n\n\n request.onabort = request.onerror = function () {\n return reject(request.error);\n };\n });\n}\n\nfunction createStore(dbName, storeName) {\n var request = indexedDB.open(dbName);\n\n request.onupgradeneeded = function () {\n return request.result.createObjectStore(storeName);\n };\n\n var dbp = promisifyRequest(request);\n return function (txMode, callback) {\n return dbp.then(function (db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\n\nvar defaultGetStoreFunc;\n\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction get(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return promisifyRequest(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction set(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction setMany(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n entries.forEach(function (entry) {\n return store.put(entry[1], entry[0]);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction getMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return Promise.all(keys.map(function (key) {\n return promisifyRequest(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction update(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n return (// Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function (resolve, reject) {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n })\n );\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction del(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction delMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n keys.forEach(function (key) {\n return store.delete(key);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction clear() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\n\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction keys() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.key);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction values() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.value);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction entries() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([promisifyRequest(store.getAllKeys()), promisifyRequest(store.getAll())]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n keys = _ref2[0],\n values = _ref2[1];\n\n return keys.map(function (key, i) {\n return [key, values[i]];\n });\n });\n }\n\n var items = [];\n return customStore('readonly', function (store) {\n return eachCursor(store, function (cursor) {\n return items.push([cursor.key, cursor.value]);\n }).then(function () {\n return items;\n });\n });\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */\nexport const canParseURL = url => {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n","import Sortable from 'sortablejs/modular/sortable.core.esm.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, setFeeds, deleteFeed } from '../helpers/storage.js';\nimport { debounce } from '../utils/debounce.js';\nimport './import-feeds.js';\nimport './export-feeds.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
    \n
    \n
    \n \n \n \n \n \n\n \n\n \n
    \n\n
    \n \n\n \n\n \n
    \n
    \n\n
      \n
      \n\n
      \n

      \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

      \n\n

      \n \n

      \n
      \n\n \n

      Import feeds

      \n \n
      \n\n \n

      Export feeds

      \n \n
      \n`;\n\nclass FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#isEditable = false;\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#feedsContainerEl = this.shadowRoot.getElementById('feedsContainer');\n this.#feedsListEl = this.shadowRoot.getElementById('feedsList');\n this.#editBtn = this.shadowRoot.getElementById('editBtn');\n this.#importBtn = this.shadowRoot.getElementById('importBtn');\n this.#importAltBtn = this.shadowRoot.getElementById('importAltBtn');\n this.#exportBtn = this.shadowRoot.getElementById('exportBtn');\n this.#searchInput = this.shadowRoot.getElementById('searchInput');\n this.#searchClearBtn = this.shadowRoot.getElementById('searchClearBtn');\n this.#importDialog = this.shadowRoot.getElementById('importDialog');\n this.#exportDialog = this.shadowRoot.getElementById('exportDialog');\n this.#importFeedsEl = this.shadowRoot.querySelector('import-feeds');\n this.#exportFeedsEl = this.shadowRoot.querySelector('export-feeds');\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById('noFeedsDisclaimer');\n }\n\n async connectedCallback() {\n const { value: feeds = [] } = await getFeeds();\n\n feeds.forEach((feed => this.#addFeed(feed)));\n\n this.#toggleFeedsVisibility();\n\n this.#feedsListEl.addEventListener('click', this.#handleActionsClick);\n this.#editBtn.addEventListener('click', this.#handleEditRequest);\n this.#importAltBtn.addEventListener('click', this.#handleImportRequest);\n this.#importBtn.addEventListener('click', this.#handleImportRequest);\n this.#exportBtn.addEventListener('click', this.#handleExportRequest);\n this.#searchInput.addEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener('click', this.#handleSearchClear);\n this.#importDialog.addEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener('me-close', this.#handleExportDialogClose);\n this.addEventListener('feeds-imported', this.#handleFeedsImported);\n document.addEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n\n new Sortable(this.#feedsListEl, {\n animation: 150,\n handle: '.sort-handler',\n onEnd: async evt => {\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll('li'), (el) => {\n return {\n url: el.getAttribute('data-url'),\n title: el.getAttribute('data-title') || ''\n };\n });\n\n await setFeeds(feeds, false);\n }\n });\n }\n\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener('click', this.#handleActionsClick);\n this.#editBtn.removeEventListener('click', this.#handleEditRequest);\n this.#importBtn.removeEventListener('click', this.#handleImportRequest);\n this.#importAltBtn.removeEventListener('click', this.#handleImportRequest);\n this.#exportBtn.removeEventListener('click', this.#handleExportRequest);\n this.#searchInput.removeEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener('click', this.#handleSearchClear);\n this.#importDialog.removeEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener('me-close', this.#handleExportDialogClose);\n this.removeEventListener('feeds-imported', this.#handleFeedsImported);\n document.removeEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n }\n\n #searchFeeds = (searchValue = '') => {\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n\n if (feedEls.length === 0) {\n return;\n }\n\n feedEls.forEach(el => {\n const url = (el.getAttribute('data-url') || '').toLowerCase();\n const title = (el.getAttribute('data-title') || '').toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n\n #debounceSearchFeeds = debounce(this.#searchFeeds, 250);\n\n #handleSearchInputDebounced = evt => {\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle('d-none', !value);\n return this.#debounceSearchFeeds(value);\n };\n\n #handleSearchClear = () => {\n this.#searchInput.value = '';\n this.#searchInput.dispatchEvent(new Event('input'));\n };\n\n #handleEditRequest = evt => {\n this.#isEditable = !this.#isEditable;\n\n evt.currentTarget.classList.toggle('active');\n\n this.shadowRoot.querySelectorAll('.sort-handler, .delete-button').forEach(el => {\n el.hidden = !el.hidden;\n });\n };\n\n #handleImportRequest = () => {\n this.#importDialog.open = true;\n };\n\n #handleExportRequest = () => {\n this.#exportDialog.open = true;\n };\n\n #handleImportDialogOpen = () => {\n try {\n this.#importFeedsEl.shadowRoot.querySelector('a-tab-group').selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector('textarea').value = '';\n } catch {\n // Fail silently\n }\n };\n\n #handleExportDialogOpen = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeedsEl.setAttribute('feeds', JSON.stringify(feeds));\n };\n\n #handleExportDialogClose = () => {\n this.#exportFeedsEl.removeAttribute('feeds');\n };\n\n #handleFeedsImported = () => {\n this.#importDialog.open = false;\n };\n\n #handleFeedsUpdateSuccess = evt => {\n if (evt.detail.action === 'delete') {\n this.#removeFeed(evt.detail.feed);\n }\n\n if (evt.detail.action === 'create') {\n this.#addFeed(evt.detail.feed);\n\n if (this.#searchInput.value) {\n this.#searchInput.value = '';\n this.#searchFeeds('');\n }\n }\n\n if (evt.detail.action === 'update') {\n const { url, title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n\n if (feedEl) {\n const linkContent = feedEl.querySelector('.link-content');\n\n feedEl.setAttribute('data-title', title || '');\n\n if (linkContent) {\n linkContent.innerHTML = title ? `${title}
      ${url}` : url;\n }\n }\n }\n };\n\n #handleActionsClick = evt => {\n const target = evt.target;\n const deleteBtn = target.closest('button.delete-button');\n const linkEl = target.closest('a.link');\n\n if (!linkEl && !deleteBtn) {\n return;\n }\n\n const feedItem = target.closest('li');\n const feedUrl = feedItem.getAttribute('data-url');\n\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) {\n deleteFeed(feedUrl);\n }\n }\n\n if (linkEl) {\n evt.preventDefault();\n document.querySelector('feed-reader').feedUrl = feedUrl;\n }\n };\n\n #addFeed(feed) {\n const { url, title } = feed;\n\n const link = document.createElement('a');\n link.className = 'link text-decoration-none d-flex align-items-center h-100';\n link.style.flex = '1';\n link.style.minWidth = 0;\n link.style.color = 'inherit';\n link.href = url;\n\n const linkContent = document.createElement('div');\n linkContent.className = 'text-truncate link-content';\n linkContent.innerHTML = title ? `${title}
      ${url}` : url;\n\n const deleteButton = document.createElement('button');\n deleteButton.type = 'button';\n deleteButton.title = 'Delete feed';\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = 'delete-button btn btn-default text-danger p-0';\n deleteButton.style.lineHeight = '1';\n deleteButton.innerHTML = /* html */`\n \n \n \n Delete\n `;\n\n const listItem = document.createElement('li');\n listItem.className = 'list-group-item p-0 d-flex justify-content-between align-items-center';\n listItem.style.height = 'var(--list-item-height)';\n listItem.setAttribute('data-url', url || '');\n listItem.setAttribute('data-title', title || '');\n\n const sortHandler = document.createElement('div');\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = 'sort-handler text-primary';\n sortHandler.innerHTML = /* html */`\n \n \n \n Reorder\n `;\n\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n\n this.#feedsListEl.appendChild(listItem);\n\n this.#toggleFeedsVisibility();\n }\n\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await getFeeds();\n this.#feedsContainerEl.classList.toggle('d-none', feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle('d-none', feeds.length > 0);\n }\n}\n\nif (!window.customElements.get('feeds-list')) {\n window.customElements.define('feeds-list', FeedsList);\n}\n","/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = parent.parentNode);\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\nvar OnSpill = [Remove, Revert];\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nexport default Sortable;\nexport { AutoScrollPlugin as AutoScroll, MultiDragPlugin as MultiDrag, OnSpill, Sortable, SwapPlugin as Swap };\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */\nexport const debounce = (fn, wait = 0, immediate = false) => {\n let timerId = null;\n\n if (typeof fn !== 'function') {\n throw new TypeError('Expected a function for first argument');\n }\n\n return (...args) => {\n clearTimeout(timerId);\n\n if (immediate && !timerId) {\n fn(...args);\n }\n\n timerId = setTimeout(() => {\n timerId = null;\n if (!immediate) {\n fn(...args);\n }\n }, wait);\n };\n};\n","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n From file\n \n
      \n \n Drag 'n' drop a file, or click to select file to import\n
      \n (Only JSON files are allowed)\n
      \n
      \n
      \n\n From text\n \n
      \n \n \n
      \n
      \n
      \n`;\n\nclass ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#dropzoneEl = this.shadowRoot.querySelector('files-dropzone');\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n connectedCallback() {\n this.#dropzoneEl.addEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener('submit', this.#handleImportFormSubmit);\n }\n\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener('submit', this.#handleImportFormSubmit);\n }\n\n #handleFilesDropzoneDropAccepted = evt => {\n const { acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.readAsText(file, 'utf-8');\n reader.onload = this.#handleFileReaderLoad;\n };\n\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) {\n return alert('Invalid file or no feeds found.');\n }\n\n const { value: feeds = [] } = await getFeeds();\n\n for (const feed of feedsToImport) {\n const feedExists = Boolean(feeds.find(f => f.url === feed.url));\n const { url, title } = feed;\n const isValidURL = canParseURL(url);\n\n if (!feedExists && isValidURL) {\n await saveFeed({ url, title });\n }\n }\n\n this.dispatchEvent(new Event('feeds-imported', {\n bubbles: true,\n composed: true\n }));\n }\n\n #handleFileReaderLoad = async (evt) => {\n try {\n const { result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert('The file is not valid.');\n }\n };\n\n #handleImportFormSubmit = async (evt) => {\n evt.preventDefault();\n\n const formData = new FormData(evt.target);\n const data = formData.get('import-data');\n\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert('The data is not valid.');\n }\n };\n}\n\nif (!window.customElements.get('import-feeds')) {\n window.customElements.define('import-feeds', ImportFeeds);\n}\n","import { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds } from '../helpers/storage.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
      \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
      \n\n
      \n
      \n
      \n
      \n
      \n\n \n`;\n\nclass ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#exportCodeEl = this.shadowRoot.getElementById('exportCode');\n this.#clipboardCopyEl = this.shadowRoot.querySelector('clipboard-copy');\n this.#webShareEl = this.shadowRoot.querySelector('web-share');\n this.#downloadButton = this.shadowRoot.getElementById('downloadButton');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feeds'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'feeds' && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n\n connectedCallback() {\n this.#downloadButton.addEventListener('click', this.#handleDownloadButtonClick);\n }\n\n disconnectedCallback() {\n this.#downloadButton.removeEventListener('click', this.#handleDownloadButtonClick);\n }\n\n get feeds() {\n return this.getAttribute('feeds');\n }\n\n set feeds(value) {\n this.setAttribute('feeds', value);\n }\n\n #getFeedsToExportString() {\n let feedsToExport = '';\n\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n\n return feedsToExport;\n }\n\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([data], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n #handleDownloadButtonClick = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeeds(feeds);\n };\n}\n\nif (!window.customElements.get('export-feeds')) {\n window.customElements.define('export-feeds', ExportFeeds);\n}\n","function a(a){return null!==a&&\"object\"==typeof a?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{a as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","import { styleSheets } from '../helpers/styles.js';\nimport { fetchFeed } from '../helpers/fetch-feeds.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\n\nlet controller;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n

      \n\n

      \n\n
      \n
      \n \n Please wait...\n
      \n\n
      \n \n \n \n There was an error while fetching the feed.\n
      \n\n
      \n
      \n
      \n`;\n\nclass FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#spinnerEl = this.shadowRoot.getElementById('spinner');\n this.#dialogEl = this.shadowRoot.querySelector('modal-element');\n this.#modalTitle = this.#dialogEl.querySelector('#feedTitle');\n this.#feedsViewer = this.shadowRoot.getElementById('feedsViewer');\n this.#errorEl = this.shadowRoot.getElementById('error');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feed-url'];\n }\n\n attributeChangedCallback(name) {\n if (name === 'feed-url') {\n this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n }\n\n connectedCallback() {\n this.#dialogEl.addEventListener('me-close', this.#handleFeedClose);\n }\n\n disconnectedCallback() {\n this.#dialogEl.removeEventListener('me-close', this.#handleFeedClose);\n }\n\n get feedUrl() {\n return this.getAttribute('feed-url');\n }\n\n set feedUrl(value) {\n if (value) {\n this.setAttribute('feed-url', value);\n } else {\n this.removeAttribute('feed-url');\n }\n }\n\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n\n #handleFeedClose = () => {\n controller && controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll('.card').forEach(el => el.remove());\n this.#modalTitle.innerHTML = '';\n this.#spinnerEl.classList.add('d-none');\n this.#errorEl.classList.add('d-none');\n }\n\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove('d-none');\n\n controller = new AbortController();\n\n try {\n const data = await fetchFeed(feedUrl, {\n signal: controller.signal\n });\n\n const { value: feeds = [] } = await getFeeds();\n const currentFeed = feeds.find(feed => feed.url === feedUrl);\n\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) {\n await saveFeed({\n url: feedUrl,\n title: data.feed.title || ''\n });\n }\n\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n\n data.items.forEach(item => {\n this.#feedsViewer.insertAdjacentHTML('beforeend', this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== 'AbortError') {\n console.error(error);\n this.#modalTitle.textContent = '';\n this.#errorEl.classList.remove('d-none');\n }\n } finally {\n this.#spinnerEl.classList.add('d-none');\n }\n }\n\n #feedsReaderTemplate(item) {\n const { link, title, description, author, pubDate, thumbnail } = item;\n let formattedDate = '';\n\n try {\n formattedDate = new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium'\n }).format(new Date(pubDate));\n } catch {\n formattedDate = '-';\n }\n\n return /* html */`\n
      \n
      \n \n
      \n
      ${title}
      \n

      ${formattedDate} ${author ? `• ${author}` : ''}

      \n
      \n\n \"${title}\"\n
      \n\n
      \n Read more...\n
      \n ${description}\n
      \n
      \n
      \n
      \n `;\n }\n}\n\nif (!window.customElements.get('feed-reader')) {\n window.customElements.define('feed-reader', FeedReader);\n}\n","const cache = new Map();\n\nexport const fetchFeed = async (url, requestOptions = {}) => {\n const cachedFeed = cache.get(url);\n\n if (cachedFeed) {\n return cachedFeed;\n }\n\n const res = await fetch('https://api.rss2json.com/v1/api.json?rss_url=' + url, requestOptions);\n\n if (!res.ok) {\n throw new Error('Error fetching data');\n }\n\n const json = await res.json();\n\n cache.set(url, json);\n\n return json;\n};\n"],"names":["$b35f94fa505d7279$var$controller","Object","defineProperty","get","$7664cb16aa99b643$export$ea3b71af1761ff40","set","enumerable","configurable","$7664cb16aa99b643$var$t","$7664cb16aa99b643$var$e","$7664cb16aa99b643$var$o","$7664cb16aa99b643$var$s","document","createElement","innerHTML","HTMLElement","t","e","o","s","i","constructor","shadowRoot","attachShadow","mode","appendChild","content","cloneNode","querySelector","observedAttributes","connectedCallback","r","addEventListener","n","disconnectedCallback","removeEventListener","a","attributeChangedCallback","disabled","setAttribute","toString","part","contains","toggle","value","getAttribute","from","hasAttribute","removeAttribute","feedbackDuration","Number","l","Element","prototype","getRootNode","composed","ownerDocument","Document","ShadowRoot","HTMLInputElement","HTMLTextAreaElement","HTMLAnchorElement","href","textContent","navigator","clipboard","writeText","d","dispatchEvent","CustomEvent","bubbles","detail","error","preventDefault","hidden","remove","add","clearTimeout","setTimeout","hasOwnProperty","call","defineCustomElement","window","customElements","define","$cd62c5572235e737$export$30b344bef3e55b67","$cd62c5572235e737$var$t","$cd62c5572235e737$var$e","delegatesFocus","toggleAttribute","shareUrl","shareTitle","shareText","shareFiles","Array","isArray","length","share","url","title","text","canShare","files","shareData","Error","name","target","nodeName","assignedElements","flatten","find","$9351176e8d763a78$export$6ccd1735166caad9","$9351176e8d763a78$var$e","Map","$9351176e8d763a78$var$t","$9351176e8d763a78$var$o","lastIndexOf","type","split","pop","toLowerCase","writable","$9351176e8d763a78$var$i","path","webkitRelativePath","$9351176e8d763a78$var$r","Promise","readEntries","$9351176e8d763a78$var$a","push","$9351176e8d763a78$var$n","file","fullPath","$9351176e8d763a78$var$s","kind","getAsEntry","webkitGetAsEntry","shift","isFile","indexOf","isDirectory","createReader","$9351176e8d763a78$var$d","$9351176e8d763a78$var$l","dataTransfer","items","$9351176e8d763a78$var$p","$9351176e8d763a78$var$c","$9351176e8d763a78$var$h","$9351176e8d763a78$var$u","getElementById","accept","multiple","autoFocus","focus","maxFiles","Math","floor","abs","maxSize","isNaN","minSize","noStyle","p","Event","dropEffect","classList","click","key","errors","code","message","Set","map","trim","filter","Boolean","replace","charAt","test","size","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$5a53255ef6289be5$var$t","random","substring","$5a53255ef6289be5$var$e","$5a53255ef6289be5$var$s","$5a53255ef6289be5$var$o","$5a53255ef6289be5$var$a","$5a53255ef6289be5$var$l","selected","closable","className","id","stopPropagation","tabId","$5a53255ef6289be5$var$i","$5a53255ef6289be5$var$r","$5a53255ef6289be5$var$n","$5a53255ef6289be5$var$c","$5a53255ef6289be5$var$d","TOP","BOTTOM","START","END","$5a53255ef6289be5$var$h","entries","$5a53255ef6289be5$var$b","AUTO","MANUAL","$5a53255ef6289be5$var$u","DOWN","LEFT","RIGHT","UP","HOME","ENTER","SPACE","$5a53255ef6289be5$var$p","$5a53255ef6289be5$var$g","$5a53255ef6289be5$export$85fd4ed3b8ca1010","placement","noScrollControls","scrollDistance","activation","noTabCycling","querySelectorAll","forEach","c","ResizeObserver","requestAnimationFrame","scrollWidth","clientWidth","h","b","u","unobserve","observe","disconnect","cancelAnimationFrame","getComputedStyle","direction","g","m","nextElementSibling","tagName","console","v","f","w","T","y","findIndex","matches","A","_","E","C","altKey","includes","selectTab","closest","scrollLeft","scrollTo","left","selectTabByIndex","selectTabById","scrollIntoView","inline","block","$d9c5053bade2d3f8$export$32589115725b904b","$d9c5053bade2d3f8$var$e","$d9c5053bade2d3f8$var$t","open","showModal","element","close","noHeader","noAnimations","noCloseButton","staticBackdrop","fullscreen","defaultPrevented","currentTarget","assignedNodes","cancelable","reason","show","hide","hasShadyCss","ShadyCSS","nativeShadow","bootstrapper","implementation","createHTMLDocument","closedShadowRootRegistry","WeakMap","_DOMException","DOMException","importPattern","nonConstructedProto","NonConstructedStyleSheet","CSSStyleSheet","reject","replaceSync","$basicStyleElement","$locations","$adoptersByLocation","$appliedMethods","proto$1","ConstructedStyleSheet","contents","resolve","checkInvocationCorrectness","_contents","self_1","warn","location","isConnected","restyleAdopter","getAdopterByLocation","sheet","cssRules","media","cssStyleSheetMethods","method","self","args","arguments","apply","basicSheet","Symbol","hasInstance","isCSSStyleSheetInstance","defaultObserverOptions","childList","subtree","locations","$element","$uniqueSheets","$observer","Location","readyState","host","connect","container","getAdopterContainer","adopt","traverseWebComponents","root","getAssociatedLocation","update","sheets","locationType","TypeError","every","some","isNonConstructedStyleSheetInstance","oldUniqueSheets","uniqueSheets","arr","index","removedSheets","arr1","arr2","removeNode","node","parentNode","removeChild","delete","_location","attachAdoptedStyleSheetProperty","proto","attach_1","init","documentLocation","bind","getShadowRoot","instance","isPrototypeOf","adopter","command","has","style","body","callback","iter","createNodeIterator","NodeFilter","SHOW_ELEMENT","foundNode","FILTER_ACCEPT","FILTER_REJECT","next","nextNode","styleList","createDocumentFragment","observer","insertBefore","MutationObserver","mutations","mutation","addedNodes","removedNodes","HTMLStyleElement","$1df650bc12a3679b$exports","URL","$4ffc15d651e12514$var$styleURLs","$4ffc15d651e12514$export$4b9cd30c41328fdd","$dc2f4a51b83babfd$export$b327150396135fe7","request","oncomplete","onsuccess","result","onabort","onerror","$dc2f4a51b83babfd$var$defaultGetStore","$dc2f4a51b83babfd$var$defaultGetStoreFunc","dbName","storeName","dbp","indexedDB","onupgradeneeded","createObjectStore","txMode","then","db","transaction","objectStore","styles","all","styleURL","res","fetch","visibility","$bad480a01f35862b$var$STORAGE_FEEDS_KEY","$bad480a01f35862b$var$STORAGE_PREFIX","$bad480a01f35862b$var$getItem","customStore","undefined","store","$bad480a01f35862b$var$setItem","data","put","$bad480a01f35862b$export$4890c08c4ffbd57b","$bad480a01f35862b$export$a8ce8a4ec117f05e","feeds","shouldDispatchEvent","action","$bad480a01f35862b$export$4b77448646caf424","feed","foundFeed","$bad480a01f35862b$export$4e54c6fd9fa8b09b","feedUrl","filteredFeeds","$e998bc9dc264f90b$export$981c5d1bd3894713","$e50da86101e29f72$var$template","$e50da86101e29f72$var$AddFeed","formEl","adoptedStyleSheets","handleFormSubmission","evt","input","urlExists","isValidURL","$2c4dfe5b2b5ff94a$var$ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","$2c4dfe5b2b5ff94a$var$_objectSpread2","source","obj","getOwnPropertyDescriptors","defineProperties","$2c4dfe5b2b5ff94a$var$_typeof","iterator","$2c4dfe5b2b5ff94a$var$_extends","assign","$2c4dfe5b2b5ff94a$var$userAgent","pattern","userAgent","match","$2c4dfe5b2b5ff94a$var$IE11OrLess","$2c4dfe5b2b5ff94a$var$Edge","$2c4dfe5b2b5ff94a$var$FireFox","$2c4dfe5b2b5ff94a$var$Safari","$2c4dfe5b2b5ff94a$var$IOS","$2c4dfe5b2b5ff94a$var$ChromeForAndroid","$2c4dfe5b2b5ff94a$var$captureMode","capture","passive","$2c4dfe5b2b5ff94a$var$on","el","event","fn","$2c4dfe5b2b5ff94a$var$off","$2c4dfe5b2b5ff94a$var$matches","selector","msMatchesSelector","webkitMatchesSelector","$2c4dfe5b2b5ff94a$var$closest","ctx","includeCTX","nodeType","$2c4dfe5b2b5ff94a$var$R_SPACE","$2c4dfe5b2b5ff94a$var$toggleClass","state","$2c4dfe5b2b5ff94a$var$css","prop","val","defaultView","currentStyle","$2c4dfe5b2b5ff94a$var$matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","$2c4dfe5b2b5ff94a$var$find","list","getElementsByTagName","$2c4dfe5b2b5ff94a$var$getWindowScrollingElement","scrollingElement","documentElement","$2c4dfe5b2b5ff94a$var$getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","getBoundingClientRect","top","elRect","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","scaleY","$2c4dfe5b2b5ff94a$var$isScrolledPast","elSide","parentSide","parent","$2c4dfe5b2b5ff94a$var$getParentAutoScrollElement","elSideVal","parentSideVal","$2c4dfe5b2b5ff94a$var$getChild","childNum","options","includeDragEl","currentChild","children","display","$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423","ghost","dragged","draggable","$2c4dfe5b2b5ff94a$var$lastChild","last","lastElementChild","previousElementSibling","$2c4dfe5b2b5ff94a$var$index","toUpperCase","clone","$2c4dfe5b2b5ff94a$var$getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollTop","includeSelf","elem","gotSelf","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","$2c4dfe5b2b5ff94a$var$isRectEqual","rect1","rect2","round","$2c4dfe5b2b5ff94a$var$throttle","ms","$2c4dfe5b2b5ff94a$var$_throttleTimeout","$2c4dfe5b2b5ff94a$var$scrollBy","x","$2c4dfe5b2b5ff94a$var$clone","Polymer","$","jQuery","Zepto","dom","$2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement","ghostEl","rect","child","animated","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","min","Infinity","max","$2c4dfe5b2b5ff94a$var$expando","Date","getTime","$2c4dfe5b2b5ff94a$var$plugins","$2c4dfe5b2b5ff94a$var$defaults","initializeByDefault","$2c4dfe5b2b5ff94a$var$PluginManager","mount","plugin","option","pluginName","concat","pluginEvent","eventName","sortable","_this","eventCanceled","cancel","eventNameGlobal","initializePlugins","defaults","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","$2c4dfe5b2b5ff94a$var$_excluded","$2c4dfe5b2b5ff94a$var$pluginEvent","_ref","originalEvent","$2c4dfe5b2b5ff94a$var$_objectWithoutProperties","excluded","$2c4dfe5b2b5ff94a$var$_objectWithoutPropertiesLoose","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","dragEl","$2c4dfe5b2b5ff94a$var$dragEl","parentEl","$2c4dfe5b2b5ff94a$var$parentEl","$2c4dfe5b2b5ff94a$var$ghostEl","rootEl","$2c4dfe5b2b5ff94a$var$rootEl","nextEl","$2c4dfe5b2b5ff94a$var$nextEl","lastDownEl","$2c4dfe5b2b5ff94a$var$lastDownEl","cloneEl","$2c4dfe5b2b5ff94a$var$cloneEl","cloneHidden","$2c4dfe5b2b5ff94a$var$cloneHidden","dragStarted","$2c4dfe5b2b5ff94a$var$moved","putSortable","$2c4dfe5b2b5ff94a$var$putSortable","activeSortable","active","oldIndex","$2c4dfe5b2b5ff94a$var$oldIndex","oldDraggableIndex","$2c4dfe5b2b5ff94a$var$oldDraggableIndex","newIndex","$2c4dfe5b2b5ff94a$var$newIndex","newDraggableIndex","$2c4dfe5b2b5ff94a$var$newDraggableIndex","hideGhostForTarget","$2c4dfe5b2b5ff94a$var$_hideGhostForTarget","unhideGhostForTarget","$2c4dfe5b2b5ff94a$var$_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","$2c4dfe5b2b5ff94a$var$_dispatchEvent","info","$2c4dfe5b2b5ff94a$var$dispatchEvent","targetEl","toEl","fromEl","extraEventProperties","onName","substr","createEvent","initEvent","to","item","pullMode","lastPutMode","allEventProperties","$2c4dfe5b2b5ff94a$var$activeGroup","$2c4dfe5b2b5ff94a$var$tapEvt","$2c4dfe5b2b5ff94a$var$touchEvt","$2c4dfe5b2b5ff94a$var$lastDx","$2c4dfe5b2b5ff94a$var$lastDy","$2c4dfe5b2b5ff94a$var$tapDistanceLeft","$2c4dfe5b2b5ff94a$var$tapDistanceTop","$2c4dfe5b2b5ff94a$var$lastTarget","$2c4dfe5b2b5ff94a$var$lastDirection","$2c4dfe5b2b5ff94a$var$targetMoveDistance","$2c4dfe5b2b5ff94a$var$ghostRelativeParent","$2c4dfe5b2b5ff94a$var$awaitingDragStarted","$2c4dfe5b2b5ff94a$var$ignoreNextClick","$2c4dfe5b2b5ff94a$var$sortables","$2c4dfe5b2b5ff94a$var$pastFirstInvertThresh","$2c4dfe5b2b5ff94a$var$isCircumstantialInvert","$2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll","$2c4dfe5b2b5ff94a$var$_silent","$2c4dfe5b2b5ff94a$var$savedInputChecked","$2c4dfe5b2b5ff94a$var$documentExists","$2c4dfe5b2b5ff94a$var$CSSFloatProperty","$2c4dfe5b2b5ff94a$var$supportDraggable","$2c4dfe5b2b5ff94a$var$supportCssPointerEvents","cssText","pointerEvents","$2c4dfe5b2b5ff94a$var$_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","clear","$2c4dfe5b2b5ff94a$var$_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","$2c4dfe5b2b5ff94a$var$_detectNearestEmptySortable","ret","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","$2c4dfe5b2b5ff94a$var$_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","revertClone","stopImmediatePropagation","$2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent","nearest","touches","clientX","clientY","_onDragOver","$2c4dfe5b2b5ff94a$var$_checkOutsideTargetEl","_isOutsideThisEl","animationCallbackId","animationStates","sort","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","animation","easing","setData","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","captureAnimationState","slice","fromRect","thisAnimationDuration","childMatrix","addAnimationState","removeAnimationState","splice","$2c4dfe5b2b5ff94a$var$indexOfObject","animateAll","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","sqrt","pow","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","offsetWidth","$2c4dfe5b2b5ff94a$var$_onMove","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","$2c4dfe5b2b5ff94a$var$_disableDraggable","$2c4dfe5b2b5ff94a$var$_unsilent","$2c4dfe5b2b5ff94a$var$_nextTick","$2c4dfe5b2b5ff94a$var$_cancelNextTick","_getDirection","touch","pointerType","originalTarget","composedPath","$2c4dfe5b2b5ff94a$var$_saveInputCheckedState","inputs","idx","checked","button","isContentEditable","criteria","_prepareDragStart","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","$2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely","dx","dy","cssMatrix","_hideClone","cloneId","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","$2c4dfe5b2b5ff94a$var$_ghostIsLast","lastElRect","childContainingRect","changed","firstElRect","firstChild","sibling","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","$2c4dfe5b2b5ff94a$var$_getSwapDirection","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","dragIndex","after","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","save","handleEvent","toArray","order","$2c4dfe5b2b5ff94a$var$_generateId","str","src","sum","charCodeAt","useAnimation","destroy","utils","on","off","css","is","extend","dst","throttle","toggleClass","nextTick","cancelNextTick","detectDirection","getChild","_len","plugins","_key","create","version","$2c4dfe5b2b5ff94a$var$scrollEl","$2c4dfe5b2b5ff94a$var$scrollRootEl","$2c4dfe5b2b5ff94a$var$touchEvt$1","$2c4dfe5b2b5ff94a$var$autoScrolls","isFallback","scroll","scrollCustomFn","sens","scrollSensitivity","speed","scrollSpeed","autoScroll","pid","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","$2c4dfe5b2b5ff94a$var$drop","toSortable","changedTouches","onSpill","$2c4dfe5b2b5ff94a$var$Revert","$2c4dfe5b2b5ff94a$var$Remove","startIndex","dragStart","_ref2","_ref3","drop","_ref4","parentSortable","$4481690a5b2e12d6$export$61fc7d43ac8f84b0","wait","immediate","timerId","$884937fee35c0707$var$template","$884937fee35c0707$var$ImportFeeds","dropzoneEl","importForm","handleFilesDropzoneDropAccepted","handleImportFormSubmit","reader","FileReader","readAsText","onload","handleFileReaderLoad","importFeeds","feedsToImport","alert","feedExists","JSON","parse","formData","FormData","$74fb585f2eaf8e2d$var$template","$74fb585f2eaf8e2d$var$ExportFeeds","exportCodeEl","clipboardCopyEl","webShareEl","downloadButton","oldValue","newValue","feedsToExport","getFeedsToExportString","handleDownloadButtonClick","stringify","exportFeeds","blob","Blob","createObjectURL","link","download","revokeObjectURL","$26a2e0c8216738ce$var$template","$26a2e0c8216738ce$var$FeedsList","isEditable","feedsContainerEl","feedsListEl","editBtn","importBtn","importAltBtn","exportBtn","searchInput","searchClearBtn","importDialog","exportDialog","importFeedsEl","exportFeedsEl","noFeedsDisclaimerEl","addFeed","toggleFeedsVisibility","handleActionsClick","handleEditRequest","handleImportRequest","handleExportRequest","handleSearchInputDebounced","handleSearchClear","handleImportDialogOpen","handleExportDialogOpen","handleExportDialogClose","handleFeedsImported","handleFeedsUpdateSuccess","onEnd","searchFeeds","searchValue","feedEls","searchQuery","debounceSearchFeeds","removeFeed","feedEl","linkContent","deleteBtn","linkEl","feedItem","confirm","flex","minWidth","color","deleteButton","lineHeight","listItem","sortHandler","$72c9c9ace8c869ec$var$cache","$72c9c9ace8c869ec$export$5b107dfb127cada8","requestOptions","cachedFeed","ok","json","$b35f94fa505d7279$var$template","$b35f94fa505d7279$var$FeedReader","spinnerEl","dialogEl","modalTitle","feedsViewer","errorEl","openFeed","closeFeed","handleFeedClose","renderFeed","abort","resetDialogContent","AbortController","signal","currentFeed","insertAdjacentHTML","feedsReaderTemplate","description","author","pubDate","thumbnail","formattedDate","Intl","DateTimeFormat","dateStyle","format","$a4c1285108bf4a9d$export$ea3b71af1761ff40","$a4c1285108bf4a9d$var$COMPONENT_NAME","$a4c1285108bf4a9d$var$SUCCESS_STATUS","$a4c1285108bf4a9d$var$ERROR_STATUS","$a4c1285108bf4a9d$var$template","timeout","buttonEl","copySlot","successSlot","errorSlot","upgradeProperty","handleClick","forceResetStatus","copy","copyValue","showStatus","status","elementName","ClipboardCopy","$e179325634270afd$export$30b344bef3e55b67","$e179325634270afd$var$styles","$e179325634270afd$var$template","buttonSlot","getButton","handleSlotChange","WebShare","$862aa3736b0514bc$export$6ccd1735166caad9","$f31161edf38949e9$var$COMMON_MIME_TYPES","$f31161edf38949e9$var$FILES_TO_IGNORE","$f31161edf38949e9$var$toFileWithMimeType","hasExtension","extension","$f31161edf38949e9$var$toFileWithPath","fileWithMimeType","$f31161edf38949e9$var$readEntriesPromise","directoryReader","$f31161edf38949e9$var$readAllDirectoryEntries","$f31161edf38949e9$var$getFileFromFileEntry","fileEntry","$f31161edf38949e9$var$getFilesFromDataTransferItemList","dataTransferItemList","queue","entry","$f31161edf38949e9$var$getFilesFromFileList","fileList","$f31161edf38949e9$export$6d52664cd15c442","$862aa3736b0514bc$var$COMPONENT_NAME","$862aa3736b0514bc$var$TOO_MANY_FILES","$862aa3736b0514bc$var$template","$862aa3736b0514bc$var$styles","fileInput","handleFileInputChange","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleKeyUp","num","handleFilesSelect","filesLength","fileHasValidType","acceptedTypeSpecifiers","acceptedMimeTypesList","fileMimeType","baseMimeType","validType","fileExceedsMaxSize","fileIsSmallerThanMinSize","FilesDropzone","$aa07eeb3067ea186$export$e2a22331486dcca0","prefix","suffix","randomString","$2b7397b7d9d03d51$export$f7b23927dede22b3","$4b127c96b8d62b28$var$tabCounter","$4b127c96b8d62b28$var$styles","$4b127c96b8d62b28$var$template","$4b127c96b8d62b28$export$3e41faf802a29e71","closeButton","handleCloseButtonClick","$17a63ddf0f11756d$var$panelCounter","$17a63ddf0f11756d$var$styles","$17a63ddf0f11756d$var$template","$17a63ddf0f11756d$export$3d96ec278d3efce4","$6ed9897cfe6c2018$var$PLACEMENT","$6ed9897cfe6c2018$var$validPlacements","$6ed9897cfe6c2018$var$ACTIVATION","$6ed9897cfe6c2018$var$KEYCODE","$6ed9897cfe6c2018$var$styles","$6ed9897cfe6c2018$var$template","$6ed9897cfe6c2018$export$85fd4ed3b8ca1010","resizeObserver","rafId","hasTabSlotChangedOnce","syncNav","$6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE","tabSlot","panelSlot","tabsContainer","navContainer","scrollButtons","handleTabClick","handleKeyDown","handleScrollButtonClick","handleTabClose","targetElement","isElementScrollable","hideEmptyTabGroup","stopResizeObserver","startResizeObserver","scrollElement","getDirection","allTabs","linkPanels","tabs","tab","panel","allPanels","panelForTab","panelId","firstTab","lastTab","prevTab","newIdx","nextTab","reset","panels","setSelectedTabOnSlotChange","setSelectedTab","orientation","scrollButton","sign","oldTab","TabGroup","$180b6dcf923bafc7$export$32589115725b904b","$180b6dcf923bafc7$var$template","$180b6dcf923bafc7$var$styles","footerSlotEl","pulseAnimationTimeout","headerEl","closeBtnEl","handleDialogClick","handleDialogClose","handleDialogCancel","handleFooterSlotChange","applyPulseEffectOnDialog","requestCloseEvent","createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","ModalElement","$442be162a818aed4$export$c37129e465f64ef0","isWebShareSupported"],"version":3,"file":"index.063a0a63.js.map"} \ No newline at end of file diff --git a/docs/index.063a0a63.js b/docs/index.2b8c09b0.js similarity index 90% rename from docs/index.063a0a63.js rename to docs/index.2b8c09b0.js index 5317dc7..0f29503 100644 --- a/docs/index.063a0a63.js +++ b/docs/index.2b8c09b0.js @@ -539,7 +539,7 @@ let e;Object.defineProperty({},"ClipboardCopy",{get:function(){return r},set:voi -`;class $ extends HTMLElement{#t=null;#e=null;#o=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(H.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.querySelector("dialog"),this.#e=this.shadowRoot.querySelector('slot[name="footer"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button"]}attributeChangedCallback(e,t,o){if(null!==this.#t){if("open"===e&&t!==o&&(this.open?(this.#t.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}}))):this.#t.close()),"no-header"===e&&t!==o){let e=this.#t.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#t.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#t.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}}}connectedCallback(){this.#n("open"),this.#n("staticBackdrop"),this.#n("noHeader"),this.#n("noAnimations"),this.#n("noCloseButton"),this.#n("fullscreen"),this.#t?.addEventListener("click",this.#s),this.#t?.addEventListener("close",this.#l),this.#t?.addEventListener("cancel",this.#i),this.#t?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#a),this.#e?.addEventListener("slotchange",this.#r)}disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#t?.addEventListener("click",this.#s),this.#t?.removeEventListener("close",this.#l),this.#t?.removeEventListener("cancel",this.#i),this.#t?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#a),this.#e?.removeEventListener("slotchange",this.#r)}get open(){return this.hasAttribute("open")}set open(e){e?this.setAttribute("open",""):this.removeAttribute("open")}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){e?this.setAttribute("static-backdrop",""):this.removeAttribute("static-backdrop")}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){e?this.setAttribute("no-header",""):this.removeAttribute("no-header")}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){e?this.setAttribute("no-animations",""):this.removeAttribute("no-animations")}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){e?this.setAttribute("no-close-button",""):this.removeAttribute("no-close-button")}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){e?this.setAttribute("fullscreen",""):this.removeAttribute("fullscreen")}#d(){this.#o||(this.#t?.classList.add("dialog--pulse"),this.#o=setTimeout(()=>{this.#t?.classList.remove("dialog--pulse"),clearTimeout(this.#o),this.#o=void 0},300))}#l=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}}))};#i=e=>{let t=this.#h("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#a=e=>{let t=this.#h("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#s=e=>{if(e.target!==e.currentTarget)return;let t=this.#h("backdrop-click");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#t?.close()};#r=()=>{if(null===this.#t)return;let e=this.#t.querySelector(".dialog__footer");if(null===e)return;let t=this.#e?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#h(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#n(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e="modal-element"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,$)}}$.defineCustomElement(),function(){if("undefined"!=typeof document&&!("adoptedStyleSheets"in document)){var e="ShadyCSS"in window&&!ShadyCSS.nativeShadow,t=document.implementation.createHTMLDocument(""),o=new WeakMap,i="object"==typeof DOMException?Error:DOMException,n=Object.defineProperty,r=Array.prototype.forEach,a=/@import.+?;?$/gm,s=CSSStyleSheet.prototype;s.replace=function(){return Promise.reject(new i("Can't call replace on non-constructed CSSStyleSheets."))},s.replaceSync=function(){throw new i("Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.")};var l=new WeakMap,d=new WeakMap,c=new WeakMap,h=new WeakMap,u=T.prototype;u.replace=function(e){try{return this.replaceSync(e),Promise.resolve(this)}catch(e){return Promise.reject(e)}},u.replaceSync=function(e){if(A(this),"string"==typeof e){var t,o=this;l.get(o).textContent=((t=e.replace(a,""))!==e&&console.warn("@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418"),t.trim()),h.set(o,[]),d.get(o).forEach(function(e){e.isConnected()&&k(o,C(o,e))})}},n(u,"cssRules",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.cssRules}}),n(u,"media",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.media}}),["addRule","deleteRule","insertRule","removeRule"].forEach(function(e){u[e]=function(){var t=this;A(t);var o=arguments;h.get(t).push({method:e,args:o}),d.get(t).forEach(function(i){if(i.isConnected()){var n=C(t,i).sheet;n[e].apply(n,o)}});var i=l.get(t).sheet;return i[e].apply(i,o)}}),n(T,Symbol.hasInstance,{configurable:!0,value:x});var p={childList:!0,subtree:!0},m=new WeakMap,f=new WeakMap,b=new WeakMap,g=new WeakMap;if(z.prototype={isConnected:function(){var e,t=f.get(this);return t instanceof Document?"loading"!==t.readyState:"isConnected"in(e=t.host)?e.isConnected:document.contains(e)},connect:function(){var e=M(this);g.get(this).observe(e,p),b.get(this).length>0&&R(this),D(e,function(e){_(e).connect()})},disconnect:function(){g.get(this).disconnect()},update:function(e){var t=this,o=f.get(t)===document?"Document":"ShadowRoot";if(!Array.isArray(e))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Iterator getter is not callable.");if(!e.every(x))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Failed to convert value to 'CSSStyleSheet'");if(e.some(S))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Can't adopt non-constructed stylesheets");t.sheets=e;var i=b.get(t),n=e.filter(function(t,o){return e.indexOf(t)===o});i.filter(function(e){return -1===n.indexOf(e)}).forEach(function(e){(function(e){e.parentNode.removeChild(e)})(C(e,t)),c.get(e).delete(t),d.set(e,d.get(e).filter(function(e){return e!==t}))}),b.set(t,n),t.isConnected()&&n.length>0&&R(t)}},window.CSSStyleSheet=T,L(Document),"ShadowRoot"in window){L(ShadowRoot);var v=Element.prototype,w=v.attachShadow;v.attachShadow=function(e){var t=w.call(this,e);return"closed"===e.mode&&o.set(this,t),t}}var y=_(document);y.isConnected()?y.connect():document.addEventListener("DOMContentLoaded",y.connect.bind(y))}function E(e){return e.shadowRoot||o.get(e)}function x(e){return"object"==typeof e&&(u.isPrototypeOf(e)||s.isPrototypeOf(e))}function S(e){return"object"==typeof e&&s.isPrototypeOf(e)}function C(e,t){return c.get(e).get(t)}function k(e,t){requestAnimationFrame(function(){t.textContent=l.get(e).textContent,h.get(e).forEach(function(e){return t.sheet[e.method].apply(t.sheet,e.args)})})}function A(e){if(!l.has(e))throw TypeError("Illegal invocation")}function T(){var e=document.createElement("style");t.body.appendChild(e),l.set(this,e),d.set(this,[]),c.set(this,new WeakMap),h.set(this,[])}function _(e){var t=m.get(e);return t||(t=new z(e),m.set(e,t)),t}function L(e){n(e.prototype,"adoptedStyleSheets",{configurable:!0,enumerable:!0,get:function(){return _(this).sheets},set:function(e){_(this).update(e)}})}function D(e,t){for(var o=document.createNodeIterator(e,NodeFilter.SHOW_ELEMENT,function(e){return E(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT},null,!1),i=void 0;i=o.nextNode();)t(E(i))}function M(e){var t=f.get(e);return t instanceof Document?t.body:t}function R(e){var t=document.createDocumentFragment(),o=b.get(e),i=g.get(e),n=M(e);i.disconnect(),o.forEach(function(o){var i;t.appendChild(C(o,e)||(i=document.createElement("style"),c.get(o).set(e,i),d.get(o).push(e),i))}),n.insertBefore(t,null),i.observe(n,p),o.forEach(function(t){k(t,C(t,e))})}function z(t){var o=this;o.sheets=[],f.set(o,t),b.set(o,[]),g.set(o,new MutationObserver(function(t,i){if(!document){i.disconnect();return}t.forEach(function(t){e||r.call(t.addedNodes,function(e){e instanceof Element&&D(e,function(e){_(e).connect()})}),r.call(t.removedNodes,function(t){t instanceof Element&&(t instanceof HTMLStyleElement&&b.get(o).some(function(e){return C(e,o)})&&R(o),e||D(t,function(e){_(e).disconnect()}))})})}))}}();var U,Y={};Y=new URL("bootstrap.33ff2998.css",import.meta.url).toString();const X=[Y,new URL("main.2238cf96.css",import.meta.url).toString()],W=[];for(let e=0;e(await fetch(e)).text()));for(let t=0;t{try{return{value:await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:G();return t("readonly",function(t){return V(t.get(e))})}(e),error:void 0}}catch(e){return{value:void 0,error:e}}},K=async(e,t)=>{try{return await function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:G();return o("readwrite",function(o){return o.put(t,e),V(o.transaction)})}(e,t),{error:void 0}}catch(e){return{error:e}}},Q=async()=>J(Z),ee=async(e,t=!0)=>{if(!Array.isArray(e))return;let{error:o}=await K(Z,e);return!o&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"set",feeds:e}})),{error:o}},et=async(e,t=!0)=>{let{value:o=[]}=await Q(),i=o.find(t=>t.url===e.url),n="";i?(i.url=e.url,i.title=e.title,n="update"):(o.push(e),n="create");let{error:r}=await K(Z,o);return!r&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:n,feed:e}})),{error:r}},eo=async(e,t=!0)=>{let{value:o=[]}=await Q(),i=o.filter(t=>t.url!==e),{error:n}=await K(Z,i);return!n&&t&&(0===i.length&&await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:G();return t("readwrite",function(t){return t.delete(e),V(t.transaction)})}(Z),document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"delete",feed:{url:e}}}))),{error:n}},ei=e=>{try{return new URL(e),!0}catch{return!1}},en=document.createElement("template");en.innerHTML=` +`;class $ extends HTMLElement{#t=null;#e=null;#o=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(H.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.querySelector("dialog"),this.#e=this.shadowRoot.querySelector('slot[name="footer"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button"]}attributeChangedCallback(e,t,o){if(null!==this.#t){if("open"===e&&t!==o&&(this.open?(this.#t.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="hidden")):this.#t.close()),"no-header"===e&&t!==o){let e=this.#t.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#t.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#t.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}}}connectedCallback(){this.#n("open"),this.#n("staticBackdrop"),this.#n("noHeader"),this.#n("noAnimations"),this.#n("noCloseButton"),this.#n("fullscreen"),this.#n("preserveOverflow"),this.#t?.addEventListener("click",this.#s),this.#t?.addEventListener("close",this.#l),this.#t?.addEventListener("cancel",this.#r),this.#t?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#i),this.#e?.addEventListener("slotchange",this.#a)}disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#t?.addEventListener("click",this.#s),this.#t?.removeEventListener("close",this.#l),this.#t?.removeEventListener("cancel",this.#r),this.#t?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#i),this.#e?.removeEventListener("slotchange",this.#a)}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",!!e)}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){this.toggleAttribute("static-backdrop",!!e)}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){this.toggleAttribute("no-header",!!e)}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){this.toggleAttribute("no-animations",!!e)}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){this.toggleAttribute("no-close-button",!!e)}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){this.toggleAttribute("fullscreen",!!e)}get preserveOverflow(){return this.hasAttribute("preserve-overflow")}set preserveOverflow(e){this.toggleAttribute("preserve-overflow",!!e)}#d(){this.#o||(this.#t?.classList.add("dialog--pulse"),this.#o=setTimeout(()=>{this.#t?.classList.remove("dialog--pulse"),clearTimeout(this.#o),this.#o=void 0},300))}#l=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="")};#r=e=>{let t=this.#h("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#i=e=>{let t=this.#h("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#s=e=>{if(e.target!==e.currentTarget)return;let t=this.#h("backdrop-click");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#t?.close()};#a=()=>{if(null===this.#t)return;let e=this.#t.querySelector(".dialog__footer");if(null===e)return;let t=this.#e?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#h(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#n(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e="modal-element"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,$)}}$.defineCustomElement(),function(){if("undefined"!=typeof document&&!("adoptedStyleSheets"in document)){var e="ShadyCSS"in window&&!ShadyCSS.nativeShadow,t=document.implementation.createHTMLDocument(""),o=new WeakMap,i="object"==typeof DOMException?Error:DOMException,n=Object.defineProperty,r=Array.prototype.forEach,a=/@import.+?;?$/gm,s=CSSStyleSheet.prototype;s.replace=function(){return Promise.reject(new i("Can't call replace on non-constructed CSSStyleSheets."))},s.replaceSync=function(){throw new i("Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.")};var l=new WeakMap,d=new WeakMap,c=new WeakMap,h=new WeakMap,u=T.prototype;u.replace=function(e){try{return this.replaceSync(e),Promise.resolve(this)}catch(e){return Promise.reject(e)}},u.replaceSync=function(e){if(A(this),"string"==typeof e){var t,o=this;l.get(o).textContent=((t=e.replace(a,""))!==e&&console.warn("@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418"),t.trim()),h.set(o,[]),d.get(o).forEach(function(e){e.isConnected()&&k(o,C(o,e))})}},n(u,"cssRules",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.cssRules}}),n(u,"media",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.media}}),["addRule","deleteRule","insertRule","removeRule"].forEach(function(e){u[e]=function(){var t=this;A(t);var o=arguments;h.get(t).push({method:e,args:o}),d.get(t).forEach(function(i){if(i.isConnected()){var n=C(t,i).sheet;n[e].apply(n,o)}});var i=l.get(t).sheet;return i[e].apply(i,o)}}),n(T,Symbol.hasInstance,{configurable:!0,value:x});var p={childList:!0,subtree:!0},m=new WeakMap,f=new WeakMap,b=new WeakMap,g=new WeakMap;if(z.prototype={isConnected:function(){var e,t=f.get(this);return t instanceof Document?"loading"!==t.readyState:"isConnected"in(e=t.host)?e.isConnected:document.contains(e)},connect:function(){var e=M(this);g.get(this).observe(e,p),b.get(this).length>0&&R(this),D(e,function(e){_(e).connect()})},disconnect:function(){g.get(this).disconnect()},update:function(e){var t=this,o=f.get(t)===document?"Document":"ShadowRoot";if(!Array.isArray(e))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Iterator getter is not callable.");if(!e.every(x))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Failed to convert value to 'CSSStyleSheet'");if(e.some(S))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Can't adopt non-constructed stylesheets");t.sheets=e;var i=b.get(t),n=e.filter(function(t,o){return e.indexOf(t)===o});i.filter(function(e){return -1===n.indexOf(e)}).forEach(function(e){(function(e){e.parentNode.removeChild(e)})(C(e,t)),c.get(e).delete(t),d.set(e,d.get(e).filter(function(e){return e!==t}))}),b.set(t,n),t.isConnected()&&n.length>0&&R(t)}},window.CSSStyleSheet=T,L(Document),"ShadowRoot"in window){L(ShadowRoot);var v=Element.prototype,w=v.attachShadow;v.attachShadow=function(e){var t=w.call(this,e);return"closed"===e.mode&&o.set(this,t),t}}var y=_(document);y.isConnected()?y.connect():document.addEventListener("DOMContentLoaded",y.connect.bind(y))}function E(e){return e.shadowRoot||o.get(e)}function x(e){return"object"==typeof e&&(u.isPrototypeOf(e)||s.isPrototypeOf(e))}function S(e){return"object"==typeof e&&s.isPrototypeOf(e)}function C(e,t){return c.get(e).get(t)}function k(e,t){requestAnimationFrame(function(){t.textContent=l.get(e).textContent,h.get(e).forEach(function(e){return t.sheet[e.method].apply(t.sheet,e.args)})})}function A(e){if(!l.has(e))throw TypeError("Illegal invocation")}function T(){var e=document.createElement("style");t.body.appendChild(e),l.set(this,e),d.set(this,[]),c.set(this,new WeakMap),h.set(this,[])}function _(e){var t=m.get(e);return t||(t=new z(e),m.set(e,t)),t}function L(e){n(e.prototype,"adoptedStyleSheets",{configurable:!0,enumerable:!0,get:function(){return _(this).sheets},set:function(e){_(this).update(e)}})}function D(e,t){for(var o=document.createNodeIterator(e,NodeFilter.SHOW_ELEMENT,function(e){return E(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT},null,!1),i=void 0;i=o.nextNode();)t(E(i))}function M(e){var t=f.get(e);return t instanceof Document?t.body:t}function R(e){var t=document.createDocumentFragment(),o=b.get(e),i=g.get(e),n=M(e);i.disconnect(),o.forEach(function(o){var i;t.appendChild(C(o,e)||(i=document.createElement("style"),c.get(o).set(e,i),d.get(o).push(e),i))}),n.insertBefore(t,null),i.observe(n,p),o.forEach(function(t){k(t,C(t,e))})}function z(t){var o=this;o.sheets=[],f.set(o,t),b.set(o,[]),g.set(o,new MutationObserver(function(t,i){if(!document){i.disconnect();return}t.forEach(function(t){e||r.call(t.addedNodes,function(e){e instanceof Element&&D(e,function(e){_(e).connect()})}),r.call(t.removedNodes,function(t){t instanceof Element&&(t instanceof HTMLStyleElement&&b.get(o).some(function(e){return C(e,o)})&&R(o),e||D(t,function(e){_(e).disconnect()}))})})}))}}();var U,Y={};Y=new URL("bootstrap.33ff2998.css",import.meta.url).toString();const X=[Y,new URL("main.2238cf96.css",import.meta.url).toString()],W=[];for(let e=0;e(await fetch(e)).text()));for(let t=0;t{try{return{value:await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:G();return t("readonly",function(t){return V(t.get(e))})}(e),error:void 0}}catch(e){return{value:void 0,error:e}}},K=async(e,t)=>{try{return await function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:G();return o("readwrite",function(o){return o.put(t,e),V(o.transaction)})}(e,t),{error:void 0}}catch(e){return{error:e}}},Q=async()=>J(Z),ee=async(e,t=!0)=>{if(!Array.isArray(e))return;let{error:o}=await K(Z,e);return!o&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"set",feeds:e}})),{error:o}},et=async(e,t=!0)=>{let{value:o=[]}=await Q(),i=o.find(t=>t.url===e.url),n="";i?(i.url=e.url,i.title=e.title,n="update"):(o.push(e),n="create");let{error:r}=await K(Z,o);return!r&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:n,feed:e}})),{error:r}},eo=async(e,t=!0)=>{let{value:o=[]}=await Q(),i=o.filter(t=>t.url!==e),{error:n}=await K(Z,i);return!n&&t&&(0===i.length&&await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:G();return t("readwrite",function(t){return t.delete(e),V(t.transaction)})}(Z),document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"delete",feed:{url:e}}}))),{error:n}},ei=e=>{try{return new URL(e),!0}catch{return!1}},en=document.createElement("template");en.innerHTML=` \n\n \n`;\nclass $7664cb16aa99b643$export$ea3b71af1761ff40 extends HTMLElement {\n #t = null;\n #e;\n #o;\n #s;\n #i;\n constructor(){\n super(), this.shadowRoot || (this.attachShadow({\n mode: \"open\"\n }), this.shadowRoot.appendChild($7664cb16aa99b643$var$s.content.cloneNode(!0))), this.#e = this.shadowRoot.querySelector(\"button\"), this.#o = this.shadowRoot.querySelector('slot[name=\"copy\"]'), this.#s = this.shadowRoot.querySelector('slot[name=\"success\"]'), this.#i = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#r(\"value\"), this.#r(\"from\"), this.#r(\"disabled\"), this.#r(\"feedbackDuration\"), this.#e.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#e.removeEventListener(\"click\", this.#n), this.#a();\n }\n attributeChangedCallback(t) {\n \"disabled\" === t && (this.#e.disabled = this.disabled, this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n get value() {\n return this.getAttribute(\"value\");\n }\n set value(t) {\n this.setAttribute(\"value\", t);\n }\n get from() {\n return this.getAttribute(\"from\");\n }\n set from(t) {\n this.setAttribute(\"from\", t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n t ? this.setAttribute(\"disabled\", \"\") : this.removeAttribute(\"disabled\");\n }\n get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || 1e3;\n }\n set feedbackDuration(t) {\n this.setAttribute(\"feedback-duration\", t);\n }\n async #l() {\n if (this.value || this.from) try {\n let o = \"\";\n if (this.value) o = this.value;\n else if (this.from) {\n let t = \"getRootNode\" in Element.prototype ? this.#e.getRootNode({\n composed: !0\n }) : this.#e.ownerDocument;\n if (!t || !(t instanceof Document || t instanceof ShadowRoot)) return;\n let e = t.querySelector(this.from);\n if (!e) return;\n o = e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement ? e.value : e instanceof HTMLAnchorElement && e.hasAttribute(\"href\") ? e.href : e.textContent;\n }\n await navigator.clipboard.writeText(o), this.#d($7664cb16aa99b643$var$e), this.dispatchEvent(new CustomEvent(`${$7664cb16aa99b643$var$t}-success`, {\n bubbles: !0,\n composed: !0,\n detail: {\n value: o\n }\n }));\n } catch (e) {\n this.#d($7664cb16aa99b643$var$o), this.dispatchEvent(new CustomEvent(`${$7664cb16aa99b643$var$t}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.#t || this.#l();\n };\n #d(t) {\n this.#o.hidden = !0, this.#s.hidden = t !== $7664cb16aa99b643$var$e, this.#i.hidden = t !== $7664cb16aa99b643$var$o, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\"), this.#e.part.add(`button--${t}`), this.#t && clearTimeout(this.#t), this.#t = setTimeout(()=>{\n this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(`button--${t}`), this.#t = null;\n }, this.feedbackDuration);\n }\n #a() {\n this.#t && clearTimeout(this.#t), this.#t = null, this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\");\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(e = $7664cb16aa99b643$var$t) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $7664cb16aa99b643$export$ea3b71af1761ff40);\n }\n}\n$7664cb16aa99b643$export$ea3b71af1761ff40.defineCustomElement();\n\n\nObject.defineProperty({}, \"WebShare\", {\n get: function() {\n return $cd62c5572235e737$export$30b344bef3e55b67;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $cd62c5572235e737$var$t = `\n :host {\n display: inline-block;\n }\n`, $cd62c5572235e737$var$e = document.createElement(\"template\");\n$cd62c5572235e737$var$e.innerHTML = `\n \n \n`;\nclass $cd62c5572235e737$export$30b344bef3e55b67 extends HTMLElement {\n #t;\n #e;\n #s = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($cd62c5572235e737$var$e.content.cloneNode(!0)), this.#t = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#e = this.#i();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"disabled\" === t && e !== s && this.#e && (this.#e.toggleAttribute(\"disabled\", this.disabled), this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part && this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#r(\"shareUrl\"), this.#r(\"shareTitle\"), this.#r(\"shareText\"), this.#r(\"shareFiles\"), this.#r(\"disabled\"), this.#t?.addEventListener(\"slotchange\", this.#a), this.#e?.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"slotchange\", this.#a), this.#e?.removeEventListener(\"click\", this.#n);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#s;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#s = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && \"AbortError\" === t.name) {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.share();\n };\n #a = (t)=>{\n t.target && \"button\" === t.target.name && (this.#e?.removeEventListener(\"click\", this.#n), this.#e = this.#i(), this.#e && (this.#e.addEventListener(\"click\", this.#n), \"BUTTON\" === this.#e.nodeName || this.#e.hasAttribute(\"role\") || this.#e.setAttribute(\"role\", \"button\")));\n };\n #i() {\n return this.#t && this.#t.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"button\" === t.getAttribute(\"slot\")) || null;\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $cd62c5572235e737$export$30b344bef3e55b67);\n }\n}\n$cd62c5572235e737$export$30b344bef3e55b67.defineCustomElement();\n\n\nObject.defineProperty({}, \"FilesDropzone\", {\n get: function() {\n return $9351176e8d763a78$export$6ccd1735166caad9;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $9351176e8d763a78$var$e = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $9351176e8d763a78$var$t = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $9351176e8d763a78$var$o = (t)=>{\n let { name: o } = t;\n if (o && -1 !== o.lastIndexOf(\".\") && !t.type) {\n let i = (o.split(\".\").pop() || \"\").toLowerCase(), r = $9351176e8d763a78$var$e.get(i);\n r && Object.defineProperty(t, \"type\", {\n value: r,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $9351176e8d763a78$var$i = (e, t)=>{\n let i = $9351176e8d763a78$var$o(e);\n if (\"string\" != typeof i.path) {\n let { webkitRelativePath: o } = e;\n Object.defineProperty(i, \"path\", {\n value: \"string\" == typeof t ? t : o || e.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return i;\n}, $9351176e8d763a78$var$r = async (e)=>await new Promise((t, o)=>{\n e.readEntries(t, o);\n }), $9351176e8d763a78$var$a = async (e)=>{\n let t = [], o = await $9351176e8d763a78$var$r(e);\n for(; o.length > 0;)t.push(...o), o = await $9351176e8d763a78$var$r(e);\n return t;\n}, $9351176e8d763a78$var$n = (e)=>new Promise((t, o)=>{\n e.file((o)=>t($9351176e8d763a78$var$i(o, e.fullPath)), o);\n }), $9351176e8d763a78$var$s = async (e)=>{\n let o = [], i = [];\n for (let t of e){\n if (\"file\" !== t.kind) continue;\n let e = t.getAsEntry ? t.getAsEntry() : t.webkitGetAsEntry();\n i.push(e);\n }\n for(; i.length > 0;){\n let e = i.shift();\n if (e) {\n if (e.isFile) {\n let i = await $9351176e8d763a78$var$n(e);\n -1 === $9351176e8d763a78$var$t.indexOf(i.name) && o.push(i);\n } else e.isDirectory && i.push(...await $9351176e8d763a78$var$a(e.createReader()));\n }\n }\n return o;\n}, $9351176e8d763a78$var$d = async (e)=>{\n let o = [];\n for (let r of e)-1 === $9351176e8d763a78$var$t.indexOf(r.name) && o.push($9351176e8d763a78$var$i(r));\n return o;\n}, $9351176e8d763a78$var$l = async (e)=>e.dataTransfer ? e.dataTransfer.items ? await $9351176e8d763a78$var$s(e.dataTransfer.items) : await $9351176e8d763a78$var$d(e.dataTransfer.files) : await $9351176e8d763a78$var$d(e.target.files), $9351176e8d763a78$var$p = \"files-dropzone\", $9351176e8d763a78$var$c = \"TOO_MANY_FILES\", $9351176e8d763a78$var$h = document.createElement(\"template\"), $9351176e8d763a78$var$u = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$9351176e8d763a78$var$h.innerHTML = `\n \n\n \n\n
      \n Drag 'n' drop files here, or click to select files\n
      \n`;\nclass $9351176e8d763a78$export$6ccd1735166caad9 extends HTMLElement {\n #e = null;\n #t = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($9351176e8d763a78$var$h.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.getElementById(\"file-input\"), this.#t = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n \"accept\" === e && t !== o && this.#e && (this.#e.accept = this.accept), \"disabled\" === e && t !== o && this.#e && (this.#e.disabled = this.disabled, this.disabled ? (this.#t?.removeAttribute(\"tabindex\"), this.#t?.setAttribute(\"aria-disabled\", \"true\")) : (this.#t?.setAttribute(\"tabindex\", \"0\"), this.#t?.setAttribute(\"aria-disabled\", \"false\"))), \"multiple\" === e && t !== o && this.#e && (this.#e.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#e?.addEventListener(\"change\", this.#i), this.#t?.addEventListener(\"dragenter\", this.#r), this.#t?.addEventListener(\"dragover\", this.#a), this.#t?.addEventListener(\"dragleave\", this.#n), this.#t?.addEventListener(\"drop\", this.#s), this.#t?.addEventListener(\"click\", this.#d), this.#t?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#t?.focus();\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"change\", this.#i), this.#t?.removeEventListener(\"dragenter\", this.#r), this.#t?.removeEventListener(\"dragover\", this.#a), this.#t?.removeEventListener(\"dragleave\", this.#n), this.#t?.removeEventListener(\"drop\", this.#s), this.#t?.removeEventListener(\"click\", this.#d), this.#t?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", null != e ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", null != e ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (null === e) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", null != e ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (null === e) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", null != e ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#p(await $9351176e8d763a78$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #a = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#t && (this.#t.classList.add(\"dropzone--dragover\"), this.#t.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$9351176e8d763a78$var$p}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #s = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\"));\n try {\n this.#p(await $9351176e8d763a78$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#e?.click();\n };\n #l = (e)=>{\n this.disabled || \" \" !== e.key && \"Enter\" !== e.key || this.#e?.click();\n };\n #p(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], o = [], i = e.length;\n if (!this.multiple && i > 1) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $9351176e8d763a78$var$c,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && i > this.maxFiles) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $9351176e8d763a78$var$c,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let i of e){\n let e = function(e, t = \"\") {\n if (!t) return !0;\n let o = [\n ...new Set(t.split(\",\").map((e)=>e.trim()).filter(Boolean))\n ], i = e.type, r = i.replace(/\\/.*$/, \"\");\n for (let t of o)if (\".\" === t.charAt(0)) {\n if (-1 !== e.name.toLowerCase().indexOf(t.toLowerCase(), e.name.length - t.length)) return !0;\n } else if (/\\/\\*$/.test(t)) {\n if (r === t.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === t) return !0;\n return !1;\n }(i, this.accept), r = i.size > this.maxSize, a = i.size < this.minSize;\n if (!e || r || a) {\n let t = [];\n e || t.push({\n code: \"INVALID_MIME_TYPE\",\n message: `File type \"${i.type}\" is not accepted.`\n }), r && t.push({\n code: \"FILE_TOO_LARGE\",\n message: `File size ${i.size} exceeds the maximum size of ${this.maxSize}.`\n }), a && t.push({\n code: \"FILE_TOO_SMALL\",\n message: `File size ${i.size} is smaller than the minimum size of ${this.minSize}.`\n }), o.push({\n file: i,\n errors: t\n });\n } else t.push(i);\n }\n this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: o\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), o.length > 0 && this.dispatchEvent(new CustomEvent(`${$9351176e8d763a78$var$p}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: o\n }\n })), this.#e && (this.#e.value = this.#e.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#e?.click();\n }\n #o(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n static defineCustomElement(e = $9351176e8d763a78$var$p) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $9351176e8d763a78$export$6ccd1735166caad9);\n }\n}\n$9351176e8d763a78$export$6ccd1735166caad9.defineCustomElement();\n\n\nlet $5a53255ef6289be5$var$t = (t = \"\", e = \"\")=>{\n let s = Math.random().toString(36).substring(2, 8);\n return `${\"string\" == typeof t && \"\" !== t ? t + \"-\" : \"\"}${s}${\"string\" == typeof e && \"\" !== e ? \"-\" + e : \"\"}`;\n}, $5a53255ef6289be5$var$e = (t, e)=>{\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let s = e[t];\n delete e[t], e[t] = s;\n }\n}, $5a53255ef6289be5$var$s = 0, $5a53255ef6289be5$var$o = `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`, $5a53255ef6289be5$var$a = document.createElement(\"template\");\n$5a53255ef6289be5$var$a.innerHTML = `\n \n\n
      \n \n
      \n`;\nclass $5a53255ef6289be5$var$l extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($5a53255ef6289be5$var$a.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n if (\"selected\" === t && e !== s && this.setAttribute(\"aria-selected\", this.selected.toString()), \"disabled\" === t && e !== s && (this.setAttribute(\"aria-disabled\", this.disabled.toString()), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\")), \"closable\" === t && e !== s) {\n if (this.closable) {\n let t = document.createElement(\"span\");\n t.className = \"tab__close\", t.setAttribute(\"part\", \"close-tab\"), t.innerHTML = '', this.shadowRoot?.querySelector(\".tab\")?.appendChild(t), t.addEventListener(\"click\", this.#t);\n } else {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t), t?.remove();\n }\n }\n }\n connectedCallback() {\n this.#e(\"selected\"), this.#e(\"disabled\"), this.#e(\"closable\"), this.id || (this.id = $5a53255ef6289be5$var$t(\"tab\", (++$5a53255ef6289be5$var$s).toString())), this.setAttribute(\"slot\", \"tab\"), this.setAttribute(\"role\", \"tab\"), this.setAttribute(\"aria-selected\", \"false\"), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t);\n }\n get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(t) {\n this.toggleAttribute(\"selected\", !!t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(t) {\n this.toggleAttribute(\"closable\", !!t);\n }\n #t = (t)=>{\n t.stopPropagation(), this.dispatchEvent(new CustomEvent(\"a-tab-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: this.id\n }\n }));\n };\n #e(t) {\n return $5a53255ef6289be5$var$e(t, this);\n }\n static defineCustomElement(t = \"a-tab\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $5a53255ef6289be5$var$l);\n }\n}\n$5a53255ef6289be5$var$l.defineCustomElement();\nlet $5a53255ef6289be5$var$i = 0, $5a53255ef6289be5$var$r = `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`, $5a53255ef6289be5$var$n = document.createElement(\"template\");\n$5a53255ef6289be5$var$n.innerHTML = `\n \n\n
      \n \n
      \n`;\nclass $5a53255ef6289be5$var$c extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($5a53255ef6289be5$var$n.content.cloneNode(!0));\n }\n connectedCallback() {\n this.setAttribute(\"slot\", \"panel\"), this.setAttribute(\"role\", \"tabpanel\"), this.setAttribute(\"hidden\", \"\"), this.id || (this.id = $5a53255ef6289be5$var$t(\"panel\", (++$5a53255ef6289be5$var$i).toString()));\n }\n static defineCustomElement(t = \"a-tab-panel\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $5a53255ef6289be5$var$c);\n }\n}\n$5a53255ef6289be5$var$c.defineCustomElement();\nlet $5a53255ef6289be5$var$d = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n}, $5a53255ef6289be5$var$h = Object.entries($5a53255ef6289be5$var$d).map(([, t])=>t), $5a53255ef6289be5$var$b = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n}, $5a53255ef6289be5$var$u = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n}, $5a53255ef6289be5$var$p = `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$5a53255ef6289be5$var$d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$5a53255ef6289be5$var$d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$5a53255ef6289be5$var$d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$5a53255ef6289be5$var$d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`, $5a53255ef6289be5$var$g = document.createElement(\"template\");\n$5a53255ef6289be5$var$g.innerHTML = `\n \n\n
      \n
      \n \n\n
      \n \n
      \n\n \n
      \n\n
      \n \n
      \n
      \n`;\nclass $5a53255ef6289be5$export$85fd4ed3b8ca1010 extends HTMLElement {\n #s = null;\n #o = null;\n #a = !1;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($5a53255ef6289be5$var$g.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"placement\" === t && e !== s && this.#l(), \"no-scroll-controls\" === t && e !== s && this.#l();\n }\n get placement() {\n return this.getAttribute(\"placement\") || $5a53255ef6289be5$var$d.TOP;\n }\n set placement(t) {\n null != t && this.setAttribute(\"placement\", t);\n }\n get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(t) {\n this.toggleAttribute(\"no-scroll-controls\", !!t);\n }\n get scrollDistance() {\n return Math.abs(Number(this.getAttribute(\"scroll-distance\"))) || 200;\n }\n set scrollDistance(t) {\n this.setAttribute(\"scroll-distance\", Math.abs(t).toString() || \"200\");\n }\n get activation() {\n return this.getAttribute(\"activation\") || $5a53255ef6289be5$var$b.AUTO;\n }\n set activation(t) {\n this.setAttribute(\"activation\", t || $5a53255ef6289be5$var$b.AUTO);\n }\n get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(t) {\n this.toggleAttribute(\"no-tab-cycling\", !!t);\n }\n connectedCallback() {\n this.#e(\"placement\"), this.#e(\"noScrollControls\"), this.#e(\"scrollDistance\"), this.#e(\"activation\"), this.#e(\"noTabCycling\");\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = this.shadowRoot?.querySelector(\".tab-group__nav\"), a = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.addEventListener(\"slotchange\", this.#i), e?.addEventListener(\"slotchange\", this.#i), s?.addEventListener(\"click\", this.#r), s?.addEventListener(\"keydown\", this.#n), a.forEach((t)=>t.addEventListener(\"click\", this.#c)), this.addEventListener(\"a-tab-close\", this.#d), \"ResizeObserver\" in window && (this.#s = new ResizeObserver((t)=>{\n this.#o = window.requestAnimationFrame(()=>{\n let e = t?.[0], s = e?.target, l = s?.scrollWidth > s?.clientWidth;\n a.forEach((t)=>t.toggleAttribute(\"hidden\", !l)), o?.part.toggle(\"nav--has-scroll-controls\", l), o?.classList.toggle(\"tab-group__nav--has-scroll-controls\", l);\n });\n })), this.#h(), this.#l();\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.removeEventListener(\"slotchange\", this.#i), e?.removeEventListener(\"slotchange\", this.#i), s?.removeEventListener(\"click\", this.#r), s?.removeEventListener(\"keydown\", this.#n), o.forEach((t)=>t.removeEventListener(\"click\", this.#c)), this.removeEventListener(\"a-tab-close\", this.#d), this.#b();\n }\n #u() {\n if (!this.#s) return;\n let t = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n t && (this.#s.unobserve(t), this.#s.observe(t));\n }\n #b() {\n this.#s && (this.#s.disconnect(), null !== this.#o && (window.cancelAnimationFrame(this.#o), this.#o = null));\n }\n #p() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n #h() {\n this.hidden = 0 === this.#g().length;\n }\n #m() {\n let t = this.#g();\n this.#h(), t.forEach((t)=>{\n let e = t.nextElementSibling;\n if (!e || \"a-tab-panel\" !== e.tagName.toLowerCase()) return console.error(`Tab #${t.id} is not a sibling of a `);\n t.setAttribute(\"aria-controls\", e.id), e.setAttribute(\"aria-labelledby\", t.id);\n });\n }\n #v() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n #g() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n #f(t) {\n let e = t.getAttribute(\"aria-controls\");\n return this.querySelector(`#${e}`);\n }\n #w() {\n return this.#g().find((t)=>!t.disabled) || null;\n }\n #T() {\n let t = this.#g();\n for(let e = t.length - 1; e >= 0; e--)if (!t[e].disabled) return t[e];\n return null;\n }\n #y() {\n let t = this.#g(), e = this.activation === $5a53255ef6289be5$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) - 1 : t.findIndex((t)=>t.selected) - 1;\n for(; t[(e + t.length) % t.length].disabled;)e--;\n return this.noTabCycling && e < 0 ? null : t[(e + t.length) % t.length];\n }\n #A() {\n let t = this.#g(), e = this.activation === $5a53255ef6289be5$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) + 1 : t.findIndex((t)=>t.selected) + 1;\n for(; t[e % t.length].disabled;)e++;\n return this.noTabCycling && e >= t.length ? null : t[e % t.length];\n }\n #_() {\n let t = this.#g(), e = this.#v();\n t.forEach((t)=>t.selected = !1), e.forEach((t)=>t.hidden = !0);\n }\n #l() {\n let t = this.shadowRoot?.querySelector(\".tab-group__nav\"), e = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n this.noScrollControls || this.placement === $5a53255ef6289be5$var$d.START || this.placement === $5a53255ef6289be5$var$d.END ? (this.#b(), e.forEach((t)=>t.hidden = !0), t?.part.remove(\"nav--has-scroll-controls\"), t?.classList.remove(\"tab-group__nav--has-scroll-controls\")) : (this.#u(), e.forEach((t)=>t.hidden = !1));\n }\n #E() {\n let t = this.#g(), e = t.find((t)=>t.selected && !t.disabled) || t.find((t)=>!t.disabled);\n e && (this.#a && !e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.#C(e));\n }\n #C(t) {\n this.#_(), t && (t.selected = !0);\n let e = this.#f(t);\n e && (e.hidden = !1);\n }\n #i = (t)=>{\n this.#m(), this.#l(), this.#E(), \"tab\" === t.target.name && (this.#a = !0);\n };\n #n = (t)=>{\n if (\"a-tab\" !== t.target.tagName.toLowerCase() || t.altKey) return;\n let e = $5a53255ef6289be5$var$h.includes(this.placement || \"\") ? this.placement : $5a53255ef6289be5$var$d.TOP, s = [\n $5a53255ef6289be5$var$d.TOP,\n $5a53255ef6289be5$var$d.BOTTOM\n ].includes(e || \"\") ? \"horizontal\" : \"vertical\", o = this.#p(), a = null;\n switch(t.key){\n case $5a53255ef6289be5$var$u.LEFT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#y() : this.#A()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.RIGHT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#A() : this.#y()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.UP:\n \"vertical\" === s && (a = this.#y()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.DOWN:\n \"vertical\" === s && (a = this.#A()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.HOME:\n (a = this.#w()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.END:\n (a = this.#T()) && (this.activation === $5a53255ef6289be5$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $5a53255ef6289be5$var$u.ENTER:\n case $5a53255ef6289be5$var$u.SPACE:\n (a = t.target) && this.selectTab(a);\n break;\n default:\n return;\n }\n t.preventDefault();\n };\n #r = (t)=>{\n let e = t.target.closest(\"a-tab\");\n e && this.selectTab(e);\n };\n #c = (t)=>{\n let e = t.target.closest(\".tab-group__scroll-button\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!e || !s) return;\n let o = e.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1, a = s.scrollLeft;\n s.scrollTo({\n left: a + o * this.scrollDistance\n });\n };\n #d = (t)=>{\n let e = t.target, s = this.#f(e);\n e && (e.remove(), e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n }))), s && \"a-tab-panel\" === s.tagName.toLowerCase() && s.remove();\n };\n #e(t) {\n return $5a53255ef6289be5$var$e(t, this);\n }\n selectTabByIndex(t) {\n let e = this.#g()[t];\n e && this.selectTab(e);\n }\n selectTabById(t) {\n let e = this.#g().find((e)=>e.id === t);\n e && this.selectTab(e);\n }\n selectTab(t) {\n let e = this.#g().find((t)=>t.selected);\n !t || t.disabled || t.selected || \"a-tab\" !== t.tagName.toLowerCase() || (this.#C(t), window.requestAnimationFrame(()=>{\n t.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n }), t.focus();\n }), e && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: t.id\n }\n })));\n }\n static defineCustomElement(t = \"a-tab-group\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $5a53255ef6289be5$export$85fd4ed3b8ca1010);\n }\n}\n$5a53255ef6289be5$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nObject.defineProperty({}, \"ModalElement\", {\n get: function() {\n return $d9c5053bade2d3f8$export$32589115725b904b;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $d9c5053bade2d3f8$var$e = document.createElement(\"template\"), $d9c5053bade2d3f8$var$t = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$d9c5053bade2d3f8$var$e.innerHTML = /* html */ `\n \n\n \n
      \n
      \n \n\n
      \n \n
      \n
      \n\n \n\n
      \n \n
      \n
      \n
      \n`; /**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ \nclass $d9c5053bade2d3f8$export$32589115725b904b extends HTMLElement {\n #e = null;\n #t = null;\n #o = void 0;\n constructor(){\n if (super(), !this.shadowRoot) {\n let t = this.attachShadow({\n mode: \"open\"\n });\n t.appendChild($d9c5053bade2d3f8$var$e.content.cloneNode(!0));\n }\n this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#t = this.shadowRoot.querySelector('slot[name=\"footer\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n if (null !== this.#e) {\n if (\"open\" === e && t !== o && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"hidden\")) : this.#e.close()), \"no-header\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__header\");\n null !== e && (e.hidden = this.noHeader);\n }\n if (\"no-animations\" === e && t !== o && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), \"no-close-button\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__close\");\n null !== e && (e.hidden = this.noCloseButton);\n }\n }\n }\n connectedCallback() {\n this.#i(\"open\"), this.#i(\"staticBackdrop\"), this.#i(\"noHeader\"), this.#i(\"noAnimations\"), this.#i(\"noCloseButton\"), this.#i(\"fullscreen\"), this.#i(\"preserveOverflow\"), this.#e?.addEventListener(\"click\", this.#a), this.#e?.addEventListener(\"close\", this.#l), this.#e?.addEventListener(\"cancel\", this.#r), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#s), this.#t?.addEventListener(\"slotchange\", this.#n);\n }\n disconnectedCallback() {\n this.#o && clearTimeout(this.#o), this.#e?.addEventListener(\"click\", this.#a), this.#e?.removeEventListener(\"close\", this.#l), this.#e?.removeEventListener(\"cancel\", this.#r), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#s), this.#t?.removeEventListener(\"slotchange\", this.#n);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n this.toggleAttribute(\"open\", !!e);\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n this.toggleAttribute(\"static-backdrop\", !!e);\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n this.toggleAttribute(\"no-header\", !!e);\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n this.toggleAttribute(\"no-animations\", !!e);\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n this.toggleAttribute(\"no-close-button\", !!e);\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n this.toggleAttribute(\"fullscreen\", !!e);\n }\n get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(e) {\n this.toggleAttribute(\"preserve-overflow\", !!e);\n }\n #d() {\n this.#o || (this.#e?.classList.add(\"dialog--pulse\"), this.#o = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#o), this.#o = void 0;\n }, 300));\n }\n #l = ()=>{\n // the open property when the dialog is closed by the user.\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"\");\n };\n #r = (e)=>{\n let t = this.#c(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #s = (e)=>{\n let t = this.#c(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #a = (e)=>{\n if (e.target !== e.currentTarget) return;\n let t = this.#c(\"backdrop-click\");\n if (this.dispatchEvent(t), t.defaultPrevented || this.staticBackdrop) {\n this.noAnimations || this.#d();\n return;\n }\n this.#e?.close();\n };\n #n = ()=>{\n if (null === this.#e) return; /** @type {Nullable} */ \n let e = this.#e.querySelector(\".dialog__footer\");\n if (null === e) return;\n let t = this.#t?.assignedNodes(), o = !!t && t.length > 0;\n e.hidden = !o;\n };\n #c(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #i(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $d9c5053bade2d3f8$export$32589115725b904b);\n }\n}\n$d9c5053bade2d3f8$export$32589115725b904b.defineCustomElement();\n //# sourceMappingURL=modal-element-defined.js.map\n\n\n(function() {\n \"use strict\";\n if (typeof document === \"undefined\" || \"adoptedStyleSheets\" in document) return;\n var hasShadyCss = \"ShadyCSS\" in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument(\"\");\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === \"object\" ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, \"\");\n if (_contents !== contents) console.warn(\"@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418\");\n return _contents.trim();\n }\n function isElementConnected(element) {\n return \"isConnected\" in element ? element.isConnected : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function(value, index) {\n return arr.indexOf(value) === index;\n });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function(value) {\n return arr2.indexOf(value) === -1;\n });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n var cssStyleSheetMethods = [\n \"addRule\",\n \"deleteRule\",\n \"insertRule\",\n \"removeRule\"\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function() {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function() {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? proto$1.isPrototypeOf(instance) || nonConstructedProto.isPrototypeOf(instance) : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? nonConstructedProto.isPrototypeOf(instance) : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement(\"style\");\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function(_location) {\n return _location !== location;\n }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function() {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods.get(sheet).forEach(function(command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) throw new TypeError(\"Illegal invocation\");\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement(\"style\");\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n } catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === \"string\") {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function(location) {\n if (location.isConnected()) restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n });\n }\n };\n defineProperty(proto$1, \"cssRules\", {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n }\n });\n defineProperty(proto$1, \"media\", {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n }\n });\n cssStyleSheetMethods.forEach(function(method) {\n proto$1[method] = function() {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({\n method: method,\n args: args\n });\n $locations.get(self).forEach(function(location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance\n });\n var defaultObserverOptions = {\n childList: true,\n subtree: true\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, \"adoptedStyleSheets\", {\n configurable: true,\n enumerable: true,\n get: function() {\n return getAssociatedLocation(this).sheets;\n },\n set: function(sheets) {\n getAssociatedLocation(this).update(sheets);\n }\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function(foundNode) {\n return getShadowRoot(foundNode) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, null, false);\n for(var next = void 0; next = iter.nextNode();)callback(getShadowRoot(next));\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return element instanceof HTMLStyleElement && $uniqueSheets.get(self).some(function(sheet) {\n return getAdopterByLocation(sheet, self);\n });\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function(sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function(sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function(mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function(mutation) {\n if (!hasShadyCss) forEach.call(mutation.addedNodes, function(node) {\n if (!(node instanceof Element)) return;\n traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).connect();\n });\n });\n forEach.call(mutation.removedNodes, function(node) {\n if (!(node instanceof Element)) return;\n if (isExistingAdopter(self, node)) adopt(self);\n if (!hasShadyCss) traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).disconnect();\n });\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function() {\n var element = $element.get(this);\n return element instanceof Document ? element.readyState !== \"loading\" : isElementConnected(element.host);\n },\n connect: function() {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) adopt(this);\n traverseWebComponents(container, function(root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function() {\n $observer.get(this).disconnect();\n },\n update: function(sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? \"Document\" : \"ShadowRoot\";\n if (!Array.isArray(sheets)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n if (!sheets.every(isCSSStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n if (sheets.some(isNonConstructedStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function(sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) adopt(self);\n }\n };\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if (\"ShadowRoot\" in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === \"closed\") closedShadowRootRegistry.set(this, root);\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) documentLocation.connect();\n else document.addEventListener(\"DOMContentLoaded\", documentLocation.connect.bind(documentLocation));\n})();\n\n\nvar $1df650bc12a3679b$exports = {};\n$1df650bc12a3679b$exports = new URL(\"bootstrap.33ff2998.css\", import.meta.url).toString();\n\n\nvar $9f1ef1895b1352ed$exports = {};\n$9f1ef1895b1352ed$exports = new URL(\"main.2238cf96.css\", import.meta.url).toString();\n\n\nconst $4ffc15d651e12514$var$styleURLs = [\n $1df650bc12a3679b$exports,\n $9f1ef1895b1352ed$exports\n];\nconst $4ffc15d651e12514$export$4b9cd30c41328fdd = [];\nfor(let i = 0; i < $4ffc15d651e12514$var$styleURLs.length; i += 1)$4ffc15d651e12514$export$4b9cd30c41328fdd.push(new CSSStyleSheet());\n(async function() {\n const styles = await Promise.all($4ffc15d651e12514$var$styleURLs.map(async (styleURL)=>{\n const res = await fetch(styleURL);\n return res.text();\n }));\n for(let i = 0; i < styles.length; i += 1)await $4ffc15d651e12514$export$4b9cd30c41328fdd[i].replace(styles[i]);\n document.body.style.visibility = \"visible\";\n})();\n\n\n\nfunction $dc2f4a51b83babfd$var$_slicedToArray(arr, i) {\n return $dc2f4a51b83babfd$var$_arrayWithHoles(arr) || $dc2f4a51b83babfd$var$_iterableToArrayLimit(arr, i) || $dc2f4a51b83babfd$var$_unsupportedIterableToArray(arr, i) || $dc2f4a51b83babfd$var$_nonIterableRest();\n}\nfunction $dc2f4a51b83babfd$var$_nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction $dc2f4a51b83babfd$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $dc2f4a51b83babfd$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $dc2f4a51b83babfd$var$_arrayLikeToArray(o, minLen);\n}\nfunction $dc2f4a51b83babfd$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $dc2f4a51b83babfd$var$_iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction $dc2f4a51b83babfd$var$_arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction $dc2f4a51b83babfd$export$b327150396135fe7(request) {\n return new Promise(function(resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function() {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n request.onabort = request.onerror = function() {\n return reject(request.error);\n };\n });\n}\nfunction $dc2f4a51b83babfd$export$f51a9068ac82ea43(dbName, storeName) {\n var request = indexedDB.open(dbName);\n request.onupgradeneeded = function() {\n return request.result.createObjectStore(storeName);\n };\n var dbp = $dc2f4a51b83babfd$export$b327150396135fe7(request);\n return function(txMode, callback) {\n return dbp.then(function(db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\nvar $dc2f4a51b83babfd$var$defaultGetStoreFunc;\nfunction $dc2f4a51b83babfd$var$defaultGetStore() {\n if (!$dc2f4a51b83babfd$var$defaultGetStoreFunc) $dc2f4a51b83babfd$var$defaultGetStoreFunc = $dc2f4a51b83babfd$export$f51a9068ac82ea43(\"keyval-store\", \"keyval\");\n return $dc2f4a51b83babfd$var$defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$3988ae62b71be9a3(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$adaa4cf7ef1b65be(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.put(value, key);\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$daa0a5170277c7a8(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n entries.forEach(function(entry) {\n return store.put(entry[1], entry[0]);\n });\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$5df405cccea42673(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return Promise.all(keys.map(function(key) {\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$722fbec263ad908a(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n return(// If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function(resolve, reject) {\n store.get(key).onsuccess = function() {\n try {\n store.put(updater(this.result), key);\n resolve($dc2f4a51b83babfd$export$b327150396135fe7(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n }));\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$1d2f21e549771e67(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.delete(key);\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$c8aa84257229cac8(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n keys.forEach(function(key) {\n return store.delete(key);\n });\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$42ffd38884aecdac() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.clear();\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n });\n}\nfunction $dc2f4a51b83babfd$var$eachCursor(store, callback) {\n store.openCursor().onsuccess = function() {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n return $dc2f4a51b83babfd$export$b327150396135fe7(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$ed97f33186d4b816() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAllKeys) return $dc2f4a51b83babfd$export$b327150396135fe7(store.getAllKeys());\n var items = [];\n return $dc2f4a51b83babfd$var$eachCursor(store, function(cursor) {\n return items.push(cursor.key);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$68c286be0e7e55b7() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAll) return $dc2f4a51b83babfd$export$b327150396135fe7(store.getAll());\n var items = [];\n return $dc2f4a51b83babfd$var$eachCursor(store, function(cursor) {\n return items.push(cursor.value);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $dc2f4a51b83babfd$export$3e9f948b41964866() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $dc2f4a51b83babfd$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) return Promise.all([\n $dc2f4a51b83babfd$export$b327150396135fe7(store.getAllKeys()),\n $dc2f4a51b83babfd$export$b327150396135fe7(store.getAll())\n ]).then(function(_ref) {\n var _ref2 = $dc2f4a51b83babfd$var$_slicedToArray(_ref, 2), keys = _ref2[0], values = _ref2[1];\n return keys.map(function(key, i) {\n return [\n key,\n values[i]\n ];\n });\n });\n var items = [];\n return customStore(\"readonly\", function(store) {\n return $dc2f4a51b83babfd$var$eachCursor(store, function(cursor) {\n return items.push([\n cursor.key,\n cursor.value\n ]);\n }).then(function() {\n return items;\n });\n });\n });\n}\n\n\nconst $bad480a01f35862b$var$STORAGE_PREFIX = \"rss-reader/\";\nconst $bad480a01f35862b$var$STORAGE_FEEDS_KEY = $bad480a01f35862b$var$STORAGE_PREFIX + \"feeds\";\nconst $bad480a01f35862b$var$getItem = async (key)=>{\n try {\n return {\n value: await (0, $dc2f4a51b83babfd$export$3988ae62b71be9a3)(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error: error\n };\n }\n};\nconst $bad480a01f35862b$var$setItem = async (key, data)=>{\n try {\n await (0, $dc2f4a51b83babfd$export$adaa4cf7ef1b65be)(key, data);\n return {\n error: void 0\n };\n } catch (error) {\n return {\n error: error\n };\n }\n};\nconst $bad480a01f35862b$export$4890c08c4ffbd57b = async ()=>{\n return $bad480a01f35862b$var$getItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY);\n};\nconst $bad480a01f35862b$export$a8ce8a4ec117f05e = async (feeds, shouldDispatchEvent = true)=>{\n if (!Array.isArray(feeds)) return;\n const { error: error } = await $bad480a01f35862b$var$setItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"set\",\n feeds: feeds\n }\n }));\n return {\n error: error\n };\n};\nconst $bad480a01f35862b$export$4b77448646caf424 = async (feed, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $bad480a01f35862b$export$4890c08c4ffbd57b();\n const foundFeed = feeds.find((f)=>f.url === feed.url);\n let action = \"\";\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = \"update\";\n } else {\n feeds.push(feed);\n action = \"create\";\n }\n const { error: error } = await $bad480a01f35862b$var$setItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: action,\n feed: feed\n }\n }));\n return {\n error: error\n };\n};\nconst $bad480a01f35862b$export$4e54c6fd9fa8b09b = async (feedUrl, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $bad480a01f35862b$export$4890c08c4ffbd57b();\n const filteredFeeds = feeds.filter((f)=>f.url !== feedUrl);\n const { error: error } = await $bad480a01f35862b$var$setItem($bad480a01f35862b$var$STORAGE_FEEDS_KEY, filteredFeeds);\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) await (0, $dc2f4a51b83babfd$export$1d2f21e549771e67)($bad480a01f35862b$var$STORAGE_FEEDS_KEY);\n document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"delete\",\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n return {\n error: error\n };\n};\n\n\n/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */ const $e998bc9dc264f90b$export$981c5d1bd3894713 = (url)=>{\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n\n\nconst $e50da86101e29f72$var$template = document.createElement(\"template\");\n$e50da86101e29f72$var$template.innerHTML = /* html */ `\n \n\n
      \n
      \n \n
      \n
      \n \n
      \n
      \n`;\nclass $e50da86101e29f72$var$AddFeed extends HTMLElement {\n #formEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($e50da86101e29f72$var$template.content.cloneNode(true));\n }\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n connectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n disconnectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n const input = evt.target[\"feed-url\"];\n const url = input.value.trim();\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n const urlExists = Boolean(feeds.find((feed)=>feed.url === url));\n const isValidURL = (0, $e998bc9dc264f90b$export$981c5d1bd3894713)(url);\n if (!urlExists && isValidURL) await (0, $bad480a01f35862b$export$4b77448646caf424)({\n url: url,\n title: \"\" // Title is not available at this point; it will be fetched later.\n });\n input.value = \"\";\n }\n}\nif (!window.customElements.get(\"add-feed\")) window.customElements.define(\"add-feed\", $e50da86101e29f72$var$AddFeed);\n\n\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */ function $2c4dfe5b2b5ff94a$var$ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction $2c4dfe5b2b5ff94a$var$_objectSpread2(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) $2c4dfe5b2b5ff94a$var$ownKeys(Object(source), true).forEach(function(key) {\n $2c4dfe5b2b5ff94a$var$_defineProperty(target, key, source[key]);\n });\n else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else $2c4dfe5b2b5ff94a$var$ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction $2c4dfe5b2b5ff94a$var$_typeof(obj) {\n \"@babel/helpers - typeof\";\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") $2c4dfe5b2b5ff94a$var$_typeof = function(obj) {\n return typeof obj;\n };\n else $2c4dfe5b2b5ff94a$var$_typeof = function(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n return $2c4dfe5b2b5ff94a$var$_typeof(obj);\n}\nfunction $2c4dfe5b2b5ff94a$var$_defineProperty(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction $2c4dfe5b2b5ff94a$var$_extends() {\n $2c4dfe5b2b5ff94a$var$_extends = Object.assign || function(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n return target;\n };\n return $2c4dfe5b2b5ff94a$var$_extends.apply(this, arguments);\n}\nfunction $2c4dfe5b2b5ff94a$var$_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction $2c4dfe5b2b5ff94a$var$_objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = $2c4dfe5b2b5ff94a$var$_objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceSymbolKeys.length; i++){\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction $2c4dfe5b2b5ff94a$var$_toConsumableArray(arr) {\n return $2c4dfe5b2b5ff94a$var$_arrayWithoutHoles(arr) || $2c4dfe5b2b5ff94a$var$_iterableToArray(arr) || $2c4dfe5b2b5ff94a$var$_unsupportedIterableToArray(arr) || $2c4dfe5b2b5ff94a$var$_nonIterableSpread();\n}\nfunction $2c4dfe5b2b5ff94a$var$_arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(arr);\n}\nfunction $2c4dfe5b2b5ff94a$var$_iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction $2c4dfe5b2b5ff94a$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(o, minLen);\n}\nfunction $2c4dfe5b2b5ff94a$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $2c4dfe5b2b5ff94a$var$_nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nvar $2c4dfe5b2b5ff94a$var$version = \"1.15.2\";\nfunction $2c4dfe5b2b5ff94a$var$userAgent(pattern) {\n if (typeof window !== \"undefined\" && window.navigator) return !!/*@__PURE__*/ navigator.userAgent.match(pattern);\n}\nvar $2c4dfe5b2b5ff94a$var$IE11OrLess = $2c4dfe5b2b5ff94a$var$userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar $2c4dfe5b2b5ff94a$var$Edge = $2c4dfe5b2b5ff94a$var$userAgent(/Edge/i);\nvar $2c4dfe5b2b5ff94a$var$FireFox = $2c4dfe5b2b5ff94a$var$userAgent(/firefox/i);\nvar $2c4dfe5b2b5ff94a$var$Safari = $2c4dfe5b2b5ff94a$var$userAgent(/safari/i) && !$2c4dfe5b2b5ff94a$var$userAgent(/chrome/i) && !$2c4dfe5b2b5ff94a$var$userAgent(/android/i);\nvar $2c4dfe5b2b5ff94a$var$IOS = $2c4dfe5b2b5ff94a$var$userAgent(/iP(ad|od|hone)/i);\nvar $2c4dfe5b2b5ff94a$var$ChromeForAndroid = $2c4dfe5b2b5ff94a$var$userAgent(/chrome/i) && $2c4dfe5b2b5ff94a$var$userAgent(/android/i);\nvar $2c4dfe5b2b5ff94a$var$captureMode = {\n capture: false,\n passive: false\n};\nfunction $2c4dfe5b2b5ff94a$var$on(el, event, fn) {\n el.addEventListener(event, fn, !$2c4dfe5b2b5ff94a$var$IE11OrLess && $2c4dfe5b2b5ff94a$var$captureMode);\n}\nfunction $2c4dfe5b2b5ff94a$var$off(el, event, fn) {\n el.removeEventListener(event, fn, !$2c4dfe5b2b5ff94a$var$IE11OrLess && $2c4dfe5b2b5ff94a$var$captureMode);\n}\nfunction $2c4dfe5b2b5ff94a$var$matches(/**HTMLElement*/ el, /**String*/ selector) {\n if (!selector) return;\n selector[0] === \">\" && (selector = selector.substring(1));\n if (el) try {\n if (el.matches) return el.matches(selector);\n else if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n } catch (_) {\n return false;\n }\n return false;\n}\nfunction $2c4dfe5b2b5ff94a$var$getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction $2c4dfe5b2b5ff94a$var$closest(/**HTMLElement*/ el, /**String*/ selector, /**HTMLElement*/ ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === \">\" ? el.parentNode === ctx && $2c4dfe5b2b5ff94a$var$matches(el, selector) : $2c4dfe5b2b5ff94a$var$matches(el, selector)) || includeCTX && el === ctx) return el;\n if (el === ctx) break;\n /* jshint boss:true */ }while (el = $2c4dfe5b2b5ff94a$var$getParentOrHost(el));\n }\n return null;\n}\nvar $2c4dfe5b2b5ff94a$var$R_SPACE = /\\s+/g;\nfunction $2c4dfe5b2b5ff94a$var$toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) el.classList[state ? \"add\" : \"remove\"](name);\n else {\n var className = (\" \" + el.className + \" \").replace($2c4dfe5b2b5ff94a$var$R_SPACE, \" \").replace(\" \" + name + \" \", \" \");\n el.className = (className + (state ? \" \" + name : \"\")).replace($2c4dfe5b2b5ff94a$var$R_SPACE, \" \");\n }\n }\n}\nfunction $2c4dfe5b2b5ff94a$var$css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) val = document.defaultView.getComputedStyle(el, \"\");\n else if (el.currentStyle) val = el.currentStyle;\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf(\"webkit\") === -1) prop = \"-webkit-\" + prop;\n style[prop] = val + (typeof val === \"string\" ? \"\" : \"px\");\n }\n }\n}\nfunction $2c4dfe5b2b5ff94a$var$matrix(el, selfOnly) {\n var appliedTransforms = \"\";\n if (typeof el === \"string\") appliedTransforms = el;\n else do {\n var transform = $2c4dfe5b2b5ff94a$var$css(el, \"transform\");\n if (transform && transform !== \"none\") appliedTransforms = transform + \" \" + appliedTransforms;\n /* jshint boss:true */ }while (!selfOnly && (el = el.parentNode));\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */ return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction $2c4dfe5b2b5ff94a$var$find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;\n if (iterator) for(; i < n; i++)iterator(list[i], i);\n return list;\n }\n return [];\n}\nfunction $2c4dfe5b2b5ff94a$var$getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) return scrollingElement;\n else return document.documentElement;\n}\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */ function $2c4dfe5b2b5ff94a$var$getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== $2c4dfe5b2b5ff94a$var$getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!$2c4dfe5b2b5ff94a$var$IE11OrLess) {\n do if (container && container.getBoundingClientRect && ($2c4dfe5b2b5ff94a$var$css(container, \"transform\") !== \"none\" || relativeToNonStaticParent && $2c4dfe5b2b5ff94a$var$css(container, \"position\") !== \"static\")) {\n var containerRect = container.getBoundingClientRect();\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt($2c4dfe5b2b5ff94a$var$css(container, \"border-top-width\"));\n left -= containerRect.left + parseInt($2c4dfe5b2b5ff94a$var$css(container, \"border-left-width\"));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = $2c4dfe5b2b5ff94a$var$matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */ function $2c4dfe5b2b5ff94a$var$isScrolledPast(el, elSide, parentSide) {\n var parent = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(el, true), elSideVal = $2c4dfe5b2b5ff94a$var$getRect(el)[elSide];\n /* jshint boss:true */ while(parent){\n var parentSideVal = $2c4dfe5b2b5ff94a$var$getRect(parent)[parentSide], visible = void 0;\n if (parentSide === \"top\" || parentSide === \"left\") visible = elSideVal >= parentSideVal;\n else visible = elSideVal <= parentSideVal;\n if (!visible) return parent;\n if (parent === $2c4dfe5b2b5ff94a$var$getWindowScrollingElement()) break;\n parent = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */ function $2c4dfe5b2b5ff94a$var$getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0, i = 0, children = el.children;\n while(i < children.length){\n if (children[i].style.display !== \"none\" && children[i] !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost && (includeDragEl || children[i] !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged) && $2c4dfe5b2b5ff94a$var$closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) return children[i];\n currentChild++;\n }\n i++;\n }\n return null;\n}\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */ function $2c4dfe5b2b5ff94a$var$lastChild(el, selector) {\n var last = el.lastElementChild;\n while(last && (last === $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost || $2c4dfe5b2b5ff94a$var$css(last, \"display\") === \"none\" || selector && !$2c4dfe5b2b5ff94a$var$matches(last, selector)))last = last.previousElementSibling;\n return last || null;\n}\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */ function $2c4dfe5b2b5ff94a$var$index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) return -1;\n /* jshint boss:true */ while(el = el.previousElementSibling)if (el.nodeName.toUpperCase() !== \"TEMPLATE\" && el !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.clone && (!selector || $2c4dfe5b2b5ff94a$var$matches(el, selector))) index++;\n return index;\n}\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */ function $2c4dfe5b2b5ff94a$var$getRelativeScrollOffset(el) {\n var offsetLeft = 0, offsetTop = 0, winScroller = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n if (el) do {\n var elMatrix = $2c4dfe5b2b5ff94a$var$matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n }while (el !== winScroller && (el = el.parentNode));\n return [\n offsetLeft,\n offsetTop\n ];\n}\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */ function $2c4dfe5b2b5ff94a$var$indexOfObject(arr, obj) {\n for(var i in arr){\n if (!arr.hasOwnProperty(i)) continue;\n for(var key in obj){\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = $2c4dfe5b2b5ff94a$var$css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == \"auto\" || elemCSS.overflowX == \"scroll\") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == \"auto\" || elemCSS.overflowY == \"scroll\")) {\n if (!elem.getBoundingClientRect || elem === document.body) return $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n while (elem = elem.parentNode);\n return $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n}\nfunction $2c4dfe5b2b5ff94a$var$extend(dst, src) {\n if (dst && src) {\n for(var key in src)if (src.hasOwnProperty(key)) dst[key] = src[key];\n }\n return dst;\n}\nfunction $2c4dfe5b2b5ff94a$var$isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar $2c4dfe5b2b5ff94a$var$_throttleTimeout;\nfunction $2c4dfe5b2b5ff94a$var$throttle(callback, ms) {\n return function() {\n if (!$2c4dfe5b2b5ff94a$var$_throttleTimeout) {\n var args = arguments, _this = this;\n if (args.length === 1) callback.call(_this, args[0]);\n else callback.apply(_this, args);\n $2c4dfe5b2b5ff94a$var$_throttleTimeout = setTimeout(function() {\n $2c4dfe5b2b5ff94a$var$_throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction $2c4dfe5b2b5ff94a$var$cancelThrottle() {\n clearTimeout($2c4dfe5b2b5ff94a$var$_throttleTimeout);\n $2c4dfe5b2b5ff94a$var$_throttleTimeout = void 0;\n}\nfunction $2c4dfe5b2b5ff94a$var$scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction $2c4dfe5b2b5ff94a$var$clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) return Polymer.dom(el).cloneNode(true);\n else if ($) return $(el).clone(true)[0];\n else return el.cloneNode(true);\n}\nfunction $2c4dfe5b2b5ff94a$var$setRect(el, rect) {\n $2c4dfe5b2b5ff94a$var$css(el, \"position\", \"absolute\");\n $2c4dfe5b2b5ff94a$var$css(el, \"top\", rect.top);\n $2c4dfe5b2b5ff94a$var$css(el, \"left\", rect.left);\n $2c4dfe5b2b5ff94a$var$css(el, \"width\", rect.width);\n $2c4dfe5b2b5ff94a$var$css(el, \"height\", rect.height);\n}\nfunction $2c4dfe5b2b5ff94a$var$unsetRect(el) {\n $2c4dfe5b2b5ff94a$var$css(el, \"position\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"top\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"left\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"width\", \"\");\n $2c4dfe5b2b5ff94a$var$css(el, \"height\", \"\");\n}\nfunction $2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function(child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!$2c4dfe5b2b5ff94a$var$closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = $2c4dfe5b2b5ff94a$var$getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar $2c4dfe5b2b5ff94a$var$expando = \"Sortable\" + new Date().getTime();\nfunction $2c4dfe5b2b5ff94a$var$AnimationStateManager() {\n var animationStates = [], animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function(child) {\n if ($2c4dfe5b2b5ff94a$var$css(child, \"display\") === \"none\" || child === $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost) return;\n animationStates.push({\n target: child,\n rect: $2c4dfe5b2b5ff94a$var$getRect(child)\n });\n var fromRect = $2c4dfe5b2b5ff94a$var$_objectSpread2({}, animationStates[animationStates.length - 1].rect);\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = $2c4dfe5b2b5ff94a$var$matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice($2c4dfe5b2b5ff94a$var$indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === \"function\") callback();\n return;\n }\n var animating = false, animationTime = 0;\n animationStates.forEach(function(state) {\n var time = 0, target = state.target, fromRect = target.fromRect, toRect = $2c4dfe5b2b5ff94a$var$getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = $2c4dfe5b2b5ff94a$var$matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) // Could also check if animatingRect is between fromRect and toRect\n {\n if ($2c4dfe5b2b5ff94a$var$isRectEqual(prevFromRect, toRect) && !$2c4dfe5b2b5ff94a$var$isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) // If returning to same place as started from animation and on same axis\n time = $2c4dfe5b2b5ff94a$var$calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n // if fromRect != toRect: animate\n if (!$2c4dfe5b2b5ff94a$var$isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) time = _this.options.animation;\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function() {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === \"function\") callback();\n } else animationCallbackId = setTimeout(function() {\n if (typeof callback === \"function\") callback();\n }, animationTime);\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n $2c4dfe5b2b5ff94a$var$css(target, \"transition\", \"\");\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"\");\n var elMatrix = $2c4dfe5b2b5ff94a$var$matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"translate3d(\" + translateX + \"px,\" + translateY + \"px,0)\");\n this.forRepaintDummy = $2c4dfe5b2b5ff94a$var$repaint(target); // repaint\n $2c4dfe5b2b5ff94a$var$css(target, \"transition\", \"transform \" + duration + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\"));\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"translate3d(0,0,0)\");\n typeof target.animated === \"number\" && clearTimeout(target.animated);\n target.animated = setTimeout(function() {\n $2c4dfe5b2b5ff94a$var$css(target, \"transition\", \"\");\n $2c4dfe5b2b5ff94a$var$css(target, \"transform\", \"\");\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction $2c4dfe5b2b5ff94a$var$repaint(target) {\n return target.offsetWidth;\n}\nfunction $2c4dfe5b2b5ff94a$var$calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\nvar $2c4dfe5b2b5ff94a$var$plugins = [];\nvar $2c4dfe5b2b5ff94a$var$defaults = {\n initializeByDefault: true\n};\nvar $2c4dfe5b2b5ff94a$var$PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for(var option in $2c4dfe5b2b5ff94a$var$defaults)if ($2c4dfe5b2b5ff94a$var$defaults.hasOwnProperty(option) && !(option in plugin)) plugin[option] = $2c4dfe5b2b5ff94a$var$defaults[option];\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(p) {\n if (p.pluginName === plugin.pluginName) throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n });\n $2c4dfe5b2b5ff94a$var$plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function() {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + \"Global\";\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) sortable[plugin.pluginName][eventNameGlobal]($2c4dfe5b2b5ff94a$var$_objectSpread2({\n sortable: sortable\n }, evt));\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) sortable[plugin.pluginName][eventName]($2c4dfe5b2b5ff94a$var$_objectSpread2({\n sortable: sortable\n }, evt));\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n // Add default options from plugin\n $2c4dfe5b2b5ff94a$var$_extends(defaults, initialized.defaults);\n });\n for(var option in sortable.options){\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== \"undefined\") sortable.options[option] = modified;\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n if (typeof plugin.eventProperties !== \"function\") return;\n $2c4dfe5b2b5ff94a$var$_extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n $2c4dfe5b2b5ff94a$var$plugins.forEach(function(plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === \"function\") modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n });\n return modifiedValue;\n }\n};\nfunction $2c4dfe5b2b5ff94a$var$dispatchEvent(_ref) {\n var sortable = _ref.sortable, rootEl = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex = _ref.oldIndex, newIndex = _ref.newIndex, oldDraggableIndex = _ref.oldDraggableIndex, newDraggableIndex = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[$2c4dfe5b2b5ff94a$var$expando];\n if (!sortable) return;\n var evt, options = sortable.options, onName = \"on\" + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$2c4dfe5b2b5ff94a$var$IE11OrLess && !$2c4dfe5b2b5ff94a$var$Edge) evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = $2c4dfe5b2b5ff94a$var$_objectSpread2($2c4dfe5b2b5ff94a$var$_objectSpread2({}, extraEventProperties), $2c4dfe5b2b5ff94a$var$PluginManager.getEventProperties(name, sortable));\n for(var option in allEventProperties)evt[option] = allEventProperties[option];\n if (rootEl) rootEl.dispatchEvent(evt);\n if (options[onName]) options[onName].call(sortable, evt);\n}\nvar $2c4dfe5b2b5ff94a$var$_excluded = [\n \"evt\"\n];\nvar $2c4dfe5b2b5ff94a$var$pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, originalEvent = _ref.evt, data = $2c4dfe5b2b5ff94a$var$_objectWithoutProperties(_ref, $2c4dfe5b2b5ff94a$var$_excluded);\n $2c4dfe5b2b5ff94a$var$PluginManager.pluginEvent.bind($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423)(eventName, sortable, $2c4dfe5b2b5ff94a$var$_objectSpread2({\n dragEl: $2c4dfe5b2b5ff94a$var$dragEl,\n parentEl: $2c4dfe5b2b5ff94a$var$parentEl,\n ghostEl: $2c4dfe5b2b5ff94a$var$ghostEl,\n rootEl: $2c4dfe5b2b5ff94a$var$rootEl,\n nextEl: $2c4dfe5b2b5ff94a$var$nextEl,\n lastDownEl: $2c4dfe5b2b5ff94a$var$lastDownEl,\n cloneEl: $2c4dfe5b2b5ff94a$var$cloneEl,\n cloneHidden: $2c4dfe5b2b5ff94a$var$cloneHidden,\n dragStarted: $2c4dfe5b2b5ff94a$var$moved,\n putSortable: $2c4dfe5b2b5ff94a$var$putSortable,\n activeSortable: $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active,\n originalEvent: originalEvent,\n oldIndex: $2c4dfe5b2b5ff94a$var$oldIndex,\n oldDraggableIndex: $2c4dfe5b2b5ff94a$var$oldDraggableIndex,\n newIndex: $2c4dfe5b2b5ff94a$var$newIndex,\n newDraggableIndex: $2c4dfe5b2b5ff94a$var$newDraggableIndex,\n hideGhostForTarget: $2c4dfe5b2b5ff94a$var$_hideGhostForTarget,\n unhideGhostForTarget: $2c4dfe5b2b5ff94a$var$_unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n $2c4dfe5b2b5ff94a$var$cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n $2c4dfe5b2b5ff94a$var$cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction $2c4dfe5b2b5ff94a$var$_dispatchEvent(info) {\n $2c4dfe5b2b5ff94a$var$dispatchEvent($2c4dfe5b2b5ff94a$var$_objectSpread2({\n putSortable: $2c4dfe5b2b5ff94a$var$putSortable,\n cloneEl: $2c4dfe5b2b5ff94a$var$cloneEl,\n targetEl: $2c4dfe5b2b5ff94a$var$dragEl,\n rootEl: $2c4dfe5b2b5ff94a$var$rootEl,\n oldIndex: $2c4dfe5b2b5ff94a$var$oldIndex,\n oldDraggableIndex: $2c4dfe5b2b5ff94a$var$oldDraggableIndex,\n newIndex: $2c4dfe5b2b5ff94a$var$newIndex,\n newDraggableIndex: $2c4dfe5b2b5ff94a$var$newDraggableIndex\n }, info));\n}\nvar $2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$parentEl, $2c4dfe5b2b5ff94a$var$ghostEl, $2c4dfe5b2b5ff94a$var$rootEl, $2c4dfe5b2b5ff94a$var$nextEl, $2c4dfe5b2b5ff94a$var$lastDownEl, $2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$cloneHidden, $2c4dfe5b2b5ff94a$var$oldIndex, $2c4dfe5b2b5ff94a$var$newIndex, $2c4dfe5b2b5ff94a$var$oldDraggableIndex, $2c4dfe5b2b5ff94a$var$newDraggableIndex, $2c4dfe5b2b5ff94a$var$activeGroup, $2c4dfe5b2b5ff94a$var$putSortable, $2c4dfe5b2b5ff94a$var$awaitingDragStarted = false, $2c4dfe5b2b5ff94a$var$ignoreNextClick = false, $2c4dfe5b2b5ff94a$var$sortables = [], $2c4dfe5b2b5ff94a$var$tapEvt, $2c4dfe5b2b5ff94a$var$touchEvt, $2c4dfe5b2b5ff94a$var$lastDx, $2c4dfe5b2b5ff94a$var$lastDy, $2c4dfe5b2b5ff94a$var$tapDistanceLeft, $2c4dfe5b2b5ff94a$var$tapDistanceTop, $2c4dfe5b2b5ff94a$var$moved, $2c4dfe5b2b5ff94a$var$lastTarget, $2c4dfe5b2b5ff94a$var$lastDirection, $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = false, $2c4dfe5b2b5ff94a$var$isCircumstantialInvert = false, $2c4dfe5b2b5ff94a$var$targetMoveDistance, // For positioning ghost absolutely\n$2c4dfe5b2b5ff94a$var$ghostRelativeParent, $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll = [], // (left, top)\n$2c4dfe5b2b5ff94a$var$_silent = false, $2c4dfe5b2b5ff94a$var$savedInputChecked = [];\n/** @const */ var $2c4dfe5b2b5ff94a$var$documentExists = typeof document !== \"undefined\", $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely = $2c4dfe5b2b5ff94a$var$IOS, $2c4dfe5b2b5ff94a$var$CSSFloatProperty = $2c4dfe5b2b5ff94a$var$Edge || $2c4dfe5b2b5ff94a$var$IE11OrLess ? \"cssFloat\" : \"float\", // This will not pass for IE9, because IE9 DnD only works on anchors\n$2c4dfe5b2b5ff94a$var$supportDraggable = $2c4dfe5b2b5ff94a$var$documentExists && !$2c4dfe5b2b5ff94a$var$ChromeForAndroid && !$2c4dfe5b2b5ff94a$var$IOS && \"draggable\" in document.createElement(\"div\"), $2c4dfe5b2b5ff94a$var$supportCssPointerEvents = function() {\n if (!$2c4dfe5b2b5ff94a$var$documentExists) return;\n // false when <= IE11\n if ($2c4dfe5b2b5ff94a$var$IE11OrLess) return false;\n var el = document.createElement(\"x\");\n el.style.cssText = \"pointer-events:auto\";\n return el.style.pointerEvents === \"auto\";\n}(), $2c4dfe5b2b5ff94a$var$_detectDirection = function _detectDirection(el, options) {\n var elCSS = $2c4dfe5b2b5ff94a$var$css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = $2c4dfe5b2b5ff94a$var$getChild(el, 0, options), child2 = $2c4dfe5b2b5ff94a$var$getChild(el, 1, options), firstChildCSS = child1 && $2c4dfe5b2b5ff94a$var$css(child1), secondChildCSS = child2 && $2c4dfe5b2b5ff94a$var$css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + $2c4dfe5b2b5ff94a$var$getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + $2c4dfe5b2b5ff94a$var$getRect(child2).width;\n if (elCSS.display === \"flex\") return elCSS.flexDirection === \"column\" || elCSS.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n if (elCSS.display === \"grid\") return elCSS.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== \"none\") {\n var touchingSideChild2 = firstChildCSS[\"float\"] === \"left\" ? \"left\" : \"right\";\n return child2 && (secondChildCSS.clear === \"both\" || secondChildCSS.clear === touchingSideChild2) ? \"vertical\" : \"horizontal\";\n }\n return child1 && (firstChildCSS.display === \"block\" || firstChildCSS.display === \"flex\" || firstChildCSS.display === \"table\" || firstChildCSS.display === \"grid\" || firstChildWidth >= elWidth && elCSS[$2c4dfe5b2b5ff94a$var$CSSFloatProperty] === \"none\" || child2 && elCSS[$2c4dfe5b2b5ff94a$var$CSSFloatProperty] === \"none\" && firstChildWidth + secondChildWidth > elWidth) ? \"vertical\" : \"horizontal\";\n}, $2c4dfe5b2b5ff94a$var$_dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n}, /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */ $2c4dfe5b2b5ff94a$var$_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n $2c4dfe5b2b5ff94a$var$sortables.some(function(sortable) {\n var threshold = sortable[$2c4dfe5b2b5ff94a$var$expando].options.emptyInsertThreshold;\n if (!threshold || $2c4dfe5b2b5ff94a$var$lastChild(sortable)) return;\n var rect = $2c4dfe5b2b5ff94a$var$getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) return ret = sortable;\n });\n return ret;\n}, $2c4dfe5b2b5ff94a$var$_prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function(to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) // Default pull value\n // Default pull and put value if same group\n return true;\n else if (value == null || value === false) return false;\n else if (pull && value === \"clone\") return value;\n else if (typeof value === \"function\") return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === \"string\" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || $2c4dfe5b2b5ff94a$var$_typeof(originalGroup) != \"object\") originalGroup = {\n name: originalGroup\n };\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n}, $2c4dfe5b2b5ff94a$var$_hideGhostForTarget = function _hideGhostForTarget() {\n if (!$2c4dfe5b2b5ff94a$var$supportCssPointerEvents && $2c4dfe5b2b5ff94a$var$ghostEl) $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"display\", \"none\");\n}, $2c4dfe5b2b5ff94a$var$_unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!$2c4dfe5b2b5ff94a$var$supportCssPointerEvents && $2c4dfe5b2b5ff94a$var$ghostEl) $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"display\", \"\");\n};\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif ($2c4dfe5b2b5ff94a$var$documentExists && !$2c4dfe5b2b5ff94a$var$ChromeForAndroid) document.addEventListener(\"click\", function(evt) {\n if ($2c4dfe5b2b5ff94a$var$ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n $2c4dfe5b2b5ff94a$var$ignoreNextClick = false;\n return false;\n }\n}, true);\nvar $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if ($2c4dfe5b2b5ff94a$var$dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = $2c4dfe5b2b5ff94a$var$_detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for(var i in evt)if (evt.hasOwnProperty(i)) event[i] = evt[i];\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[$2c4dfe5b2b5ff94a$var$expando]._onDragOver(event);\n }\n }\n};\nvar $2c4dfe5b2b5ff94a$var$_checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if ($2c4dfe5b2b5ff94a$var$dragEl) $2c4dfe5b2b5ff94a$var$dragEl.parentNode[$2c4dfe5b2b5ff94a$var$expando]._isOutsideThisEl(evt.target);\n};\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ function $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) throw \"Sortable: `el` must be an HTMLElement, not \".concat(({}).toString.call(el));\n this.el = el; // root element\n this.options = options = $2c4dfe5b2b5ff94a$var$_extends({}, options);\n // Export instance\n el[$2c4dfe5b2b5ff94a$var$expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? \">li\" : \">*\",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return $2c4dfe5b2b5ff94a$var$_detectDirection(el, this.options);\n },\n ghostClass: \"sortable-ghost\",\n chosenClass: \"sortable-chosen\",\n dragClass: \"sortable-drag\",\n ignore: \"a, img\",\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData(\"Text\", dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: \"data-id\",\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: \"sortable-fallback\",\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.supportPointer !== false && \"PointerEvent\" in window && !$2c4dfe5b2b5ff94a$var$Safari,\n emptyInsertThreshold: 5\n };\n $2c4dfe5b2b5ff94a$var$PluginManager.initializePlugins(this, el, defaults);\n // Set default options\n for(var name in defaults)!(name in options) && (options[name] = defaults[name]);\n $2c4dfe5b2b5ff94a$var$_prepareGroup(options);\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : $2c4dfe5b2b5ff94a$var$supportDraggable;\n if (this.nativeDraggable) // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n // Bind events\n if (options.supportPointer) $2c4dfe5b2b5ff94a$var$on(el, \"pointerdown\", this._onTapStart);\n else {\n $2c4dfe5b2b5ff94a$var$on(el, \"mousedown\", this._onTapStart);\n $2c4dfe5b2b5ff94a$var$on(el, \"touchstart\", this._onTapStart);\n }\n if (this.nativeDraggable) {\n $2c4dfe5b2b5ff94a$var$on(el, \"dragover\", this);\n $2c4dfe5b2b5ff94a$var$on(el, \"dragenter\", this);\n }\n $2c4dfe5b2b5ff94a$var$sortables.push(this.el);\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n // Add animation state manager\n $2c4dfe5b2b5ff94a$var$_extends(this, $2c4dfe5b2b5ff94a$var$AnimationStateManager());\n}\n$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.prototype = /** @lends Sortable.prototype */ {\n constructor: $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) $2c4dfe5b2b5ff94a$var$lastTarget = null;\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === \"function\" ? this.options.direction.call(this, evt, target, $2c4dfe5b2b5ff94a$var$dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(/** Event|TouchEvent */ evt) {\n if (!evt.cancelable) return;\n var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === \"touch\" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter;\n $2c4dfe5b2b5ff94a$var$_saveInputCheckedState(el);\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if ($2c4dfe5b2b5ff94a$var$dragEl) return;\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) return; // only left button and enabled\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) return;\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && $2c4dfe5b2b5ff94a$var$Safari && target && target.tagName.toUpperCase() === \"SELECT\") return;\n target = $2c4dfe5b2b5ff94a$var$closest(target, options.draggable, el, false);\n if (target && target.animated) return;\n if ($2c4dfe5b2b5ff94a$var$lastDownEl === target) // Ignoring duplicate `down`\n return;\n // Get the index of the dragged element within its parent\n $2c4dfe5b2b5ff94a$var$oldIndex = $2c4dfe5b2b5ff94a$var$index(target);\n $2c4dfe5b2b5ff94a$var$oldDraggableIndex = $2c4dfe5b2b5ff94a$var$index(target, options.draggable);\n // Check filter\n if (typeof filter === \"function\") {\n if (filter.call(this, evt, target, this)) {\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: \"filter\",\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(\",\").some(function(criteria) {\n criteria = $2c4dfe5b2b5ff94a$var$closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: \"filter\",\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !$2c4dfe5b2b5ff94a$var$closest(originalTarget, options.handle, el, false)) return;\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(/** Event */ evt, /** Touch */ touch, /** HTMLElement */ target) {\n var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;\n if (target && !$2c4dfe5b2b5ff94a$var$dragEl && target.parentNode === el) {\n var dragRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n $2c4dfe5b2b5ff94a$var$rootEl = el;\n $2c4dfe5b2b5ff94a$var$dragEl = target;\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$dragEl.parentNode;\n $2c4dfe5b2b5ff94a$var$nextEl = $2c4dfe5b2b5ff94a$var$dragEl.nextSibling;\n $2c4dfe5b2b5ff94a$var$lastDownEl = target;\n $2c4dfe5b2b5ff94a$var$activeGroup = options.group;\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged = $2c4dfe5b2b5ff94a$var$dragEl;\n $2c4dfe5b2b5ff94a$var$tapEvt = {\n target: $2c4dfe5b2b5ff94a$var$dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n $2c4dfe5b2b5ff94a$var$tapDistanceLeft = $2c4dfe5b2b5ff94a$var$tapEvt.clientX - dragRect.left;\n $2c4dfe5b2b5ff94a$var$tapDistanceTop = $2c4dfe5b2b5ff94a$var$tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n $2c4dfe5b2b5ff94a$var$dragEl.style[\"will-change\"] = \"all\";\n dragStartFn = function dragStartFn() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"delayEnded\", _this, {\n evt: evt\n });\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!$2c4dfe5b2b5ff94a$var$FireFox && _this.nativeDraggable) $2c4dfe5b2b5ff94a$var$dragEl.draggable = true;\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n // Drag start event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n name: \"choose\",\n originalEvent: evt\n });\n // Chosen item\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.chosenClass, true);\n };\n // Disable \"draggable\"\n options.ignore.split(\",\").forEach(function(criteria) {\n $2c4dfe5b2b5ff94a$var$find($2c4dfe5b2b5ff94a$var$dragEl, criteria.trim(), $2c4dfe5b2b5ff94a$var$_disableDraggable);\n });\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"dragover\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mousemove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchmove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mouseup\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchend\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchcancel\", _this._onDrop);\n // Make dragEl draggable (must be before delay for FireFox)\n if ($2c4dfe5b2b5ff94a$var$FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n $2c4dfe5b2b5ff94a$var$dragEl.draggable = true;\n }\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"delayStart\", this, {\n evt: evt\n });\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !($2c4dfe5b2b5ff94a$var$Edge || $2c4dfe5b2b5ff94a$var$IE11OrLess))) {\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mouseup\", _this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchend\", _this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchcancel\", _this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"mousemove\", _this._delayedDragTouchMoveHandler);\n $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"touchmove\", _this._delayedDragTouchMoveHandler);\n options.supportPointer && $2c4dfe5b2b5ff94a$var$on(ownerDocument, \"pointermove\", _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else dragStartFn();\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(/** TouchEvent|PointerEvent **/ e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) this._disableDelayedDrag();\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n $2c4dfe5b2b5ff94a$var$dragEl && $2c4dfe5b2b5ff94a$var$_disableDraggable($2c4dfe5b2b5ff94a$var$dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"mouseup\", this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchend\", this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchcancel\", this._disableDelayedDrag);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"mousemove\", this._delayedDragTouchMoveHandler);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchmove\", this._delayedDragTouchMoveHandler);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"pointermove\", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(/** Event */ evt, /** Touch */ touch) {\n touch = touch || evt.pointerType == \"touch\" && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) $2c4dfe5b2b5ff94a$var$on(document, \"pointermove\", this._onTouchMove);\n else if (touch) $2c4dfe5b2b5ff94a$var$on(document, \"touchmove\", this._onTouchMove);\n else $2c4dfe5b2b5ff94a$var$on(document, \"mousemove\", this._onTouchMove);\n } else {\n $2c4dfe5b2b5ff94a$var$on($2c4dfe5b2b5ff94a$var$dragEl, \"dragend\", this);\n $2c4dfe5b2b5ff94a$var$on($2c4dfe5b2b5ff94a$var$rootEl, \"dragstart\", this._onDragStart);\n }\n try {\n if (document.selection) // Timeout neccessary for IE9\n $2c4dfe5b2b5ff94a$var$_nextTick(function() {\n document.selection.empty();\n });\n else window.getSelection().removeAllRanges();\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n $2c4dfe5b2b5ff94a$var$awaitingDragStarted = false;\n if ($2c4dfe5b2b5ff94a$var$rootEl && $2c4dfe5b2b5ff94a$var$dragEl) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"dragStarted\", this, {\n evt: evt\n });\n if (this.nativeDraggable) $2c4dfe5b2b5ff94a$var$on(document, \"dragover\", $2c4dfe5b2b5ff94a$var$_checkOutsideTargetEl);\n var options = this.options;\n // Apply effect\n !fallback && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.dragClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.ghostClass, true);\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active = this;\n fallback && this._appendGhost();\n // Drag start event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"start\",\n originalEvent: evt\n });\n } else this._nulling();\n },\n _emulateDragOver: function _emulateDragOver() {\n if ($2c4dfe5b2b5ff94a$var$touchEvt) {\n this._lastX = $2c4dfe5b2b5ff94a$var$touchEvt.clientX;\n this._lastY = $2c4dfe5b2b5ff94a$var$touchEvt.clientY;\n $2c4dfe5b2b5ff94a$var$_hideGhostForTarget();\n var target = document.elementFromPoint($2c4dfe5b2b5ff94a$var$touchEvt.clientX, $2c4dfe5b2b5ff94a$var$touchEvt.clientY);\n var parent = target;\n while(target && target.shadowRoot){\n target = target.shadowRoot.elementFromPoint($2c4dfe5b2b5ff94a$var$touchEvt.clientX, $2c4dfe5b2b5ff94a$var$touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n $2c4dfe5b2b5ff94a$var$dragEl.parentNode[$2c4dfe5b2b5ff94a$var$expando]._isOutsideThisEl(target);\n if (parent) do {\n if (parent[$2c4dfe5b2b5ff94a$var$expando]) {\n var inserted = void 0;\n inserted = parent[$2c4dfe5b2b5ff94a$var$expando]._onDragOver({\n clientX: $2c4dfe5b2b5ff94a$var$touchEvt.clientX,\n clientY: $2c4dfe5b2b5ff94a$var$touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) break;\n }\n target = parent; // store last element\n }while (parent = parent.parentNode);\n $2c4dfe5b2b5ff94a$var$_unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(/**TouchEvent*/ evt) {\n if ($2c4dfe5b2b5ff94a$var$tapEvt) {\n var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = $2c4dfe5b2b5ff94a$var$ghostEl && $2c4dfe5b2b5ff94a$var$matrix($2c4dfe5b2b5ff94a$var$ghostEl, true), scaleX = $2c4dfe5b2b5ff94a$var$ghostEl && ghostMatrix && ghostMatrix.a, scaleY = $2c4dfe5b2b5ff94a$var$ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely && $2c4dfe5b2b5ff94a$var$ghostRelativeParent && $2c4dfe5b2b5ff94a$var$getRelativeScrollOffset($2c4dfe5b2b5ff94a$var$ghostRelativeParent), dx = (touch.clientX - $2c4dfe5b2b5ff94a$var$tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - $2c4dfe5b2b5ff94a$var$tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n // only set the status to dragging, when we are actually dragging\n if (!$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active && !$2c4dfe5b2b5ff94a$var$awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) return;\n this._onDragStart(evt, true);\n }\n if ($2c4dfe5b2b5ff94a$var$ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - ($2c4dfe5b2b5ff94a$var$lastDx || 0);\n ghostMatrix.f += dy - ($2c4dfe5b2b5ff94a$var$lastDy || 0);\n } else ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"webkitTransform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"mozTransform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"msTransform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transform\", cssMatrix);\n $2c4dfe5b2b5ff94a$var$lastDx = dx;\n $2c4dfe5b2b5ff94a$var$lastDy = dy;\n $2c4dfe5b2b5ff94a$var$touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!$2c4dfe5b2b5ff94a$var$ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : $2c4dfe5b2b5ff94a$var$rootEl, rect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl, true, $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely, true, container), options = this.options;\n // Position absolutely\n if ($2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely) {\n // Get relatively positioned parent\n $2c4dfe5b2b5ff94a$var$ghostRelativeParent = container;\n while($2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostRelativeParent, \"position\") === \"static\" && $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostRelativeParent, \"transform\") === \"none\" && $2c4dfe5b2b5ff94a$var$ghostRelativeParent !== document)$2c4dfe5b2b5ff94a$var$ghostRelativeParent = $2c4dfe5b2b5ff94a$var$ghostRelativeParent.parentNode;\n if ($2c4dfe5b2b5ff94a$var$ghostRelativeParent !== document.body && $2c4dfe5b2b5ff94a$var$ghostRelativeParent !== document.documentElement) {\n if ($2c4dfe5b2b5ff94a$var$ghostRelativeParent === document) $2c4dfe5b2b5ff94a$var$ghostRelativeParent = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n rect.top += $2c4dfe5b2b5ff94a$var$ghostRelativeParent.scrollTop;\n rect.left += $2c4dfe5b2b5ff94a$var$ghostRelativeParent.scrollLeft;\n } else $2c4dfe5b2b5ff94a$var$ghostRelativeParent = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n $2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll = $2c4dfe5b2b5ff94a$var$getRelativeScrollOffset($2c4dfe5b2b5ff94a$var$ghostRelativeParent);\n }\n $2c4dfe5b2b5ff94a$var$ghostEl = $2c4dfe5b2b5ff94a$var$dragEl.cloneNode(true);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$ghostEl, options.ghostClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$ghostEl, options.fallbackClass, true);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$ghostEl, options.dragClass, true);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transition\", \"\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transform\", \"\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"box-sizing\", \"border-box\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"margin\", 0);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"top\", rect.top);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"left\", rect.left);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"width\", rect.width);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"height\", rect.height);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"opacity\", \"0.8\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"position\", $2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely ? \"absolute\" : \"fixed\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"zIndex\", \"100000\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"pointerEvents\", \"none\");\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost = $2c4dfe5b2b5ff94a$var$ghostEl;\n container.appendChild($2c4dfe5b2b5ff94a$var$ghostEl);\n // Set transform-origin\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$ghostEl, \"transform-origin\", $2c4dfe5b2b5ff94a$var$tapDistanceLeft / parseInt($2c4dfe5b2b5ff94a$var$ghostEl.style.width) * 100 + \"% \" + $2c4dfe5b2b5ff94a$var$tapDistanceTop / parseInt($2c4dfe5b2b5ff94a$var$ghostEl.style.height) * 100 + \"%\");\n }\n },\n _onDragStart: function _onDragStart(/**Event*/ evt, /**boolean*/ fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"dragStart\", this, {\n evt: evt\n });\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"setupClone\", this);\n if (!$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n $2c4dfe5b2b5ff94a$var$cloneEl = $2c4dfe5b2b5ff94a$var$clone($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$cloneEl.removeAttribute(\"id\");\n $2c4dfe5b2b5ff94a$var$cloneEl.draggable = false;\n $2c4dfe5b2b5ff94a$var$cloneEl.style[\"will-change\"] = \"\";\n this._hideClone();\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$cloneEl, this.options.chosenClass, false);\n $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.clone = $2c4dfe5b2b5ff94a$var$cloneEl;\n }\n // #1143: IFrame support workaround\n _this.cloneId = $2c4dfe5b2b5ff94a$var$_nextTick(function() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"clone\", _this);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$dragEl);\n _this._hideClone();\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n name: \"clone\"\n });\n });\n !fallback && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.dragClass, true);\n // Set proper drop events\n if (fallback) {\n $2c4dfe5b2b5ff94a$var$ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n $2c4dfe5b2b5ff94a$var$off(document, \"mouseup\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchend\", _this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchcancel\", _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = \"move\";\n options.setData && options.setData.call(_this, dataTransfer, $2c4dfe5b2b5ff94a$var$dragEl);\n }\n $2c4dfe5b2b5ff94a$var$on(document, \"drop\", _this);\n // #1276 fix:\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$dragEl, \"transform\", \"translateZ(0)\");\n }\n $2c4dfe5b2b5ff94a$var$awaitingDragStarted = true;\n _this._dragStartId = $2c4dfe5b2b5ff94a$var$_nextTick(_this._dragStarted.bind(_this, fallback, evt));\n $2c4dfe5b2b5ff94a$var$on(document, \"selectstart\", _this);\n $2c4dfe5b2b5ff94a$var$moved = true;\n if ($2c4dfe5b2b5ff94a$var$Safari) $2c4dfe5b2b5ff94a$var$css(document.body, \"user-select\", \"none\");\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(/**Event*/ evt) {\n var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active, isOwner = $2c4dfe5b2b5ff94a$var$activeGroup === group, canSort = options.sort, fromSortable = $2c4dfe5b2b5ff94a$var$putSortable || activeSortable, vertical, _this = this, completedFired = false;\n if ($2c4dfe5b2b5ff94a$var$_silent) return;\n function dragOverEvent(name, extra) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(name, _this, $2c4dfe5b2b5ff94a$var$_objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? \"vertical\" : \"horizontal\",\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return $2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, $2c4dfe5b2b5ff94a$var$getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n // Capture animation state\n function capture() {\n dragOverEvent(\"dragOverAnimationCapture\");\n _this.captureAnimationState();\n if (_this !== fromSortable) fromSortable.captureAnimationState();\n }\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent(\"dragOverCompleted\", {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n else activeSortable._showClone(_this);\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$putSortable ? $2c4dfe5b2b5ff94a$var$putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, options.ghostClass, true);\n }\n if ($2c4dfe5b2b5ff94a$var$putSortable !== _this && _this !== $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active) $2c4dfe5b2b5ff94a$var$putSortable = _this;\n else if (_this === $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active && $2c4dfe5b2b5ff94a$var$putSortable) $2c4dfe5b2b5ff94a$var$putSortable = null;\n // Animation\n if (fromSortable === _this) _this._ignoreWhileAnimating = target;\n _this.animateAll(function() {\n dragOverEvent(\"dragOverAnimationComplete\");\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n // Null lastTarget if it is not inside a previously swapped element\n if (target === $2c4dfe5b2b5ff94a$var$dragEl && !$2c4dfe5b2b5ff94a$var$dragEl.animated || target === el && !target.animated) $2c4dfe5b2b5ff94a$var$lastTarget = null;\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n $2c4dfe5b2b5ff94a$var$dragEl.parentNode[$2c4dfe5b2b5ff94a$var$expando]._isOutsideThisEl(evt.target);\n // Do not detect for empty insert if already inserted\n !insertion && $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n // Call when dragEl has been inserted\n function changed() {\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl, options.draggable);\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: _this,\n name: \"change\",\n toEl: el,\n newIndex: $2c4dfe5b2b5ff94a$var$newIndex,\n newDraggableIndex: $2c4dfe5b2b5ff94a$var$newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) evt.cancelable && evt.preventDefault();\n target = $2c4dfe5b2b5ff94a$var$closest(target, options.draggable, el, true);\n dragOverEvent(\"dragOver\");\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if ($2c4dfe5b2b5ff94a$var$dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) return completed(false);\n $2c4dfe5b2b5ff94a$var$ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = $2c4dfe5b2b5ff94a$var$parentEl !== $2c4dfe5b2b5ff94a$var$rootEl // Reverting item into the original list\n ) : $2c4dfe5b2b5ff94a$var$putSortable === this || (this.lastPutMode = $2c4dfe5b2b5ff94a$var$activeGroup.checkPull(this, activeSortable, $2c4dfe5b2b5ff94a$var$dragEl, evt)) && group.checkPut(this, activeSortable, $2c4dfe5b2b5ff94a$var$dragEl, evt))) {\n vertical = this._getDirection(evt, target) === \"vertical\";\n dragRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl);\n dragOverEvent(\"dragOverValid\");\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if (revert) {\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent(\"revert\");\n if (!$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n if ($2c4dfe5b2b5ff94a$var$nextEl) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$nextEl);\n else $2c4dfe5b2b5ff94a$var$rootEl.appendChild($2c4dfe5b2b5ff94a$var$dragEl);\n }\n return completed(true);\n }\n var elLastChild = $2c4dfe5b2b5ff94a$var$lastChild(el, options.draggable);\n if (!elLastChild || $2c4dfe5b2b5ff94a$var$_ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === $2c4dfe5b2b5ff94a$var$dragEl) return completed(false);\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) target = elLastChild;\n if (target) targetRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n if ($2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) // the last draggable element is not the last node\n el.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, elLastChild.nextSibling);\n else el.appendChild($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (elLastChild && $2c4dfe5b2b5ff94a$var$_ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = $2c4dfe5b2b5ff94a$var$getChild(el, 0, options, true);\n if (firstChild === $2c4dfe5b2b5ff94a$var$dragEl) return completed(false);\n target = firstChild;\n targetRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n if ($2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, firstChild);\n $2c4dfe5b2b5ff94a$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = $2c4dfe5b2b5ff94a$var$getRect(target);\n var direction = 0, targetBeforeFirstSwap, differentLevel = $2c4dfe5b2b5ff94a$var$dragEl.parentNode !== el, differentRowCol = !$2c4dfe5b2b5ff94a$var$_dragElInRowColumn($2c4dfe5b2b5ff94a$var$dragEl.animated && $2c4dfe5b2b5ff94a$var$dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? \"top\" : \"left\", scrolledPastTop = $2c4dfe5b2b5ff94a$var$isScrolledPast(target, \"top\", \"top\") || $2c4dfe5b2b5ff94a$var$isScrolledPast($2c4dfe5b2b5ff94a$var$dragEl, \"top\", \"top\"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if ($2c4dfe5b2b5ff94a$var$lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = false;\n $2c4dfe5b2b5ff94a$var$isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = $2c4dfe5b2b5ff94a$var$_getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, $2c4dfe5b2b5ff94a$var$isCircumstantialInvert, $2c4dfe5b2b5ff94a$var$lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n do {\n dragIndex -= direction;\n sibling = $2c4dfe5b2b5ff94a$var$parentEl.children[dragIndex];\n }while (sibling && ($2c4dfe5b2b5ff94a$var$css(sibling, \"display\") === \"none\" || sibling === $2c4dfe5b2b5ff94a$var$ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) return completed(false);\n $2c4dfe5b2b5ff94a$var$lastTarget = target;\n $2c4dfe5b2b5ff94a$var$lastDirection = direction;\n var nextSibling = target.nextElementSibling, after = false;\n after = direction === 1;\n var moveVector = $2c4dfe5b2b5ff94a$var$_onMove($2c4dfe5b2b5ff94a$var$rootEl, el, $2c4dfe5b2b5ff94a$var$dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) after = moveVector === 1;\n $2c4dfe5b2b5ff94a$var$_silent = true;\n setTimeout($2c4dfe5b2b5ff94a$var$_unsilent, 30);\n capture();\n if (after && !nextSibling) el.appendChild($2c4dfe5b2b5ff94a$var$dragEl);\n else target.parentNode.insertBefore($2c4dfe5b2b5ff94a$var$dragEl, after ? nextSibling : target);\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) $2c4dfe5b2b5ff94a$var$scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$dragEl.parentNode; // actualization\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !$2c4dfe5b2b5ff94a$var$isCircumstantialInvert) $2c4dfe5b2b5ff94a$var$targetMoveDistance = Math.abs(targetBeforeFirstSwap - $2c4dfe5b2b5ff94a$var$getRect(target)[side1]);\n changed();\n return completed(true);\n }\n }\n if (el.contains($2c4dfe5b2b5ff94a$var$dragEl)) return completed(false);\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n $2c4dfe5b2b5ff94a$var$off(document, \"mousemove\", this._onTouchMove);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchmove\", this._onTouchMove);\n $2c4dfe5b2b5ff94a$var$off(document, \"pointermove\", this._onTouchMove);\n $2c4dfe5b2b5ff94a$var$off(document, \"dragover\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$off(document, \"mousemove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchmove\", $2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"mouseup\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchend\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"pointerup\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(ownerDocument, \"touchcancel\", this._onDrop);\n $2c4dfe5b2b5ff94a$var$off(document, \"selectstart\", this);\n },\n _onDrop: function _onDrop(/**Event*/ evt) {\n var el = this.el, options = this.options;\n // Get the index of the dragged element within its parent\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl, options.draggable);\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"drop\", this, {\n evt: evt\n });\n $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$dragEl && $2c4dfe5b2b5ff94a$var$dragEl.parentNode;\n // Get again after plugin event\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl, options.draggable);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) {\n this._nulling();\n return;\n }\n $2c4dfe5b2b5ff94a$var$awaitingDragStarted = false;\n $2c4dfe5b2b5ff94a$var$isCircumstantialInvert = false;\n $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n $2c4dfe5b2b5ff94a$var$_cancelNextTick(this.cloneId);\n $2c4dfe5b2b5ff94a$var$_cancelNextTick(this._dragStartId);\n // Unbind events\n if (this.nativeDraggable) {\n $2c4dfe5b2b5ff94a$var$off(document, \"drop\", this);\n $2c4dfe5b2b5ff94a$var$off(el, \"dragstart\", this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if ($2c4dfe5b2b5ff94a$var$Safari) $2c4dfe5b2b5ff94a$var$css(document.body, \"user-select\", \"\");\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$dragEl, \"transform\", \"\");\n if (evt) {\n if ($2c4dfe5b2b5ff94a$var$moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n $2c4dfe5b2b5ff94a$var$ghostEl && $2c4dfe5b2b5ff94a$var$ghostEl.parentNode && $2c4dfe5b2b5ff94a$var$ghostEl.parentNode.removeChild($2c4dfe5b2b5ff94a$var$ghostEl);\n if ($2c4dfe5b2b5ff94a$var$rootEl === $2c4dfe5b2b5ff94a$var$parentEl || $2c4dfe5b2b5ff94a$var$putSortable && $2c4dfe5b2b5ff94a$var$putSortable.lastPutMode !== \"clone\") // Remove clone(s)\n $2c4dfe5b2b5ff94a$var$cloneEl && $2c4dfe5b2b5ff94a$var$cloneEl.parentNode && $2c4dfe5b2b5ff94a$var$cloneEl.parentNode.removeChild($2c4dfe5b2b5ff94a$var$cloneEl);\n if ($2c4dfe5b2b5ff94a$var$dragEl) {\n if (this.nativeDraggable) $2c4dfe5b2b5ff94a$var$off($2c4dfe5b2b5ff94a$var$dragEl, \"dragend\", this);\n $2c4dfe5b2b5ff94a$var$_disableDraggable($2c4dfe5b2b5ff94a$var$dragEl);\n $2c4dfe5b2b5ff94a$var$dragEl.style[\"will-change\"] = \"\";\n // Remove classes\n // ghostClass is added in dragStarted\n if ($2c4dfe5b2b5ff94a$var$moved && !$2c4dfe5b2b5ff94a$var$awaitingDragStarted) $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$putSortable ? $2c4dfe5b2b5ff94a$var$putSortable.options.ghostClass : this.options.ghostClass, false);\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl, this.options.chosenClass, false);\n // Drag stop event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"unchoose\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if ($2c4dfe5b2b5ff94a$var$rootEl !== $2c4dfe5b2b5ff94a$var$parentEl) {\n if ($2c4dfe5b2b5ff94a$var$newIndex >= 0) {\n // Add event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n rootEl: $2c4dfe5b2b5ff94a$var$parentEl,\n name: \"add\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n fromEl: $2c4dfe5b2b5ff94a$var$rootEl,\n originalEvent: evt\n });\n // Remove event\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"remove\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n // drag from one list and drop into another\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n rootEl: $2c4dfe5b2b5ff94a$var$parentEl,\n name: \"sort\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n fromEl: $2c4dfe5b2b5ff94a$var$rootEl,\n originalEvent: evt\n });\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n }\n $2c4dfe5b2b5ff94a$var$putSortable && $2c4dfe5b2b5ff94a$var$putSortable.save();\n } else {\n if ($2c4dfe5b2b5ff94a$var$newIndex !== $2c4dfe5b2b5ff94a$var$oldIndex) {\n if ($2c4dfe5b2b5ff94a$var$newIndex >= 0) {\n // drag & drop within the same list\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"update\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active) {\n /* jshint eqnull:true */ if ($2c4dfe5b2b5ff94a$var$newIndex == null || $2c4dfe5b2b5ff94a$var$newIndex === -1) {\n $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$oldIndex;\n $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$oldDraggableIndex;\n }\n $2c4dfe5b2b5ff94a$var$_dispatchEvent({\n sortable: this,\n name: \"end\",\n toEl: $2c4dfe5b2b5ff94a$var$parentEl,\n originalEvent: evt\n });\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"nulling\", this);\n $2c4dfe5b2b5ff94a$var$rootEl = $2c4dfe5b2b5ff94a$var$dragEl = $2c4dfe5b2b5ff94a$var$parentEl = $2c4dfe5b2b5ff94a$var$ghostEl = $2c4dfe5b2b5ff94a$var$nextEl = $2c4dfe5b2b5ff94a$var$cloneEl = $2c4dfe5b2b5ff94a$var$lastDownEl = $2c4dfe5b2b5ff94a$var$cloneHidden = $2c4dfe5b2b5ff94a$var$tapEvt = $2c4dfe5b2b5ff94a$var$touchEvt = $2c4dfe5b2b5ff94a$var$moved = $2c4dfe5b2b5ff94a$var$newIndex = $2c4dfe5b2b5ff94a$var$newDraggableIndex = $2c4dfe5b2b5ff94a$var$oldIndex = $2c4dfe5b2b5ff94a$var$oldDraggableIndex = $2c4dfe5b2b5ff94a$var$lastTarget = $2c4dfe5b2b5ff94a$var$lastDirection = $2c4dfe5b2b5ff94a$var$putSortable = $2c4dfe5b2b5ff94a$var$activeGroup = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.ghost = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.clone = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active = null;\n $2c4dfe5b2b5ff94a$var$savedInputChecked.forEach(function(el) {\n el.checked = true;\n });\n $2c4dfe5b2b5ff94a$var$savedInputChecked.length = $2c4dfe5b2b5ff94a$var$lastDx = $2c4dfe5b2b5ff94a$var$lastDy = 0;\n },\n handleEvent: function handleEvent(/**Event*/ evt) {\n switch(evt.type){\n case \"drop\":\n case \"dragend\":\n this._onDrop(evt);\n break;\n case \"dragenter\":\n case \"dragover\":\n if ($2c4dfe5b2b5ff94a$var$dragEl) {\n this._onDragOver(evt);\n $2c4dfe5b2b5ff94a$var$_globalDragOver(evt);\n }\n break;\n case \"selectstart\":\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */ toArray: function toArray() {\n var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;\n for(; i < n; i++){\n el = children[i];\n if ($2c4dfe5b2b5ff94a$var$closest(el, options.draggable, this.el, false)) order.push(el.getAttribute(options.dataIdAttr) || $2c4dfe5b2b5ff94a$var$_generateId(el));\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */ sort: function sort(order, useAnimation) {\n var items = {}, rootEl = this.el;\n this.toArray().forEach(function(id, i) {\n var el = rootEl.children[i];\n if ($2c4dfe5b2b5ff94a$var$closest(el, this.options.draggable, rootEl, false)) items[id] = el;\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function(id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */ save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */ closest: function closest$1(el, selector) {\n return $2c4dfe5b2b5ff94a$var$closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */ option: function option(name, value) {\n var options = this.options;\n if (value === void 0) return options[name];\n else {\n var modifiedValue = $2c4dfe5b2b5ff94a$var$PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== \"undefined\") options[name] = modifiedValue;\n else options[name] = value;\n if (name === \"group\") $2c4dfe5b2b5ff94a$var$_prepareGroup(options);\n }\n },\n /**\r\n * Destroy\r\n */ destroy: function destroy() {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"destroy\", this);\n var el = this.el;\n el[$2c4dfe5b2b5ff94a$var$expando] = null;\n $2c4dfe5b2b5ff94a$var$off(el, \"mousedown\", this._onTapStart);\n $2c4dfe5b2b5ff94a$var$off(el, \"touchstart\", this._onTapStart);\n $2c4dfe5b2b5ff94a$var$off(el, \"pointerdown\", this._onTapStart);\n if (this.nativeDraggable) {\n $2c4dfe5b2b5ff94a$var$off(el, \"dragover\", this);\n $2c4dfe5b2b5ff94a$var$off(el, \"dragenter\", this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll(\"[draggable]\"), function(el) {\n el.removeAttribute(\"draggable\");\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n $2c4dfe5b2b5ff94a$var$sortables.splice($2c4dfe5b2b5ff94a$var$sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!$2c4dfe5b2b5ff94a$var$cloneHidden) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"hideClone\", this);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return;\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$cloneEl, \"display\", \"none\");\n if (this.options.removeCloneOnHide && $2c4dfe5b2b5ff94a$var$cloneEl.parentNode) $2c4dfe5b2b5ff94a$var$cloneEl.parentNode.removeChild($2c4dfe5b2b5ff94a$var$cloneEl);\n $2c4dfe5b2b5ff94a$var$cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== \"clone\") {\n this._hideClone();\n return;\n }\n if ($2c4dfe5b2b5ff94a$var$cloneHidden) {\n $2c4dfe5b2b5ff94a$var$pluginEvent(\"showClone\", this);\n if ($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.eventCanceled) return;\n // show clone at dragEl or original position\n if ($2c4dfe5b2b5ff94a$var$dragEl.parentNode == $2c4dfe5b2b5ff94a$var$rootEl && !this.options.group.revertClone) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$dragEl);\n else if ($2c4dfe5b2b5ff94a$var$nextEl) $2c4dfe5b2b5ff94a$var$rootEl.insertBefore($2c4dfe5b2b5ff94a$var$cloneEl, $2c4dfe5b2b5ff94a$var$nextEl);\n else $2c4dfe5b2b5ff94a$var$rootEl.appendChild($2c4dfe5b2b5ff94a$var$cloneEl);\n if (this.options.group.revertClone) this.animate($2c4dfe5b2b5ff94a$var$dragEl, $2c4dfe5b2b5ff94a$var$cloneEl);\n $2c4dfe5b2b5ff94a$var$css($2c4dfe5b2b5ff94a$var$cloneEl, \"display\", \"\");\n $2c4dfe5b2b5ff94a$var$cloneHidden = false;\n }\n }\n};\nfunction $2c4dfe5b2b5ff94a$var$_globalDragOver(/**Event*/ evt) {\n if (evt.dataTransfer) evt.dataTransfer.dropEffect = \"move\";\n evt.cancelable && evt.preventDefault();\n}\nfunction $2c4dfe5b2b5ff94a$var$_onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt, sortable = fromEl[$2c4dfe5b2b5ff94a$var$expando], onMoveFn = sortable.options.onMove, retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$2c4dfe5b2b5ff94a$var$IE11OrLess && !$2c4dfe5b2b5ff94a$var$Edge) evt = new CustomEvent(\"move\", {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(\"move\", true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || $2c4dfe5b2b5ff94a$var$getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) retVal = onMoveFn.call(sortable, evt, originalEvent);\n return retVal;\n}\nfunction $2c4dfe5b2b5ff94a$var$_disableDraggable(el) {\n el.draggable = false;\n}\nfunction $2c4dfe5b2b5ff94a$var$_unsilent() {\n $2c4dfe5b2b5ff94a$var$_silent = false;\n}\nfunction $2c4dfe5b2b5ff94a$var$_ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = $2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement(sortable.el, sortable.options, $2c4dfe5b2b5ff94a$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction $2c4dfe5b2b5ff94a$var$_ghostIsLast(evt, vertical, sortable) {\n var lastElRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = $2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement(sortable.el, sortable.options, $2c4dfe5b2b5ff94a$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction $2c4dfe5b2b5ff94a$var$_getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && $2c4dfe5b2b5ff94a$var$targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!$2c4dfe5b2b5ff94a$var$pastFirstInvertThresh && ($2c4dfe5b2b5ff94a$var$lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n $2c4dfe5b2b5ff94a$var$pastFirstInvertThresh = true;\n if (!$2c4dfe5b2b5ff94a$var$pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if ($2c4dfe5b2b5ff94a$var$lastDirection === 1 ? mouseOnAxis < targetS1 + $2c4dfe5b2b5ff94a$var$targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - $2c4dfe5b2b5ff94a$var$targetMoveDistance) return -$2c4dfe5b2b5ff94a$var$lastDirection;\n } else invert = true;\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) return $2c4dfe5b2b5ff94a$var$_getInsertDirection(target);\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n return 0;\n}\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */ function $2c4dfe5b2b5ff94a$var$_getInsertDirection(target) {\n if ($2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl) < $2c4dfe5b2b5ff94a$var$index(target)) return 1;\n else return -1;\n}\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */ function $2c4dfe5b2b5ff94a$var$_generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;\n while(i--)sum += str.charCodeAt(i);\n return sum.toString(36);\n}\nfunction $2c4dfe5b2b5ff94a$var$_saveInputCheckedState(root) {\n $2c4dfe5b2b5ff94a$var$savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName(\"input\");\n var idx = inputs.length;\n while(idx--){\n var el = inputs[idx];\n el.checked && $2c4dfe5b2b5ff94a$var$savedInputChecked.push(el);\n }\n}\nfunction $2c4dfe5b2b5ff94a$var$_nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction $2c4dfe5b2b5ff94a$var$_cancelNextTick(id) {\n return clearTimeout(id);\n}\n// Fixed #973:\nif ($2c4dfe5b2b5ff94a$var$documentExists) $2c4dfe5b2b5ff94a$var$on(document, \"touchmove\", function(evt) {\n if (($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active || $2c4dfe5b2b5ff94a$var$awaitingDragStarted) && evt.cancelable) evt.preventDefault();\n});\n// Export utils\n$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.utils = {\n on: $2c4dfe5b2b5ff94a$var$on,\n off: $2c4dfe5b2b5ff94a$var$off,\n css: $2c4dfe5b2b5ff94a$var$css,\n find: $2c4dfe5b2b5ff94a$var$find,\n is: function is(el, selector) {\n return !!$2c4dfe5b2b5ff94a$var$closest(el, selector, el, false);\n },\n extend: $2c4dfe5b2b5ff94a$var$extend,\n throttle: $2c4dfe5b2b5ff94a$var$throttle,\n closest: $2c4dfe5b2b5ff94a$var$closest,\n toggleClass: $2c4dfe5b2b5ff94a$var$toggleClass,\n clone: $2c4dfe5b2b5ff94a$var$clone,\n index: $2c4dfe5b2b5ff94a$var$index,\n nextTick: $2c4dfe5b2b5ff94a$var$_nextTick,\n cancelNextTick: $2c4dfe5b2b5ff94a$var$_cancelNextTick,\n detectDirection: $2c4dfe5b2b5ff94a$var$_detectDirection,\n getChild: $2c4dfe5b2b5ff94a$var$getChild\n};\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */ $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.get = function(element) {\n return element[$2c4dfe5b2b5ff94a$var$expando];\n};\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */ $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.mount = function() {\n for(var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++)plugins[_key] = arguments[_key];\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function(plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) throw \"Sortable: Mounted plugin must be a constructor function, not \".concat(({}).toString.call(plugin));\n if (plugin.utils) $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.utils = $2c4dfe5b2b5ff94a$var$_objectSpread2($2c4dfe5b2b5ff94a$var$_objectSpread2({}, $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.utils), plugin.utils);\n $2c4dfe5b2b5ff94a$var$PluginManager.mount(plugin);\n });\n};\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.create = function(el, options) {\n return new $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423(el, options);\n};\n// Export\n$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.version = $2c4dfe5b2b5ff94a$var$version;\nvar $2c4dfe5b2b5ff94a$var$autoScrolls = [], $2c4dfe5b2b5ff94a$var$scrollEl, $2c4dfe5b2b5ff94a$var$scrollRootEl, $2c4dfe5b2b5ff94a$var$scrolling = false, $2c4dfe5b2b5ff94a$var$lastAutoScrollX, $2c4dfe5b2b5ff94a$var$lastAutoScrollY, $2c4dfe5b2b5ff94a$var$touchEvt$1, $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval;\nfunction $2c4dfe5b2b5ff94a$export$3fb39aee5567f02e() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) $2c4dfe5b2b5ff94a$var$on(document, \"dragover\", this._handleAutoScroll);\n else {\n if (this.options.supportPointer) $2c4dfe5b2b5ff94a$var$on(document, \"pointermove\", this._handleFallbackAutoScroll);\n else if (originalEvent.touches) $2c4dfe5b2b5ff94a$var$on(document, \"touchmove\", this._handleFallbackAutoScroll);\n else $2c4dfe5b2b5ff94a$var$on(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) this._handleAutoScroll(originalEvent);\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) $2c4dfe5b2b5ff94a$var$off(document, \"dragover\", this._handleAutoScroll);\n else {\n $2c4dfe5b2b5ff94a$var$off(document, \"pointermove\", this._handleFallbackAutoScroll);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchmove\", this._handleFallbackAutoScroll);\n $2c4dfe5b2b5ff94a$var$off(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n $2c4dfe5b2b5ff94a$var$clearPointerElemChangedInterval();\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n $2c4dfe5b2b5ff94a$var$cancelThrottle();\n },\n nulling: function nulling() {\n $2c4dfe5b2b5ff94a$var$touchEvt$1 = $2c4dfe5b2b5ff94a$var$scrollRootEl = $2c4dfe5b2b5ff94a$var$scrollEl = $2c4dfe5b2b5ff94a$var$scrolling = $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval = $2c4dfe5b2b5ff94a$var$lastAutoScrollX = $2c4dfe5b2b5ff94a$var$lastAutoScrollY = null;\n $2c4dfe5b2b5ff94a$var$autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y);\n $2c4dfe5b2b5ff94a$var$touchEvt$1 = evt;\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || $2c4dfe5b2b5ff94a$var$Edge || $2c4dfe5b2b5ff94a$var$IE11OrLess || $2c4dfe5b2b5ff94a$var$Safari) {\n $2c4dfe5b2b5ff94a$var$autoScroll(evt, this.options, elem, fallback);\n // Listener for pointer element change\n var ogElemScroller = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(elem, true);\n if ($2c4dfe5b2b5ff94a$var$scrolling && (!$2c4dfe5b2b5ff94a$var$pointerElemChangedInterval || x !== $2c4dfe5b2b5ff94a$var$lastAutoScrollX || y !== $2c4dfe5b2b5ff94a$var$lastAutoScrollY)) {\n $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval && $2c4dfe5b2b5ff94a$var$clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n $2c4dfe5b2b5ff94a$var$pointerElemChangedInterval = setInterval(function() {\n var newElem = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n }\n $2c4dfe5b2b5ff94a$var$autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n $2c4dfe5b2b5ff94a$var$lastAutoScrollX = x;\n $2c4dfe5b2b5ff94a$var$lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(elem, true) === $2c4dfe5b2b5ff94a$var$getWindowScrollingElement()) {\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n return;\n }\n $2c4dfe5b2b5ff94a$var$autoScroll(evt, this.options, $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return $2c4dfe5b2b5ff94a$var$_extends(AutoScroll, {\n pluginName: \"scroll\",\n initializeByDefault: true\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$clearAutoScrolls() {\n $2c4dfe5b2b5ff94a$var$autoScrolls.forEach(function(autoScroll) {\n clearInterval(autoScroll.pid);\n });\n $2c4dfe5b2b5ff94a$var$autoScrolls = [];\n}\nfunction $2c4dfe5b2b5ff94a$var$clearPointerElemChangedInterval() {\n clearInterval($2c4dfe5b2b5ff94a$var$pointerElemChangedInterval);\n}\nvar $2c4dfe5b2b5ff94a$var$autoScroll = $2c4dfe5b2b5ff94a$var$throttle(function(evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = $2c4dfe5b2b5ff94a$var$getWindowScrollingElement();\n var scrollThisInstance = false, scrollCustomFn;\n // New scroll root, set scrollEl\n if ($2c4dfe5b2b5ff94a$var$scrollRootEl !== rootEl) {\n $2c4dfe5b2b5ff94a$var$scrollRootEl = rootEl;\n $2c4dfe5b2b5ff94a$var$clearAutoScrolls();\n $2c4dfe5b2b5ff94a$var$scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if ($2c4dfe5b2b5ff94a$var$scrollEl === true) $2c4dfe5b2b5ff94a$var$scrollEl = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(rootEl, true);\n }\n var layersOut = 0;\n var currentParent = $2c4dfe5b2b5ff94a$var$scrollEl;\n do {\n var el = currentParent, rect = $2c4dfe5b2b5ff94a$var$getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = $2c4dfe5b2b5ff94a$var$css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\" || elCSS.overflowX === \"visible\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\" || elCSS.overflowY === \"visible\");\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\");\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!$2c4dfe5b2b5ff94a$var$autoScrolls[layersOut]) {\n for(var i = 0; i <= layersOut; i++)if (!$2c4dfe5b2b5ff94a$var$autoScrolls[i]) $2c4dfe5b2b5ff94a$var$autoScrolls[i] = {};\n }\n if ($2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vx != vx || $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vy != vy || $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].el !== el) {\n $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].el = el;\n $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vx = vx;\n $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].vy = vy;\n clearInterval($2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */ $2c4dfe5b2b5ff94a$var$autoScrolls[layersOut].pid = setInterval((function() {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.active._onTouchMove($2c4dfe5b2b5ff94a$var$touchEvt$1); // To move ghost if it is positioned absolutely\n var scrollOffsetY = $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vy ? $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vx ? $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === \"function\") {\n if (scrollCustomFn.call($2c4dfe5b2b5ff94a$export$31b3ca70d8f57423.dragged.parentNode[$2c4dfe5b2b5ff94a$var$expando], scrollOffsetX, scrollOffsetY, evt, $2c4dfe5b2b5ff94a$var$touchEvt$1, $2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].el) !== \"continue\") return;\n }\n $2c4dfe5b2b5ff94a$var$scrollBy($2c4dfe5b2b5ff94a$var$autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }).bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n }while (options.bubbleScroll && currentParent !== winScroller && (currentParent = $2c4dfe5b2b5ff94a$var$getParentAutoScrollElement(currentParent, false)));\n $2c4dfe5b2b5ff94a$var$scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\nvar $2c4dfe5b2b5ff94a$var$drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, dragEl = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent(\"spill\");\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction $2c4dfe5b2b5ff94a$var$Revert() {}\n$2c4dfe5b2b5ff94a$var$Revert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl, putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) putSortable.captureAnimationState();\n var nextSibling = $2c4dfe5b2b5ff94a$var$getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) this.sortable.el.insertBefore(dragEl, nextSibling);\n else this.sortable.el.appendChild(dragEl);\n this.sortable.animateAll();\n if (putSortable) putSortable.animateAll();\n },\n drop: $2c4dfe5b2b5ff94a$var$drop\n};\n$2c4dfe5b2b5ff94a$var$_extends($2c4dfe5b2b5ff94a$var$Revert, {\n pluginName: \"revertOnSpill\"\n});\nfunction $2c4dfe5b2b5ff94a$var$Remove() {}\n$2c4dfe5b2b5ff94a$var$Remove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl, putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: $2c4dfe5b2b5ff94a$var$drop\n};\n$2c4dfe5b2b5ff94a$var$_extends($2c4dfe5b2b5ff94a$var$Remove, {\n pluginName: \"removeOnSpill\"\n});\nvar $2c4dfe5b2b5ff94a$export$55b3d9f7b2513474 = [\n $2c4dfe5b2b5ff94a$var$Remove,\n $2c4dfe5b2b5ff94a$var$Revert\n];\nvar $2c4dfe5b2b5ff94a$var$lastSwapEl;\nfunction $2c4dfe5b2b5ff94a$export$bdb5f0a1b77546f4() {\n function Swap() {\n this.defaults = {\n swapClass: \"sortable-swap-highlight\"\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n $2c4dfe5b2b5ff94a$var$lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed, target = _ref2.target, onMove = _ref2.onMove, activeSortable = _ref2.activeSortable, changed = _ref2.changed, cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el, options = this.options;\n if (target && target !== el) {\n var prevSwapEl = $2c4dfe5b2b5ff94a$var$lastSwapEl;\n if (onMove(target) !== false) {\n $2c4dfe5b2b5ff94a$var$toggleClass(target, options.swapClass, true);\n $2c4dfe5b2b5ff94a$var$lastSwapEl = target;\n } else $2c4dfe5b2b5ff94a$var$lastSwapEl = null;\n if (prevSwapEl && prevSwapEl !== $2c4dfe5b2b5ff94a$var$lastSwapEl) $2c4dfe5b2b5ff94a$var$toggleClass(prevSwapEl, options.swapClass, false);\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable, putSortable = _ref3.putSortable, dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n $2c4dfe5b2b5ff94a$var$lastSwapEl && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$lastSwapEl, options.swapClass, false);\n if ($2c4dfe5b2b5ff94a$var$lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== $2c4dfe5b2b5ff94a$var$lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n $2c4dfe5b2b5ff94a$var$swapNodes(dragEl, $2c4dfe5b2b5ff94a$var$lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n $2c4dfe5b2b5ff94a$var$lastSwapEl = null;\n }\n };\n return $2c4dfe5b2b5ff94a$var$_extends(Swap, {\n pluginName: \"swap\",\n eventProperties: function eventProperties() {\n return {\n swapItem: $2c4dfe5b2b5ff94a$var$lastSwapEl\n };\n }\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$swapNodes(n1, n2) {\n var p1 = n1.parentNode, p2 = n2.parentNode, i1, i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = $2c4dfe5b2b5ff94a$var$index(n1);\n i2 = $2c4dfe5b2b5ff94a$var$index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) i2++;\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\nvar $2c4dfe5b2b5ff94a$var$multiDragElements = [], $2c4dfe5b2b5ff94a$var$multiDragClones = [], $2c4dfe5b2b5ff94a$var$lastMultiDragSelect, // for selection with modifier key down (SHIFT)\n$2c4dfe5b2b5ff94a$var$multiDragSortable, $2c4dfe5b2b5ff94a$var$initialFolding = false, // Initial multi-drag fold when drag started\n$2c4dfe5b2b5ff94a$var$folding = false, // Folding any other time\n$2c4dfe5b2b5ff94a$var$dragStarted = false, $2c4dfe5b2b5ff94a$var$dragEl$1, $2c4dfe5b2b5ff94a$var$clonesFromRect, $2c4dfe5b2b5ff94a$var$clonesHidden;\nfunction $2c4dfe5b2b5ff94a$export$18e5d2a5d1df842d() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) $2c4dfe5b2b5ff94a$var$on(document, \"pointerup\", this._deselectMultiDrag);\n else {\n $2c4dfe5b2b5ff94a$var$on(document, \"mouseup\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$on(document, \"touchend\", this._deselectMultiDrag);\n }\n }\n $2c4dfe5b2b5ff94a$var$on(document, \"keydown\", this._checkKeyDown);\n $2c4dfe5b2b5ff94a$var$on(document, \"keyup\", this._checkKeyUp);\n this.defaults = {\n selectedClass: \"sortable-selected\",\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = \"\";\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length && $2c4dfe5b2b5ff94a$var$multiDragSortable === sortable) $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement, i) {\n data += (!i ? \"\" : \", \") + multiDragElement.textContent;\n });\n else data = dragEl.textContent;\n dataTransfer.setData(\"Text\", data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n $2c4dfe5b2b5ff94a$var$dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable, cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for(var i = 0; i < $2c4dfe5b2b5ff94a$var$multiDragElements.length; i++){\n $2c4dfe5b2b5ff94a$var$multiDragClones.push($2c4dfe5b2b5ff94a$var$clone($2c4dfe5b2b5ff94a$var$multiDragElements[i]));\n $2c4dfe5b2b5ff94a$var$multiDragClones[i].sortableIndex = $2c4dfe5b2b5ff94a$var$multiDragElements[i].sortableIndex;\n $2c4dfe5b2b5ff94a$var$multiDragClones[i].draggable = false;\n $2c4dfe5b2b5ff94a$var$multiDragClones[i].style[\"will-change\"] = \"\";\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$multiDragClones[i], this.options.selectedClass, false);\n $2c4dfe5b2b5ff94a$var$multiDragElements[i] === $2c4dfe5b2b5ff94a$var$dragEl$1 && $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable, rootEl = _ref3.rootEl, dispatchSortableEvent = _ref3.dispatchSortableEvent, cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length && $2c4dfe5b2b5ff94a$var$multiDragSortable === sortable) {\n $2c4dfe5b2b5ff94a$var$insertMultiDragClones(true, rootEl);\n dispatchSortableEvent(\"clone\");\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown, rootEl = _ref4.rootEl, cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n $2c4dfe5b2b5ff94a$var$insertMultiDragClones(false, rootEl);\n $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n $2c4dfe5b2b5ff94a$var$css(clone, \"display\", \"\");\n });\n cloneNowShown();\n $2c4dfe5b2b5ff94a$var$clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable, cloneNowHidden = _ref5.cloneNowHidden, cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n $2c4dfe5b2b5ff94a$var$css(clone, \"display\", \"none\");\n if (_this.options.removeCloneOnHide && clone.parentNode) clone.parentNode.removeChild(clone);\n });\n cloneNowHidden();\n $2c4dfe5b2b5ff94a$var$clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && $2c4dfe5b2b5ff94a$var$multiDragSortable) $2c4dfe5b2b5ff94a$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.sortableIndex = $2c4dfe5b2b5ff94a$var$index(multiDragElement);\n });\n // Sort multi-drag elements\n $2c4dfe5b2b5ff94a$var$multiDragElements = $2c4dfe5b2b5ff94a$var$multiDragElements.sort(function(a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n $2c4dfe5b2b5ff94a$var$dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n if (this.options.animation) {\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n $2c4dfe5b2b5ff94a$var$css(multiDragElement, \"position\", \"absolute\");\n });\n var dragRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl$1, false, true, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n $2c4dfe5b2b5ff94a$var$setRect(multiDragElement, dragRect);\n });\n $2c4dfe5b2b5ff94a$var$folding = true;\n $2c4dfe5b2b5ff94a$var$initialFolding = true;\n }\n }\n sortable.animateAll(function() {\n $2c4dfe5b2b5ff94a$var$folding = false;\n $2c4dfe5b2b5ff94a$var$initialFolding = false;\n if (_this2.options.animation) $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n $2c4dfe5b2b5ff94a$var$unsetRect(multiDragElement);\n });\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target, completed = _ref8.completed, cancel = _ref8.cancel;\n if ($2c4dfe5b2b5ff94a$var$folding && ~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable, rootEl = _ref9.rootEl, sortable = _ref9.sortable, dragRect = _ref9.dragRect;\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length > 1) {\n // Setup unfold animation\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: $2c4dfe5b2b5ff94a$var$folding ? $2c4dfe5b2b5ff94a$var$getRect(multiDragElement) : dragRect\n });\n $2c4dfe5b2b5ff94a$var$unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n $2c4dfe5b2b5ff94a$var$folding = false;\n $2c4dfe5b2b5ff94a$var$insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable, isOwner = _ref10.isOwner, insertion = _ref10.insertion, activeSortable = _ref10.activeSortable, parentEl = _ref10.parentEl, putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n $2c4dfe5b2b5ff94a$var$initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && $2c4dfe5b2b5ff94a$var$multiDragElements.length > 1 && ($2c4dfe5b2b5ff94a$var$folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl$1, false, true, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n $2c4dfe5b2b5ff94a$var$setRect(multiDragElement, dragRectAbsolute);\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n $2c4dfe5b2b5ff94a$var$folding = true;\n }\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!$2c4dfe5b2b5ff94a$var$folding) $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n if ($2c4dfe5b2b5ff94a$var$multiDragElements.length > 1) {\n var clonesHiddenBefore = $2c4dfe5b2b5ff94a$var$clonesHidden;\n activeSortable._showClone(sortable);\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !$2c4dfe5b2b5ff94a$var$clonesHidden && clonesHiddenBefore) $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: $2c4dfe5b2b5ff94a$var$clonesFromRect\n });\n clone.fromRect = $2c4dfe5b2b5ff94a$var$clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n } else activeSortable._showClone(sortable);\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect, isOwner = _ref11.isOwner, activeSortable = _ref11.activeSortable;\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n $2c4dfe5b2b5ff94a$var$clonesFromRect = $2c4dfe5b2b5ff94a$var$_extends({}, dragRect);\n var dragMatrix = $2c4dfe5b2b5ff94a$var$matrix($2c4dfe5b2b5ff94a$var$dragEl$1, true);\n $2c4dfe5b2b5ff94a$var$clonesFromRect.top -= dragMatrix.f;\n $2c4dfe5b2b5ff94a$var$clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if ($2c4dfe5b2b5ff94a$var$folding) {\n $2c4dfe5b2b5ff94a$var$folding = false;\n $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent, rootEl = _ref12.rootEl, parentEl = _ref12.parentEl, sortable = _ref12.sortable, dispatchSortableEvent = _ref12.dispatchSortableEvent, oldIndex = _ref12.oldIndex, putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options, children = parentEl.children;\n // Multi-drag selection\n if (!$2c4dfe5b2b5ff94a$var$dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) this._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$toggleClass($2c4dfe5b2b5ff94a$var$dragEl$1, options.selectedClass, !~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1));\n if (!~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1)) {\n $2c4dfe5b2b5ff94a$var$multiDragElements.push($2c4dfe5b2b5ff94a$var$dragEl$1);\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: $2c4dfe5b2b5ff94a$var$dragEl$1,\n originalEvent: evt\n });\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && $2c4dfe5b2b5ff94a$var$lastMultiDragSelect && sortable.el.contains($2c4dfe5b2b5ff94a$var$lastMultiDragSelect)) {\n var lastIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$lastMultiDragSelect), currentIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for(; i < n; i++){\n if (~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(children[i])) continue;\n $2c4dfe5b2b5ff94a$var$toggleClass(children[i], options.selectedClass, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.push(children[i]);\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else $2c4dfe5b2b5ff94a$var$lastMultiDragSelect = $2c4dfe5b2b5ff94a$var$dragEl$1;\n $2c4dfe5b2b5ff94a$var$multiDragSortable = toSortable;\n } else {\n $2c4dfe5b2b5ff94a$var$multiDragElements.splice($2c4dfe5b2b5ff94a$var$multiDragElements.indexOf($2c4dfe5b2b5ff94a$var$dragEl$1), 1);\n $2c4dfe5b2b5ff94a$var$lastMultiDragSelect = null;\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"deselect\",\n targetEl: $2c4dfe5b2b5ff94a$var$dragEl$1,\n originalEvent: evt\n });\n }\n }\n // Multi-drag drop\n if ($2c4dfe5b2b5ff94a$var$dragStarted && this.isMultiDrag) {\n $2c4dfe5b2b5ff94a$var$folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[$2c4dfe5b2b5ff94a$var$expando].options.sort || parentEl !== rootEl) && $2c4dfe5b2b5ff94a$var$multiDragElements.length > 1) {\n var dragRect = $2c4dfe5b2b5ff94a$var$getRect($2c4dfe5b2b5ff94a$var$dragEl$1), multiDragIndex = $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl$1, \":not(.\" + this.options.selectedClass + \")\");\n if (!$2c4dfe5b2b5ff94a$var$initialFolding && options.animation) $2c4dfe5b2b5ff94a$var$dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!$2c4dfe5b2b5ff94a$var$initialFolding) {\n if (options.animation) {\n $2c4dfe5b2b5ff94a$var$dragEl$1.fromRect = dragRect;\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== $2c4dfe5b2b5ff94a$var$dragEl$1) {\n var rect = $2c4dfe5b2b5ff94a$var$folding ? $2c4dfe5b2b5ff94a$var$getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n $2c4dfe5b2b5ff94a$var$removeMultiDragElements();\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (children[multiDragIndex]) parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n else parentEl.appendChild(multiDragElement);\n multiDragIndex++;\n });\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === $2c4dfe5b2b5ff94a$var$index($2c4dfe5b2b5ff94a$var$dragEl$1)) {\n var update = false;\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement.sortableIndex !== $2c4dfe5b2b5ff94a$var$index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent(\"update\");\n dispatchSortableEvent(\"sort\");\n }\n }\n }\n // Must be done after capturing individual rects (scroll bar)\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n $2c4dfe5b2b5ff94a$var$unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n $2c4dfe5b2b5ff94a$var$multiDragSortable = toSortable;\n }\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== \"clone\") $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = $2c4dfe5b2b5ff94a$var$dragStarted = false;\n $2c4dfe5b2b5ff94a$var$multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$off(document, \"pointerup\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$off(document, \"mouseup\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$off(document, \"touchend\", this._deselectMultiDrag);\n $2c4dfe5b2b5ff94a$var$off(document, \"keydown\", this._checkKeyDown);\n $2c4dfe5b2b5ff94a$var$off(document, \"keyup\", this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof $2c4dfe5b2b5ff94a$var$dragStarted !== \"undefined\" && $2c4dfe5b2b5ff94a$var$dragStarted) return;\n // Only deselect if selection is in this sortable\n if ($2c4dfe5b2b5ff94a$var$multiDragSortable !== this.sortable) return;\n // Only deselect if target is not item in this sortable\n if (evt && $2c4dfe5b2b5ff94a$var$closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while($2c4dfe5b2b5ff94a$var$multiDragElements.length){\n var el = $2c4dfe5b2b5ff94a$var$multiDragElements[0];\n $2c4dfe5b2b5ff94a$var$toggleClass(el, this.options.selectedClass, false);\n $2c4dfe5b2b5ff94a$var$multiDragElements.shift();\n $2c4dfe5b2b5ff94a$var$dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: \"deselect\",\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = true;\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = false;\n }\n };\n return $2c4dfe5b2b5ff94a$var$_extends(MultiDrag, {\n // Static methods & properties\n pluginName: \"multiDrag\",\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */ select: function select(el) {\n var sortable = el.parentNode[$2c4dfe5b2b5ff94a$var$expando];\n if (!sortable || !sortable.options.multiDrag || ~$2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(el)) return;\n if ($2c4dfe5b2b5ff94a$var$multiDragSortable && $2c4dfe5b2b5ff94a$var$multiDragSortable !== sortable) {\n $2c4dfe5b2b5ff94a$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $2c4dfe5b2b5ff94a$var$multiDragSortable = sortable;\n }\n $2c4dfe5b2b5ff94a$var$toggleClass(el, sortable.options.selectedClass, true);\n $2c4dfe5b2b5ff94a$var$multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */ deselect: function deselect(el) {\n var sortable = el.parentNode[$2c4dfe5b2b5ff94a$var$expando], index = $2c4dfe5b2b5ff94a$var$multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n $2c4dfe5b2b5ff94a$var$toggleClass(el, sortable.options.selectedClass, false);\n $2c4dfe5b2b5ff94a$var$multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [], newIndicies = [];\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n // multiDragElements will already be sorted if folding\n var newIndex;\n if ($2c4dfe5b2b5ff94a$var$folding && multiDragElement !== $2c4dfe5b2b5ff94a$var$dragEl$1) newIndex = -1;\n else if ($2c4dfe5b2b5ff94a$var$folding) newIndex = $2c4dfe5b2b5ff94a$var$index(multiDragElement, \":not(.\" + _this3.options.selectedClass + \")\");\n else newIndex = $2c4dfe5b2b5ff94a$var$index(multiDragElement);\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: $2c4dfe5b2b5ff94a$var$_toConsumableArray($2c4dfe5b2b5ff94a$var$multiDragElements),\n clones: [].concat($2c4dfe5b2b5ff94a$var$multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === \"ctrl\") key = \"Control\";\n else if (key.length > 1) key = key.charAt(0).toUpperCase() + key.substr(1);\n return key;\n }\n }\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$insertMultiDragElements(clonesInserted, rootEl) {\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(multiDragElement, target);\n else rootEl.appendChild(multiDragElement);\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */ function $2c4dfe5b2b5ff94a$var$insertMultiDragClones(elementsInserted, rootEl) {\n $2c4dfe5b2b5ff94a$var$multiDragClones.forEach(function(clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(clone, target);\n else rootEl.appendChild(clone);\n });\n}\nfunction $2c4dfe5b2b5ff94a$var$removeMultiDragElements() {\n $2c4dfe5b2b5ff94a$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $2c4dfe5b2b5ff94a$var$dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\nvar $2c4dfe5b2b5ff94a$export$2e2bcd8739ae039 = $2c4dfe5b2b5ff94a$export$31b3ca70d8f57423;\n\n\n\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */ const $4481690a5b2e12d6$export$61fc7d43ac8f84b0 = (fn, wait = 0, immediate = false)=>{\n let timerId = null;\n if (typeof fn !== \"function\") throw new TypeError(\"Expected a function for first argument\");\n return (...args)=>{\n clearTimeout(timerId);\n if (immediate && !timerId) fn(...args);\n timerId = setTimeout(()=>{\n timerId = null;\n if (!immediate) fn(...args);\n }, wait);\n };\n};\n\n\n\n\n\nconst $884937fee35c0707$var$template = document.createElement(\"template\");\n$884937fee35c0707$var$template.innerHTML = /* html */ `\n \n\n \n From file\n \n
      \n \n Drag 'n' drop a file, or click to select file to import\n
      \n (Only JSON files are allowed)\n
      \n
      \n
      \n\n From text\n \n
      \n \n \n
      \n
      \n
      \n`;\nclass $884937fee35c0707$var$ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($884937fee35c0707$var$template.content.cloneNode(true));\n }\n this.#dropzoneEl = this.shadowRoot.querySelector(\"files-dropzone\");\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n }\n connectedCallback() {\n this.#dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n #handleFilesDropzoneDropAccepted = (evt)=>{\n const { acceptedFiles: acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n if (!file) return;\n const reader = new FileReader();\n reader.readAsText(file, \"utf-8\");\n reader.onload = this.#handleFileReaderLoad;\n };\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) return alert(\"Invalid file or no feeds found.\");\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n for (const feed of feedsToImport){\n const feedExists = Boolean(feeds.find((f)=>f.url === feed.url));\n const { url: url, title: title } = feed;\n const isValidURL = (0, $e998bc9dc264f90b$export$981c5d1bd3894713)(url);\n if (!feedExists && isValidURL) await (0, $bad480a01f35862b$export$4b77448646caf424)({\n url: url,\n title: title\n });\n }\n this.dispatchEvent(new Event(\"feeds-imported\", {\n bubbles: true,\n composed: true\n }));\n }\n #handleFileReaderLoad = async (evt)=>{\n try {\n const { result: result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert(\"The file is not valid.\");\n }\n };\n #handleImportFormSubmit = async (evt)=>{\n evt.preventDefault();\n const formData = new FormData(evt.target);\n const data = formData.get(\"import-data\");\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert(\"The data is not valid.\");\n }\n };\n}\nif (!window.customElements.get(\"import-feeds\")) window.customElements.define(\"import-feeds\", $884937fee35c0707$var$ImportFeeds);\n\n\nfunction $7a2aca835bb05064$export$c37129e465f64ef0(a) {\n return null !== a && \"object\" == typeof a ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\n\n\nconst $74fb585f2eaf8e2d$var$template = document.createElement(\"template\");\n$74fb585f2eaf8e2d$var$template.innerHTML = /* html */ `\n \n\n
      \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
      \n\n
      \n
      \n
      \n
      \n
      \n\n \n`;\nclass $74fb585f2eaf8e2d$var$ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($74fb585f2eaf8e2d$var$template.content.cloneNode(true));\n }\n this.#exportCodeEl = this.shadowRoot.getElementById(\"exportCode\");\n this.#clipboardCopyEl = this.shadowRoot.querySelector(\"clipboard-copy\");\n this.#webShareEl = this.shadowRoot.querySelector(\"web-share\");\n this.#downloadButton = this.shadowRoot.getElementById(\"downloadButton\");\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feeds\"\n ];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"feeds\" && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n connectedCallback() {\n this.#downloadButton.addEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n disconnectedCallback() {\n this.#downloadButton.removeEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n get feeds() {\n return this.getAttribute(\"feeds\");\n }\n set feeds(value) {\n this.setAttribute(\"feeds\", value);\n }\n #getFeedsToExportString() {\n let feedsToExport = \"\";\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n return feedsToExport;\n }\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([\n data\n ], {\n type: \"application/json\"\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n #handleDownloadButtonClick = async ()=>{\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n this.#exportFeeds(feeds);\n };\n}\nif (!window.customElements.get(\"export-feeds\")) window.customElements.define(\"export-feeds\", $74fb585f2eaf8e2d$var$ExportFeeds);\n\n\nconst $26a2e0c8216738ce$var$template = document.createElement(\"template\");\n$26a2e0c8216738ce$var$template.innerHTML = /* html */ `\n \n\n
      \n
      \n
      \n \n \n \n \n \n\n \n\n \n
      \n\n
      \n \n\n \n\n \n
      \n
      \n\n
        \n
        \n\n
        \n

        \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

        \n\n

        \n \n

        \n
        \n\n \n

        Import feeds

        \n \n
        \n\n \n

        Export feeds

        \n \n
        \n`;\nclass $26a2e0c8216738ce$var$FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($26a2e0c8216738ce$var$template.content.cloneNode(true));\n }\n this.#isEditable = false;\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n this.#feedsContainerEl = this.shadowRoot.getElementById(\"feedsContainer\");\n this.#feedsListEl = this.shadowRoot.getElementById(\"feedsList\");\n this.#editBtn = this.shadowRoot.getElementById(\"editBtn\");\n this.#importBtn = this.shadowRoot.getElementById(\"importBtn\");\n this.#importAltBtn = this.shadowRoot.getElementById(\"importAltBtn\");\n this.#exportBtn = this.shadowRoot.getElementById(\"exportBtn\");\n this.#searchInput = this.shadowRoot.getElementById(\"searchInput\");\n this.#searchClearBtn = this.shadowRoot.getElementById(\"searchClearBtn\");\n this.#importDialog = this.shadowRoot.getElementById(\"importDialog\");\n this.#exportDialog = this.shadowRoot.getElementById(\"exportDialog\");\n this.#importFeedsEl = this.shadowRoot.querySelector(\"import-feeds\");\n this.#exportFeedsEl = this.shadowRoot.querySelector(\"export-feeds\");\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById(\"noFeedsDisclaimer\");\n }\n async connectedCallback() {\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n feeds.forEach((feed)=>this.#addFeed(feed));\n this.#toggleFeedsVisibility();\n this.#feedsListEl.addEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.addEventListener(\"click\", this.#handleEditRequest);\n this.#importAltBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#importBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.addEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.addEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.addEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener(\"me-close\", this.#handleExportDialogClose);\n this.addEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.addEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n new (0, $2c4dfe5b2b5ff94a$export$2e2bcd8739ae039)(this.#feedsListEl, {\n animation: 150,\n handle: \".sort-handler\",\n onEnd: async (evt)=>{\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll(\"li\"), (el)=>{\n return {\n url: el.getAttribute(\"data-url\"),\n title: el.getAttribute(\"data-title\") || \"\"\n };\n });\n await (0, $bad480a01f35862b$export$a8ce8a4ec117f05e)(feeds, false);\n }\n });\n }\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.removeEventListener(\"click\", this.#handleEditRequest);\n this.#importBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#importAltBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.removeEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.removeEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.removeEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-close\", this.#handleExportDialogClose);\n this.removeEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.removeEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n }\n #searchFeeds = (searchValue = \"\")=>{\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n if (feedEls.length === 0) return;\n feedEls.forEach((el)=>{\n const url = (el.getAttribute(\"data-url\") || \"\").toLowerCase();\n const title = (el.getAttribute(\"data-title\") || \"\").toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n #debounceSearchFeeds = (0, $4481690a5b2e12d6$export$61fc7d43ac8f84b0)(this.#searchFeeds, 250);\n #handleSearchInputDebounced = (evt)=>{\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle(\"d-none\", !value);\n return this.#debounceSearchFeeds(value);\n };\n #handleSearchClear = ()=>{\n this.#searchInput.value = \"\";\n this.#searchInput.dispatchEvent(new Event(\"input\"));\n };\n #handleEditRequest = (evt)=>{\n this.#isEditable = !this.#isEditable;\n evt.currentTarget.classList.toggle(\"active\");\n this.shadowRoot.querySelectorAll(\".sort-handler, .delete-button\").forEach((el)=>{\n el.hidden = !el.hidden;\n });\n };\n #handleImportRequest = ()=>{\n this.#importDialog.open = true;\n };\n #handleExportRequest = ()=>{\n this.#exportDialog.open = true;\n };\n #handleImportDialogOpen = ()=>{\n try {\n this.#importFeedsEl.shadowRoot.querySelector(\"a-tab-group\").selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector(\"textarea\").value = \"\";\n } catch {\n // Fail silently\n }\n };\n #handleExportDialogOpen = async ()=>{\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n this.#exportFeedsEl.setAttribute(\"feeds\", JSON.stringify(feeds));\n };\n #handleExportDialogClose = ()=>{\n this.#exportFeedsEl.removeAttribute(\"feeds\");\n };\n #handleFeedsImported = ()=>{\n this.#importDialog.open = false;\n };\n #handleFeedsUpdateSuccess = (evt)=>{\n if (evt.detail.action === \"delete\") this.#removeFeed(evt.detail.feed);\n if (evt.detail.action === \"create\") {\n this.#addFeed(evt.detail.feed);\n if (this.#searchInput.value) {\n this.#searchInput.value = \"\";\n this.#searchFeeds(\"\");\n }\n }\n if (evt.detail.action === \"update\") {\n const { url: url, title: title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n if (feedEl) {\n const linkContent = feedEl.querySelector(\".link-content\");\n feedEl.setAttribute(\"data-title\", title || \"\");\n if (linkContent) linkContent.innerHTML = title ? `${title}
        ${url}` : url;\n }\n }\n };\n #handleActionsClick = (evt)=>{\n const target = evt.target;\n const deleteBtn = target.closest(\"button.delete-button\");\n const linkEl = target.closest(\"a.link\");\n if (!linkEl && !deleteBtn) return;\n const feedItem = target.closest(\"li\");\n const feedUrl = feedItem.getAttribute(\"data-url\");\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) (0, $bad480a01f35862b$export$4e54c6fd9fa8b09b)(feedUrl);\n }\n if (linkEl) {\n evt.preventDefault();\n document.querySelector(\"feed-reader\").feedUrl = feedUrl;\n }\n };\n #addFeed(feed) {\n const { url: url, title: title } = feed;\n const link = document.createElement(\"a\");\n link.className = \"link text-decoration-none d-flex align-items-center h-100\";\n link.style.flex = \"1\";\n link.style.minWidth = 0;\n link.style.color = \"inherit\";\n link.href = url;\n const linkContent = document.createElement(\"div\");\n linkContent.className = \"text-truncate link-content\";\n linkContent.innerHTML = title ? `${title}
        ${url}` : url;\n const deleteButton = document.createElement(\"button\");\n deleteButton.type = \"button\";\n deleteButton.title = \"Delete feed\";\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = \"delete-button btn btn-default text-danger p-0\";\n deleteButton.style.lineHeight = \"1\";\n deleteButton.innerHTML = /* html */ `\n \n \n \n Delete\n `;\n const listItem = document.createElement(\"li\");\n listItem.className = \"list-group-item p-0 d-flex justify-content-between align-items-center\";\n listItem.style.height = \"var(--list-item-height)\";\n listItem.setAttribute(\"data-url\", url || \"\");\n listItem.setAttribute(\"data-title\", title || \"\");\n const sortHandler = document.createElement(\"div\");\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = \"sort-handler text-primary\";\n sortHandler.innerHTML = /* html */ `\n \n \n \n Reorder\n `;\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n this.#feedsListEl.appendChild(listItem);\n this.#toggleFeedsVisibility();\n }\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n this.#feedsContainerEl.classList.toggle(\"d-none\", feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle(\"d-none\", feeds.length > 0);\n }\n}\nif (!window.customElements.get(\"feeds-list\")) window.customElements.define(\"feeds-list\", $26a2e0c8216738ce$var$FeedsList);\n\n\n\nconst $72c9c9ace8c869ec$var$cache = new Map();\nconst $72c9c9ace8c869ec$export$5b107dfb127cada8 = async (url, requestOptions = {})=>{\n const cachedFeed = $72c9c9ace8c869ec$var$cache.get(url);\n if (cachedFeed) return cachedFeed;\n const res = await fetch(\"https://api.rss2json.com/v1/api.json?rss_url=\" + url, requestOptions);\n if (!res.ok) throw new Error(\"Error fetching data\");\n const json = await res.json();\n $72c9c9ace8c869ec$var$cache.set(url, json);\n return json;\n};\n\n\n\nlet $b35f94fa505d7279$var$controller;\nconst $b35f94fa505d7279$var$template = document.createElement(\"template\");\n$b35f94fa505d7279$var$template.innerHTML = /* html */ `\n \n\n \n

        \n\n

        \n\n
        \n
        \n \n Please wait...\n
        \n\n
        \n \n \n \n There was an error while fetching the feed.\n
        \n\n
        \n
        \n
        \n`;\nclass $b35f94fa505d7279$var$FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($b35f94fa505d7279$var$template.content.cloneNode(true));\n }\n this.#spinnerEl = this.shadowRoot.getElementById(\"spinner\");\n this.#dialogEl = this.shadowRoot.querySelector(\"modal-element\");\n this.#modalTitle = this.#dialogEl.querySelector(\"#feedTitle\");\n this.#feedsViewer = this.shadowRoot.getElementById(\"feedsViewer\");\n this.#errorEl = this.shadowRoot.getElementById(\"error\");\n this.shadowRoot.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feed-url\"\n ];\n }\n attributeChangedCallback(name) {\n if (name === \"feed-url\") this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n connectedCallback() {\n this.#dialogEl.addEventListener(\"me-close\", this.#handleFeedClose);\n }\n disconnectedCallback() {\n this.#dialogEl.removeEventListener(\"me-close\", this.#handleFeedClose);\n }\n get feedUrl() {\n return this.getAttribute(\"feed-url\");\n }\n set feedUrl(value) {\n if (value) this.setAttribute(\"feed-url\", value);\n else this.removeAttribute(\"feed-url\");\n }\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n #handleFeedClose = ()=>{\n $b35f94fa505d7279$var$controller && $b35f94fa505d7279$var$controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll(\".card\").forEach((el)=>el.remove());\n this.#modalTitle.innerHTML = \"\";\n this.#spinnerEl.classList.add(\"d-none\");\n this.#errorEl.classList.add(\"d-none\");\n }\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove(\"d-none\");\n $b35f94fa505d7279$var$controller = new AbortController();\n try {\n const data = await (0, $72c9c9ace8c869ec$export$5b107dfb127cada8)(feedUrl, {\n signal: $b35f94fa505d7279$var$controller.signal\n });\n const { value: feeds = [] } = await (0, $bad480a01f35862b$export$4890c08c4ffbd57b)();\n const currentFeed = feeds.find((feed)=>feed.url === feedUrl);\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) await (0, $bad480a01f35862b$export$4b77448646caf424)({\n url: feedUrl,\n title: data.feed.title || \"\"\n });\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n data.items.forEach((item)=>{\n this.#feedsViewer.insertAdjacentHTML(\"beforeend\", this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n this.#modalTitle.textContent = \"\";\n this.#errorEl.classList.remove(\"d-none\");\n }\n } finally{\n this.#spinnerEl.classList.add(\"d-none\");\n }\n }\n #feedsReaderTemplate(item) {\n const { link: link, title: title, description: description, author: author, pubDate: pubDate, thumbnail: thumbnail } = item;\n let formattedDate = \"\";\n try {\n formattedDate = new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\"\n }).format(new Date(pubDate));\n } catch {\n formattedDate = \"-\";\n }\n return /* html */ `\n
        \n \n
        \n `;\n }\n}\nif (!window.customElements.get(\"feed-reader\")) window.customElements.define(\"feed-reader\", $b35f94fa505d7279$var$FeedReader);\n\n\ndocument.adoptedStyleSheets = (0, $4ffc15d651e12514$export$4b9cd30c41328fdd);\n\n\n//# sourceMappingURL=index.2b8c09b0.js.map\n","import '@georapbox/clipboard-copy-element/dist/clipboard-copy-defined.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport '@georapbox/a-tab-group/dist/a-tab-group.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport 'construct-style-sheets-polyfill/dist/adoptedStyleSheets.js';\nimport { styleSheets } from './helpers/styles.js';\nimport './components/add-feed.js';\nimport './components/feeds-list.js';\nimport './components/feed-reader.js';\n\ndocument.adoptedStyleSheets = styleSheets;\n","Object.defineProperty({},\"ClipboardCopy\",{get:function(){return i},set:void 0,enumerable:!0,configurable:!0});let t=\"clipboard-copy\",e=\"success\",o=\"error\",s=document.createElement(\"template\");s.innerHTML=`\n \n\n \n`;class i extends HTMLElement{#t=null;#e;#o;#s;#i;constructor(){super(),this.shadowRoot||(this.attachShadow({mode:\"open\"}),this.shadowRoot.appendChild(s.content.cloneNode(!0))),this.#e=this.shadowRoot.querySelector(\"button\"),this.#o=this.shadowRoot.querySelector('slot[name=\"copy\"]'),this.#s=this.shadowRoot.querySelector('slot[name=\"success\"]'),this.#i=this.shadowRoot.querySelector('slot[name=\"error\"]')}static get observedAttributes(){return[\"disabled\"]}connectedCallback(){this.#r(\"value\"),this.#r(\"from\"),this.#r(\"disabled\"),this.#r(\"feedbackDuration\"),this.#e.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#e.removeEventListener(\"click\",this.#n),this.#a()}attributeChangedCallback(t){\"disabled\"===t&&(this.#e.disabled=this.disabled,this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}get value(){return this.getAttribute(\"value\")}set value(t){this.setAttribute(\"value\",t)}get from(){return this.getAttribute(\"from\")}set from(t){this.setAttribute(\"from\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get feedbackDuration(){return Number(this.getAttribute(\"feedback-duration\"))||1e3}set feedbackDuration(t){this.setAttribute(\"feedback-duration\",t)}async #l(){if(this.value||this.from)try{let o=\"\";if(this.value)o=this.value;else if(this.from){let t=\"getRootNode\"in Element.prototype?this.#e.getRootNode({composed:!0}):this.#e.ownerDocument;if(!t||!(t instanceof Document||t instanceof ShadowRoot))return;let e=t.querySelector(this.from);if(!e)return;o=e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement?e.value:e instanceof HTMLAnchorElement&&e.hasAttribute(\"href\")?e.href:e.textContent}await navigator.clipboard.writeText(o),this.#d(e),this.dispatchEvent(new CustomEvent(`${t}-success`,{bubbles:!0,composed:!0,detail:{value:o}}))}catch(e){this.#d(o),this.dispatchEvent(new CustomEvent(`${t}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}#n=t=>{t.preventDefault(),this.disabled||this.#t||this.#l()};#d(t){this.#o.hidden=!0,this.#s.hidden=t!==e,this.#i.hidden=t!==o,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\"),this.#e.part.add(`button--${t}`),this.#t&&clearTimeout(this.#t),this.#t=setTimeout(()=>{this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(`button--${t}`),this.#t=null},this.feedbackDuration)}#a(){this.#t&&clearTimeout(this.#t),this.#t=null,this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\")}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(e=t){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,i)}}i.defineCustomElement();export{i as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $a4c1285108bf4a9d$exports = {};\n\n$parcel$export($a4c1285108bf4a9d$exports, \"ClipboardCopy\", function () { return $a4c1285108bf4a9d$export$ea3b71af1761ff40; });\nconst $a4c1285108bf4a9d$var$COMPONENT_NAME = \"clipboard-copy\";\nconst $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION = 1000;\nconst $a4c1285108bf4a9d$var$SUCCESS_STATUS = \"success\";\nconst $a4c1285108bf4a9d$var$ERROR_STATUS = \"error\";\nconst $a4c1285108bf4a9d$var$template = document.createElement(\"template\");\n$a4c1285108bf4a9d$var$template.innerHTML = /* html */ `\n \n\n \n`;\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */ class $a4c1285108bf4a9d$export$ea3b71af1761ff40 extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($a4c1285108bf4a9d$var$template.content.cloneNode(true));\n }\n this.#buttonEl = this.shadowRoot.querySelector(\"button\");\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#upgradeProperty(\"value\");\n this.#upgradeProperty(\"from\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"feedbackDuration\");\n this.#buttonEl.addEventListener(\"click\", this.#handleClick);\n }\n disconnectedCallback() {\n this.#buttonEl.removeEventListener(\"click\", this.#handleClick);\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n attributeChangedCallback(name) {\n if (name === \"disabled\") {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute(\"aria-disabled\", this.disabled.toString());\n if (this.#buttonEl.part.contains(\"button\")) this.#buttonEl.part.toggle(\"button--disabled\", this.disabled);\n }\n }\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */ get value() {\n return this.getAttribute(\"value\");\n }\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */ set value(value) {\n this.setAttribute(\"value\", value);\n }\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */ get from() {\n return this.getAttribute(\"from\");\n }\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */ set from(value) {\n this.setAttribute(\"from\", value);\n }\n /**\n * Getter for the disabled state.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */ set disabled(value) {\n if (value) this.setAttribute(\"disabled\", \"\");\n else this.removeAttribute(\"disabled\");\n }\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */ get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION;\n }\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */ set feedbackDuration(value) {\n this.setAttribute(\"feedback-duration\", value);\n }\n /**\n * Copies the value to the clipboard and handles success or error states.\n */ async #copy() {\n if (!this.value && !this.from) return;\n try {\n let copyValue = \"\";\n if (this.value) copyValue = this.value;\n else if (this.from) {\n const root = \"getRootNode\" in Element.prototype ? this.#buttonEl.getRootNode({\n composed: true\n }) : this.#buttonEl.ownerDocument;\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) return;\n const element = root.querySelector(this.from);\n if (!element) return;\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) copyValue = element.value;\n else if (element instanceof HTMLAnchorElement && element.hasAttribute(\"href\")) copyValue = element.href;\n else copyValue = element.textContent;\n }\n await navigator.clipboard.writeText(copyValue);\n this.#showStatus($a4c1285108bf4a9d$var$SUCCESS_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: {\n value: copyValue\n }\n }));\n } catch (error) {\n this.#showStatus($a4c1285108bf4a9d$var$ERROR_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */ #handleClick = (evt)=>{\n evt.preventDefault();\n if (this.disabled || this.#timeout) return;\n this.#copy();\n };\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */ #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== $a4c1285108bf4a9d$var$SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== $a4c1285108bf4a9d$var$ERROR_STATUS;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n this.#buttonEl.part.add(`button--${status}`);\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = setTimeout(()=>{\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(`button--${status}`);\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */ #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n }\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */ #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */ static defineCustomElement(elementName = $a4c1285108bf4a9d$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $a4c1285108bf4a9d$export$ea3b71af1761ff40);\n }\n}\n\n\n(0, $a4c1285108bf4a9d$export$ea3b71af1761ff40).defineCustomElement();\n\n\nexport {$a4c1285108bf4a9d$export$ea3b71af1761ff40 as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","import { ClipboardCopy } from './clipboard-copy.js';\n\nClipboardCopy.defineCustomElement();\n\nexport { ClipboardCopy };\n","const COMPONENT_NAME = 'clipboard-copy';\nconst DEFAULT_FEEDBACK_DURATION = 1000;\nconst SUCCESS_STATUS = 'success';\nconst ERROR_STATUS = 'error';\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n`;\n\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */\nclass ClipboardCopy extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonEl = this.shadowRoot.querySelector('button');\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n connectedCallback() {\n this.#upgradeProperty('value');\n this.#upgradeProperty('from');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('feedbackDuration');\n\n this.#buttonEl.addEventListener('click', this.#handleClick);\n }\n\n disconnectedCallback() {\n this.#buttonEl.removeEventListener('click', this.#handleClick);\n\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n\n attributeChangedCallback(name) {\n if (name === 'disabled') {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */\n get value() {\n return this.getAttribute('value');\n }\n\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */\n set value(value) {\n this.setAttribute('value', value);\n }\n\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */\n get from() {\n return this.getAttribute('from');\n }\n\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */\n set from(value) {\n this.setAttribute('from', value);\n }\n\n /**\n * Getter for the disabled state.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */\n set disabled(value) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */\n get feedbackDuration() {\n return Number(this.getAttribute('feedback-duration')) || DEFAULT_FEEDBACK_DURATION;\n }\n\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */\n set feedbackDuration(value) {\n this.setAttribute('feedback-duration', value);\n }\n\n /**\n * Copies the value to the clipboard and handles success or error states.\n */\n async #copy() {\n if (!this.value && !this.from) {\n return;\n }\n\n try {\n let copyValue = '';\n\n if (this.value) {\n copyValue = this.value;\n } else if (this.from) {\n const root = 'getRootNode' in Element.prototype\n ? this.#buttonEl.getRootNode({ composed: true })\n : this.#buttonEl.ownerDocument;\n\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) {\n return;\n }\n\n const element = root.querySelector(this.from);\n\n if (!element) {\n return;\n }\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n copyValue = element.value;\n } else if (element instanceof HTMLAnchorElement && element.hasAttribute('href')) {\n copyValue = element.href;\n } else {\n copyValue = element.textContent;\n }\n }\n\n await navigator.clipboard.writeText(copyValue);\n\n this.#showStatus(SUCCESS_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: { value: copyValue }\n }));\n } catch (error) {\n this.#showStatus(ERROR_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled || this.#timeout) {\n return;\n }\n\n this.#copy();\n };\n\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */\n #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== ERROR_STATUS;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n this.#buttonEl.part.add(`button--${status}`);\n\n this.#timeout && clearTimeout(this.#timeout);\n\n this.#timeout = setTimeout(() => {\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove(`button--${status}`);\n\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */\n #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n }\n\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */\n #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ClipboardCopy);\n }\n }\n}\n\nexport { ClipboardCopy };\n","Object.defineProperty({},\"WebShare\",{get:function(){return s},set:void 0,enumerable:!0,configurable:!0});let t=`\n :host {\n display: inline-block;\n }\n`,e=document.createElement(\"template\");e.innerHTML=`\n \n \n`;class s extends HTMLElement{#t;#e;#s=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(e.content.cloneNode(!0)),this.#t=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#e=this.#i()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,s){\"disabled\"===t&&e!==s&&this.#e&&(this.#e.toggleAttribute(\"disabled\",this.disabled),this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part&&this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#r(\"shareUrl\"),this.#r(\"shareTitle\"),this.#r(\"shareText\"),this.#r(\"shareFiles\"),this.#r(\"disabled\"),this.#t?.addEventListener(\"slotchange\",this.#a),this.#e?.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#t?.removeEventListener(\"slotchange\",this.#a),this.#e?.removeEventListener(\"click\",this.#n)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#s}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#s=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&\"AbortError\"===t.name){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#n=t=>{t.preventDefault(),this.disabled||this.share()};#a=t=>{t.target&&\"button\"===t.target.name&&(this.#e?.removeEventListener(\"click\",this.#n),this.#e=this.#i(),this.#e&&(this.#e.addEventListener(\"click\",this.#n),\"BUTTON\"===this.#e.nodeName||this.#e.hasAttribute(\"role\")||this.#e.setAttribute(\"role\",\"button\")))};#i(){return this.#t&&this.#t.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"button\"===t.getAttribute(\"slot\"))||null}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(t=\"web-share\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,s)}}s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */ function $442be162a818aed4$export$c37129e465f64ef0(options) {\n if (options !== null && typeof options === \"object\") return \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(options);\n return \"share\" in navigator;\n}\n\n\nexport {$442be162a818aed4$export$c37129e465f64ef0 as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */`\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles)\n && this.shareFiles.length > 0\n && navigator.canShare\n && navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n\n return;\n }\n\n this.dispatchEvent(new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","Object.defineProperty({},\"FilesDropzone\",{get:function(){return m},set:void 0,enumerable:!0,configurable:!0});let e=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),t=[\".DS_Store\",\"Thumbs.db\"],o=t=>{let{name:o}=t;if(o&&-1!==o.lastIndexOf(\".\")&&!t.type){let i=(o.split(\".\").pop()||\"\").toLowerCase(),r=e.get(i);r&&Object.defineProperty(t,\"type\",{value:r,writable:!1,configurable:!1,enumerable:!0})}return t},i=(e,t)=>{let i=o(e);if(\"string\"!=typeof i.path){let{webkitRelativePath:o}=e;Object.defineProperty(i,\"path\",{value:\"string\"==typeof t?t:o||e.name,writable:!1,configurable:!1,enumerable:!0})}return i},r=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),a=async e=>{let t=[],o=await r(e);for(;o.length>0;)t.push(...o),o=await r(e);return t},n=e=>new Promise((t,o)=>{e.file(o=>t(i(o,e.fullPath)),o)}),s=async e=>{let o=[],i=[];for(let t of e){if(\"file\"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();i.push(e)}for(;i.length>0;){let e=i.shift();if(e){if(e.isFile){let i=await n(e);-1===t.indexOf(i.name)&&o.push(i)}else e.isDirectory&&i.push(...await a(e.createReader()))}}return o},d=async e=>{let o=[];for(let r of e)-1===t.indexOf(r.name)&&o.push(i(r));return o},l=async e=>e.dataTransfer?e.dataTransfer.items?await s(e.dataTransfer.items):await d(e.dataTransfer.files):await d(e.target.files),p=\"files-dropzone\",c=\"TOO_MANY_FILES\",h=document.createElement(\"template\"),u=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;h.innerHTML=`\n \n\n \n\n
        \n Drag 'n' drop files here, or click to select files\n
        \n`;class m extends HTMLElement{#e=null;#t=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(h.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.getElementById(\"file-input\"),this.#t=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,o){\"accept\"===e&&t!==o&&this.#e&&(this.#e.accept=this.accept),\"disabled\"===e&&t!==o&&this.#e&&(this.#e.disabled=this.disabled,this.disabled?(this.#t?.removeAttribute(\"tabindex\"),this.#t?.setAttribute(\"aria-disabled\",\"true\")):(this.#t?.setAttribute(\"tabindex\",\"0\"),this.#t?.setAttribute(\"aria-disabled\",\"false\"))),\"multiple\"===e&&t!==o&&this.#e&&(this.#e.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#e?.addEventListener(\"change\",this.#i),this.#t?.addEventListener(\"dragenter\",this.#r),this.#t?.addEventListener(\"dragover\",this.#a),this.#t?.addEventListener(\"dragleave\",this.#n),this.#t?.addEventListener(\"drop\",this.#s),this.#t?.addEventListener(\"click\",this.#d),this.#t?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#t?.focus()}disconnectedCallback(){this.#e?.removeEventListener(\"change\",this.#i),this.#t?.removeEventListener(\"dragenter\",this.#r),this.#t?.removeEventListener(\"dragover\",this.#a),this.#t?.removeEventListener(\"dragleave\",this.#n),this.#t?.removeEventListener(\"drop\",this.#s),this.#t?.removeEventListener(\"click\",this.#d),this.#t?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",null!=e?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",null!=e?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${p}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#t&&(this.#t.classList.add(\"dropzone--dragover\"),this.#t.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragleave`,{bubbles:!0,composed:!0})))};#s=async e=>{if(!this.disabled){e.preventDefault(),this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\"));try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#d=()=>{this.disabled||this.#e?.click()};#l=e=>{this.disabled||\" \"!==e.key&&\"Enter\"!==e.key||this.#e?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:c,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:c,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let i of e){let e=function(e,t=\"\"){if(!t)return!0;let o=[...new Set(t.split(\",\").map(e=>e.trim()).filter(Boolean))],i=e.type,r=i.replace(/\\/.*$/,\"\");for(let t of o)if(\".\"===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\\/\\*$/.test(t)){if(r===t.replace(/\\/.*$/,\"\"))return!0}else if(i===t)return!0;return!1}(i,this.accept),r=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${p}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${p}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#e&&(this.#e.value=this.#e.defaultValue)}openFileDialog(){this.disabled||this.#e?.click()}#o(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=p){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,m)}}m.defineCustomElement();export{m as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $862aa3736b0514bc$exports = {};\n\n$parcel$export($862aa3736b0514bc$exports, \"FilesDropzone\", function () { return $862aa3736b0514bc$export$6ccd1735166caad9; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ // @ts-check\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */ function $38f222170fd4d21a$export$7c47054fed488f80(file, acceptedTypeSpecifiers = \"\") {\n if (!acceptedTypeSpecifiers) return true;\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(\",\").map((v)=>v.trim()).filter(Boolean))\n ];\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, \"\");\n for (const validType of acceptedMimeTypesList){\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n } else {\n if (fileMimeType === validType) return true;\n }\n }\n return false;\n}\n\n\n// @ts-check\n/**\n * A map of common file extensions and their associated MIME types.\n */ const $f31161edf38949e9$var$COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n // Others\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]);\nconst $f31161edf38949e9$var$FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n \".DS_Store\",\n \"Thumbs.db\" // Windows\n];\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */ const $f31161edf38949e9$var$toFileWithMimeType = (file)=>{\n const { name: name } = file;\n const hasExtension = name && name.lastIndexOf(\".\") !== -1;\n if (hasExtension && !file.type) {\n const extension = (name.split(\".\").pop() || \"\").toLowerCase();\n const type = $f31161edf38949e9$var$COMMON_MIME_TYPES.get(extension);\n if (type) Object.defineProperty(file, \"type\", {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return file;\n};\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */ const $f31161edf38949e9$var$toFileWithPath = (file, path)=>{\n const fileWithMimeType = $f31161edf38949e9$var$toFileWithMimeType(file);\n // @ts-ignore\n if (typeof fileWithMimeType.path !== \"string\") {\n const { webkitRelativePath: webkitRelativePath } = file;\n Object.defineProperty(fileWithMimeType, \"path\", {\n value: typeof path === \"string\" ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return fileWithMimeType;\n};\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readEntriesPromise = async (directoryReader)=>{\n return await new Promise((resolve, reject)=>{\n directoryReader.readEntries(resolve, reject);\n });\n};\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readAllDirectoryEntries = async (directoryReader)=>{\n const entries = [];\n let readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n while(readEntries.length > 0){\n entries.push(...readEntries);\n readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n }\n return entries;\n};\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */ const $f31161edf38949e9$var$getFileFromFileEntry = (fileEntry)=>{\n return new Promise((resolve, reject)=>{\n fileEntry.file((file)=>resolve($f31161edf38949e9$var$toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromDataTransferItemList = async (dataTransferItemList)=>{\n const files = [];\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n for (const item of dataTransferItemList){\n if (item.kind !== \"file\") continue;\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n queue.push(entry);\n }\n while(queue.length > 0){\n const entry = queue.shift();\n if (!entry) continue;\n else if (entry.isFile) {\n const file = await $f31161edf38949e9$var$getFileFromFileEntry(entry);\n if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push(file);\n } else if (entry.isDirectory) queue.push(...await $f31161edf38949e9$var$readAllDirectoryEntries(entry.createReader()));\n }\n return files;\n};\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromFileList = async (fileList)=>{\n const files = [];\n for (const file of fileList)if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push($f31161edf38949e9$var$toFileWithPath(file));\n return files;\n};\nconst $f31161edf38949e9$export$6d52664cd15c442 = async (evt)=>{\n if (evt.dataTransfer) return evt.dataTransfer.items ? await $f31161edf38949e9$var$getFilesFromDataTransferItemList(evt.dataTransfer.items) : await $f31161edf38949e9$var$getFilesFromFileList(evt.dataTransfer.files);\n return await $f31161edf38949e9$var$getFilesFromFileList(evt.target.files);\n};\n\n\nconst $862aa3736b0514bc$var$COMPONENT_NAME = \"files-dropzone\";\nconst $862aa3736b0514bc$var$TOO_MANY_FILES = \"TOO_MANY_FILES\";\nconst $862aa3736b0514bc$var$FILE_TOO_LARGE = \"FILE_TOO_LARGE\";\nconst $862aa3736b0514bc$var$FILE_TOO_SMALL = \"FILE_TOO_SMALL\";\nconst $862aa3736b0514bc$var$INVALID_MIME_TYPE = \"INVALID_MIME_TYPE\";\nconst $862aa3736b0514bc$var$template = document.createElement(\"template\");\nconst $862aa3736b0514bc$var$styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$862aa3736b0514bc$var$template.innerHTML = /* html */ `\n \n\n \n\n
        \n Drag 'n' drop files here, or click to select files\n
        \n`;\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */ class $862aa3736b0514bc$export$6ccd1735166caad9 extends HTMLElement {\n /** @type {Nullable} */ #fileInput = null;\n /** @type {Nullable} */ #dropzoneEl = null;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($862aa3736b0514bc$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ this.shadowRoot.getElementById(\"file-input\");\n this.#dropzoneEl = this.shadowRoot.getElementById(\"dropzone\");\n }\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"accept\" && oldValue !== newValue && this.#fileInput) this.#fileInput.accept = this.accept;\n if (name === \"disabled\" && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute(\"tabindex\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.#dropzoneEl?.setAttribute(\"tabindex\", \"0\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"false\");\n }\n }\n if (name === \"multiple\" && oldValue !== newValue && this.#fileInput) this.#fileInput.multiple = this.multiple;\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"accept\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"maxFiles\");\n this.#upgradeProperty(\"maxSize\");\n this.#upgradeProperty(\"minSize\");\n this.#upgradeProperty(\"multiple\");\n this.#upgradeProperty(\"autoFocus\");\n this.#upgradeProperty(\"noStyle\");\n this.#fileInput?.addEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.addEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.addEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.addEventListener(\"keyup\", this.#handleKeyUp);\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#fileInput?.removeEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.removeEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.removeEventListener(\"keyup\", this.#handleKeyUp);\n }\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */ get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(value) {\n this.setAttribute(\"accept\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */ get maxFiles() {\n const num = Number(this.getAttribute(\"max-files\")) || 0;\n if (num <= 0) return Infinity;\n return Math.floor(Math.abs(num));\n }\n set maxFiles(value) {\n this.setAttribute(\"max-files\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */ get maxSize() {\n const value = this.getAttribute(\"max-size\");\n if (value === null) return Infinity;\n const num = Number(value);\n return Number.isNaN(num) ? Infinity : num;\n }\n set maxSize(value) {\n this.setAttribute(\"max-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */ get minSize() {\n const value = this.getAttribute(\"min-size\");\n if (value === null) return 0;\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n set minSize(value) {\n this.setAttribute(\"min-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */ get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(value) {\n this.toggleAttribute(\"multiple\", !!value);\n }\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */ get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(value) {\n this.toggleAttribute(\"auto-focus\", !!value);\n }\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */ get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(value) {\n this.toggleAttribute(\"no-style\", !!value);\n }\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */ #handleFileInputChange = async (evt)=>{\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the dragenter event of the dropzone.\n */ #handleDragEnter = ()=>{\n if (this.disabled) return;\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDragOver = (evt)=>{\n evt.preventDefault();\n if (this.disabled) {\n evt.dataTransfer.dropEffect = \"none\";\n return;\n }\n evt.dataTransfer.dropEffect = \"copy\";\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add(\"dropzone--dragover\");\n this.#dropzoneEl.part.add(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragleave event of the dropzone.\n */ #handleDragLeave = ()=>{\n if (this.disabled) return;\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDrop = async (evt)=>{\n if (this.disabled) return;\n evt.preventDefault();\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the click event of the dropzone.\n */ #handleClick = ()=>{\n if (this.disabled) return;\n this.#fileInput?.click();\n };\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleKeyUp = (evt)=>{\n if (this.disabled) return;\n if (evt.key === \" \" || evt.key === \"Enter\") this.#fileInput?.click();\n };\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */ #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) return;\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n else if (this.multiple && filesLength > this.maxFiles) // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files){\n const fileHasValidType = (0, $38f222170fd4d21a$export$7c47054fed488f80)(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) acceptedFiles.push(file);\n else {\n const errors = [];\n if (!fileHasValidType) errors.push({\n code: $862aa3736b0514bc$var$INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n if (fileExceedsMaxSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n if (fileIsSmallerThanMinSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n rejectedFiles.push({\n file: file,\n errors: errors\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles,\n rejectedFiles: rejectedFiles\n }\n }));\n if (acceptedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles\n }\n }));\n if (rejectedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles: rejectedFiles\n }\n }));\n if (this.#fileInput) this.#fileInput.value = this.#fileInput.defaultValue;\n }\n /**\n * Opens the file dialog programmatically.\n */ openFileDialog() {\n if (this.disabled) return;\n this.#fileInput?.click();\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */ static defineCustomElement(elementName = $862aa3736b0514bc$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $862aa3736b0514bc$export$6ccd1735166caad9);\n }\n}\n\n\n(0, $862aa3736b0514bc$export$6ccd1735166caad9).defineCustomElement();\n\n\nexport {$862aa3736b0514bc$export$6ccd1735166caad9 as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n
        \n Drag 'n' drop files here, or click to select files\n
        \n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */(this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n }));\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n }));\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n }));\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(',').map(v => v.trim()).filter(Boolean))\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...await readAllDirectoryEntries(entry.createReader()));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","let t=(t=\"\",e=\"\")=>{let s=Math.random().toString(36).substring(2,8);return`${\"string\"==typeof t&&\"\"!==t?t+\"-\":\"\"}${s}${\"string\"==typeof e&&\"\"!==e?\"-\"+e:\"\"}`},e=(t,e)=>{if(Object.prototype.hasOwnProperty.call(e,t)){let s=e[t];delete e[t],e[t]=s}},s=0,o=`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`,a=document.createElement(\"template\");a.innerHTML=`\n \n\n
        \n \n
        \n`;class l extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(a.content.cloneNode(!0))}static get observedAttributes(){return[\"selected\",\"disabled\",\"closable\"]}attributeChangedCallback(t,e,s){if(\"selected\"===t&&e!==s&&this.setAttribute(\"aria-selected\",this.selected.toString()),\"disabled\"===t&&e!==s&&(this.setAttribute(\"aria-disabled\",this.disabled.toString()),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")),\"closable\"===t&&e!==s){if(this.closable){let t=document.createElement(\"span\");t.className=\"tab__close\",t.setAttribute(\"part\",\"close-tab\"),t.innerHTML='',this.shadowRoot?.querySelector(\".tab\")?.appendChild(t),t.addEventListener(\"click\",this.#t)}else{let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t),t?.remove()}}}connectedCallback(){this.#e(\"selected\"),this.#e(\"disabled\"),this.#e(\"closable\"),this.id||(this.id=t(\"tab\",(++s).toString())),this.setAttribute(\"slot\",\"tab\"),this.setAttribute(\"role\",\"tab\"),this.setAttribute(\"aria-selected\",\"false\"),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t)}get selected(){return this.hasAttribute(\"selected\")}set selected(t){this.toggleAttribute(\"selected\",!!t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get closable(){return this.hasAttribute(\"closable\")}set closable(t){this.toggleAttribute(\"closable\",!!t)}#t=t=>{t.stopPropagation(),this.dispatchEvent(new CustomEvent(\"a-tab-close\",{bubbles:!0,composed:!0,detail:{tabId:this.id}}))};#e(t){return e(t,this)}static defineCustomElement(t=\"a-tab\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,l)}}l.defineCustomElement();let i=0,r=`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`,n=document.createElement(\"template\");n.innerHTML=`\n \n\n
        \n \n
        \n`;class c extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(n.content.cloneNode(!0))}connectedCallback(){this.setAttribute(\"slot\",\"panel\"),this.setAttribute(\"role\",\"tabpanel\"),this.setAttribute(\"hidden\",\"\"),this.id||(this.id=t(\"panel\",(++i).toString()))}static defineCustomElement(t=\"a-tab-panel\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,c)}}c.defineCustomElement();let d={TOP:\"top\",BOTTOM:\"bottom\",START:\"start\",END:\"end\"},h=Object.entries(d).map(([,t])=>t),b={AUTO:\"auto\",MANUAL:\"manual\"},u={DOWN:\"ArrowDown\",LEFT:\"ArrowLeft\",RIGHT:\"ArrowRight\",UP:\"ArrowUp\",HOME:\"Home\",END:\"End\",ENTER:\"Enter\",SPACE:\" \"},p=`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`,g=document.createElement(\"template\");g.innerHTML=`\n \n\n
        \n
        \n \n\n
        \n \n
        \n\n \n
        \n\n
        \n \n
        \n
        \n`;class m extends HTMLElement{#s=null;#o=null;#a=!1;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(g.content.cloneNode(!0))}static get observedAttributes(){return[\"placement\",\"no-scroll-controls\"]}attributeChangedCallback(t,e,s){\"placement\"===t&&e!==s&&this.#l(),\"no-scroll-controls\"===t&&e!==s&&this.#l()}get placement(){return this.getAttribute(\"placement\")||d.TOP}set placement(t){null!=t&&this.setAttribute(\"placement\",t)}get noScrollControls(){return this.hasAttribute(\"no-scroll-controls\")}set noScrollControls(t){this.toggleAttribute(\"no-scroll-controls\",!!t)}get scrollDistance(){return Math.abs(Number(this.getAttribute(\"scroll-distance\")))||200}set scrollDistance(t){this.setAttribute(\"scroll-distance\",Math.abs(t).toString()||\"200\")}get activation(){return this.getAttribute(\"activation\")||b.AUTO}set activation(t){this.setAttribute(\"activation\",t||b.AUTO)}get noTabCycling(){return this.hasAttribute(\"no-tab-cycling\")}set noTabCycling(t){this.toggleAttribute(\"no-tab-cycling\",!!t)}connectedCallback(){this.#e(\"placement\"),this.#e(\"noScrollControls\"),this.#e(\"scrollDistance\"),this.#e(\"activation\"),this.#e(\"noTabCycling\");let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=this.shadowRoot?.querySelector(\".tab-group__nav\"),a=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.addEventListener(\"slotchange\",this.#i),e?.addEventListener(\"slotchange\",this.#i),s?.addEventListener(\"click\",this.#r),s?.addEventListener(\"keydown\",this.#n),a.forEach(t=>t.addEventListener(\"click\",this.#c)),this.addEventListener(\"a-tab-close\",this.#d),\"ResizeObserver\"in window&&(this.#s=new ResizeObserver(t=>{this.#o=window.requestAnimationFrame(()=>{let e=t?.[0],s=e?.target,l=s?.scrollWidth>s?.clientWidth;a.forEach(t=>t.toggleAttribute(\"hidden\",!l)),o?.part.toggle(\"nav--has-scroll-controls\",l),o?.classList.toggle(\"tab-group__nav--has-scroll-controls\",l)})})),this.#h(),this.#l()}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.removeEventListener(\"slotchange\",this.#i),e?.removeEventListener(\"slotchange\",this.#i),s?.removeEventListener(\"click\",this.#r),s?.removeEventListener(\"keydown\",this.#n),o.forEach(t=>t.removeEventListener(\"click\",this.#c)),this.removeEventListener(\"a-tab-close\",this.#d),this.#b()}#u(){if(!this.#s)return;let t=this.shadowRoot?.querySelector(\".tab-group__tabs\");t&&(this.#s.unobserve(t),this.#s.observe(t))}#b(){this.#s&&(this.#s.disconnect(),null!==this.#o&&(window.cancelAnimationFrame(this.#o),this.#o=null))}#p(){return getComputedStyle(this).direction||\"ltr\"}#h(){this.hidden=0===this.#g().length}#m(){let t=this.#g();this.#h(),t.forEach(t=>{let e=t.nextElementSibling;if(!e||\"a-tab-panel\"!==e.tagName.toLowerCase())return console.error(`Tab #${t.id} is not a sibling of a `);t.setAttribute(\"aria-controls\",e.id),e.setAttribute(\"aria-labelledby\",t.id)})}#v(){return Array.from(this.querySelectorAll(\"a-tab-panel\"))}#g(){return Array.from(this.querySelectorAll(\"a-tab\"))}#f(t){let e=t.getAttribute(\"aria-controls\");return this.querySelector(`#${e}`)}#w(){return this.#g().find(t=>!t.disabled)||null}#T(){let t=this.#g();for(let e=t.length-1;e>=0;e--)if(!t[e].disabled)return t[e];return null}#y(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))-1:t.findIndex(t=>t.selected)-1;for(;t[(e+t.length)%t.length].disabled;)e--;return this.noTabCycling&&e<0?null:t[(e+t.length)%t.length]}#A(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))+1:t.findIndex(t=>t.selected)+1;for(;t[e%t.length].disabled;)e++;return this.noTabCycling&&e>=t.length?null:t[e%t.length]}#_(){let t=this.#g(),e=this.#v();t.forEach(t=>t.selected=!1),e.forEach(t=>t.hidden=!0)}#l(){let t=this.shadowRoot?.querySelector(\".tab-group__nav\"),e=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);this.noScrollControls||this.placement===d.START||this.placement===d.END?(this.#b(),e.forEach(t=>t.hidden=!0),t?.part.remove(\"nav--has-scroll-controls\"),t?.classList.remove(\"tab-group__nav--has-scroll-controls\")):(this.#u(),e.forEach(t=>t.hidden=!1))}#E(){let t=this.#g(),e=t.find(t=>t.selected&&!t.disabled)||t.find(t=>!t.disabled);e&&(this.#a&&!e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.#C(e))}#C(t){this.#_(),t&&(t.selected=!0);let e=this.#f(t);e&&(e.hidden=!1)}#i=t=>{this.#m(),this.#l(),this.#E(),\"tab\"===t.target.name&&(this.#a=!0)};#n=t=>{if(\"a-tab\"!==t.target.tagName.toLowerCase()||t.altKey)return;let e=h.includes(this.placement||\"\")?this.placement:d.TOP,s=[d.TOP,d.BOTTOM].includes(e||\"\")?\"horizontal\":\"vertical\",o=this.#p(),a=null;switch(t.key){case u.LEFT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#y():this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.RIGHT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#A():this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.UP:\"vertical\"===s&&(a=this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.DOWN:\"vertical\"===s&&(a=this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.HOME:(a=this.#w())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.END:(a=this.#T())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.ENTER:case u.SPACE:(a=t.target)&&this.selectTab(a);break;default:return}t.preventDefault()};#r=t=>{let e=t.target.closest(\"a-tab\");e&&this.selectTab(e)};#c=t=>{let e=t.target.closest(\".tab-group__scroll-button\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\");if(!e||!s)return;let o=e.classList.contains(\"tab-group__scroll-button--start\")?-1:1,a=s.scrollLeft;s.scrollTo({left:a+o*this.scrollDistance})};#d=t=>{let e=t.target,s=this.#f(e);e&&(e.remove(),e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}}))),s&&\"a-tab-panel\"===s.tagName.toLowerCase()&&s.remove()};#e(t){return e(t,this)}selectTabByIndex(t){let e=this.#g()[t];e&&this.selectTab(e)}selectTabById(t){let e=this.#g().find(e=>e.id===t);e&&this.selectTab(e)}selectTab(t){let e=this.#g().find(t=>t.selected);!t||t.disabled||t.selected||\"a-tab\"!==t.tagName.toLowerCase()||(this.#C(t),window.requestAnimationFrame(()=>{t.scrollIntoView({inline:\"nearest\",block:\"nearest\"}),t.focus()}),e&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:t.id}})))}static defineCustomElement(t=\"a-tab-group\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,m)}}m.defineCustomElement();export{m as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /** @typedef {import('./a-tab').Tab} Tab */ /** @typedef {import('./a-tab-panel').TabPanel} TabPanel */ // @ts-check\n// @ts-check\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $aa07eeb3067ea186$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n// @ts-check\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */ const $2b7397b7d9d03d51$export$f7b23927dede22b3 = (prop, instance)=>{\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\n\nlet $4b127c96b8d62b28$var$tabCounter = 0;\nconst $4b127c96b8d62b28$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\nconst $4b127c96b8d62b28$var$template = document.createElement(\"template\");\n$4b127c96b8d62b28$var$template.innerHTML = /* html */ `\n \n\n
        \n \n
        \n`;\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */ class $4b127c96b8d62b28$export$3e41faf802a29e71 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($4b127c96b8d62b28$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"selected\" && oldValue !== newValue) this.setAttribute(\"aria-selected\", this.selected.toString());\n if (name === \"disabled\" && oldValue !== newValue) {\n this.setAttribute(\"aria-disabled\", this.disabled.toString());\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n if (name === \"closable\" && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement(\"span\");\n closeButton.className = \"tab__close\";\n closeButton.setAttribute(\"part\", \"close-tab\");\n closeButton.innerHTML = /* html */ ``;\n this.shadowRoot?.querySelector(\".tab\")?.appendChild(closeButton);\n closeButton.addEventListener(\"click\", this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"selected\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"closable\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"tab\", (++$4b127c96b8d62b28$var$tabCounter).toString());\n this.setAttribute(\"slot\", \"tab\");\n this.setAttribute(\"role\", \"tab\");\n this.setAttribute(\"aria-selected\", \"false\");\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n }\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */ get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(value) {\n this.toggleAttribute(\"selected\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */ get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(value) {\n this.toggleAttribute(\"closable\", !!value);\n }\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n evt.stopPropagation();\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: {\n tabId: this.id\n }\n }));\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n static defineCustomElement(elementName = \"a-tab\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $4b127c96b8d62b28$export$3e41faf802a29e71);\n }\n}\n$4b127c96b8d62b28$export$3e41faf802a29e71.defineCustomElement();\n\n\n// @ts-check\n\nlet $17a63ddf0f11756d$var$panelCounter = 0;\nconst $17a63ddf0f11756d$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\nconst $17a63ddf0f11756d$var$template = document.createElement(\"template\");\n$17a63ddf0f11756d$var$template.innerHTML = /* html */ `\n \n\n
        \n \n
        \n`;\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */ class $17a63ddf0f11756d$export$3d96ec278d3efce4 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($17a63ddf0f11756d$var$template.content.cloneNode(true));\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.setAttribute(\"slot\", \"panel\");\n this.setAttribute(\"role\", \"tabpanel\");\n this.setAttribute(\"hidden\", \"\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"panel\", (++$17a63ddf0f11756d$var$panelCounter).toString());\n }\n static defineCustomElement(elementName = \"a-tab-panel\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $17a63ddf0f11756d$export$3d96ec278d3efce4);\n }\n}\n$17a63ddf0f11756d$export$3d96ec278d3efce4.defineCustomElement();\n\n\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */ const $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE = 200;\n/**\n * The available placements for the tabs.\n */ const $6ed9897cfe6c2018$var$PLACEMENT = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n};\n/**\n * The valid placements for the tabs.\n */ const $6ed9897cfe6c2018$var$validPlacements = Object.entries($6ed9897cfe6c2018$var$PLACEMENT).map(([, value])=>value);\n/**\n * The available activation modes for the tabs.\n */ const $6ed9897cfe6c2018$var$ACTIVATION = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n};\n/**\n * Defines key codes to help with handling keyboard events.\n */ const $6ed9897cfe6c2018$var$KEYCODE = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n};\nconst $6ed9897cfe6c2018$var$styles = /* css */ `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\nconst $6ed9897cfe6c2018$var$template = document.createElement(\"template\");\n$6ed9897cfe6c2018$var$template.innerHTML = /* html */ `\n \n\n
        \n
        \n \n\n
        \n \n
        \n\n \n
        \n\n
        \n \n
        \n
        \n`;\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */ class $6ed9897cfe6c2018$export$85fd4ed3b8ca1010 extends HTMLElement {\n /** @type {Nullable} */ #resizeObserver = null;\n /** @type {Nullable} */ #rafId = null;\n /** @type {boolean} */ #hasTabSlotChangedOnce = false;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($6ed9897cfe6c2018$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"placement\" && oldValue !== newValue) this.#syncNav();\n if (name === \"no-scroll-controls\" && oldValue !== newValue) this.#syncNav();\n }\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */ get placement() {\n return this.getAttribute(\"placement\") || $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n }\n set placement(value) {\n if (value != null) this.setAttribute(\"placement\", value);\n }\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */ get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(value) {\n this.toggleAttribute(\"no-scroll-controls\", !!value);\n }\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */ get scrollDistance() {\n const value = Number(this.getAttribute(\"scroll-distance\"));\n return Math.abs(value) || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE;\n }\n set scrollDistance(value) {\n this.setAttribute(\"scroll-distance\", Math.abs(value).toString() || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE.toString());\n }\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */ get activation() {\n return this.getAttribute(\"activation\") || $6ed9897cfe6c2018$var$ACTIVATION.AUTO;\n }\n set activation(value) {\n this.setAttribute(\"activation\", value || $6ed9897cfe6c2018$var$ACTIVATION.AUTO);\n }\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */ get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(value) {\n this.toggleAttribute(\"no-tab-cycling\", !!value);\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"placement\");\n this.#upgradeProperty(\"noScrollControls\");\n this.#upgradeProperty(\"scrollDistance\");\n this.#upgradeProperty(\"activation\");\n this.#upgradeProperty(\"noTabCycling\");\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.addEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.addEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.addEventListener(\"click\", this.#handleScrollButtonClick));\n this.addEventListener(\"a-tab-close\", this.#handleTabClose);\n if (\"ResizeObserver\" in window) this.#resizeObserver = new ResizeObserver((entries)=>{\n this.#rafId = window.requestAnimationFrame(()=>{\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach((el)=>el.toggleAttribute(\"hidden\", !isElementScrollable));\n navContainer?.part.toggle(\"nav--has-scroll-controls\", isElementScrollable);\n navContainer?.classList.toggle(\"tab-group__nav--has-scroll-controls\", isElementScrollable);\n });\n });\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.removeEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.removeEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.removeEventListener(\"click\", this.#handleScrollButtonClick));\n this.removeEventListener(\"a-tab-close\", this.#handleTabClose);\n this.#stopResizeObserver();\n }\n /**\n * Starts observing the tabs container for resize events.\n */ #startResizeObserver() {\n if (!this.#resizeObserver) return;\n const scrollElement = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n /**\n * Stops observing the tabs container for resize events.\n */ #stopResizeObserver() {\n if (!this.#resizeObserver) return;\n this.#resizeObserver.disconnect();\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */ #getDirection() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n /**\n * Hides the tab group if there are no tabs.\n */ #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */ #linkPanels() {\n const tabs = this.#allTabs();\n this.#hideEmptyTabGroup();\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach((tab)=>{\n const panel = tab.nextElementSibling;\n if (!panel || panel.tagName.toLowerCase() !== \"a-tab-panel\") return console.error(`Tab #${tab.id} is not a sibling of a `);\n tab.setAttribute(\"aria-controls\", panel.id);\n panel.setAttribute(\"aria-labelledby\", tab.id);\n });\n }\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */ #allPanels() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */ #allTabs() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */ #panelForTab(tab) {\n const panelId = tab.getAttribute(\"aria-controls\");\n return this.querySelector(`#${panelId}`);\n }\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */ #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find((tab)=>!tab.disabled) || null;\n }\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */ #lastTab() {\n const tabs = this.#allTabs();\n for(let i = tabs.length - 1; i >= 0; i--){\n if (!tabs[i].disabled) return tabs[i];\n }\n return null;\n }\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */ #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) - 1 : tabs.findIndex((tab)=>tab.selected) - 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[(newIdx + tabs.length) % tabs.length].disabled)newIdx--;\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) return null;\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */ #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) + 1 : tabs.findIndex((tab)=>tab.selected) + 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[newIdx % tabs.length].disabled)newIdx++;\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) return null;\n return tabs[newIdx % tabs.length];\n }\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */ #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n tabs.forEach((tab)=>tab.selected = false);\n panels.forEach((panel)=>panel.hidden = true);\n }\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */ #syncNav() {\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n /** @type {HTMLButtonElement[]} */ const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n if (this.noScrollControls || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.START || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = true);\n navContainer?.part.remove(\"nav--has-scroll-controls\");\n navContainer?.classList.remove(\"tab-group__nav--has-scroll-controls\");\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = false);\n }\n }\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */ #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find((tab)=>tab.selected && !tab.disabled) || tabs.find((tab)=>!tab.disabled);\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n this.#setSelectedTab(tab);\n }\n }\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */ #setSelectedTab(tab) {\n this.#reset();\n if (tab) tab.selected = true;\n const panel = this.#panelForTab(tab);\n if (panel) panel.hidden = false;\n }\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */ #handleSlotChange = (evt)=>{\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n if (evt.target.name === \"tab\") this.#hasTabSlotChangedOnce = true;\n };\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */ #handleKeyDown = (evt)=>{\n if (evt.target.tagName.toLowerCase() !== \"a-tab\" // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) return;\n const placement = $6ed9897cfe6c2018$var$validPlacements.includes(this.placement || \"\") ? this.placement : $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n const orientation = [\n $6ed9897cfe6c2018$var$PLACEMENT.TOP,\n $6ed9897cfe6c2018$var$PLACEMENT.BOTTOM\n ].includes(placement || \"\") ? \"horizontal\" : \"vertical\";\n const direction = this.#getDirection();\n let tab = null;\n switch(evt.key){\n case $6ed9897cfe6c2018$var$KEYCODE.LEFT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#prevTab() : this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.RIGHT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#nextTab() : this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.UP:\n if (orientation === \"vertical\") {\n tab = this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.DOWN:\n if (orientation === \"vertical\") {\n tab = this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.END:\n tab = this.#lastTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.ENTER:\n case $6ed9897cfe6c2018$var$KEYCODE.SPACE:\n tab = evt.target;\n if (tab) this.selectTab(tab);\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */ #handleTabClick = (evt)=>{\n const tab = evt.target.closest(\"a-tab\");\n if (tab) this.selectTab(tab);\n };\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */ #handleScrollButtonClick = (evt)=>{\n const scrollButton = evt.target.closest(\".tab-group__scroll-button\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!scrollButton || !tabsContainer) return;\n const sign = scrollButton.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */ #handleTabClose = (evt)=>{\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n if (tab) {\n tab.remove();\n tab.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n if (panel && panel.tagName.toLowerCase() === \"a-tab-panel\") panel.remove();\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */ selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */ selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find((tab)=>tab.id === id);\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */ selectTab(tab) {\n const oldTab = this.#allTabs().find((t)=>t.selected);\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== \"a-tab\") return;\n this.#setSelectedTab(tab);\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(()=>{\n tab.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n });\n tab.focus();\n });\n if (oldTab) this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: oldTab.id\n }\n }));\n this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n static defineCustomElement(elementName = \"a-tab-group\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $6ed9897cfe6c2018$export$85fd4ed3b8ca1010);\n }\n}\n$6ed9897cfe6c2018$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nexport {$6ed9897cfe6c2018$export$85fd4ed3b8ca1010 as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/** @typedef {import('./a-tab').Tab} Tab */\n/** @typedef {import('./a-tab-panel').TabPanel} TabPanel */\n\nimport './a-tab.js';\nimport './a-tab-panel.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */\nconst DEFAULT_SCROLL_DISTANCE = 200;\n\n/**\n * The available placements for the tabs.\n */\nconst PLACEMENT = {\n TOP: 'top',\n BOTTOM: 'bottom',\n START: 'start',\n END: 'end'\n};\n\n/**\n * The valid placements for the tabs.\n */\nconst validPlacements = Object.entries(PLACEMENT).map(([, value]) => value);\n\n/**\n * The available activation modes for the tabs.\n */\nconst ACTIVATION = {\n AUTO: 'auto',\n MANUAL: 'manual'\n};\n\n/**\n * Defines key codes to help with handling keyboard events.\n */\nconst KEYCODE = {\n DOWN: 'ArrowDown',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n HOME: 'Home',\n END: 'End',\n ENTER: 'Enter',\n SPACE: ' '\n};\n\nconst styles = /* css */`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
        \n
        \n \n\n
        \n \n
        \n\n \n
        \n\n
        \n \n
        \n
        \n`;\n\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */\nclass TabGroup extends HTMLElement {\n /** @type {Nullable} */\n #resizeObserver = null;\n\n /** @type {Nullable} */\n #rafId = null;\n\n /** @type {boolean} */\n #hasTabSlotChangedOnce = false;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['placement', 'no-scroll-controls'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'placement' && oldValue !== newValue) {\n this.#syncNav();\n }\n\n if (name === 'no-scroll-controls' && oldValue !== newValue) {\n this.#syncNav();\n }\n }\n\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || PLACEMENT.TOP;\n }\n\n set placement(value) {\n if (value != null) {\n this.setAttribute('placement', value);\n }\n }\n\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */\n get noScrollControls() {\n return this.hasAttribute('no-scroll-controls');\n }\n\n set noScrollControls(value) {\n this.toggleAttribute('no-scroll-controls', !!value);\n }\n\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */\n get scrollDistance() {\n const value = Number(this.getAttribute('scroll-distance'));\n return Math.abs(value) || DEFAULT_SCROLL_DISTANCE;\n }\n\n set scrollDistance(value) {\n this.setAttribute('scroll-distance', Math.abs(value).toString() || DEFAULT_SCROLL_DISTANCE.toString());\n }\n\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */\n get activation() {\n return this.getAttribute('activation') || ACTIVATION.AUTO;\n }\n\n set activation(value) {\n this.setAttribute('activation', value || ACTIVATION.AUTO);\n }\n\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */\n get noTabCycling() {\n return this.hasAttribute('no-tab-cycling');\n }\n\n set noTabCycling(value) {\n this.toggleAttribute('no-tab-cycling', !!value);\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('placement');\n this.#upgradeProperty('noScrollControls');\n this.#upgradeProperty('scrollDistance');\n this.#upgradeProperty('activation');\n this.#upgradeProperty('noTabCycling');\n\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.addEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.addEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.addEventListener('click', this.#handleTabClick);\n tabsContainer?.addEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.addEventListener('click', this.#handleScrollButtonClick));\n this.addEventListener('a-tab-close', this.#handleTabClose);\n\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(entries => {\n this.#rafId = window.requestAnimationFrame(() => {\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach(el => el.toggleAttribute('hidden', !isElementScrollable));\n navContainer?.part.toggle('nav--has-scroll-controls', isElementScrollable);\n navContainer?.classList.toggle('tab-group__nav--has-scroll-controls', isElementScrollable);\n });\n });\n }\n\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.removeEventListener('click', this.#handleTabClick);\n tabsContainer?.removeEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.removeEventListener('click', this.#handleScrollButtonClick));\n this.removeEventListener('a-tab-close', this.#handleTabClose);\n this.#stopResizeObserver();\n }\n\n /**\n * Starts observing the tabs container for resize events.\n */\n #startResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n const scrollElement = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n\n /**\n * Stops observing the tabs container for resize events.\n */\n #stopResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n this.#resizeObserver.disconnect();\n\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */\n #getDirection() {\n return getComputedStyle(this).direction || 'ltr';\n }\n\n /**\n * Hides the tab group if there are no tabs.\n */\n #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */\n #linkPanels() {\n const tabs = this.#allTabs();\n\n this.#hideEmptyTabGroup();\n\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach(tab => {\n const panel = tab.nextElementSibling;\n\n if (!panel || panel.tagName.toLowerCase() !== 'a-tab-panel') {\n return console.error(`Tab #${tab.id} is not a sibling of a `);\n }\n\n tab.setAttribute('aria-controls', panel.id);\n panel.setAttribute('aria-labelledby', tab.id);\n });\n }\n\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */\n #allPanels() {\n return Array.from(this.querySelectorAll('a-tab-panel'));\n }\n\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */\n #allTabs() {\n return Array.from(this.querySelectorAll('a-tab'));\n }\n\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */\n #panelForTab(tab) {\n const panelId = tab.getAttribute('aria-controls');\n return this.querySelector(`#${panelId}`);\n }\n\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */\n #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find(tab => !tab.disabled) || null;\n }\n\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */\n #lastTab() {\n const tabs = this.#allTabs();\n\n for (let i = tabs.length - 1; i >= 0; i--) {\n if (!tabs[i].disabled) {\n return tabs[i];\n }\n }\n\n return null;\n }\n\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */\n #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) - 1\n : tabs.findIndex(tab => tab.selected) - 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[(newIdx + tabs.length) % tabs.length].disabled) {\n newIdx--;\n }\n\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) {\n return null;\n }\n\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */\n #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) + 1\n : tabs.findIndex(tab => tab.selected) + 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[newIdx % tabs.length].disabled) {\n newIdx++;\n }\n\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) {\n return null;\n }\n\n return tabs[newIdx % tabs.length];\n }\n\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */\n #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n\n tabs.forEach(tab => tab.selected = false);\n panels.forEach(panel => panel.hidden = true);\n }\n\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */\n #syncNav() {\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n\n /** @type {HTMLButtonElement[]} */\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n if (this.noScrollControls || this.placement === PLACEMENT.START || this.placement === PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach(el => el.hidden = true);\n navContainer?.part.remove('nav--has-scroll-controls');\n navContainer?.classList.remove('tab-group__nav--has-scroll-controls');\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach(el => el.hidden = false);\n }\n }\n\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */\n #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find(tab => tab.selected && !tab.disabled) || tabs.find(tab => !tab.disabled);\n\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) {\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n this.#setSelectedTab(tab);\n }\n }\n\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n #setSelectedTab(tab) {\n this.#reset();\n\n if (tab) {\n tab.selected = true;\n }\n\n const panel = this.#panelForTab(tab);\n\n if (panel) {\n panel.hidden = false;\n }\n }\n\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */\n #handleSlotChange = evt => {\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n\n if (evt.target.name === 'tab') {\n this.#hasTabSlotChangedOnce = true;\n }\n };\n\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */\n #handleKeyDown = evt => {\n if (\n evt.target.tagName.toLowerCase() !== 'a-tab' // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) {\n return;\n }\n\n const placement = validPlacements.includes(this.placement || '') ? this.placement : PLACEMENT.TOP;\n const orientation = [PLACEMENT.TOP, PLACEMENT.BOTTOM].includes(placement || '') ? 'horizontal' : 'vertical';\n const direction = this.#getDirection();\n let tab = null;\n\n switch (evt.key) {\n case KEYCODE.LEFT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#prevTab() : this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.RIGHT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#nextTab() : this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.UP:\n if (orientation === 'vertical') {\n tab = this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.DOWN:\n if (orientation === 'vertical') {\n tab = this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.END:\n tab = this.#lastTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.ENTER:\n case KEYCODE.SPACE:\n tab = evt.target;\n if (tab) {\n this.selectTab(tab);\n }\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClick = evt => {\n const tab = evt.target.closest('a-tab');\n\n if (tab) {\n this.selectTab(tab);\n }\n };\n\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleScrollButtonClick = evt => {\n const scrollButton = evt.target.closest('.tab-group__scroll-button');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (!scrollButton || !tabsContainer) {\n return;\n }\n\n const sign = scrollButton.classList.contains('tab-group__scroll-button--start') ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClose = evt => {\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n\n if (tab) {\n tab.remove();\n\n tab.selected && this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n if (panel && panel.tagName.toLowerCase() === 'a-tab-panel') {\n panel.remove();\n }\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */\n selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */\n selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find(tab => tab.id === id);\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n selectTab(tab) {\n const oldTab = this.#allTabs().find(t => t.selected);\n\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== 'a-tab') {\n return;\n }\n\n this.#setSelectedTab(tab);\n\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(() => {\n tab.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n tab.focus();\n });\n\n if (oldTab) {\n this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: oldTab.id }\n }));\n }\n\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n static defineCustomElement(elementName = 'a-tab-group') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabGroup);\n }\n }\n}\n\nTabGroup.defineCustomElement();\n\nexport { TabGroup };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\nlet tabCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
        \n \n
        \n`;\n\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */\nclass Tab extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['selected', 'disabled', 'closable'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'selected' && oldValue !== newValue) {\n this.setAttribute('aria-selected', this.selected.toString());\n }\n\n if (name === 'disabled' && oldValue !== newValue) {\n this.setAttribute('aria-disabled', this.disabled.toString());\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n if (name === 'closable' && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement('span');\n closeButton.className = 'tab__close';\n closeButton.setAttribute('part', 'close-tab');\n closeButton.innerHTML = /* html */``;\n this.shadowRoot?.querySelector('.tab')?.appendChild(closeButton);\n closeButton.addEventListener('click', this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('selected');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('closable');\n\n if (!this.id) {\n this.id = uid('tab', (++tabCounter).toString());\n }\n\n this.setAttribute('slot', 'tab');\n this.setAttribute('role', 'tab');\n this.setAttribute('aria-selected', 'false');\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n }\n\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */\n get selected() {\n return this.hasAttribute('selected');\n }\n\n set selected(value) {\n this.toggleAttribute('selected', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */\n get closable() {\n return this.hasAttribute('closable');\n }\n\n set closable(value) {\n this.toggleAttribute('closable', !!value);\n }\n\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n evt.stopPropagation();\n\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: { tabId: this.id }\n }));\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n static defineCustomElement(elementName = 'a-tab') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, Tab);\n }\n }\n}\n\nTab.defineCustomElement();\n\nexport { Tab };\n","// @ts-check\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","// @ts-check\n\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */\nconst upgradeProperty = (prop, instance) => {\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\nexport { upgradeProperty };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\n\nlet panelCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
        \n \n
        \n`;\n\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */\nclass TabPanel extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.setAttribute('slot', 'panel');\n this.setAttribute('role', 'tabpanel');\n this.setAttribute('hidden', '');\n\n if (!this.id) {\n this.id = uid('panel', (++panelCounter).toString());\n }\n }\n\n static defineCustomElement(elementName = 'a-tab-panel') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabPanel);\n }\n }\n}\n\nTabPanel.defineCustomElement();\n\nexport { TabPanel };\n","Object.defineProperty({},\"ModalElement\",{get:function(){return o},set:void 0,enumerable:!0,configurable:!0});let e=document.createElement(\"template\"),t=/* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;e.innerHTML=/* html */`\n \n\n \n
        \n
        \n \n\n
        \n \n
        \n
        \n\n \n\n
        \n \n
        \n
        \n
        \n`;/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */class o extends HTMLElement{/** @type {Nullable} */#e=null;/** @type {Nullable} */#t=null;/** @type {ReturnType | undefined} */#o=void 0;constructor(){if(super(),!this.shadowRoot){let t=this.attachShadow({mode:\"open\"});t.appendChild(e.content.cloneNode(!0))}this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#t=this.shadowRoot.querySelector('slot[name=\"footer\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\"]}/**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */attributeChangedCallback(e,t,o){if(null!==this.#e){if(\"open\"===e&&t!==o&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"hidden\")):this.#e.close()),\"no-header\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__header\");null!==e&&(e.hidden=this.noHeader)}if(\"no-animations\"===e&&t!==o&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),\"no-close-button\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__close\");null!==e&&(e.hidden=this.noCloseButton)}}}/**\n * Lifecycle method that is called when the element is added to the DOM.\n */connectedCallback(){this.#i(\"open\"),this.#i(\"staticBackdrop\"),this.#i(\"noHeader\"),this.#i(\"noAnimations\"),this.#i(\"noCloseButton\"),this.#i(\"fullscreen\"),this.#i(\"preserveOverflow\"),this.#e?.addEventListener(\"click\",this.#a),this.#e?.addEventListener(\"close\",this.#l),this.#e?.addEventListener(\"cancel\",this.#r),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#s),this.#t?.addEventListener(\"slotchange\",this.#n)}/**\n * Lifecycle method that is called when the element is removed from the DOM.\n */disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#e?.addEventListener(\"click\",this.#a),this.#e?.removeEventListener(\"close\",this.#l),this.#e?.removeEventListener(\"cancel\",this.#r),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#s),this.#t?.removeEventListener(\"slotchange\",this.#n)}/**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */get open(){return this.hasAttribute(\"open\")}set open(e){this.toggleAttribute(\"open\",!!e)}/**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){this.toggleAttribute(\"static-backdrop\",!!e)}/**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){this.toggleAttribute(\"no-header\",!!e)}/**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){this.toggleAttribute(\"no-animations\",!!e)}/**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){this.toggleAttribute(\"no-close-button\",!!e)}/**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){this.toggleAttribute(\"fullscreen\",!!e)}/**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */get preserveOverflow(){return this.hasAttribute(\"preserve-overflow\")}set preserveOverflow(e){this.toggleAttribute(\"preserve-overflow\",!!e)}/**\n * Applies a pulse effect on the dialog.\n */#d(){this.#o||(this.#e?.classList.add(\"dialog--pulse\"),this.#o=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#o),this.#o=void 0},300))}/**\n * Handles the close event of the dialog.\n */#l=()=>{// This is required because the dialog element does not reset\n// the open property when the dialog is closed by the user.\nthis.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"\")};/**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */#r=e=>{let t=this.#c(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */#s=e=>{let t=this.#c(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */#a=e=>{if(e.target!==e.currentTarget)return;let t=this.#c(\"backdrop-click\");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#e?.close()};/**\n * Handles the slotchange event of the footer slot.\n */#n=()=>{if(null===this.#e)return;/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__footer\");if(null===e)return;let t=this.#t?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};/**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */#c(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow'} prop - The property to upgrade.\n */#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}/**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */show(){this.open||(this.open=!0)}/**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */hide(){this.open&&(this.open=!1)}/**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */static defineCustomElement(e=\"modal-element\"){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,o)}}o.defineCustomElement();export{o as ModalElement};//# sourceMappingURL=modal-element-defined.js.map\n\n//# sourceMappingURL=modal-element-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $180b6dcf923bafc7$exports = {};\n\n$parcel$export($180b6dcf923bafc7$exports, \"ModalElement\", function () { return $180b6dcf923bafc7$export$32589115725b904b; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ const $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION = 300;\nconst $180b6dcf923bafc7$var$template = document.createElement(\"template\");\nconst $180b6dcf923bafc7$var$styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${$180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$180b6dcf923bafc7$var$template.innerHTML = /* html */ `\n \n\n \n
        \n
        \n \n\n
        \n \n
        \n
        \n\n \n\n
        \n \n
        \n
        \n
        \n`;\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ class $180b6dcf923bafc7$export$32589115725b904b extends HTMLElement {\n /** @type {Nullable} */ #dialogEl = null;\n /** @type {Nullable} */ #footerSlotEl = null;\n /** @type {ReturnType | undefined} */ #pulseAnimationTimeout = void 0;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($180b6dcf923bafc7$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector(\"dialog\");\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) return;\n if (name === \"open\" && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"hidden\";\n } else this.#dialogEl.close();\n }\n if (name === \"no-header\" && oldValue !== newValue) {\n /** @type {Nullable} */ const headerEl = this.#dialogEl.querySelector(\".dialog__header\");\n if (headerEl !== null) headerEl.hidden = this.noHeader;\n }\n if (name === \"no-animations\" && oldValue !== newValue) this.#dialogEl.classList.toggle(\"dialog--no-animations\", this.noAnimations);\n if (name === \"no-close-button\" && oldValue !== newValue) {\n /** @type {Nullable} */ const closeBtnEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeBtnEl !== null) closeBtnEl.hidden = this.noCloseButton;\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"open\");\n this.#upgradeProperty(\"staticBackdrop\");\n this.#upgradeProperty(\"noHeader\");\n this.#upgradeProperty(\"noAnimations\");\n this.#upgradeProperty(\"noCloseButton\");\n this.#upgradeProperty(\"fullscreen\");\n this.#upgradeProperty(\"preserveOverflow\");\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.addEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.addEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.removeEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.removeEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */ get open() {\n return this.hasAttribute(\"open\");\n }\n set open(value) {\n this.toggleAttribute(\"open\", !!value);\n }\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */ get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(value) {\n this.toggleAttribute(\"static-backdrop\", !!value);\n }\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */ get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(value) {\n this.toggleAttribute(\"no-header\", !!value);\n }\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */ get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(value) {\n this.toggleAttribute(\"no-animations\", !!value);\n }\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */ get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(value) {\n this.toggleAttribute(\"no-close-button\", !!value);\n }\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */ get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(value) {\n this.toggleAttribute(\"fullscreen\", !!value);\n }\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */ get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(value) {\n this.toggleAttribute(\"preserve-overflow\", !!value);\n }\n /**\n * Applies a pulse effect on the dialog.\n */ #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) return;\n this.#dialogEl?.classList.add(\"dialog--pulse\");\n this.#pulseAnimationTimeout = setTimeout(()=>{\n this.#dialogEl?.classList.remove(\"dialog--pulse\");\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION);\n }\n /**\n * Handles the close event of the dialog.\n */ #handleDialogClose = ()=>{\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"\";\n };\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */ #handleDialogCancel = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"escape-key\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"close-button\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */ #handleDialogClick = (evt)=>{\n if (evt.target !== evt.currentTarget) return;\n const requestCloseEvent = this.#createRequestCloseEvent(\"backdrop-click\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n this.#dialogEl?.close();\n };\n /**\n * Handles the slotchange event of the footer slot.\n */ #handleFooterSlotChange = ()=>{\n if (this.#dialogEl === null) return;\n /** @type {Nullable} */ const footerEl = this.#dialogEl.querySelector(\".dialog__footer\");\n if (footerEl === null) return;\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n footerEl.hidden = !hasFooterSlotNodes;\n };\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */ #createRequestCloseEvent(reason) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason: reason,\n element: this\n }\n });\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */ show() {\n if (this.open) return;\n this.open = true;\n }\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */ hide() {\n if (!this.open) return;\n this.open = false;\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */ static defineCustomElement(elementName = \"modal-element\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $180b6dcf923bafc7$export$32589115725b904b);\n }\n}\n\n\n(0, $180b6dcf923bafc7$export$32589115725b904b).defineCustomElement();\n\n\nexport {$180b6dcf923bafc7$export$32589115725b904b as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nconst PULSE_ANIMATION_DURATION = 300;\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n
        \n
        \n \n\n
        \n \n
        \n
        \n\n \n\n
        \n \n
        \n
        \n
        \n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = 'hidden';\n }\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n this.#upgradeProperty('preserveOverflow');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n this.toggleAttribute('open', !!value);\n }\n\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n this.toggleAttribute('static-backdrop', !!value);\n }\n\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n this.toggleAttribute('no-header', !!value);\n }\n\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n this.toggleAttribute('no-animations', !!value);\n }\n\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n this.toggleAttribute('no-close-button', !!value);\n }\n\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n this.toggleAttribute('fullscreen', !!value);\n }\n\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */\n get preserveOverflow() {\n return this.hasAttribute('preserve-overflow');\n }\n\n set preserveOverflow(value) {\n this.toggleAttribute('preserve-overflow', !!value);\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = '';\n }\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n if (evt.target !== evt.currentTarget) {\n return;\n }\n\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n\n this.#dialogEl?.close();\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","(function () {\n 'use strict';\n\n if (typeof document === 'undefined' || 'adoptedStyleSheets' in document) { return; }\n\n var hasShadyCss = 'ShadyCSS' in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument('');\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === 'object' ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, '');\n if (_contents !== contents) {\n console.warn('@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418');\n }\n return _contents.trim();\n }\n function isElementConnected(element) {\n return 'isConnected' in element\n ? element.isConnected\n : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function (value, index) { return arr.indexOf(value) === index; });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function (value) { return arr2.indexOf(value) === -1; });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n\n var cssStyleSheetMethods = [\n 'addRule',\n 'deleteRule',\n 'insertRule',\n 'removeRule',\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function () {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function () {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? proto$1.isPrototypeOf(instance) ||\n nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement('style');\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function (_location) { return _location !== location; }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function () {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods\n .get(sheet)\n .forEach(function (command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) {\n throw new TypeError('Illegal invocation');\n }\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement('style');\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n }\n catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === 'string') {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function (location) {\n if (location.isConnected()) {\n restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n }\n });\n }\n };\n defineProperty(proto$1, 'cssRules', {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n },\n });\n defineProperty(proto$1, 'media', {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n },\n });\n cssStyleSheetMethods.forEach(function (method) {\n proto$1[method] = function () {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({ method: method, args: args });\n $locations.get(self).forEach(function (location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance,\n });\n\n var defaultObserverOptions = {\n childList: true,\n subtree: true,\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, 'adoptedStyleSheets', {\n configurable: true,\n enumerable: true,\n get: function () {\n return getAssociatedLocation(this).sheets;\n },\n set: function (sheets) {\n getAssociatedLocation(this).update(sheets);\n },\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function (foundNode) {\n return getShadowRoot(foundNode)\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_REJECT;\n },\n null, false);\n for (var next = void 0; (next = iter.nextNode());) {\n callback(getShadowRoot(next));\n }\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return (element instanceof HTMLStyleElement &&\n $uniqueSheets.get(self).some(function (sheet) { return getAdopterByLocation(sheet, self); }));\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function (sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function (sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function (mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function (mutation) {\n if (!hasShadyCss) {\n forEach.call(mutation.addedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).connect();\n });\n });\n }\n forEach.call(mutation.removedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n if (isExistingAdopter(self, node)) {\n adopt(self);\n }\n if (!hasShadyCss) {\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).disconnect();\n });\n }\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function () {\n var element = $element.get(this);\n return element instanceof Document\n ? element.readyState !== 'loading'\n : isElementConnected(element.host);\n },\n connect: function () {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) {\n adopt(this);\n }\n traverseWebComponents(container, function (root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function () {\n $observer.get(this).disconnect();\n },\n update: function (sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? 'Document' : 'ShadowRoot';\n if (!Array.isArray(sheets)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n }\n if (!sheets.every(isCSSStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n }\n if (sheets.some(isNonConstructedStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n }\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function (sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) {\n adopt(self);\n }\n },\n };\n\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if ('ShadowRoot' in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === 'closed') {\n closedShadowRootRegistry.set(this, root);\n }\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) {\n documentLocation.connect();\n }\n else {\n document.addEventListener('DOMContentLoaded', documentLocation.connect.bind(documentLocation));\n }\n\n}());\n","import * as bootstrapStyleSheet from 'url:bootstrap/dist/css/bootstrap.css';\nimport * as mainStyleSheet from 'url:../../../src/css/main.css';\n\nconst styleURLs = [bootstrapStyleSheet, mainStyleSheet];\n\nconst styleSheets = [];\n\nfor (let i = 0; i < styleURLs.length; i += 1) {\n styleSheets.push(new CSSStyleSheet());\n}\n\n(async function () {\n const styles = await Promise.all(styleURLs.map(async styleURL => {\n const res = await fetch(styleURL);\n return res.text();\n }));\n\n for (let i = 0; i < styles.length; i += 1) {\n await styleSheets[i].replace(styles[i]);\n }\n\n document.body.style.visibility = 'visible';\n}());\n\nexport { styleSheets };\n","module.exports = new __parcel__URL__(\"bootstrap.33ff2998.css\").toString();","module.exports = new __parcel__URL__(\"main.2238cf96.css\").toString();","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
        \n
        \n \n
        \n
        \n \n
        \n
        \n`;\n\nclass AddFeed extends HTMLElement {\n #formEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n\n connectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n disconnectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n\n const input = evt.target['feed-url'];\n const url = input.value.trim();\n const { value: feeds = [] } = await getFeeds();\n const urlExists = Boolean(feeds.find(feed => feed.url === url));\n const isValidURL = canParseURL(url);\n\n if (!urlExists && isValidURL) {\n await saveFeed({\n url,\n title: '' // Title is not available at this point; it will be fetched later.\n });\n }\n\n input.value = '';\n }\n}\n\nif (!window.customElements.get('add-feed')) {\n window.customElements.define('add-feed', AddFeed);\n}\n","import { set, get, del } from 'idb-keyval';\n\nconst STORAGE_PREFIX = 'rss-reader/';\nconst STORAGE_FEEDS_KEY = STORAGE_PREFIX + 'feeds';\n\nconst getItem = async key => {\n try {\n return {\n value: await get(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error\n };\n }\n};\n\nconst setItem = async (key, data) => {\n try {\n await set(key, data);\n\n return {\n error: void 0\n };\n } catch (error) {\n return { error };\n }\n};\n\nexport const getFeeds = async () => {\n return getItem(STORAGE_FEEDS_KEY);\n};\n\nexport const setFeeds = async (feeds, shouldDispatchEvent = true) => {\n if (!Array.isArray(feeds)) {\n return;\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'set',\n feeds\n }\n }));\n }\n\n return { error };\n};\n\nexport const saveFeed = async (feed, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const foundFeed = feeds.find(f => f.url === feed.url);\n let action = '';\n\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = 'update';\n } else {\n feeds.push(feed);\n action = 'create';\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action,\n feed\n }\n }));\n }\n\n return { error };\n};\n\nexport const deleteFeed = async (feedUrl, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const filteredFeeds = feeds.filter(f => f.url !== feedUrl);\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, filteredFeeds);\n\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) {\n await del(STORAGE_FEEDS_KEY);\n }\n\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'delete',\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n\n return { error };\n};\n","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction promisifyRequest(request) {\n return new Promise(function (resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function () {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n\n\n request.onabort = request.onerror = function () {\n return reject(request.error);\n };\n });\n}\n\nfunction createStore(dbName, storeName) {\n var request = indexedDB.open(dbName);\n\n request.onupgradeneeded = function () {\n return request.result.createObjectStore(storeName);\n };\n\n var dbp = promisifyRequest(request);\n return function (txMode, callback) {\n return dbp.then(function (db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\n\nvar defaultGetStoreFunc;\n\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction get(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return promisifyRequest(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction set(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction setMany(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n entries.forEach(function (entry) {\n return store.put(entry[1], entry[0]);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction getMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return Promise.all(keys.map(function (key) {\n return promisifyRequest(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction update(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n return (// Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function (resolve, reject) {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n })\n );\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction del(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction delMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n keys.forEach(function (key) {\n return store.delete(key);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction clear() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\n\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction keys() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.key);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction values() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.value);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction entries() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([promisifyRequest(store.getAllKeys()), promisifyRequest(store.getAll())]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n keys = _ref2[0],\n values = _ref2[1];\n\n return keys.map(function (key, i) {\n return [key, values[i]];\n });\n });\n }\n\n var items = [];\n return customStore('readonly', function (store) {\n return eachCursor(store, function (cursor) {\n return items.push([cursor.key, cursor.value]);\n }).then(function () {\n return items;\n });\n });\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */\nexport const canParseURL = url => {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n","import Sortable from 'sortablejs/modular/sortable.core.esm.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, setFeeds, deleteFeed } from '../helpers/storage.js';\nimport { debounce } from '../utils/debounce.js';\nimport './import-feeds.js';\nimport './export-feeds.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
        \n
        \n
        \n \n \n \n \n \n\n \n\n \n
        \n\n
        \n \n\n \n\n \n
        \n
        \n\n
          \n
          \n\n
          \n

          \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

          \n\n

          \n \n

          \n
          \n\n \n

          Import feeds

          \n \n
          \n\n \n

          Export feeds

          \n \n
          \n`;\n\nclass FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#isEditable = false;\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#feedsContainerEl = this.shadowRoot.getElementById('feedsContainer');\n this.#feedsListEl = this.shadowRoot.getElementById('feedsList');\n this.#editBtn = this.shadowRoot.getElementById('editBtn');\n this.#importBtn = this.shadowRoot.getElementById('importBtn');\n this.#importAltBtn = this.shadowRoot.getElementById('importAltBtn');\n this.#exportBtn = this.shadowRoot.getElementById('exportBtn');\n this.#searchInput = this.shadowRoot.getElementById('searchInput');\n this.#searchClearBtn = this.shadowRoot.getElementById('searchClearBtn');\n this.#importDialog = this.shadowRoot.getElementById('importDialog');\n this.#exportDialog = this.shadowRoot.getElementById('exportDialog');\n this.#importFeedsEl = this.shadowRoot.querySelector('import-feeds');\n this.#exportFeedsEl = this.shadowRoot.querySelector('export-feeds');\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById('noFeedsDisclaimer');\n }\n\n async connectedCallback() {\n const { value: feeds = [] } = await getFeeds();\n\n feeds.forEach((feed => this.#addFeed(feed)));\n\n this.#toggleFeedsVisibility();\n\n this.#feedsListEl.addEventListener('click', this.#handleActionsClick);\n this.#editBtn.addEventListener('click', this.#handleEditRequest);\n this.#importAltBtn.addEventListener('click', this.#handleImportRequest);\n this.#importBtn.addEventListener('click', this.#handleImportRequest);\n this.#exportBtn.addEventListener('click', this.#handleExportRequest);\n this.#searchInput.addEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener('click', this.#handleSearchClear);\n this.#importDialog.addEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener('me-close', this.#handleExportDialogClose);\n this.addEventListener('feeds-imported', this.#handleFeedsImported);\n document.addEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n\n new Sortable(this.#feedsListEl, {\n animation: 150,\n handle: '.sort-handler',\n onEnd: async evt => {\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll('li'), (el) => {\n return {\n url: el.getAttribute('data-url'),\n title: el.getAttribute('data-title') || ''\n };\n });\n\n await setFeeds(feeds, false);\n }\n });\n }\n\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener('click', this.#handleActionsClick);\n this.#editBtn.removeEventListener('click', this.#handleEditRequest);\n this.#importBtn.removeEventListener('click', this.#handleImportRequest);\n this.#importAltBtn.removeEventListener('click', this.#handleImportRequest);\n this.#exportBtn.removeEventListener('click', this.#handleExportRequest);\n this.#searchInput.removeEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener('click', this.#handleSearchClear);\n this.#importDialog.removeEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener('me-close', this.#handleExportDialogClose);\n this.removeEventListener('feeds-imported', this.#handleFeedsImported);\n document.removeEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n }\n\n #searchFeeds = (searchValue = '') => {\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n\n if (feedEls.length === 0) {\n return;\n }\n\n feedEls.forEach(el => {\n const url = (el.getAttribute('data-url') || '').toLowerCase();\n const title = (el.getAttribute('data-title') || '').toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n\n #debounceSearchFeeds = debounce(this.#searchFeeds, 250);\n\n #handleSearchInputDebounced = evt => {\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle('d-none', !value);\n return this.#debounceSearchFeeds(value);\n };\n\n #handleSearchClear = () => {\n this.#searchInput.value = '';\n this.#searchInput.dispatchEvent(new Event('input'));\n };\n\n #handleEditRequest = evt => {\n this.#isEditable = !this.#isEditable;\n\n evt.currentTarget.classList.toggle('active');\n\n this.shadowRoot.querySelectorAll('.sort-handler, .delete-button').forEach(el => {\n el.hidden = !el.hidden;\n });\n };\n\n #handleImportRequest = () => {\n this.#importDialog.open = true;\n };\n\n #handleExportRequest = () => {\n this.#exportDialog.open = true;\n };\n\n #handleImportDialogOpen = () => {\n try {\n this.#importFeedsEl.shadowRoot.querySelector('a-tab-group').selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector('textarea').value = '';\n } catch {\n // Fail silently\n }\n };\n\n #handleExportDialogOpen = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeedsEl.setAttribute('feeds', JSON.stringify(feeds));\n };\n\n #handleExportDialogClose = () => {\n this.#exportFeedsEl.removeAttribute('feeds');\n };\n\n #handleFeedsImported = () => {\n this.#importDialog.open = false;\n };\n\n #handleFeedsUpdateSuccess = evt => {\n if (evt.detail.action === 'delete') {\n this.#removeFeed(evt.detail.feed);\n }\n\n if (evt.detail.action === 'create') {\n this.#addFeed(evt.detail.feed);\n\n if (this.#searchInput.value) {\n this.#searchInput.value = '';\n this.#searchFeeds('');\n }\n }\n\n if (evt.detail.action === 'update') {\n const { url, title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n\n if (feedEl) {\n const linkContent = feedEl.querySelector('.link-content');\n\n feedEl.setAttribute('data-title', title || '');\n\n if (linkContent) {\n linkContent.innerHTML = title ? `${title}
          ${url}` : url;\n }\n }\n }\n };\n\n #handleActionsClick = evt => {\n const target = evt.target;\n const deleteBtn = target.closest('button.delete-button');\n const linkEl = target.closest('a.link');\n\n if (!linkEl && !deleteBtn) {\n return;\n }\n\n const feedItem = target.closest('li');\n const feedUrl = feedItem.getAttribute('data-url');\n\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) {\n deleteFeed(feedUrl);\n }\n }\n\n if (linkEl) {\n evt.preventDefault();\n document.querySelector('feed-reader').feedUrl = feedUrl;\n }\n };\n\n #addFeed(feed) {\n const { url, title } = feed;\n\n const link = document.createElement('a');\n link.className = 'link text-decoration-none d-flex align-items-center h-100';\n link.style.flex = '1';\n link.style.minWidth = 0;\n link.style.color = 'inherit';\n link.href = url;\n\n const linkContent = document.createElement('div');\n linkContent.className = 'text-truncate link-content';\n linkContent.innerHTML = title ? `${title}
          ${url}` : url;\n\n const deleteButton = document.createElement('button');\n deleteButton.type = 'button';\n deleteButton.title = 'Delete feed';\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = 'delete-button btn btn-default text-danger p-0';\n deleteButton.style.lineHeight = '1';\n deleteButton.innerHTML = /* html */`\n \n \n \n Delete\n `;\n\n const listItem = document.createElement('li');\n listItem.className = 'list-group-item p-0 d-flex justify-content-between align-items-center';\n listItem.style.height = 'var(--list-item-height)';\n listItem.setAttribute('data-url', url || '');\n listItem.setAttribute('data-title', title || '');\n\n const sortHandler = document.createElement('div');\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = 'sort-handler text-primary';\n sortHandler.innerHTML = /* html */`\n \n \n \n Reorder\n `;\n\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n\n this.#feedsListEl.appendChild(listItem);\n\n this.#toggleFeedsVisibility();\n }\n\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await getFeeds();\n this.#feedsContainerEl.classList.toggle('d-none', feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle('d-none', feeds.length > 0);\n }\n}\n\nif (!window.customElements.get('feeds-list')) {\n window.customElements.define('feeds-list', FeedsList);\n}\n","/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = parent.parentNode);\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\nvar OnSpill = [Remove, Revert];\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nexport default Sortable;\nexport { AutoScrollPlugin as AutoScroll, MultiDragPlugin as MultiDrag, OnSpill, Sortable, SwapPlugin as Swap };\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */\nexport const debounce = (fn, wait = 0, immediate = false) => {\n let timerId = null;\n\n if (typeof fn !== 'function') {\n throw new TypeError('Expected a function for first argument');\n }\n\n return (...args) => {\n clearTimeout(timerId);\n\n if (immediate && !timerId) {\n fn(...args);\n }\n\n timerId = setTimeout(() => {\n timerId = null;\n if (!immediate) {\n fn(...args);\n }\n }, wait);\n };\n};\n","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n From file\n \n
          \n \n Drag 'n' drop a file, or click to select file to import\n
          \n (Only JSON files are allowed)\n
          \n
          \n
          \n\n From text\n \n
          \n \n \n
          \n
          \n
          \n`;\n\nclass ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#dropzoneEl = this.shadowRoot.querySelector('files-dropzone');\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n connectedCallback() {\n this.#dropzoneEl.addEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener('submit', this.#handleImportFormSubmit);\n }\n\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener('submit', this.#handleImportFormSubmit);\n }\n\n #handleFilesDropzoneDropAccepted = evt => {\n const { acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.readAsText(file, 'utf-8');\n reader.onload = this.#handleFileReaderLoad;\n };\n\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) {\n return alert('Invalid file or no feeds found.');\n }\n\n const { value: feeds = [] } = await getFeeds();\n\n for (const feed of feedsToImport) {\n const feedExists = Boolean(feeds.find(f => f.url === feed.url));\n const { url, title } = feed;\n const isValidURL = canParseURL(url);\n\n if (!feedExists && isValidURL) {\n await saveFeed({ url, title });\n }\n }\n\n this.dispatchEvent(new Event('feeds-imported', {\n bubbles: true,\n composed: true\n }));\n }\n\n #handleFileReaderLoad = async (evt) => {\n try {\n const { result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert('The file is not valid.');\n }\n };\n\n #handleImportFormSubmit = async (evt) => {\n evt.preventDefault();\n\n const formData = new FormData(evt.target);\n const data = formData.get('import-data');\n\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert('The data is not valid.');\n }\n };\n}\n\nif (!window.customElements.get('import-feeds')) {\n window.customElements.define('import-feeds', ImportFeeds);\n}\n","import { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds } from '../helpers/storage.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
          \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
          \n\n
          \n
          \n
          \n
          \n
          \n\n \n`;\n\nclass ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#exportCodeEl = this.shadowRoot.getElementById('exportCode');\n this.#clipboardCopyEl = this.shadowRoot.querySelector('clipboard-copy');\n this.#webShareEl = this.shadowRoot.querySelector('web-share');\n this.#downloadButton = this.shadowRoot.getElementById('downloadButton');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feeds'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'feeds' && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n\n connectedCallback() {\n this.#downloadButton.addEventListener('click', this.#handleDownloadButtonClick);\n }\n\n disconnectedCallback() {\n this.#downloadButton.removeEventListener('click', this.#handleDownloadButtonClick);\n }\n\n get feeds() {\n return this.getAttribute('feeds');\n }\n\n set feeds(value) {\n this.setAttribute('feeds', value);\n }\n\n #getFeedsToExportString() {\n let feedsToExport = '';\n\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n\n return feedsToExport;\n }\n\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([data], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n #handleDownloadButtonClick = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeeds(feeds);\n };\n}\n\nif (!window.customElements.get('export-feeds')) {\n window.customElements.define('export-feeds', ExportFeeds);\n}\n","function a(a){return null!==a&&\"object\"==typeof a?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{a as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","import { styleSheets } from '../helpers/styles.js';\nimport { fetchFeed } from '../helpers/fetch-feeds.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\n\nlet controller;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n

          \n\n

          \n\n
          \n
          \n \n Please wait...\n
          \n\n
          \n \n \n \n There was an error while fetching the feed.\n
          \n\n
          \n
          \n
          \n`;\n\nclass FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#spinnerEl = this.shadowRoot.getElementById('spinner');\n this.#dialogEl = this.shadowRoot.querySelector('modal-element');\n this.#modalTitle = this.#dialogEl.querySelector('#feedTitle');\n this.#feedsViewer = this.shadowRoot.getElementById('feedsViewer');\n this.#errorEl = this.shadowRoot.getElementById('error');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feed-url'];\n }\n\n attributeChangedCallback(name) {\n if (name === 'feed-url') {\n this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n }\n\n connectedCallback() {\n this.#dialogEl.addEventListener('me-close', this.#handleFeedClose);\n }\n\n disconnectedCallback() {\n this.#dialogEl.removeEventListener('me-close', this.#handleFeedClose);\n }\n\n get feedUrl() {\n return this.getAttribute('feed-url');\n }\n\n set feedUrl(value) {\n if (value) {\n this.setAttribute('feed-url', value);\n } else {\n this.removeAttribute('feed-url');\n }\n }\n\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n\n #handleFeedClose = () => {\n controller && controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll('.card').forEach(el => el.remove());\n this.#modalTitle.innerHTML = '';\n this.#spinnerEl.classList.add('d-none');\n this.#errorEl.classList.add('d-none');\n }\n\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove('d-none');\n\n controller = new AbortController();\n\n try {\n const data = await fetchFeed(feedUrl, {\n signal: controller.signal\n });\n\n const { value: feeds = [] } = await getFeeds();\n const currentFeed = feeds.find(feed => feed.url === feedUrl);\n\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) {\n await saveFeed({\n url: feedUrl,\n title: data.feed.title || ''\n });\n }\n\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n\n data.items.forEach(item => {\n this.#feedsViewer.insertAdjacentHTML('beforeend', this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== 'AbortError') {\n console.error(error);\n this.#modalTitle.textContent = '';\n this.#errorEl.classList.remove('d-none');\n }\n } finally {\n this.#spinnerEl.classList.add('d-none');\n }\n }\n\n #feedsReaderTemplate(item) {\n const { link, title, description, author, pubDate, thumbnail } = item;\n let formattedDate = '';\n\n try {\n formattedDate = new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium'\n }).format(new Date(pubDate));\n } catch {\n formattedDate = '-';\n }\n\n return /* html */`\n
          \n
          \n \n
          \n
          ${title}
          \n

          ${formattedDate} ${author ? `• ${author}` : ''}

          \n
          \n\n \"${title}\"\n
          \n\n
          \n Read more...\n
          \n ${description}\n
          \n
          \n
          \n
          \n `;\n }\n}\n\nif (!window.customElements.get('feed-reader')) {\n window.customElements.define('feed-reader', FeedReader);\n}\n","const cache = new Map();\n\nexport const fetchFeed = async (url, requestOptions = {}) => {\n const cachedFeed = cache.get(url);\n\n if (cachedFeed) {\n return cachedFeed;\n }\n\n const res = await fetch('https://api.rss2json.com/v1/api.json?rss_url=' + url, requestOptions);\n\n if (!res.ok) {\n throw new Error('Error fetching data');\n }\n\n const json = await res.json();\n\n cache.set(url, json);\n\n return json;\n};\n"],"names":["$b35f94fa505d7279$var$controller","Object","defineProperty","get","$7664cb16aa99b643$export$ea3b71af1761ff40","set","enumerable","configurable","$7664cb16aa99b643$var$t","$7664cb16aa99b643$var$e","$7664cb16aa99b643$var$o","$7664cb16aa99b643$var$s","document","createElement","innerHTML","HTMLElement","t","e","o","s","i","constructor","shadowRoot","attachShadow","mode","appendChild","content","cloneNode","querySelector","observedAttributes","connectedCallback","r","addEventListener","n","disconnectedCallback","removeEventListener","a","attributeChangedCallback","disabled","setAttribute","toString","part","contains","toggle","value","getAttribute","from","hasAttribute","removeAttribute","feedbackDuration","Number","l","Element","prototype","getRootNode","composed","ownerDocument","Document","ShadowRoot","HTMLInputElement","HTMLTextAreaElement","HTMLAnchorElement","href","textContent","navigator","clipboard","writeText","d","dispatchEvent","CustomEvent","bubbles","detail","error","preventDefault","hidden","remove","add","clearTimeout","setTimeout","hasOwnProperty","call","defineCustomElement","window","customElements","define","$cd62c5572235e737$export$30b344bef3e55b67","$cd62c5572235e737$var$t","$cd62c5572235e737$var$e","delegatesFocus","toggleAttribute","shareUrl","shareTitle","shareText","shareFiles","Array","isArray","length","share","url","title","text","canShare","files","shareData","Error","name","target","nodeName","assignedElements","flatten","find","$9351176e8d763a78$export$6ccd1735166caad9","$9351176e8d763a78$var$e","Map","$9351176e8d763a78$var$t","$9351176e8d763a78$var$o","lastIndexOf","type","split","pop","toLowerCase","writable","$9351176e8d763a78$var$i","path","webkitRelativePath","$9351176e8d763a78$var$r","Promise","readEntries","$9351176e8d763a78$var$a","push","$9351176e8d763a78$var$n","file","fullPath","$9351176e8d763a78$var$s","kind","getAsEntry","webkitGetAsEntry","shift","isFile","indexOf","isDirectory","createReader","$9351176e8d763a78$var$d","$9351176e8d763a78$var$l","dataTransfer","items","$9351176e8d763a78$var$p","$9351176e8d763a78$var$c","$9351176e8d763a78$var$h","$9351176e8d763a78$var$u","getElementById","accept","multiple","autoFocus","focus","maxFiles","Math","floor","abs","maxSize","isNaN","minSize","noStyle","p","Event","dropEffect","classList","click","key","errors","code","message","Set","map","trim","filter","Boolean","replace","charAt","test","size","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$5a53255ef6289be5$var$t","random","substring","$5a53255ef6289be5$var$e","$5a53255ef6289be5$var$s","$5a53255ef6289be5$var$o","$5a53255ef6289be5$var$a","$5a53255ef6289be5$var$l","selected","closable","className","id","stopPropagation","tabId","$5a53255ef6289be5$var$i","$5a53255ef6289be5$var$r","$5a53255ef6289be5$var$n","$5a53255ef6289be5$var$c","$5a53255ef6289be5$var$d","TOP","BOTTOM","START","END","$5a53255ef6289be5$var$h","entries","$5a53255ef6289be5$var$b","AUTO","MANUAL","$5a53255ef6289be5$var$u","DOWN","LEFT","RIGHT","UP","HOME","ENTER","SPACE","$5a53255ef6289be5$var$p","$5a53255ef6289be5$var$g","$5a53255ef6289be5$export$85fd4ed3b8ca1010","placement","noScrollControls","scrollDistance","activation","noTabCycling","querySelectorAll","forEach","c","ResizeObserver","requestAnimationFrame","scrollWidth","clientWidth","h","b","u","unobserve","observe","disconnect","cancelAnimationFrame","getComputedStyle","direction","g","m","nextElementSibling","tagName","console","v","f","w","T","y","findIndex","matches","A","_","E","C","altKey","includes","selectTab","closest","scrollLeft","scrollTo","left","selectTabByIndex","selectTabById","scrollIntoView","inline","block","$d9c5053bade2d3f8$export$32589115725b904b","$d9c5053bade2d3f8$var$e","$d9c5053bade2d3f8$var$t","open","showModal","element","body","preserveOverflow","style","overflow","close","noHeader","noAnimations","noCloseButton","staticBackdrop","fullscreen","defaultPrevented","currentTarget","assignedNodes","cancelable","reason","show","hide","hasShadyCss","ShadyCSS","nativeShadow","bootstrapper","implementation","createHTMLDocument","closedShadowRootRegistry","WeakMap","_DOMException","DOMException","importPattern","nonConstructedProto","NonConstructedStyleSheet","CSSStyleSheet","reject","replaceSync","$basicStyleElement","$locations","$adoptersByLocation","$appliedMethods","proto$1","ConstructedStyleSheet","contents","resolve","checkInvocationCorrectness","_contents","self_1","warn","location","isConnected","restyleAdopter","getAdopterByLocation","sheet","cssRules","media","cssStyleSheetMethods","method","self","args","arguments","apply","basicSheet","Symbol","hasInstance","isCSSStyleSheetInstance","defaultObserverOptions","childList","subtree","locations","$element","$uniqueSheets","$observer","Location","readyState","host","connect","container","getAdopterContainer","adopt","traverseWebComponents","root","getAssociatedLocation","update","sheets","locationType","TypeError","every","some","isNonConstructedStyleSheetInstance","oldUniqueSheets","uniqueSheets","arr","index","removedSheets","arr1","arr2","removeNode","node","parentNode","removeChild","delete","_location","attachAdoptedStyleSheetProperty","proto","attach_1","init","documentLocation","bind","getShadowRoot","instance","isPrototypeOf","adopter","command","has","callback","iter","createNodeIterator","NodeFilter","SHOW_ELEMENT","foundNode","FILTER_ACCEPT","FILTER_REJECT","next","nextNode","styleList","createDocumentFragment","observer","insertBefore","MutationObserver","mutations","mutation","addedNodes","removedNodes","HTMLStyleElement","$1df650bc12a3679b$exports","URL","$4ffc15d651e12514$var$styleURLs","$4ffc15d651e12514$export$4b9cd30c41328fdd","$dc2f4a51b83babfd$export$b327150396135fe7","request","oncomplete","onsuccess","result","onabort","onerror","$dc2f4a51b83babfd$var$defaultGetStore","$dc2f4a51b83babfd$var$defaultGetStoreFunc","dbName","storeName","dbp","indexedDB","onupgradeneeded","createObjectStore","txMode","then","db","transaction","objectStore","styles","all","styleURL","res","fetch","visibility","$bad480a01f35862b$var$STORAGE_FEEDS_KEY","$bad480a01f35862b$var$STORAGE_PREFIX","$bad480a01f35862b$var$getItem","customStore","undefined","store","$bad480a01f35862b$var$setItem","data","put","$bad480a01f35862b$export$4890c08c4ffbd57b","$bad480a01f35862b$export$a8ce8a4ec117f05e","feeds","shouldDispatchEvent","action","$bad480a01f35862b$export$4b77448646caf424","feed","foundFeed","$bad480a01f35862b$export$4e54c6fd9fa8b09b","feedUrl","filteredFeeds","$e998bc9dc264f90b$export$981c5d1bd3894713","$e50da86101e29f72$var$template","$e50da86101e29f72$var$AddFeed","formEl","adoptedStyleSheets","handleFormSubmission","evt","input","urlExists","isValidURL","$2c4dfe5b2b5ff94a$var$ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","$2c4dfe5b2b5ff94a$var$_objectSpread2","source","obj","getOwnPropertyDescriptors","defineProperties","$2c4dfe5b2b5ff94a$var$_typeof","iterator","$2c4dfe5b2b5ff94a$var$_extends","assign","$2c4dfe5b2b5ff94a$var$userAgent","pattern","userAgent","match","$2c4dfe5b2b5ff94a$var$IE11OrLess","$2c4dfe5b2b5ff94a$var$Edge","$2c4dfe5b2b5ff94a$var$FireFox","$2c4dfe5b2b5ff94a$var$Safari","$2c4dfe5b2b5ff94a$var$IOS","$2c4dfe5b2b5ff94a$var$ChromeForAndroid","$2c4dfe5b2b5ff94a$var$captureMode","capture","passive","$2c4dfe5b2b5ff94a$var$on","el","event","fn","$2c4dfe5b2b5ff94a$var$off","$2c4dfe5b2b5ff94a$var$matches","selector","msMatchesSelector","webkitMatchesSelector","$2c4dfe5b2b5ff94a$var$closest","ctx","includeCTX","nodeType","$2c4dfe5b2b5ff94a$var$R_SPACE","$2c4dfe5b2b5ff94a$var$toggleClass","state","$2c4dfe5b2b5ff94a$var$css","prop","val","defaultView","currentStyle","$2c4dfe5b2b5ff94a$var$matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","$2c4dfe5b2b5ff94a$var$find","list","getElementsByTagName","$2c4dfe5b2b5ff94a$var$getWindowScrollingElement","scrollingElement","documentElement","$2c4dfe5b2b5ff94a$var$getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","getBoundingClientRect","top","elRect","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","scaleY","$2c4dfe5b2b5ff94a$var$isScrolledPast","elSide","parentSide","parent","$2c4dfe5b2b5ff94a$var$getParentAutoScrollElement","elSideVal","parentSideVal","$2c4dfe5b2b5ff94a$var$getChild","childNum","options","includeDragEl","currentChild","children","display","$2c4dfe5b2b5ff94a$export$31b3ca70d8f57423","ghost","dragged","draggable","$2c4dfe5b2b5ff94a$var$lastChild","last","lastElementChild","previousElementSibling","$2c4dfe5b2b5ff94a$var$index","toUpperCase","clone","$2c4dfe5b2b5ff94a$var$getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollTop","includeSelf","elem","gotSelf","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","$2c4dfe5b2b5ff94a$var$isRectEqual","rect1","rect2","round","$2c4dfe5b2b5ff94a$var$throttle","ms","$2c4dfe5b2b5ff94a$var$_throttleTimeout","$2c4dfe5b2b5ff94a$var$scrollBy","x","$2c4dfe5b2b5ff94a$var$clone","Polymer","$","jQuery","Zepto","dom","$2c4dfe5b2b5ff94a$var$getChildContainingRectFromElement","ghostEl","rect","child","animated","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","min","Infinity","max","$2c4dfe5b2b5ff94a$var$expando","Date","getTime","$2c4dfe5b2b5ff94a$var$plugins","$2c4dfe5b2b5ff94a$var$defaults","initializeByDefault","$2c4dfe5b2b5ff94a$var$PluginManager","mount","plugin","option","pluginName","concat","pluginEvent","eventName","sortable","_this","eventCanceled","cancel","eventNameGlobal","initializePlugins","defaults","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","$2c4dfe5b2b5ff94a$var$_excluded","$2c4dfe5b2b5ff94a$var$pluginEvent","_ref","originalEvent","$2c4dfe5b2b5ff94a$var$_objectWithoutProperties","excluded","$2c4dfe5b2b5ff94a$var$_objectWithoutPropertiesLoose","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","dragEl","$2c4dfe5b2b5ff94a$var$dragEl","parentEl","$2c4dfe5b2b5ff94a$var$parentEl","$2c4dfe5b2b5ff94a$var$ghostEl","rootEl","$2c4dfe5b2b5ff94a$var$rootEl","nextEl","$2c4dfe5b2b5ff94a$var$nextEl","lastDownEl","$2c4dfe5b2b5ff94a$var$lastDownEl","cloneEl","$2c4dfe5b2b5ff94a$var$cloneEl","cloneHidden","$2c4dfe5b2b5ff94a$var$cloneHidden","dragStarted","$2c4dfe5b2b5ff94a$var$moved","putSortable","$2c4dfe5b2b5ff94a$var$putSortable","activeSortable","active","oldIndex","$2c4dfe5b2b5ff94a$var$oldIndex","oldDraggableIndex","$2c4dfe5b2b5ff94a$var$oldDraggableIndex","newIndex","$2c4dfe5b2b5ff94a$var$newIndex","newDraggableIndex","$2c4dfe5b2b5ff94a$var$newDraggableIndex","hideGhostForTarget","$2c4dfe5b2b5ff94a$var$_hideGhostForTarget","unhideGhostForTarget","$2c4dfe5b2b5ff94a$var$_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","$2c4dfe5b2b5ff94a$var$_dispatchEvent","info","$2c4dfe5b2b5ff94a$var$dispatchEvent","targetEl","toEl","fromEl","extraEventProperties","onName","substr","createEvent","initEvent","to","item","pullMode","lastPutMode","allEventProperties","$2c4dfe5b2b5ff94a$var$activeGroup","$2c4dfe5b2b5ff94a$var$tapEvt","$2c4dfe5b2b5ff94a$var$touchEvt","$2c4dfe5b2b5ff94a$var$lastDx","$2c4dfe5b2b5ff94a$var$lastDy","$2c4dfe5b2b5ff94a$var$tapDistanceLeft","$2c4dfe5b2b5ff94a$var$tapDistanceTop","$2c4dfe5b2b5ff94a$var$lastTarget","$2c4dfe5b2b5ff94a$var$lastDirection","$2c4dfe5b2b5ff94a$var$targetMoveDistance","$2c4dfe5b2b5ff94a$var$ghostRelativeParent","$2c4dfe5b2b5ff94a$var$awaitingDragStarted","$2c4dfe5b2b5ff94a$var$ignoreNextClick","$2c4dfe5b2b5ff94a$var$sortables","$2c4dfe5b2b5ff94a$var$pastFirstInvertThresh","$2c4dfe5b2b5ff94a$var$isCircumstantialInvert","$2c4dfe5b2b5ff94a$var$ghostRelativeParentInitialScroll","$2c4dfe5b2b5ff94a$var$_silent","$2c4dfe5b2b5ff94a$var$savedInputChecked","$2c4dfe5b2b5ff94a$var$documentExists","$2c4dfe5b2b5ff94a$var$CSSFloatProperty","$2c4dfe5b2b5ff94a$var$supportDraggable","$2c4dfe5b2b5ff94a$var$supportCssPointerEvents","cssText","pointerEvents","$2c4dfe5b2b5ff94a$var$_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","clear","$2c4dfe5b2b5ff94a$var$_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","$2c4dfe5b2b5ff94a$var$_detectNearestEmptySortable","ret","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","$2c4dfe5b2b5ff94a$var$_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","revertClone","stopImmediatePropagation","$2c4dfe5b2b5ff94a$var$nearestEmptyInsertDetectEvent","nearest","touches","clientX","clientY","_onDragOver","$2c4dfe5b2b5ff94a$var$_checkOutsideTargetEl","_isOutsideThisEl","animationCallbackId","animationStates","sort","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","animation","easing","setData","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","captureAnimationState","slice","fromRect","thisAnimationDuration","childMatrix","addAnimationState","removeAnimationState","splice","$2c4dfe5b2b5ff94a$var$indexOfObject","animateAll","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","sqrt","pow","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","offsetWidth","$2c4dfe5b2b5ff94a$var$_onMove","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","$2c4dfe5b2b5ff94a$var$_disableDraggable","$2c4dfe5b2b5ff94a$var$_unsilent","$2c4dfe5b2b5ff94a$var$_nextTick","$2c4dfe5b2b5ff94a$var$_cancelNextTick","_getDirection","touch","pointerType","originalTarget","composedPath","$2c4dfe5b2b5ff94a$var$_saveInputCheckedState","inputs","idx","checked","button","isContentEditable","criteria","_prepareDragStart","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","$2c4dfe5b2b5ff94a$var$PositionGhostAbsolutely","dx","dy","cssMatrix","_hideClone","cloneId","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","$2c4dfe5b2b5ff94a$var$_ghostIsLast","lastElRect","childContainingRect","changed","firstElRect","firstChild","sibling","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","$2c4dfe5b2b5ff94a$var$_getSwapDirection","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","dragIndex","after","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","save","handleEvent","toArray","order","$2c4dfe5b2b5ff94a$var$_generateId","str","src","sum","charCodeAt","useAnimation","destroy","utils","on","off","css","is","extend","dst","throttle","toggleClass","nextTick","cancelNextTick","detectDirection","getChild","_len","plugins","_key","create","version","$2c4dfe5b2b5ff94a$var$scrollEl","$2c4dfe5b2b5ff94a$var$scrollRootEl","$2c4dfe5b2b5ff94a$var$touchEvt$1","$2c4dfe5b2b5ff94a$var$autoScrolls","isFallback","scroll","scrollCustomFn","sens","scrollSensitivity","speed","scrollSpeed","autoScroll","pid","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","$2c4dfe5b2b5ff94a$var$drop","toSortable","changedTouches","onSpill","$2c4dfe5b2b5ff94a$var$Revert","$2c4dfe5b2b5ff94a$var$Remove","startIndex","dragStart","_ref2","_ref3","drop","_ref4","parentSortable","$4481690a5b2e12d6$export$61fc7d43ac8f84b0","wait","immediate","timerId","$884937fee35c0707$var$template","$884937fee35c0707$var$ImportFeeds","dropzoneEl","importForm","handleFilesDropzoneDropAccepted","handleImportFormSubmit","reader","FileReader","readAsText","onload","handleFileReaderLoad","importFeeds","feedsToImport","alert","feedExists","JSON","parse","formData","FormData","$74fb585f2eaf8e2d$var$template","$74fb585f2eaf8e2d$var$ExportFeeds","exportCodeEl","clipboardCopyEl","webShareEl","downloadButton","oldValue","newValue","feedsToExport","getFeedsToExportString","handleDownloadButtonClick","stringify","exportFeeds","blob","Blob","createObjectURL","link","download","revokeObjectURL","$26a2e0c8216738ce$var$template","$26a2e0c8216738ce$var$FeedsList","isEditable","feedsContainerEl","feedsListEl","editBtn","importBtn","importAltBtn","exportBtn","searchInput","searchClearBtn","importDialog","exportDialog","importFeedsEl","exportFeedsEl","noFeedsDisclaimerEl","addFeed","toggleFeedsVisibility","handleActionsClick","handleEditRequest","handleImportRequest","handleExportRequest","handleSearchInputDebounced","handleSearchClear","handleImportDialogOpen","handleExportDialogOpen","handleExportDialogClose","handleFeedsImported","handleFeedsUpdateSuccess","onEnd","searchFeeds","searchValue","feedEls","searchQuery","debounceSearchFeeds","removeFeed","feedEl","linkContent","deleteBtn","linkEl","feedItem","confirm","flex","minWidth","color","deleteButton","lineHeight","listItem","sortHandler","$72c9c9ace8c869ec$var$cache","$72c9c9ace8c869ec$export$5b107dfb127cada8","requestOptions","cachedFeed","ok","json","$b35f94fa505d7279$var$template","$b35f94fa505d7279$var$FeedReader","spinnerEl","dialogEl","modalTitle","feedsViewer","errorEl","openFeed","closeFeed","handleFeedClose","renderFeed","abort","resetDialogContent","AbortController","signal","currentFeed","insertAdjacentHTML","feedsReaderTemplate","description","author","pubDate","thumbnail","formattedDate","Intl","DateTimeFormat","dateStyle","format","$a4c1285108bf4a9d$export$ea3b71af1761ff40","$a4c1285108bf4a9d$var$COMPONENT_NAME","$a4c1285108bf4a9d$var$SUCCESS_STATUS","$a4c1285108bf4a9d$var$ERROR_STATUS","$a4c1285108bf4a9d$var$template","timeout","buttonEl","copySlot","successSlot","errorSlot","upgradeProperty","handleClick","forceResetStatus","copy","copyValue","showStatus","status","elementName","ClipboardCopy","$e179325634270afd$export$30b344bef3e55b67","$e179325634270afd$var$styles","$e179325634270afd$var$template","buttonSlot","getButton","handleSlotChange","WebShare","$862aa3736b0514bc$export$6ccd1735166caad9","$f31161edf38949e9$var$COMMON_MIME_TYPES","$f31161edf38949e9$var$FILES_TO_IGNORE","$f31161edf38949e9$var$toFileWithMimeType","hasExtension","extension","$f31161edf38949e9$var$toFileWithPath","fileWithMimeType","$f31161edf38949e9$var$readEntriesPromise","directoryReader","$f31161edf38949e9$var$readAllDirectoryEntries","$f31161edf38949e9$var$getFileFromFileEntry","fileEntry","$f31161edf38949e9$var$getFilesFromDataTransferItemList","dataTransferItemList","queue","entry","$f31161edf38949e9$var$getFilesFromFileList","fileList","$f31161edf38949e9$export$6d52664cd15c442","$862aa3736b0514bc$var$COMPONENT_NAME","$862aa3736b0514bc$var$TOO_MANY_FILES","$862aa3736b0514bc$var$template","$862aa3736b0514bc$var$styles","fileInput","handleFileInputChange","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleKeyUp","num","handleFilesSelect","filesLength","fileHasValidType","acceptedTypeSpecifiers","acceptedMimeTypesList","fileMimeType","baseMimeType","validType","fileExceedsMaxSize","fileIsSmallerThanMinSize","FilesDropzone","$aa07eeb3067ea186$export$e2a22331486dcca0","prefix","suffix","randomString","$2b7397b7d9d03d51$export$f7b23927dede22b3","$4b127c96b8d62b28$var$tabCounter","$4b127c96b8d62b28$var$styles","$4b127c96b8d62b28$var$template","$4b127c96b8d62b28$export$3e41faf802a29e71","closeButton","handleCloseButtonClick","$17a63ddf0f11756d$var$panelCounter","$17a63ddf0f11756d$var$styles","$17a63ddf0f11756d$var$template","$17a63ddf0f11756d$export$3d96ec278d3efce4","$6ed9897cfe6c2018$var$PLACEMENT","$6ed9897cfe6c2018$var$validPlacements","$6ed9897cfe6c2018$var$ACTIVATION","$6ed9897cfe6c2018$var$KEYCODE","$6ed9897cfe6c2018$var$styles","$6ed9897cfe6c2018$var$template","$6ed9897cfe6c2018$export$85fd4ed3b8ca1010","resizeObserver","rafId","hasTabSlotChangedOnce","syncNav","$6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE","tabSlot","panelSlot","tabsContainer","navContainer","scrollButtons","handleTabClick","handleKeyDown","handleScrollButtonClick","handleTabClose","targetElement","isElementScrollable","hideEmptyTabGroup","stopResizeObserver","startResizeObserver","scrollElement","getDirection","allTabs","linkPanels","tabs","tab","panel","allPanels","panelForTab","panelId","firstTab","lastTab","prevTab","newIdx","nextTab","reset","panels","setSelectedTabOnSlotChange","setSelectedTab","orientation","scrollButton","sign","oldTab","TabGroup","$180b6dcf923bafc7$export$32589115725b904b","$180b6dcf923bafc7$var$template","$180b6dcf923bafc7$var$styles","footerSlotEl","pulseAnimationTimeout","headerEl","closeBtnEl","handleDialogClick","handleDialogClose","handleDialogCancel","handleFooterSlotChange","applyPulseEffectOnDialog","requestCloseEvent","createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","ModalElement","$442be162a818aed4$export$c37129e465f64ef0","isWebShareSupported"],"version":3,"file":"index.2b8c09b0.js.map"} \ No newline at end of file diff --git a/docs/index.fdee3dc7.js b/docs/index.c4734e4f.js similarity index 90% rename from docs/index.fdee3dc7.js rename to docs/index.c4734e4f.js index ab244ee..5ae1fad 100644 --- a/docs/index.fdee3dc7.js +++ b/docs/index.c4734e4f.js @@ -539,7 +539,7 @@ -`;class V extends HTMLElement{#t=null;#e=null;#o=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(X.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.querySelector("dialog"),this.#e=this.shadowRoot.querySelector('slot[name="footer"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button"]}attributeChangedCallback(e,t,o){if(null!==this.#t){if("open"===e&&t!==o&&(this.open?(this.#t.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}}))):this.#t.close()),"no-header"===e&&t!==o){let e=this.#t.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#t.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#t.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}}}connectedCallback(){this.#n("open"),this.#n("staticBackdrop"),this.#n("noHeader"),this.#n("noAnimations"),this.#n("noCloseButton"),this.#n("fullscreen"),this.#t?.addEventListener("click",this.#s),this.#t?.addEventListener("close",this.#l),this.#t?.addEventListener("cancel",this.#i),this.#t?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#a),this.#e?.addEventListener("slotchange",this.#r)}disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#t?.addEventListener("click",this.#s),this.#t?.removeEventListener("close",this.#l),this.#t?.removeEventListener("cancel",this.#i),this.#t?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#a),this.#e?.removeEventListener("slotchange",this.#r)}get open(){return this.hasAttribute("open")}set open(e){e?this.setAttribute("open",""):this.removeAttribute("open")}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){e?this.setAttribute("static-backdrop",""):this.removeAttribute("static-backdrop")}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){e?this.setAttribute("no-header",""):this.removeAttribute("no-header")}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){e?this.setAttribute("no-animations",""):this.removeAttribute("no-animations")}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){e?this.setAttribute("no-close-button",""):this.removeAttribute("no-close-button")}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){e?this.setAttribute("fullscreen",""):this.removeAttribute("fullscreen")}#d(){this.#o||(this.#t?.classList.add("dialog--pulse"),this.#o=setTimeout(()=>{this.#t?.classList.remove("dialog--pulse"),clearTimeout(this.#o),this.#o=void 0},300))}#l=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}}))};#i=e=>{let t=this.#h("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#a=e=>{let t=this.#h("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#s=e=>{if(e.target!==e.currentTarget)return;let t=this.#h("backdrop-click");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#t?.close()};#r=()=>{if(null===this.#t)return;let e=this.#t.querySelector(".dialog__footer");if(null===e)return;let t=this.#e?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#h(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#n(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e="modal-element"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,V)}}V.defineCustomElement(),function(){if("undefined"!=typeof document&&!("adoptedStyleSheets"in document)){var e="ShadyCSS"in window&&!ShadyCSS.nativeShadow,t=document.implementation.createHTMLDocument(""),o=new WeakMap,i="object"==typeof DOMException?Error:DOMException,n=Object.defineProperty,r=Array.prototype.forEach,a=/@import.+?;?$/gm,s=CSSStyleSheet.prototype;s.replace=function(){return Promise.reject(new i("Can't call replace on non-constructed CSSStyleSheets."))},s.replaceSync=function(){throw new i("Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.")};var l=new WeakMap,d=new WeakMap,c=new WeakMap,h=new WeakMap,u=T.prototype;u.replace=function(e){try{return this.replaceSync(e),Promise.resolve(this)}catch(e){return Promise.reject(e)}},u.replaceSync=function(e){if(A(this),"string"==typeof e){var t,o=this;l.get(o).textContent=((t=e.replace(a,""))!==e&&console.warn("@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418"),t.trim()),h.set(o,[]),d.get(o).forEach(function(e){e.isConnected()&&k(o,C(o,e))})}},n(u,"cssRules",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.cssRules}}),n(u,"media",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.media}}),["addRule","deleteRule","insertRule","removeRule"].forEach(function(e){u[e]=function(){var t=this;A(t);var o=arguments;h.get(t).push({method:e,args:o}),d.get(t).forEach(function(i){if(i.isConnected()){var n=C(t,i).sheet;n[e].apply(n,o)}});var i=l.get(t).sheet;return i[e].apply(i,o)}}),n(T,Symbol.hasInstance,{configurable:!0,value:x});var p={childList:!0,subtree:!0},m=new WeakMap,f=new WeakMap,b=new WeakMap,g=new WeakMap;if(z.prototype={isConnected:function(){var e,t=f.get(this);return t instanceof Document?"loading"!==t.readyState:"isConnected"in(e=t.host)?e.isConnected:document.contains(e)},connect:function(){var e=M(this);g.get(this).observe(e,p),b.get(this).length>0&&R(this),D(e,function(e){_(e).connect()})},disconnect:function(){g.get(this).disconnect()},update:function(e){var t=this,o=f.get(t)===document?"Document":"ShadowRoot";if(!Array.isArray(e))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Iterator getter is not callable.");if(!e.every(x))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Failed to convert value to 'CSSStyleSheet'");if(e.some(S))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Can't adopt non-constructed stylesheets");t.sheets=e;var i=b.get(t),n=e.filter(function(t,o){return e.indexOf(t)===o});i.filter(function(e){return -1===n.indexOf(e)}).forEach(function(e){(function(e){e.parentNode.removeChild(e)})(C(e,t)),c.get(e).delete(t),d.set(e,d.get(e).filter(function(e){return e!==t}))}),b.set(t,n),t.isConnected()&&n.length>0&&R(t)}},window.CSSStyleSheet=T,L(Document),"ShadowRoot"in window){L(ShadowRoot);var v=Element.prototype,w=v.attachShadow;v.attachShadow=function(e){var t=w.call(this,e);return"closed"===e.mode&&o.set(this,t),t}}var y=_(document);y.isConnected()?y.connect():document.addEventListener("DOMContentLoaded",y.connect.bind(y))}function E(e){return e.shadowRoot||o.get(e)}function x(e){return"object"==typeof e&&(u.isPrototypeOf(e)||s.isPrototypeOf(e))}function S(e){return"object"==typeof e&&s.isPrototypeOf(e)}function C(e,t){return c.get(e).get(t)}function k(e,t){requestAnimationFrame(function(){t.textContent=l.get(e).textContent,h.get(e).forEach(function(e){return t.sheet[e.method].apply(t.sheet,e.args)})})}function A(e){if(!l.has(e))throw TypeError("Illegal invocation")}function T(){var e=document.createElement("style");t.body.appendChild(e),l.set(this,e),d.set(this,[]),c.set(this,new WeakMap),h.set(this,[])}function _(e){var t=m.get(e);return t||(t=new z(e),m.set(e,t)),t}function L(e){n(e.prototype,"adoptedStyleSheets",{configurable:!0,enumerable:!0,get:function(){return _(this).sheets},set:function(e){_(this).update(e)}})}function D(e,t){for(var o=document.createNodeIterator(e,NodeFilter.SHOW_ELEMENT,function(e){return E(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT},null,!1),i=void 0;i=o.nextNode();)t(E(i))}function M(e){var t=f.get(e);return t instanceof Document?t.body:t}function R(e){var t=document.createDocumentFragment(),o=b.get(e),i=g.get(e),n=M(e);i.disconnect(),o.forEach(function(o){var i;t.appendChild(C(o,e)||(i=document.createElement("style"),c.get(o).set(e,i),d.get(o).push(e),i))}),n.insertBefore(t,null),i.observe(n,p),o.forEach(function(t){k(t,C(t,e))})}function z(t){var o=this;o.sheets=[],f.set(o,t),b.set(o,[]),g.set(o,new MutationObserver(function(t,i){if(!document){i.disconnect();return}t.forEach(function(t){e||r.call(t.addedNodes,function(e){e instanceof Element&&D(e,function(e){_(e).connect()})}),r.call(t.removedNodes,function(t){t instanceof Element&&(t instanceof HTMLStyleElement&&b.get(o).some(function(e){return C(e,o)})&&R(o),e||D(t,function(e){_(e).disconnect()}))})})}))}}();var G={};G=r("aNJCr").getBundleURL("jBxQq")+"bootstrap.33ff2998.css";let J=[G,r("aNJCr").getBundleURL("jBxQq")+"main.2238cf96.css"],Z=[];for(let e=0;e(await fetch(e)).text()));for(let t=0;t{try{return{value:await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:K();return t("readonly",function(t){return Q(t.get(e))})}(e),error:void 0}}catch(e){return{value:void 0,error:e}}},eo=async(e,t)=>{try{return await function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:K();return o("readwrite",function(o){return o.put(t,e),Q(o.transaction)})}(e,t),{error:void 0}}catch(e){return{error:e}}},ei=async()=>et(ee),en=async(e,t=!0)=>{if(!Array.isArray(e))return;let{error:o}=await eo(ee,e);return!o&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"set",feeds:e}})),{error:o}},er=async(e,t=!0)=>{let{value:o=[]}=await ei(),i=o.find(t=>t.url===e.url),n="";i?(i.url=e.url,i.title=e.title,n="update"):(o.push(e),n="create");let{error:r}=await eo(ee,o);return!r&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:n,feed:e}})),{error:r}},ea=async(e,t=!0)=>{let{value:o=[]}=await ei(),i=o.filter(t=>t.url!==e),{error:n}=await eo(ee,i);return!n&&t&&(0===i.length&&await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:K();return t("readwrite",function(t){return t.delete(e),Q(t.transaction)})}(ee),document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"delete",feed:{url:e}}}))),{error:n}},es=e=>{try{return new URL(e),!0}catch{return!1}},el=document.createElement("template");el.innerHTML=` +`;class V extends HTMLElement{#t=null;#e=null;#o=void 0;constructor(){super(),this.shadowRoot||this.attachShadow({mode:"open"}).appendChild(X.content.cloneNode(!0)),this.shadowRoot&&(this.#t=this.shadowRoot.querySelector("dialog"),this.#e=this.shadowRoot.querySelector('slot[name="footer"]'))}static get observedAttributes(){return["open","no-header","no-animations","no-close-button"]}attributeChangedCallback(e,t,o){if(null!==this.#t){if("open"===e&&t!==o&&(this.open?(this.#t.showModal(),this.dispatchEvent(new CustomEvent("me-open",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="hidden")):this.#t.close()),"no-header"===e&&t!==o){let e=this.#t.querySelector(".dialog__header");null!==e&&(e.hidden=this.noHeader)}if("no-animations"===e&&t!==o&&this.#t.classList.toggle("dialog--no-animations",this.noAnimations),"no-close-button"===e&&t!==o){let e=this.#t.querySelector(".dialog__close");null!==e&&(e.hidden=this.noCloseButton)}}}connectedCallback(){this.#n("open"),this.#n("staticBackdrop"),this.#n("noHeader"),this.#n("noAnimations"),this.#n("noCloseButton"),this.#n("fullscreen"),this.#n("preserveOverflow"),this.#t?.addEventListener("click",this.#s),this.#t?.addEventListener("close",this.#l),this.#t?.addEventListener("cancel",this.#r),this.#t?.querySelector('form[method="dialog"]')?.addEventListener("submit",this.#i),this.#e?.addEventListener("slotchange",this.#a)}disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#t?.addEventListener("click",this.#s),this.#t?.removeEventListener("close",this.#l),this.#t?.removeEventListener("cancel",this.#r),this.#t?.querySelector('form[method="dialog"]')?.removeEventListener("submit",this.#i),this.#e?.removeEventListener("slotchange",this.#a)}get open(){return this.hasAttribute("open")}set open(e){this.toggleAttribute("open",!!e)}get staticBackdrop(){return this.hasAttribute("static-backdrop")}set staticBackdrop(e){this.toggleAttribute("static-backdrop",!!e)}get noHeader(){return this.hasAttribute("no-header")}set noHeader(e){this.toggleAttribute("no-header",!!e)}get noAnimations(){return this.hasAttribute("no-animations")}set noAnimations(e){this.toggleAttribute("no-animations",!!e)}get noCloseButton(){return this.hasAttribute("no-close-button")}set noCloseButton(e){this.toggleAttribute("no-close-button",!!e)}get fullscreen(){return this.hasAttribute("fullscreen")}set fullscreen(e){this.toggleAttribute("fullscreen",!!e)}get preserveOverflow(){return this.hasAttribute("preserve-overflow")}set preserveOverflow(e){this.toggleAttribute("preserve-overflow",!!e)}#d(){this.#o||(this.#t?.classList.add("dialog--pulse"),this.#o=setTimeout(()=>{this.#t?.classList.remove("dialog--pulse"),clearTimeout(this.#o),this.#o=void 0},300))}#l=()=>{this.open=!1,this.dispatchEvent(new CustomEvent("me-close",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow="")};#r=e=>{let t=this.#h("escape-key");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#i=e=>{let t=this.#h("close-button");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};#s=e=>{if(e.target!==e.currentTarget)return;let t=this.#h("backdrop-click");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#t?.close()};#a=()=>{if(null===this.#t)return;let e=this.#t.querySelector(".dialog__footer");if(null===e)return;let t=this.#e?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};#h(e){return new CustomEvent("me-request-close",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}#n(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}show(){this.open||(this.open=!0)}hide(){this.open&&(this.open=!1)}static defineCustomElement(e="modal-element"){"undefined"==typeof window||window.customElements.get(e)||window.customElements.define(e,V)}}V.defineCustomElement(),function(){if("undefined"!=typeof document&&!("adoptedStyleSheets"in document)){var e="ShadyCSS"in window&&!ShadyCSS.nativeShadow,t=document.implementation.createHTMLDocument(""),o=new WeakMap,i="object"==typeof DOMException?Error:DOMException,n=Object.defineProperty,r=Array.prototype.forEach,a=/@import.+?;?$/gm,s=CSSStyleSheet.prototype;s.replace=function(){return Promise.reject(new i("Can't call replace on non-constructed CSSStyleSheets."))},s.replaceSync=function(){throw new i("Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.")};var l=new WeakMap,d=new WeakMap,c=new WeakMap,h=new WeakMap,u=T.prototype;u.replace=function(e){try{return this.replaceSync(e),Promise.resolve(this)}catch(e){return Promise.reject(e)}},u.replaceSync=function(e){if(A(this),"string"==typeof e){var t,o=this;l.get(o).textContent=((t=e.replace(a,""))!==e&&console.warn("@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418"),t.trim()),h.set(o,[]),d.get(o).forEach(function(e){e.isConnected()&&k(o,C(o,e))})}},n(u,"cssRules",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.cssRules}}),n(u,"media",{configurable:!0,enumerable:!0,get:function(){return A(this),l.get(this).sheet.media}}),["addRule","deleteRule","insertRule","removeRule"].forEach(function(e){u[e]=function(){var t=this;A(t);var o=arguments;h.get(t).push({method:e,args:o}),d.get(t).forEach(function(i){if(i.isConnected()){var n=C(t,i).sheet;n[e].apply(n,o)}});var i=l.get(t).sheet;return i[e].apply(i,o)}}),n(T,Symbol.hasInstance,{configurable:!0,value:x});var p={childList:!0,subtree:!0},m=new WeakMap,f=new WeakMap,b=new WeakMap,g=new WeakMap;if(z.prototype={isConnected:function(){var e,t=f.get(this);return t instanceof Document?"loading"!==t.readyState:"isConnected"in(e=t.host)?e.isConnected:document.contains(e)},connect:function(){var e=M(this);g.get(this).observe(e,p),b.get(this).length>0&&R(this),D(e,function(e){_(e).connect()})},disconnect:function(){g.get(this).disconnect()},update:function(e){var t=this,o=f.get(t)===document?"Document":"ShadowRoot";if(!Array.isArray(e))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Iterator getter is not callable.");if(!e.every(x))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Failed to convert value to 'CSSStyleSheet'");if(e.some(S))throw TypeError("Failed to set the 'adoptedStyleSheets' property on "+o+": Can't adopt non-constructed stylesheets");t.sheets=e;var i=b.get(t),n=e.filter(function(t,o){return e.indexOf(t)===o});i.filter(function(e){return -1===n.indexOf(e)}).forEach(function(e){(function(e){e.parentNode.removeChild(e)})(C(e,t)),c.get(e).delete(t),d.set(e,d.get(e).filter(function(e){return e!==t}))}),b.set(t,n),t.isConnected()&&n.length>0&&R(t)}},window.CSSStyleSheet=T,L(Document),"ShadowRoot"in window){L(ShadowRoot);var v=Element.prototype,w=v.attachShadow;v.attachShadow=function(e){var t=w.call(this,e);return"closed"===e.mode&&o.set(this,t),t}}var y=_(document);y.isConnected()?y.connect():document.addEventListener("DOMContentLoaded",y.connect.bind(y))}function E(e){return e.shadowRoot||o.get(e)}function x(e){return"object"==typeof e&&(u.isPrototypeOf(e)||s.isPrototypeOf(e))}function S(e){return"object"==typeof e&&s.isPrototypeOf(e)}function C(e,t){return c.get(e).get(t)}function k(e,t){requestAnimationFrame(function(){t.textContent=l.get(e).textContent,h.get(e).forEach(function(e){return t.sheet[e.method].apply(t.sheet,e.args)})})}function A(e){if(!l.has(e))throw TypeError("Illegal invocation")}function T(){var e=document.createElement("style");t.body.appendChild(e),l.set(this,e),d.set(this,[]),c.set(this,new WeakMap),h.set(this,[])}function _(e){var t=m.get(e);return t||(t=new z(e),m.set(e,t)),t}function L(e){n(e.prototype,"adoptedStyleSheets",{configurable:!0,enumerable:!0,get:function(){return _(this).sheets},set:function(e){_(this).update(e)}})}function D(e,t){for(var o=document.createNodeIterator(e,NodeFilter.SHOW_ELEMENT,function(e){return E(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT},null,!1),i=void 0;i=o.nextNode();)t(E(i))}function M(e){var t=f.get(e);return t instanceof Document?t.body:t}function R(e){var t=document.createDocumentFragment(),o=b.get(e),i=g.get(e),n=M(e);i.disconnect(),o.forEach(function(o){var i;t.appendChild(C(o,e)||(i=document.createElement("style"),c.get(o).set(e,i),d.get(o).push(e),i))}),n.insertBefore(t,null),i.observe(n,p),o.forEach(function(t){k(t,C(t,e))})}function z(t){var o=this;o.sheets=[],f.set(o,t),b.set(o,[]),g.set(o,new MutationObserver(function(t,i){if(!document){i.disconnect();return}t.forEach(function(t){e||r.call(t.addedNodes,function(e){e instanceof Element&&D(e,function(e){_(e).connect()})}),r.call(t.removedNodes,function(t){t instanceof Element&&(t instanceof HTMLStyleElement&&b.get(o).some(function(e){return C(e,o)})&&R(o),e||D(t,function(e){_(e).disconnect()}))})})}))}}();var G={};G=r("aNJCr").getBundleURL("jBxQq")+"bootstrap.33ff2998.css";let J=[G,r("aNJCr").getBundleURL("jBxQq")+"main.2238cf96.css"],Z=[];for(let e=0;e(await fetch(e)).text()));for(let t=0;t{try{return{value:await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:K();return t("readonly",function(t){return Q(t.get(e))})}(e),error:void 0}}catch(e){return{value:void 0,error:e}}},eo=async(e,t)=>{try{return await function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:K();return o("readwrite",function(o){return o.put(t,e),Q(o.transaction)})}(e,t),{error:void 0}}catch(e){return{error:e}}},ei=async()=>et(ee),en=async(e,t=!0)=>{if(!Array.isArray(e))return;let{error:o}=await eo(ee,e);return!o&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"set",feeds:e}})),{error:o}},er=async(e,t=!0)=>{let{value:o=[]}=await ei(),i=o.find(t=>t.url===e.url),n="";i?(i.url=e.url,i.title=e.title,n="update"):(o.push(e),n="create");let{error:r}=await eo(ee,o);return!r&&t&&document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:n,feed:e}})),{error:r}},ea=async(e,t=!0)=>{let{value:o=[]}=await ei(),i=o.filter(t=>t.url!==e),{error:n}=await eo(ee,i);return!n&&t&&(0===i.length&&await function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:K();return t("readwrite",function(t){return t.delete(e),Q(t.transaction)})}(ee),document.dispatchEvent(new CustomEvent("feeds-updated",{bubbles:!0,detail:{action:"delete",feed:{url:e}}}))),{error:n}},es=e=>{try{return new URL(e),!0}catch{return!1}},el=document.createElement("template");el.innerHTML=` \n\n \n`;\nclass $0da3d504155236c3$export$ea3b71af1761ff40 extends HTMLElement {\n #t = null;\n #e;\n #o;\n #s;\n #i;\n constructor(){\n super(), this.shadowRoot || (this.attachShadow({\n mode: \"open\"\n }), this.shadowRoot.appendChild($0da3d504155236c3$var$s.content.cloneNode(!0))), this.#e = this.shadowRoot.querySelector(\"button\"), this.#o = this.shadowRoot.querySelector('slot[name=\"copy\"]'), this.#s = this.shadowRoot.querySelector('slot[name=\"success\"]'), this.#i = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#r(\"value\"), this.#r(\"from\"), this.#r(\"disabled\"), this.#r(\"feedbackDuration\"), this.#e.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#e.removeEventListener(\"click\", this.#n), this.#a();\n }\n attributeChangedCallback(t) {\n \"disabled\" === t && (this.#e.disabled = this.disabled, this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n get value() {\n return this.getAttribute(\"value\");\n }\n set value(t) {\n this.setAttribute(\"value\", t);\n }\n get from() {\n return this.getAttribute(\"from\");\n }\n set from(t) {\n this.setAttribute(\"from\", t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n t ? this.setAttribute(\"disabled\", \"\") : this.removeAttribute(\"disabled\");\n }\n get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || 1e3;\n }\n set feedbackDuration(t) {\n this.setAttribute(\"feedback-duration\", t);\n }\n async #l() {\n if (this.value || this.from) try {\n let o = \"\";\n if (this.value) o = this.value;\n else if (this.from) {\n let t = \"getRootNode\" in Element.prototype ? this.#e.getRootNode({\n composed: !0\n }) : this.#e.ownerDocument;\n if (!t || !(t instanceof Document || t instanceof ShadowRoot)) return;\n let e = t.querySelector(this.from);\n if (!e) return;\n o = e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement ? e.value : e instanceof HTMLAnchorElement && e.hasAttribute(\"href\") ? e.href : e.textContent;\n }\n await navigator.clipboard.writeText(o), this.#d($0da3d504155236c3$var$e), this.dispatchEvent(new CustomEvent(`${$0da3d504155236c3$var$t}-success`, {\n bubbles: !0,\n composed: !0,\n detail: {\n value: o\n }\n }));\n } catch (e) {\n this.#d($0da3d504155236c3$var$o), this.dispatchEvent(new CustomEvent(`${$0da3d504155236c3$var$t}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.#t || this.#l();\n };\n #d(t) {\n this.#o.hidden = !0, this.#s.hidden = t !== $0da3d504155236c3$var$e, this.#i.hidden = t !== $0da3d504155236c3$var$o, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\"), this.#e.part.add(`button--${t}`), this.#t && clearTimeout(this.#t), this.#t = setTimeout(()=>{\n this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(`button--${t}`), this.#t = null;\n }, this.feedbackDuration);\n }\n #a() {\n this.#t && clearTimeout(this.#t), this.#t = null, this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\");\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(e = $0da3d504155236c3$var$t) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $0da3d504155236c3$export$ea3b71af1761ff40);\n }\n}\n$0da3d504155236c3$export$ea3b71af1761ff40.defineCustomElement();\n\n\nObject.defineProperty({}, \"WebShare\", {\n get: function() {\n return $4f74a8126e204146$export$30b344bef3e55b67;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $4f74a8126e204146$var$t = `\n :host {\n display: inline-block;\n }\n`, $4f74a8126e204146$var$e = document.createElement(\"template\");\n$4f74a8126e204146$var$e.innerHTML = `\n \n \n`;\nclass $4f74a8126e204146$export$30b344bef3e55b67 extends HTMLElement {\n #t;\n #e;\n #s = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($4f74a8126e204146$var$e.content.cloneNode(!0)), this.#t = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#e = this.#i();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"disabled\" === t && e !== s && this.#e && (this.#e.toggleAttribute(\"disabled\", this.disabled), this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part && this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#r(\"shareUrl\"), this.#r(\"shareTitle\"), this.#r(\"shareText\"), this.#r(\"shareFiles\"), this.#r(\"disabled\"), this.#t?.addEventListener(\"slotchange\", this.#a), this.#e?.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"slotchange\", this.#a), this.#e?.removeEventListener(\"click\", this.#n);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#s;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#s = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && \"AbortError\" === t.name) {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.share();\n };\n #a = (t)=>{\n t.target && \"button\" === t.target.name && (this.#e?.removeEventListener(\"click\", this.#n), this.#e = this.#i(), this.#e && (this.#e.addEventListener(\"click\", this.#n), \"BUTTON\" === this.#e.nodeName || this.#e.hasAttribute(\"role\") || this.#e.setAttribute(\"role\", \"button\")));\n };\n #i() {\n return this.#t && this.#t.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"button\" === t.getAttribute(\"slot\")) || null;\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $4f74a8126e204146$export$30b344bef3e55b67);\n }\n}\n$4f74a8126e204146$export$30b344bef3e55b67.defineCustomElement();\n\n\nObject.defineProperty({}, \"FilesDropzone\", {\n get: function() {\n return $7aad62ebc3d6fae8$export$6ccd1735166caad9;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $7aad62ebc3d6fae8$var$e = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $7aad62ebc3d6fae8$var$t = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $7aad62ebc3d6fae8$var$o = (t)=>{\n let { name: o } = t;\n if (o && -1 !== o.lastIndexOf(\".\") && !t.type) {\n let i = (o.split(\".\").pop() || \"\").toLowerCase(), r = $7aad62ebc3d6fae8$var$e.get(i);\n r && Object.defineProperty(t, \"type\", {\n value: r,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $7aad62ebc3d6fae8$var$i = (e, t)=>{\n let i = $7aad62ebc3d6fae8$var$o(e);\n if (\"string\" != typeof i.path) {\n let { webkitRelativePath: o } = e;\n Object.defineProperty(i, \"path\", {\n value: \"string\" == typeof t ? t : o || e.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return i;\n}, $7aad62ebc3d6fae8$var$r = async (e)=>await new Promise((t, o)=>{\n e.readEntries(t, o);\n }), $7aad62ebc3d6fae8$var$a = async (e)=>{\n let t = [], o = await $7aad62ebc3d6fae8$var$r(e);\n for(; o.length > 0;)t.push(...o), o = await $7aad62ebc3d6fae8$var$r(e);\n return t;\n}, $7aad62ebc3d6fae8$var$n = (e)=>new Promise((t, o)=>{\n e.file((o)=>t($7aad62ebc3d6fae8$var$i(o, e.fullPath)), o);\n }), $7aad62ebc3d6fae8$var$s = async (e)=>{\n let o = [], i = [];\n for (let t of e){\n if (\"file\" !== t.kind) continue;\n let e = t.getAsEntry ? t.getAsEntry() : t.webkitGetAsEntry();\n i.push(e);\n }\n for(; i.length > 0;){\n let e = i.shift();\n if (e) {\n if (e.isFile) {\n let i = await $7aad62ebc3d6fae8$var$n(e);\n -1 === $7aad62ebc3d6fae8$var$t.indexOf(i.name) && o.push(i);\n } else e.isDirectory && i.push(...await $7aad62ebc3d6fae8$var$a(e.createReader()));\n }\n }\n return o;\n}, $7aad62ebc3d6fae8$var$d = async (e)=>{\n let o = [];\n for (let r of e)-1 === $7aad62ebc3d6fae8$var$t.indexOf(r.name) && o.push($7aad62ebc3d6fae8$var$i(r));\n return o;\n}, $7aad62ebc3d6fae8$var$l = async (e)=>e.dataTransfer ? e.dataTransfer.items ? await $7aad62ebc3d6fae8$var$s(e.dataTransfer.items) : await $7aad62ebc3d6fae8$var$d(e.dataTransfer.files) : await $7aad62ebc3d6fae8$var$d(e.target.files), $7aad62ebc3d6fae8$var$p = \"files-dropzone\", $7aad62ebc3d6fae8$var$c = \"TOO_MANY_FILES\", $7aad62ebc3d6fae8$var$h = document.createElement(\"template\"), $7aad62ebc3d6fae8$var$u = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$7aad62ebc3d6fae8$var$h.innerHTML = `\n \n\n \n\n
          \n Drag 'n' drop files here, or click to select files\n
          \n`;\nclass $7aad62ebc3d6fae8$export$6ccd1735166caad9 extends HTMLElement {\n #e = null;\n #t = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($7aad62ebc3d6fae8$var$h.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.getElementById(\"file-input\"), this.#t = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n \"accept\" === e && t !== o && this.#e && (this.#e.accept = this.accept), \"disabled\" === e && t !== o && this.#e && (this.#e.disabled = this.disabled, this.disabled ? (this.#t?.removeAttribute(\"tabindex\"), this.#t?.setAttribute(\"aria-disabled\", \"true\")) : (this.#t?.setAttribute(\"tabindex\", \"0\"), this.#t?.setAttribute(\"aria-disabled\", \"false\"))), \"multiple\" === e && t !== o && this.#e && (this.#e.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#e?.addEventListener(\"change\", this.#i), this.#t?.addEventListener(\"dragenter\", this.#r), this.#t?.addEventListener(\"dragover\", this.#a), this.#t?.addEventListener(\"dragleave\", this.#n), this.#t?.addEventListener(\"drop\", this.#s), this.#t?.addEventListener(\"click\", this.#d), this.#t?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#t?.focus();\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"change\", this.#i), this.#t?.removeEventListener(\"dragenter\", this.#r), this.#t?.removeEventListener(\"dragover\", this.#a), this.#t?.removeEventListener(\"dragleave\", this.#n), this.#t?.removeEventListener(\"drop\", this.#s), this.#t?.removeEventListener(\"click\", this.#d), this.#t?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", null != e ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", null != e ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (null === e) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", null != e ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (null === e) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", null != e ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#p(await $7aad62ebc3d6fae8$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #a = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#t && (this.#t.classList.add(\"dropzone--dragover\"), this.#t.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #s = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\"));\n try {\n this.#p(await $7aad62ebc3d6fae8$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#e?.click();\n };\n #l = (e)=>{\n this.disabled || \" \" !== e.key && \"Enter\" !== e.key || this.#e?.click();\n };\n #p(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], o = [], i = e.length;\n if (!this.multiple && i > 1) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$c,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && i > this.maxFiles) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$c,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let i of e){\n let e = function(e, t = \"\") {\n if (!t) return !0;\n let o = [\n ...new Set(t.split(\",\").map((e)=>e.trim()).filter(Boolean))\n ], i = e.type, r = i.replace(/\\/.*$/, \"\");\n for (let t of o)if (\".\" === t.charAt(0)) {\n if (-1 !== e.name.toLowerCase().indexOf(t.toLowerCase(), e.name.length - t.length)) return !0;\n } else if (/\\/\\*$/.test(t)) {\n if (r === t.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === t) return !0;\n return !1;\n }(i, this.accept), r = i.size > this.maxSize, a = i.size < this.minSize;\n if (!e || r || a) {\n let t = [];\n e || t.push({\n code: \"INVALID_MIME_TYPE\",\n message: `File type \"${i.type}\" is not accepted.`\n }), r && t.push({\n code: \"FILE_TOO_LARGE\",\n message: `File size ${i.size} exceeds the maximum size of ${this.maxSize}.`\n }), a && t.push({\n code: \"FILE_TOO_SMALL\",\n message: `File size ${i.size} is smaller than the minimum size of ${this.minSize}.`\n }), o.push({\n file: i,\n errors: t\n });\n } else t.push(i);\n }\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: o\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), o.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: o\n }\n })), this.#e && (this.#e.value = this.#e.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#e?.click();\n }\n #o(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n static defineCustomElement(e = $7aad62ebc3d6fae8$var$p) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $7aad62ebc3d6fae8$export$6ccd1735166caad9);\n }\n}\n$7aad62ebc3d6fae8$export$6ccd1735166caad9.defineCustomElement();\n\n\nlet $c172d40c323f9126$var$t = (t = \"\", e = \"\")=>{\n let s = Math.random().toString(36).substring(2, 8);\n return `${\"string\" == typeof t && \"\" !== t ? t + \"-\" : \"\"}${s}${\"string\" == typeof e && \"\" !== e ? \"-\" + e : \"\"}`;\n}, $c172d40c323f9126$var$e = (t, e)=>{\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let s = e[t];\n delete e[t], e[t] = s;\n }\n}, $c172d40c323f9126$var$s = 0, $c172d40c323f9126$var$o = `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`, $c172d40c323f9126$var$a = document.createElement(\"template\");\n$c172d40c323f9126$var$a.innerHTML = `\n \n\n
          \n \n
          \n`;\nclass $c172d40c323f9126$var$l extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($c172d40c323f9126$var$a.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n if (\"selected\" === t && e !== s && this.setAttribute(\"aria-selected\", this.selected.toString()), \"disabled\" === t && e !== s && (this.setAttribute(\"aria-disabled\", this.disabled.toString()), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\")), \"closable\" === t && e !== s) {\n if (this.closable) {\n let t = document.createElement(\"span\");\n t.className = \"tab__close\", t.setAttribute(\"part\", \"close-tab\"), t.innerHTML = '', this.shadowRoot?.querySelector(\".tab\")?.appendChild(t), t.addEventListener(\"click\", this.#t);\n } else {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t), t?.remove();\n }\n }\n }\n connectedCallback() {\n this.#e(\"selected\"), this.#e(\"disabled\"), this.#e(\"closable\"), this.id || (this.id = $c172d40c323f9126$var$t(\"tab\", (++$c172d40c323f9126$var$s).toString())), this.setAttribute(\"slot\", \"tab\"), this.setAttribute(\"role\", \"tab\"), this.setAttribute(\"aria-selected\", \"false\"), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t);\n }\n get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(t) {\n this.toggleAttribute(\"selected\", !!t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(t) {\n this.toggleAttribute(\"closable\", !!t);\n }\n #t = (t)=>{\n t.stopPropagation(), this.dispatchEvent(new CustomEvent(\"a-tab-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: this.id\n }\n }));\n };\n #e(t) {\n return $c172d40c323f9126$var$e(t, this);\n }\n static defineCustomElement(t = \"a-tab\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $c172d40c323f9126$var$l);\n }\n}\n$c172d40c323f9126$var$l.defineCustomElement();\nlet $c172d40c323f9126$var$i = 0, $c172d40c323f9126$var$r = `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`, $c172d40c323f9126$var$n = document.createElement(\"template\");\n$c172d40c323f9126$var$n.innerHTML = `\n \n\n
          \n \n
          \n`;\nclass $c172d40c323f9126$var$c extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($c172d40c323f9126$var$n.content.cloneNode(!0));\n }\n connectedCallback() {\n this.setAttribute(\"slot\", \"panel\"), this.setAttribute(\"role\", \"tabpanel\"), this.setAttribute(\"hidden\", \"\"), this.id || (this.id = $c172d40c323f9126$var$t(\"panel\", (++$c172d40c323f9126$var$i).toString()));\n }\n static defineCustomElement(t = \"a-tab-panel\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $c172d40c323f9126$var$c);\n }\n}\n$c172d40c323f9126$var$c.defineCustomElement();\nlet $c172d40c323f9126$var$d = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n}, $c172d40c323f9126$var$h = Object.entries($c172d40c323f9126$var$d).map(([, t])=>t), $c172d40c323f9126$var$b = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n}, $c172d40c323f9126$var$u = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n}, $c172d40c323f9126$var$p = `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$c172d40c323f9126$var$d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$c172d40c323f9126$var$d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$c172d40c323f9126$var$d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`, $c172d40c323f9126$var$g = document.createElement(\"template\");\n$c172d40c323f9126$var$g.innerHTML = `\n \n\n
          \n
          \n \n\n
          \n \n
          \n\n \n
          \n\n
          \n \n
          \n
          \n`;\nclass $c172d40c323f9126$export$85fd4ed3b8ca1010 extends HTMLElement {\n #s = null;\n #o = null;\n #a = !1;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($c172d40c323f9126$var$g.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"placement\" === t && e !== s && this.#l(), \"no-scroll-controls\" === t && e !== s && this.#l();\n }\n get placement() {\n return this.getAttribute(\"placement\") || $c172d40c323f9126$var$d.TOP;\n }\n set placement(t) {\n null != t && this.setAttribute(\"placement\", t);\n }\n get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(t) {\n this.toggleAttribute(\"no-scroll-controls\", !!t);\n }\n get scrollDistance() {\n return Math.abs(Number(this.getAttribute(\"scroll-distance\"))) || 200;\n }\n set scrollDistance(t) {\n this.setAttribute(\"scroll-distance\", Math.abs(t).toString() || \"200\");\n }\n get activation() {\n return this.getAttribute(\"activation\") || $c172d40c323f9126$var$b.AUTO;\n }\n set activation(t) {\n this.setAttribute(\"activation\", t || $c172d40c323f9126$var$b.AUTO);\n }\n get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(t) {\n this.toggleAttribute(\"no-tab-cycling\", !!t);\n }\n connectedCallback() {\n this.#e(\"placement\"), this.#e(\"noScrollControls\"), this.#e(\"scrollDistance\"), this.#e(\"activation\"), this.#e(\"noTabCycling\");\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = this.shadowRoot?.querySelector(\".tab-group__nav\"), a = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.addEventListener(\"slotchange\", this.#i), e?.addEventListener(\"slotchange\", this.#i), s?.addEventListener(\"click\", this.#r), s?.addEventListener(\"keydown\", this.#n), a.forEach((t)=>t.addEventListener(\"click\", this.#c)), this.addEventListener(\"a-tab-close\", this.#d), \"ResizeObserver\" in window && (this.#s = new ResizeObserver((t)=>{\n this.#o = window.requestAnimationFrame(()=>{\n let e = t?.[0], s = e?.target, l = s?.scrollWidth > s?.clientWidth;\n a.forEach((t)=>t.toggleAttribute(\"hidden\", !l)), o?.part.toggle(\"nav--has-scroll-controls\", l), o?.classList.toggle(\"tab-group__nav--has-scroll-controls\", l);\n });\n })), this.#h(), this.#l();\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.removeEventListener(\"slotchange\", this.#i), e?.removeEventListener(\"slotchange\", this.#i), s?.removeEventListener(\"click\", this.#r), s?.removeEventListener(\"keydown\", this.#n), o.forEach((t)=>t.removeEventListener(\"click\", this.#c)), this.removeEventListener(\"a-tab-close\", this.#d), this.#b();\n }\n #u() {\n if (!this.#s) return;\n let t = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n t && (this.#s.unobserve(t), this.#s.observe(t));\n }\n #b() {\n this.#s && (this.#s.disconnect(), null !== this.#o && (window.cancelAnimationFrame(this.#o), this.#o = null));\n }\n #p() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n #h() {\n this.hidden = 0 === this.#g().length;\n }\n #m() {\n let t = this.#g();\n this.#h(), t.forEach((t)=>{\n let e = t.nextElementSibling;\n if (!e || \"a-tab-panel\" !== e.tagName.toLowerCase()) return console.error(`Tab #${t.id} is not a sibling of a `);\n t.setAttribute(\"aria-controls\", e.id), e.setAttribute(\"aria-labelledby\", t.id);\n });\n }\n #v() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n #g() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n #f(t) {\n let e = t.getAttribute(\"aria-controls\");\n return this.querySelector(`#${e}`);\n }\n #w() {\n return this.#g().find((t)=>!t.disabled) || null;\n }\n #T() {\n let t = this.#g();\n for(let e = t.length - 1; e >= 0; e--)if (!t[e].disabled) return t[e];\n return null;\n }\n #y() {\n let t = this.#g(), e = this.activation === $c172d40c323f9126$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) - 1 : t.findIndex((t)=>t.selected) - 1;\n for(; t[(e + t.length) % t.length].disabled;)e--;\n return this.noTabCycling && e < 0 ? null : t[(e + t.length) % t.length];\n }\n #A() {\n let t = this.#g(), e = this.activation === $c172d40c323f9126$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) + 1 : t.findIndex((t)=>t.selected) + 1;\n for(; t[e % t.length].disabled;)e++;\n return this.noTabCycling && e >= t.length ? null : t[e % t.length];\n }\n #_() {\n let t = this.#g(), e = this.#v();\n t.forEach((t)=>t.selected = !1), e.forEach((t)=>t.hidden = !0);\n }\n #l() {\n let t = this.shadowRoot?.querySelector(\".tab-group__nav\"), e = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n this.noScrollControls || this.placement === $c172d40c323f9126$var$d.START || this.placement === $c172d40c323f9126$var$d.END ? (this.#b(), e.forEach((t)=>t.hidden = !0), t?.part.remove(\"nav--has-scroll-controls\"), t?.classList.remove(\"tab-group__nav--has-scroll-controls\")) : (this.#u(), e.forEach((t)=>t.hidden = !1));\n }\n #E() {\n let t = this.#g(), e = t.find((t)=>t.selected && !t.disabled) || t.find((t)=>!t.disabled);\n e && (this.#a && !e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.#C(e));\n }\n #C(t) {\n this.#_(), t && (t.selected = !0);\n let e = this.#f(t);\n e && (e.hidden = !1);\n }\n #i = (t)=>{\n this.#m(), this.#l(), this.#E(), \"tab\" === t.target.name && (this.#a = !0);\n };\n #n = (t)=>{\n if (\"a-tab\" !== t.target.tagName.toLowerCase() || t.altKey) return;\n let e = $c172d40c323f9126$var$h.includes(this.placement || \"\") ? this.placement : $c172d40c323f9126$var$d.TOP, s = [\n $c172d40c323f9126$var$d.TOP,\n $c172d40c323f9126$var$d.BOTTOM\n ].includes(e || \"\") ? \"horizontal\" : \"vertical\", o = this.#p(), a = null;\n switch(t.key){\n case $c172d40c323f9126$var$u.LEFT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#y() : this.#A()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.RIGHT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#A() : this.#y()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.UP:\n \"vertical\" === s && (a = this.#y()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.DOWN:\n \"vertical\" === s && (a = this.#A()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.HOME:\n (a = this.#w()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.END:\n (a = this.#T()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.ENTER:\n case $c172d40c323f9126$var$u.SPACE:\n (a = t.target) && this.selectTab(a);\n break;\n default:\n return;\n }\n t.preventDefault();\n };\n #r = (t)=>{\n let e = t.target.closest(\"a-tab\");\n e && this.selectTab(e);\n };\n #c = (t)=>{\n let e = t.target.closest(\".tab-group__scroll-button\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!e || !s) return;\n let o = e.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1, a = s.scrollLeft;\n s.scrollTo({\n left: a + o * this.scrollDistance\n });\n };\n #d = (t)=>{\n let e = t.target, s = this.#f(e);\n e && (e.remove(), e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n }))), s && \"a-tab-panel\" === s.tagName.toLowerCase() && s.remove();\n };\n #e(t) {\n return $c172d40c323f9126$var$e(t, this);\n }\n selectTabByIndex(t) {\n let e = this.#g()[t];\n e && this.selectTab(e);\n }\n selectTabById(t) {\n let e = this.#g().find((e)=>e.id === t);\n e && this.selectTab(e);\n }\n selectTab(t) {\n let e = this.#g().find((t)=>t.selected);\n !t || t.disabled || t.selected || \"a-tab\" !== t.tagName.toLowerCase() || (this.#C(t), window.requestAnimationFrame(()=>{\n t.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n }), t.focus();\n }), e && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: t.id\n }\n })));\n }\n static defineCustomElement(t = \"a-tab-group\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $c172d40c323f9126$export$85fd4ed3b8ca1010);\n }\n}\n$c172d40c323f9126$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nObject.defineProperty({}, \"ModalElement\", {\n get: function() {\n return $4da30046ce6d9325$export$32589115725b904b;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $4da30046ce6d9325$var$e = document.createElement(\"template\"), $4da30046ce6d9325$var$t = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$4da30046ce6d9325$var$e.innerHTML = /* html */ `\n \n\n \n
          \n
          \n \n\n
          \n \n
          \n
          \n\n \n\n
          \n \n
          \n
          \n
          \n`; /**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ \nclass $4da30046ce6d9325$export$32589115725b904b extends HTMLElement {\n #e = null;\n #t = null;\n #o = void 0;\n constructor(){\n if (super(), !this.shadowRoot) {\n let t = this.attachShadow({\n mode: \"open\"\n });\n t.appendChild($4da30046ce6d9325$var$e.content.cloneNode(!0));\n }\n this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#t = this.shadowRoot.querySelector('slot[name=\"footer\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n if (null !== this.#e) {\n if (\"open\" === e && t !== o && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"hidden\")) : this.#e.close()), \"no-header\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__header\");\n null !== e && (e.hidden = this.noHeader);\n }\n if (\"no-animations\" === e && t !== o && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), \"no-close-button\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__close\");\n null !== e && (e.hidden = this.noCloseButton);\n }\n }\n }\n connectedCallback() {\n this.#i(\"open\"), this.#i(\"staticBackdrop\"), this.#i(\"noHeader\"), this.#i(\"noAnimations\"), this.#i(\"noCloseButton\"), this.#i(\"fullscreen\"), this.#i(\"preserveOverflow\"), this.#e?.addEventListener(\"click\", this.#a), this.#e?.addEventListener(\"close\", this.#l), this.#e?.addEventListener(\"cancel\", this.#r), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#s), this.#t?.addEventListener(\"slotchange\", this.#n);\n }\n disconnectedCallback() {\n this.#o && clearTimeout(this.#o), this.#e?.addEventListener(\"click\", this.#a), this.#e?.removeEventListener(\"close\", this.#l), this.#e?.removeEventListener(\"cancel\", this.#r), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#s), this.#t?.removeEventListener(\"slotchange\", this.#n);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n this.toggleAttribute(\"open\", !!e);\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n this.toggleAttribute(\"static-backdrop\", !!e);\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n this.toggleAttribute(\"no-header\", !!e);\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n this.toggleAttribute(\"no-animations\", !!e);\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n this.toggleAttribute(\"no-close-button\", !!e);\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n this.toggleAttribute(\"fullscreen\", !!e);\n }\n get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(e) {\n this.toggleAttribute(\"preserve-overflow\", !!e);\n }\n #d() {\n this.#o || (this.#e?.classList.add(\"dialog--pulse\"), this.#o = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#o), this.#o = void 0;\n }, 300));\n }\n #l = ()=>{\n // the open property when the dialog is closed by the user.\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n })), document.body && !this.preserveOverflow && (document.body.style.overflow = \"\");\n };\n #r = (e)=>{\n let t = this.#c(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #s = (e)=>{\n let t = this.#c(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #a = (e)=>{\n if (e.target !== e.currentTarget) return;\n let t = this.#c(\"backdrop-click\");\n if (this.dispatchEvent(t), t.defaultPrevented || this.staticBackdrop) {\n this.noAnimations || this.#d();\n return;\n }\n this.#e?.close();\n };\n #n = ()=>{\n if (null === this.#e) return; /** @type {Nullable} */ \n let e = this.#e.querySelector(\".dialog__footer\");\n if (null === e) return;\n let t = this.#t?.assignedNodes(), o = !!t && t.length > 0;\n e.hidden = !o;\n };\n #c(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #i(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $4da30046ce6d9325$export$32589115725b904b);\n }\n}\n$4da30046ce6d9325$export$32589115725b904b.defineCustomElement();\n //# sourceMappingURL=modal-element-defined.js.map\n\n\n(function() {\n \"use strict\";\n if (typeof document === \"undefined\" || \"adoptedStyleSheets\" in document) return;\n var hasShadyCss = \"ShadyCSS\" in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument(\"\");\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === \"object\" ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, \"\");\n if (_contents !== contents) console.warn(\"@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418\");\n return _contents.trim();\n }\n function isElementConnected(element) {\n return \"isConnected\" in element ? element.isConnected : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function(value, index) {\n return arr.indexOf(value) === index;\n });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function(value) {\n return arr2.indexOf(value) === -1;\n });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n var cssStyleSheetMethods = [\n \"addRule\",\n \"deleteRule\",\n \"insertRule\",\n \"removeRule\"\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function() {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function() {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? proto$1.isPrototypeOf(instance) || nonConstructedProto.isPrototypeOf(instance) : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? nonConstructedProto.isPrototypeOf(instance) : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement(\"style\");\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function(_location) {\n return _location !== location;\n }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function() {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods.get(sheet).forEach(function(command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) throw new TypeError(\"Illegal invocation\");\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement(\"style\");\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n } catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === \"string\") {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function(location) {\n if (location.isConnected()) restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n });\n }\n };\n defineProperty(proto$1, \"cssRules\", {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n }\n });\n defineProperty(proto$1, \"media\", {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n }\n });\n cssStyleSheetMethods.forEach(function(method) {\n proto$1[method] = function() {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({\n method: method,\n args: args\n });\n $locations.get(self).forEach(function(location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance\n });\n var defaultObserverOptions = {\n childList: true,\n subtree: true\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, \"adoptedStyleSheets\", {\n configurable: true,\n enumerable: true,\n get: function() {\n return getAssociatedLocation(this).sheets;\n },\n set: function(sheets) {\n getAssociatedLocation(this).update(sheets);\n }\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function(foundNode) {\n return getShadowRoot(foundNode) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, null, false);\n for(var next = void 0; next = iter.nextNode();)callback(getShadowRoot(next));\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return element instanceof HTMLStyleElement && $uniqueSheets.get(self).some(function(sheet) {\n return getAdopterByLocation(sheet, self);\n });\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function(sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function(sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function(mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function(mutation) {\n if (!hasShadyCss) forEach.call(mutation.addedNodes, function(node) {\n if (!(node instanceof Element)) return;\n traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).connect();\n });\n });\n forEach.call(mutation.removedNodes, function(node) {\n if (!(node instanceof Element)) return;\n if (isExistingAdopter(self, node)) adopt(self);\n if (!hasShadyCss) traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).disconnect();\n });\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function() {\n var element = $element.get(this);\n return element instanceof Document ? element.readyState !== \"loading\" : isElementConnected(element.host);\n },\n connect: function() {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) adopt(this);\n traverseWebComponents(container, function(root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function() {\n $observer.get(this).disconnect();\n },\n update: function(sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? \"Document\" : \"ShadowRoot\";\n if (!Array.isArray(sheets)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n if (!sheets.every(isCSSStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n if (sheets.some(isNonConstructedStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function(sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) adopt(self);\n }\n };\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if (\"ShadowRoot\" in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === \"closed\") closedShadowRootRegistry.set(this, root);\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) documentLocation.connect();\n else document.addEventListener(\"DOMContentLoaded\", documentLocation.connect.bind(documentLocation));\n})();\n\n\nvar $821acccc985d5f51$exports = {};\n\n$821acccc985d5f51$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"jBxQq\") + \"bootstrap.33ff2998.css\";\n\n\nvar $215eadd5da70ce75$exports = {};\n\n$215eadd5da70ce75$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"jBxQq\") + \"main.2238cf96.css\";\n\n\nconst $053c683f8862b85c$var$styleURLs = [\n $821acccc985d5f51$exports,\n $215eadd5da70ce75$exports\n];\nconst $053c683f8862b85c$export$4b9cd30c41328fdd = [];\nfor(let i = 0; i < $053c683f8862b85c$var$styleURLs.length; i += 1)$053c683f8862b85c$export$4b9cd30c41328fdd.push(new CSSStyleSheet());\n(async function() {\n const styles = await Promise.all($053c683f8862b85c$var$styleURLs.map(async (styleURL)=>{\n const res = await fetch(styleURL);\n return res.text();\n }));\n for(let i = 0; i < styles.length; i += 1)await $053c683f8862b85c$export$4b9cd30c41328fdd[i].replace(styles[i]);\n document.body.style.visibility = \"visible\";\n})();\n\n\n\nfunction $e92a13782f6c06ba$var$_slicedToArray(arr, i) {\n return $e92a13782f6c06ba$var$_arrayWithHoles(arr) || $e92a13782f6c06ba$var$_iterableToArrayLimit(arr, i) || $e92a13782f6c06ba$var$_unsupportedIterableToArray(arr, i) || $e92a13782f6c06ba$var$_nonIterableRest();\n}\nfunction $e92a13782f6c06ba$var$_nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction $e92a13782f6c06ba$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $e92a13782f6c06ba$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $e92a13782f6c06ba$var$_arrayLikeToArray(o, minLen);\n}\nfunction $e92a13782f6c06ba$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $e92a13782f6c06ba$var$_iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction $e92a13782f6c06ba$var$_arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction $e92a13782f6c06ba$export$b327150396135fe7(request) {\n return new Promise(function(resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function() {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n request.onabort = request.onerror = function() {\n return reject(request.error);\n };\n });\n}\nfunction $e92a13782f6c06ba$export$f51a9068ac82ea43(dbName, storeName) {\n var request = indexedDB.open(dbName);\n request.onupgradeneeded = function() {\n return request.result.createObjectStore(storeName);\n };\n var dbp = $e92a13782f6c06ba$export$b327150396135fe7(request);\n return function(txMode, callback) {\n return dbp.then(function(db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\nvar $e92a13782f6c06ba$var$defaultGetStoreFunc;\nfunction $e92a13782f6c06ba$var$defaultGetStore() {\n if (!$e92a13782f6c06ba$var$defaultGetStoreFunc) $e92a13782f6c06ba$var$defaultGetStoreFunc = $e92a13782f6c06ba$export$f51a9068ac82ea43(\"keyval-store\", \"keyval\");\n return $e92a13782f6c06ba$var$defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$3988ae62b71be9a3(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return $e92a13782f6c06ba$export$b327150396135fe7(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$adaa4cf7ef1b65be(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.put(value, key);\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$daa0a5170277c7a8(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n entries.forEach(function(entry) {\n return store.put(entry[1], entry[0]);\n });\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$5df405cccea42673(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return Promise.all(keys.map(function(key) {\n return $e92a13782f6c06ba$export$b327150396135fe7(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$722fbec263ad908a(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n return(// If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function(resolve, reject) {\n store.get(key).onsuccess = function() {\n try {\n store.put(updater(this.result), key);\n resolve($e92a13782f6c06ba$export$b327150396135fe7(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n }));\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$1d2f21e549771e67(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.delete(key);\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$c8aa84257229cac8(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n keys.forEach(function(key) {\n return store.delete(key);\n });\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$42ffd38884aecdac() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.clear();\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\nfunction $e92a13782f6c06ba$var$eachCursor(store, callback) {\n store.openCursor().onsuccess = function() {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$ed97f33186d4b816() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAllKeys) return $e92a13782f6c06ba$export$b327150396135fe7(store.getAllKeys());\n var items = [];\n return $e92a13782f6c06ba$var$eachCursor(store, function(cursor) {\n return items.push(cursor.key);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$68c286be0e7e55b7() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAll) return $e92a13782f6c06ba$export$b327150396135fe7(store.getAll());\n var items = [];\n return $e92a13782f6c06ba$var$eachCursor(store, function(cursor) {\n return items.push(cursor.value);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$3e9f948b41964866() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) return Promise.all([\n $e92a13782f6c06ba$export$b327150396135fe7(store.getAllKeys()),\n $e92a13782f6c06ba$export$b327150396135fe7(store.getAll())\n ]).then(function(_ref) {\n var _ref2 = $e92a13782f6c06ba$var$_slicedToArray(_ref, 2), keys = _ref2[0], values = _ref2[1];\n return keys.map(function(key, i) {\n return [\n key,\n values[i]\n ];\n });\n });\n var items = [];\n return customStore(\"readonly\", function(store) {\n return $e92a13782f6c06ba$var$eachCursor(store, function(cursor) {\n return items.push([\n cursor.key,\n cursor.value\n ]);\n }).then(function() {\n return items;\n });\n });\n });\n}\n\n\nconst $b36f6cb20f27a9a6$var$STORAGE_PREFIX = \"rss-reader/\";\nconst $b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY = $b36f6cb20f27a9a6$var$STORAGE_PREFIX + \"feeds\";\nconst $b36f6cb20f27a9a6$var$getItem = async (key)=>{\n try {\n return {\n value: await (0, $e92a13782f6c06ba$export$3988ae62b71be9a3)(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error: error\n };\n }\n};\nconst $b36f6cb20f27a9a6$var$setItem = async (key, data)=>{\n try {\n await (0, $e92a13782f6c06ba$export$adaa4cf7ef1b65be)(key, data);\n return {\n error: void 0\n };\n } catch (error) {\n return {\n error: error\n };\n }\n};\nconst $b36f6cb20f27a9a6$export$4890c08c4ffbd57b = async ()=>{\n return $b36f6cb20f27a9a6$var$getItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY);\n};\nconst $b36f6cb20f27a9a6$export$a8ce8a4ec117f05e = async (feeds, shouldDispatchEvent = true)=>{\n if (!Array.isArray(feeds)) return;\n const { error: error } = await $b36f6cb20f27a9a6$var$setItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"set\",\n feeds: feeds\n }\n }));\n return {\n error: error\n };\n};\nconst $b36f6cb20f27a9a6$export$4b77448646caf424 = async (feed, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $b36f6cb20f27a9a6$export$4890c08c4ffbd57b();\n const foundFeed = feeds.find((f)=>f.url === feed.url);\n let action = \"\";\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = \"update\";\n } else {\n feeds.push(feed);\n action = \"create\";\n }\n const { error: error } = await $b36f6cb20f27a9a6$var$setItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: action,\n feed: feed\n }\n }));\n return {\n error: error\n };\n};\nconst $b36f6cb20f27a9a6$export$4e54c6fd9fa8b09b = async (feedUrl, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $b36f6cb20f27a9a6$export$4890c08c4ffbd57b();\n const filteredFeeds = feeds.filter((f)=>f.url !== feedUrl);\n const { error: error } = await $b36f6cb20f27a9a6$var$setItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY, filteredFeeds);\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) await (0, $e92a13782f6c06ba$export$1d2f21e549771e67)($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY);\n document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"delete\",\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n return {\n error: error\n };\n};\n\n\n/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */ const $8ca5c59aef5015ba$export$981c5d1bd3894713 = (url)=>{\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n\n\nconst $0c951fb6e39d40f6$var$template = document.createElement(\"template\");\n$0c951fb6e39d40f6$var$template.innerHTML = /* html */ `\n \n\n
          \n
          \n \n
          \n
          \n \n
          \n
          \n`;\nclass $0c951fb6e39d40f6$var$AddFeed extends HTMLElement {\n #formEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($0c951fb6e39d40f6$var$template.content.cloneNode(true));\n }\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n connectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n disconnectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n const input = evt.target[\"feed-url\"];\n const url = input.value.trim();\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n const urlExists = Boolean(feeds.find((feed)=>feed.url === url));\n const isValidURL = (0, $8ca5c59aef5015ba$export$981c5d1bd3894713)(url);\n if (!urlExists && isValidURL) await (0, $b36f6cb20f27a9a6$export$4b77448646caf424)({\n url: url,\n title: \"\" // Title is not available at this point; it will be fetched later.\n });\n input.value = \"\";\n }\n}\nif (!window.customElements.get(\"add-feed\")) window.customElements.define(\"add-feed\", $0c951fb6e39d40f6$var$AddFeed);\n\n\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */ function $da1f6dc1cffd4cb1$var$ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction $da1f6dc1cffd4cb1$var$_objectSpread2(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) $da1f6dc1cffd4cb1$var$ownKeys(Object(source), true).forEach(function(key) {\n $da1f6dc1cffd4cb1$var$_defineProperty(target, key, source[key]);\n });\n else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else $da1f6dc1cffd4cb1$var$ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction $da1f6dc1cffd4cb1$var$_typeof(obj) {\n \"@babel/helpers - typeof\";\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") $da1f6dc1cffd4cb1$var$_typeof = function(obj) {\n return typeof obj;\n };\n else $da1f6dc1cffd4cb1$var$_typeof = function(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n return $da1f6dc1cffd4cb1$var$_typeof(obj);\n}\nfunction $da1f6dc1cffd4cb1$var$_defineProperty(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction $da1f6dc1cffd4cb1$var$_extends() {\n $da1f6dc1cffd4cb1$var$_extends = Object.assign || function(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n return target;\n };\n return $da1f6dc1cffd4cb1$var$_extends.apply(this, arguments);\n}\nfunction $da1f6dc1cffd4cb1$var$_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction $da1f6dc1cffd4cb1$var$_objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = $da1f6dc1cffd4cb1$var$_objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceSymbolKeys.length; i++){\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction $da1f6dc1cffd4cb1$var$_toConsumableArray(arr) {\n return $da1f6dc1cffd4cb1$var$_arrayWithoutHoles(arr) || $da1f6dc1cffd4cb1$var$_iterableToArray(arr) || $da1f6dc1cffd4cb1$var$_unsupportedIterableToArray(arr) || $da1f6dc1cffd4cb1$var$_nonIterableSpread();\n}\nfunction $da1f6dc1cffd4cb1$var$_arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return $da1f6dc1cffd4cb1$var$_arrayLikeToArray(arr);\n}\nfunction $da1f6dc1cffd4cb1$var$_iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction $da1f6dc1cffd4cb1$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $da1f6dc1cffd4cb1$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $da1f6dc1cffd4cb1$var$_arrayLikeToArray(o, minLen);\n}\nfunction $da1f6dc1cffd4cb1$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $da1f6dc1cffd4cb1$var$_nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nvar $da1f6dc1cffd4cb1$var$version = \"1.15.2\";\nfunction $da1f6dc1cffd4cb1$var$userAgent(pattern) {\n if (typeof window !== \"undefined\" && window.navigator) return !!/*@__PURE__*/ navigator.userAgent.match(pattern);\n}\nvar $da1f6dc1cffd4cb1$var$IE11OrLess = $da1f6dc1cffd4cb1$var$userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar $da1f6dc1cffd4cb1$var$Edge = $da1f6dc1cffd4cb1$var$userAgent(/Edge/i);\nvar $da1f6dc1cffd4cb1$var$FireFox = $da1f6dc1cffd4cb1$var$userAgent(/firefox/i);\nvar $da1f6dc1cffd4cb1$var$Safari = $da1f6dc1cffd4cb1$var$userAgent(/safari/i) && !$da1f6dc1cffd4cb1$var$userAgent(/chrome/i) && !$da1f6dc1cffd4cb1$var$userAgent(/android/i);\nvar $da1f6dc1cffd4cb1$var$IOS = $da1f6dc1cffd4cb1$var$userAgent(/iP(ad|od|hone)/i);\nvar $da1f6dc1cffd4cb1$var$ChromeForAndroid = $da1f6dc1cffd4cb1$var$userAgent(/chrome/i) && $da1f6dc1cffd4cb1$var$userAgent(/android/i);\nvar $da1f6dc1cffd4cb1$var$captureMode = {\n capture: false,\n passive: false\n};\nfunction $da1f6dc1cffd4cb1$var$on(el, event, fn) {\n el.addEventListener(event, fn, !$da1f6dc1cffd4cb1$var$IE11OrLess && $da1f6dc1cffd4cb1$var$captureMode);\n}\nfunction $da1f6dc1cffd4cb1$var$off(el, event, fn) {\n el.removeEventListener(event, fn, !$da1f6dc1cffd4cb1$var$IE11OrLess && $da1f6dc1cffd4cb1$var$captureMode);\n}\nfunction $da1f6dc1cffd4cb1$var$matches(/**HTMLElement*/ el, /**String*/ selector) {\n if (!selector) return;\n selector[0] === \">\" && (selector = selector.substring(1));\n if (el) try {\n if (el.matches) return el.matches(selector);\n else if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n } catch (_) {\n return false;\n }\n return false;\n}\nfunction $da1f6dc1cffd4cb1$var$getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction $da1f6dc1cffd4cb1$var$closest(/**HTMLElement*/ el, /**String*/ selector, /**HTMLElement*/ ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === \">\" ? el.parentNode === ctx && $da1f6dc1cffd4cb1$var$matches(el, selector) : $da1f6dc1cffd4cb1$var$matches(el, selector)) || includeCTX && el === ctx) return el;\n if (el === ctx) break;\n /* jshint boss:true */ }while (el = $da1f6dc1cffd4cb1$var$getParentOrHost(el));\n }\n return null;\n}\nvar $da1f6dc1cffd4cb1$var$R_SPACE = /\\s+/g;\nfunction $da1f6dc1cffd4cb1$var$toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) el.classList[state ? \"add\" : \"remove\"](name);\n else {\n var className = (\" \" + el.className + \" \").replace($da1f6dc1cffd4cb1$var$R_SPACE, \" \").replace(\" \" + name + \" \", \" \");\n el.className = (className + (state ? \" \" + name : \"\")).replace($da1f6dc1cffd4cb1$var$R_SPACE, \" \");\n }\n }\n}\nfunction $da1f6dc1cffd4cb1$var$css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) val = document.defaultView.getComputedStyle(el, \"\");\n else if (el.currentStyle) val = el.currentStyle;\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf(\"webkit\") === -1) prop = \"-webkit-\" + prop;\n style[prop] = val + (typeof val === \"string\" ? \"\" : \"px\");\n }\n }\n}\nfunction $da1f6dc1cffd4cb1$var$matrix(el, selfOnly) {\n var appliedTransforms = \"\";\n if (typeof el === \"string\") appliedTransforms = el;\n else do {\n var transform = $da1f6dc1cffd4cb1$var$css(el, \"transform\");\n if (transform && transform !== \"none\") appliedTransforms = transform + \" \" + appliedTransforms;\n /* jshint boss:true */ }while (!selfOnly && (el = el.parentNode));\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */ return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction $da1f6dc1cffd4cb1$var$find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;\n if (iterator) for(; i < n; i++)iterator(list[i], i);\n return list;\n }\n return [];\n}\nfunction $da1f6dc1cffd4cb1$var$getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) return scrollingElement;\n else return document.documentElement;\n}\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */ function $da1f6dc1cffd4cb1$var$getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== $da1f6dc1cffd4cb1$var$getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!$da1f6dc1cffd4cb1$var$IE11OrLess) {\n do if (container && container.getBoundingClientRect && ($da1f6dc1cffd4cb1$var$css(container, \"transform\") !== \"none\" || relativeToNonStaticParent && $da1f6dc1cffd4cb1$var$css(container, \"position\") !== \"static\")) {\n var containerRect = container.getBoundingClientRect();\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt($da1f6dc1cffd4cb1$var$css(container, \"border-top-width\"));\n left -= containerRect.left + parseInt($da1f6dc1cffd4cb1$var$css(container, \"border-left-width\"));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = $da1f6dc1cffd4cb1$var$matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */ function $da1f6dc1cffd4cb1$var$isScrolledPast(el, elSide, parentSide) {\n var parent = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(el, true), elSideVal = $da1f6dc1cffd4cb1$var$getRect(el)[elSide];\n /* jshint boss:true */ while(parent){\n var parentSideVal = $da1f6dc1cffd4cb1$var$getRect(parent)[parentSide], visible = void 0;\n if (parentSide === \"top\" || parentSide === \"left\") visible = elSideVal >= parentSideVal;\n else visible = elSideVal <= parentSideVal;\n if (!visible) return parent;\n if (parent === $da1f6dc1cffd4cb1$var$getWindowScrollingElement()) break;\n parent = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */ function $da1f6dc1cffd4cb1$var$getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0, i = 0, children = el.children;\n while(i < children.length){\n if (children[i].style.display !== \"none\" && children[i] !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost && (includeDragEl || children[i] !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged) && $da1f6dc1cffd4cb1$var$closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) return children[i];\n currentChild++;\n }\n i++;\n }\n return null;\n}\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */ function $da1f6dc1cffd4cb1$var$lastChild(el, selector) {\n var last = el.lastElementChild;\n while(last && (last === $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost || $da1f6dc1cffd4cb1$var$css(last, \"display\") === \"none\" || selector && !$da1f6dc1cffd4cb1$var$matches(last, selector)))last = last.previousElementSibling;\n return last || null;\n}\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */ function $da1f6dc1cffd4cb1$var$index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) return -1;\n /* jshint boss:true */ while(el = el.previousElementSibling)if (el.nodeName.toUpperCase() !== \"TEMPLATE\" && el !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.clone && (!selector || $da1f6dc1cffd4cb1$var$matches(el, selector))) index++;\n return index;\n}\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */ function $da1f6dc1cffd4cb1$var$getRelativeScrollOffset(el) {\n var offsetLeft = 0, offsetTop = 0, winScroller = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n if (el) do {\n var elMatrix = $da1f6dc1cffd4cb1$var$matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n }while (el !== winScroller && (el = el.parentNode));\n return [\n offsetLeft,\n offsetTop\n ];\n}\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */ function $da1f6dc1cffd4cb1$var$indexOfObject(arr, obj) {\n for(var i in arr){\n if (!arr.hasOwnProperty(i)) continue;\n for(var key in obj){\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = $da1f6dc1cffd4cb1$var$css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == \"auto\" || elemCSS.overflowX == \"scroll\") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == \"auto\" || elemCSS.overflowY == \"scroll\")) {\n if (!elem.getBoundingClientRect || elem === document.body) return $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n while (elem = elem.parentNode);\n return $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n}\nfunction $da1f6dc1cffd4cb1$var$extend(dst, src) {\n if (dst && src) {\n for(var key in src)if (src.hasOwnProperty(key)) dst[key] = src[key];\n }\n return dst;\n}\nfunction $da1f6dc1cffd4cb1$var$isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar $da1f6dc1cffd4cb1$var$_throttleTimeout;\nfunction $da1f6dc1cffd4cb1$var$throttle(callback, ms) {\n return function() {\n if (!$da1f6dc1cffd4cb1$var$_throttleTimeout) {\n var args = arguments, _this = this;\n if (args.length === 1) callback.call(_this, args[0]);\n else callback.apply(_this, args);\n $da1f6dc1cffd4cb1$var$_throttleTimeout = setTimeout(function() {\n $da1f6dc1cffd4cb1$var$_throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction $da1f6dc1cffd4cb1$var$cancelThrottle() {\n clearTimeout($da1f6dc1cffd4cb1$var$_throttleTimeout);\n $da1f6dc1cffd4cb1$var$_throttleTimeout = void 0;\n}\nfunction $da1f6dc1cffd4cb1$var$scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction $da1f6dc1cffd4cb1$var$clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) return Polymer.dom(el).cloneNode(true);\n else if ($) return $(el).clone(true)[0];\n else return el.cloneNode(true);\n}\nfunction $da1f6dc1cffd4cb1$var$setRect(el, rect) {\n $da1f6dc1cffd4cb1$var$css(el, \"position\", \"absolute\");\n $da1f6dc1cffd4cb1$var$css(el, \"top\", rect.top);\n $da1f6dc1cffd4cb1$var$css(el, \"left\", rect.left);\n $da1f6dc1cffd4cb1$var$css(el, \"width\", rect.width);\n $da1f6dc1cffd4cb1$var$css(el, \"height\", rect.height);\n}\nfunction $da1f6dc1cffd4cb1$var$unsetRect(el) {\n $da1f6dc1cffd4cb1$var$css(el, \"position\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"top\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"left\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"width\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"height\", \"\");\n}\nfunction $da1f6dc1cffd4cb1$var$getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function(child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!$da1f6dc1cffd4cb1$var$closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = $da1f6dc1cffd4cb1$var$getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar $da1f6dc1cffd4cb1$var$expando = \"Sortable\" + new Date().getTime();\nfunction $da1f6dc1cffd4cb1$var$AnimationStateManager() {\n var animationStates = [], animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function(child) {\n if ($da1f6dc1cffd4cb1$var$css(child, \"display\") === \"none\" || child === $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost) return;\n animationStates.push({\n target: child,\n rect: $da1f6dc1cffd4cb1$var$getRect(child)\n });\n var fromRect = $da1f6dc1cffd4cb1$var$_objectSpread2({}, animationStates[animationStates.length - 1].rect);\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = $da1f6dc1cffd4cb1$var$matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice($da1f6dc1cffd4cb1$var$indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === \"function\") callback();\n return;\n }\n var animating = false, animationTime = 0;\n animationStates.forEach(function(state) {\n var time = 0, target = state.target, fromRect = target.fromRect, toRect = $da1f6dc1cffd4cb1$var$getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = $da1f6dc1cffd4cb1$var$matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) // Could also check if animatingRect is between fromRect and toRect\n {\n if ($da1f6dc1cffd4cb1$var$isRectEqual(prevFromRect, toRect) && !$da1f6dc1cffd4cb1$var$isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) // If returning to same place as started from animation and on same axis\n time = $da1f6dc1cffd4cb1$var$calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n // if fromRect != toRect: animate\n if (!$da1f6dc1cffd4cb1$var$isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) time = _this.options.animation;\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function() {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === \"function\") callback();\n } else animationCallbackId = setTimeout(function() {\n if (typeof callback === \"function\") callback();\n }, animationTime);\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n $da1f6dc1cffd4cb1$var$css(target, \"transition\", \"\");\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"\");\n var elMatrix = $da1f6dc1cffd4cb1$var$matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"translate3d(\" + translateX + \"px,\" + translateY + \"px,0)\");\n this.forRepaintDummy = $da1f6dc1cffd4cb1$var$repaint(target); // repaint\n $da1f6dc1cffd4cb1$var$css(target, \"transition\", \"transform \" + duration + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\"));\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"translate3d(0,0,0)\");\n typeof target.animated === \"number\" && clearTimeout(target.animated);\n target.animated = setTimeout(function() {\n $da1f6dc1cffd4cb1$var$css(target, \"transition\", \"\");\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"\");\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction $da1f6dc1cffd4cb1$var$repaint(target) {\n return target.offsetWidth;\n}\nfunction $da1f6dc1cffd4cb1$var$calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\nvar $da1f6dc1cffd4cb1$var$plugins = [];\nvar $da1f6dc1cffd4cb1$var$defaults = {\n initializeByDefault: true\n};\nvar $da1f6dc1cffd4cb1$var$PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for(var option in $da1f6dc1cffd4cb1$var$defaults)if ($da1f6dc1cffd4cb1$var$defaults.hasOwnProperty(option) && !(option in plugin)) plugin[option] = $da1f6dc1cffd4cb1$var$defaults[option];\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(p) {\n if (p.pluginName === plugin.pluginName) throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n });\n $da1f6dc1cffd4cb1$var$plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function() {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + \"Global\";\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) sortable[plugin.pluginName][eventNameGlobal]($da1f6dc1cffd4cb1$var$_objectSpread2({\n sortable: sortable\n }, evt));\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) sortable[plugin.pluginName][eventName]($da1f6dc1cffd4cb1$var$_objectSpread2({\n sortable: sortable\n }, evt));\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n // Add default options from plugin\n $da1f6dc1cffd4cb1$var$_extends(defaults, initialized.defaults);\n });\n for(var option in sortable.options){\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== \"undefined\") sortable.options[option] = modified;\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n if (typeof plugin.eventProperties !== \"function\") return;\n $da1f6dc1cffd4cb1$var$_extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === \"function\") modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n });\n return modifiedValue;\n }\n};\nfunction $da1f6dc1cffd4cb1$var$dispatchEvent(_ref) {\n var sortable = _ref.sortable, rootEl = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex = _ref.oldIndex, newIndex = _ref.newIndex, oldDraggableIndex = _ref.oldDraggableIndex, newDraggableIndex = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[$da1f6dc1cffd4cb1$var$expando];\n if (!sortable) return;\n var evt, options = sortable.options, onName = \"on\" + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$da1f6dc1cffd4cb1$var$IE11OrLess && !$da1f6dc1cffd4cb1$var$Edge) evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = $da1f6dc1cffd4cb1$var$_objectSpread2($da1f6dc1cffd4cb1$var$_objectSpread2({}, extraEventProperties), $da1f6dc1cffd4cb1$var$PluginManager.getEventProperties(name, sortable));\n for(var option in allEventProperties)evt[option] = allEventProperties[option];\n if (rootEl) rootEl.dispatchEvent(evt);\n if (options[onName]) options[onName].call(sortable, evt);\n}\nvar $da1f6dc1cffd4cb1$var$_excluded = [\n \"evt\"\n];\nvar $da1f6dc1cffd4cb1$var$pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, originalEvent = _ref.evt, data = $da1f6dc1cffd4cb1$var$_objectWithoutProperties(_ref, $da1f6dc1cffd4cb1$var$_excluded);\n $da1f6dc1cffd4cb1$var$PluginManager.pluginEvent.bind($da1f6dc1cffd4cb1$export$31b3ca70d8f57423)(eventName, sortable, $da1f6dc1cffd4cb1$var$_objectSpread2({\n dragEl: $da1f6dc1cffd4cb1$var$dragEl,\n parentEl: $da1f6dc1cffd4cb1$var$parentEl,\n ghostEl: $da1f6dc1cffd4cb1$var$ghostEl,\n rootEl: $da1f6dc1cffd4cb1$var$rootEl,\n nextEl: $da1f6dc1cffd4cb1$var$nextEl,\n lastDownEl: $da1f6dc1cffd4cb1$var$lastDownEl,\n cloneEl: $da1f6dc1cffd4cb1$var$cloneEl,\n cloneHidden: $da1f6dc1cffd4cb1$var$cloneHidden,\n dragStarted: $da1f6dc1cffd4cb1$var$moved,\n putSortable: $da1f6dc1cffd4cb1$var$putSortable,\n activeSortable: $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active,\n originalEvent: originalEvent,\n oldIndex: $da1f6dc1cffd4cb1$var$oldIndex,\n oldDraggableIndex: $da1f6dc1cffd4cb1$var$oldDraggableIndex,\n newIndex: $da1f6dc1cffd4cb1$var$newIndex,\n newDraggableIndex: $da1f6dc1cffd4cb1$var$newDraggableIndex,\n hideGhostForTarget: $da1f6dc1cffd4cb1$var$_hideGhostForTarget,\n unhideGhostForTarget: $da1f6dc1cffd4cb1$var$_unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n $da1f6dc1cffd4cb1$var$cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n $da1f6dc1cffd4cb1$var$cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction $da1f6dc1cffd4cb1$var$_dispatchEvent(info) {\n $da1f6dc1cffd4cb1$var$dispatchEvent($da1f6dc1cffd4cb1$var$_objectSpread2({\n putSortable: $da1f6dc1cffd4cb1$var$putSortable,\n cloneEl: $da1f6dc1cffd4cb1$var$cloneEl,\n targetEl: $da1f6dc1cffd4cb1$var$dragEl,\n rootEl: $da1f6dc1cffd4cb1$var$rootEl,\n oldIndex: $da1f6dc1cffd4cb1$var$oldIndex,\n oldDraggableIndex: $da1f6dc1cffd4cb1$var$oldDraggableIndex,\n newIndex: $da1f6dc1cffd4cb1$var$newIndex,\n newDraggableIndex: $da1f6dc1cffd4cb1$var$newDraggableIndex\n }, info));\n}\nvar $da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$parentEl, $da1f6dc1cffd4cb1$var$ghostEl, $da1f6dc1cffd4cb1$var$rootEl, $da1f6dc1cffd4cb1$var$nextEl, $da1f6dc1cffd4cb1$var$lastDownEl, $da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$cloneHidden, $da1f6dc1cffd4cb1$var$oldIndex, $da1f6dc1cffd4cb1$var$newIndex, $da1f6dc1cffd4cb1$var$oldDraggableIndex, $da1f6dc1cffd4cb1$var$newDraggableIndex, $da1f6dc1cffd4cb1$var$activeGroup, $da1f6dc1cffd4cb1$var$putSortable, $da1f6dc1cffd4cb1$var$awaitingDragStarted = false, $da1f6dc1cffd4cb1$var$ignoreNextClick = false, $da1f6dc1cffd4cb1$var$sortables = [], $da1f6dc1cffd4cb1$var$tapEvt, $da1f6dc1cffd4cb1$var$touchEvt, $da1f6dc1cffd4cb1$var$lastDx, $da1f6dc1cffd4cb1$var$lastDy, $da1f6dc1cffd4cb1$var$tapDistanceLeft, $da1f6dc1cffd4cb1$var$tapDistanceTop, $da1f6dc1cffd4cb1$var$moved, $da1f6dc1cffd4cb1$var$lastTarget, $da1f6dc1cffd4cb1$var$lastDirection, $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = false, $da1f6dc1cffd4cb1$var$isCircumstantialInvert = false, $da1f6dc1cffd4cb1$var$targetMoveDistance, // For positioning ghost absolutely\n$da1f6dc1cffd4cb1$var$ghostRelativeParent, $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll = [], // (left, top)\n$da1f6dc1cffd4cb1$var$_silent = false, $da1f6dc1cffd4cb1$var$savedInputChecked = [];\n/** @const */ var $da1f6dc1cffd4cb1$var$documentExists = typeof document !== \"undefined\", $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely = $da1f6dc1cffd4cb1$var$IOS, $da1f6dc1cffd4cb1$var$CSSFloatProperty = $da1f6dc1cffd4cb1$var$Edge || $da1f6dc1cffd4cb1$var$IE11OrLess ? \"cssFloat\" : \"float\", // This will not pass for IE9, because IE9 DnD only works on anchors\n$da1f6dc1cffd4cb1$var$supportDraggable = $da1f6dc1cffd4cb1$var$documentExists && !$da1f6dc1cffd4cb1$var$ChromeForAndroid && !$da1f6dc1cffd4cb1$var$IOS && \"draggable\" in document.createElement(\"div\"), $da1f6dc1cffd4cb1$var$supportCssPointerEvents = function() {\n if (!$da1f6dc1cffd4cb1$var$documentExists) return;\n // false when <= IE11\n if ($da1f6dc1cffd4cb1$var$IE11OrLess) return false;\n var el = document.createElement(\"x\");\n el.style.cssText = \"pointer-events:auto\";\n return el.style.pointerEvents === \"auto\";\n}(), $da1f6dc1cffd4cb1$var$_detectDirection = function _detectDirection(el, options) {\n var elCSS = $da1f6dc1cffd4cb1$var$css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = $da1f6dc1cffd4cb1$var$getChild(el, 0, options), child2 = $da1f6dc1cffd4cb1$var$getChild(el, 1, options), firstChildCSS = child1 && $da1f6dc1cffd4cb1$var$css(child1), secondChildCSS = child2 && $da1f6dc1cffd4cb1$var$css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + $da1f6dc1cffd4cb1$var$getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + $da1f6dc1cffd4cb1$var$getRect(child2).width;\n if (elCSS.display === \"flex\") return elCSS.flexDirection === \"column\" || elCSS.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n if (elCSS.display === \"grid\") return elCSS.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== \"none\") {\n var touchingSideChild2 = firstChildCSS[\"float\"] === \"left\" ? \"left\" : \"right\";\n return child2 && (secondChildCSS.clear === \"both\" || secondChildCSS.clear === touchingSideChild2) ? \"vertical\" : \"horizontal\";\n }\n return child1 && (firstChildCSS.display === \"block\" || firstChildCSS.display === \"flex\" || firstChildCSS.display === \"table\" || firstChildCSS.display === \"grid\" || firstChildWidth >= elWidth && elCSS[$da1f6dc1cffd4cb1$var$CSSFloatProperty] === \"none\" || child2 && elCSS[$da1f6dc1cffd4cb1$var$CSSFloatProperty] === \"none\" && firstChildWidth + secondChildWidth > elWidth) ? \"vertical\" : \"horizontal\";\n}, $da1f6dc1cffd4cb1$var$_dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n}, /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */ $da1f6dc1cffd4cb1$var$_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n $da1f6dc1cffd4cb1$var$sortables.some(function(sortable) {\n var threshold = sortable[$da1f6dc1cffd4cb1$var$expando].options.emptyInsertThreshold;\n if (!threshold || $da1f6dc1cffd4cb1$var$lastChild(sortable)) return;\n var rect = $da1f6dc1cffd4cb1$var$getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) return ret = sortable;\n });\n return ret;\n}, $da1f6dc1cffd4cb1$var$_prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function(to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) // Default pull value\n // Default pull and put value if same group\n return true;\n else if (value == null || value === false) return false;\n else if (pull && value === \"clone\") return value;\n else if (typeof value === \"function\") return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === \"string\" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || $da1f6dc1cffd4cb1$var$_typeof(originalGroup) != \"object\") originalGroup = {\n name: originalGroup\n };\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n}, $da1f6dc1cffd4cb1$var$_hideGhostForTarget = function _hideGhostForTarget() {\n if (!$da1f6dc1cffd4cb1$var$supportCssPointerEvents && $da1f6dc1cffd4cb1$var$ghostEl) $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"display\", \"none\");\n}, $da1f6dc1cffd4cb1$var$_unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!$da1f6dc1cffd4cb1$var$supportCssPointerEvents && $da1f6dc1cffd4cb1$var$ghostEl) $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"display\", \"\");\n};\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif ($da1f6dc1cffd4cb1$var$documentExists && !$da1f6dc1cffd4cb1$var$ChromeForAndroid) document.addEventListener(\"click\", function(evt) {\n if ($da1f6dc1cffd4cb1$var$ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n $da1f6dc1cffd4cb1$var$ignoreNextClick = false;\n return false;\n }\n}, true);\nvar $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if ($da1f6dc1cffd4cb1$var$dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = $da1f6dc1cffd4cb1$var$_detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for(var i in evt)if (evt.hasOwnProperty(i)) event[i] = evt[i];\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[$da1f6dc1cffd4cb1$var$expando]._onDragOver(event);\n }\n }\n};\nvar $da1f6dc1cffd4cb1$var$_checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if ($da1f6dc1cffd4cb1$var$dragEl) $da1f6dc1cffd4cb1$var$dragEl.parentNode[$da1f6dc1cffd4cb1$var$expando]._isOutsideThisEl(evt.target);\n};\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ function $da1f6dc1cffd4cb1$export$31b3ca70d8f57423(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) throw \"Sortable: `el` must be an HTMLElement, not \".concat(({}).toString.call(el));\n this.el = el; // root element\n this.options = options = $da1f6dc1cffd4cb1$var$_extends({}, options);\n // Export instance\n el[$da1f6dc1cffd4cb1$var$expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? \">li\" : \">*\",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return $da1f6dc1cffd4cb1$var$_detectDirection(el, this.options);\n },\n ghostClass: \"sortable-ghost\",\n chosenClass: \"sortable-chosen\",\n dragClass: \"sortable-drag\",\n ignore: \"a, img\",\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData(\"Text\", dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: \"data-id\",\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: \"sortable-fallback\",\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.supportPointer !== false && \"PointerEvent\" in window && !$da1f6dc1cffd4cb1$var$Safari,\n emptyInsertThreshold: 5\n };\n $da1f6dc1cffd4cb1$var$PluginManager.initializePlugins(this, el, defaults);\n // Set default options\n for(var name in defaults)!(name in options) && (options[name] = defaults[name]);\n $da1f6dc1cffd4cb1$var$_prepareGroup(options);\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : $da1f6dc1cffd4cb1$var$supportDraggable;\n if (this.nativeDraggable) // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n // Bind events\n if (options.supportPointer) $da1f6dc1cffd4cb1$var$on(el, \"pointerdown\", this._onTapStart);\n else {\n $da1f6dc1cffd4cb1$var$on(el, \"mousedown\", this._onTapStart);\n $da1f6dc1cffd4cb1$var$on(el, \"touchstart\", this._onTapStart);\n }\n if (this.nativeDraggable) {\n $da1f6dc1cffd4cb1$var$on(el, \"dragover\", this);\n $da1f6dc1cffd4cb1$var$on(el, \"dragenter\", this);\n }\n $da1f6dc1cffd4cb1$var$sortables.push(this.el);\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n // Add animation state manager\n $da1f6dc1cffd4cb1$var$_extends(this, $da1f6dc1cffd4cb1$var$AnimationStateManager());\n}\n$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.prototype = /** @lends Sortable.prototype */ {\n constructor: $da1f6dc1cffd4cb1$export$31b3ca70d8f57423,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) $da1f6dc1cffd4cb1$var$lastTarget = null;\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === \"function\" ? this.options.direction.call(this, evt, target, $da1f6dc1cffd4cb1$var$dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(/** Event|TouchEvent */ evt) {\n if (!evt.cancelable) return;\n var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === \"touch\" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter;\n $da1f6dc1cffd4cb1$var$_saveInputCheckedState(el);\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if ($da1f6dc1cffd4cb1$var$dragEl) return;\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) return; // only left button and enabled\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) return;\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && $da1f6dc1cffd4cb1$var$Safari && target && target.tagName.toUpperCase() === \"SELECT\") return;\n target = $da1f6dc1cffd4cb1$var$closest(target, options.draggable, el, false);\n if (target && target.animated) return;\n if ($da1f6dc1cffd4cb1$var$lastDownEl === target) // Ignoring duplicate `down`\n return;\n // Get the index of the dragged element within its parent\n $da1f6dc1cffd4cb1$var$oldIndex = $da1f6dc1cffd4cb1$var$index(target);\n $da1f6dc1cffd4cb1$var$oldDraggableIndex = $da1f6dc1cffd4cb1$var$index(target, options.draggable);\n // Check filter\n if (typeof filter === \"function\") {\n if (filter.call(this, evt, target, this)) {\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: \"filter\",\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n $da1f6dc1cffd4cb1$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(\",\").some(function(criteria) {\n criteria = $da1f6dc1cffd4cb1$var$closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: \"filter\",\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n $da1f6dc1cffd4cb1$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !$da1f6dc1cffd4cb1$var$closest(originalTarget, options.handle, el, false)) return;\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(/** Event */ evt, /** Touch */ touch, /** HTMLElement */ target) {\n var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;\n if (target && !$da1f6dc1cffd4cb1$var$dragEl && target.parentNode === el) {\n var dragRect = $da1f6dc1cffd4cb1$var$getRect(target);\n $da1f6dc1cffd4cb1$var$rootEl = el;\n $da1f6dc1cffd4cb1$var$dragEl = target;\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$dragEl.parentNode;\n $da1f6dc1cffd4cb1$var$nextEl = $da1f6dc1cffd4cb1$var$dragEl.nextSibling;\n $da1f6dc1cffd4cb1$var$lastDownEl = target;\n $da1f6dc1cffd4cb1$var$activeGroup = options.group;\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged = $da1f6dc1cffd4cb1$var$dragEl;\n $da1f6dc1cffd4cb1$var$tapEvt = {\n target: $da1f6dc1cffd4cb1$var$dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n $da1f6dc1cffd4cb1$var$tapDistanceLeft = $da1f6dc1cffd4cb1$var$tapEvt.clientX - dragRect.left;\n $da1f6dc1cffd4cb1$var$tapDistanceTop = $da1f6dc1cffd4cb1$var$tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n $da1f6dc1cffd4cb1$var$dragEl.style[\"will-change\"] = \"all\";\n dragStartFn = function dragStartFn() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"delayEnded\", _this, {\n evt: evt\n });\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!$da1f6dc1cffd4cb1$var$FireFox && _this.nativeDraggable) $da1f6dc1cffd4cb1$var$dragEl.draggable = true;\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n // Drag start event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n name: \"choose\",\n originalEvent: evt\n });\n // Chosen item\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.chosenClass, true);\n };\n // Disable \"draggable\"\n options.ignore.split(\",\").forEach(function(criteria) {\n $da1f6dc1cffd4cb1$var$find($da1f6dc1cffd4cb1$var$dragEl, criteria.trim(), $da1f6dc1cffd4cb1$var$_disableDraggable);\n });\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"dragover\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mousemove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchmove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mouseup\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchend\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchcancel\", _this._onDrop);\n // Make dragEl draggable (must be before delay for FireFox)\n if ($da1f6dc1cffd4cb1$var$FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n $da1f6dc1cffd4cb1$var$dragEl.draggable = true;\n }\n $da1f6dc1cffd4cb1$var$pluginEvent(\"delayStart\", this, {\n evt: evt\n });\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !($da1f6dc1cffd4cb1$var$Edge || $da1f6dc1cffd4cb1$var$IE11OrLess))) {\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mouseup\", _this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchend\", _this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchcancel\", _this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mousemove\", _this._delayedDragTouchMoveHandler);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchmove\", _this._delayedDragTouchMoveHandler);\n options.supportPointer && $da1f6dc1cffd4cb1$var$on(ownerDocument, \"pointermove\", _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else dragStartFn();\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(/** TouchEvent|PointerEvent **/ e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) this._disableDelayedDrag();\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n $da1f6dc1cffd4cb1$var$dragEl && $da1f6dc1cffd4cb1$var$_disableDraggable($da1f6dc1cffd4cb1$var$dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"mouseup\", this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchend\", this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchcancel\", this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"mousemove\", this._delayedDragTouchMoveHandler);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchmove\", this._delayedDragTouchMoveHandler);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"pointermove\", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(/** Event */ evt, /** Touch */ touch) {\n touch = touch || evt.pointerType == \"touch\" && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) $da1f6dc1cffd4cb1$var$on(document, \"pointermove\", this._onTouchMove);\n else if (touch) $da1f6dc1cffd4cb1$var$on(document, \"touchmove\", this._onTouchMove);\n else $da1f6dc1cffd4cb1$var$on(document, \"mousemove\", this._onTouchMove);\n } else {\n $da1f6dc1cffd4cb1$var$on($da1f6dc1cffd4cb1$var$dragEl, \"dragend\", this);\n $da1f6dc1cffd4cb1$var$on($da1f6dc1cffd4cb1$var$rootEl, \"dragstart\", this._onDragStart);\n }\n try {\n if (document.selection) // Timeout neccessary for IE9\n $da1f6dc1cffd4cb1$var$_nextTick(function() {\n document.selection.empty();\n });\n else window.getSelection().removeAllRanges();\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n $da1f6dc1cffd4cb1$var$awaitingDragStarted = false;\n if ($da1f6dc1cffd4cb1$var$rootEl && $da1f6dc1cffd4cb1$var$dragEl) {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"dragStarted\", this, {\n evt: evt\n });\n if (this.nativeDraggable) $da1f6dc1cffd4cb1$var$on(document, \"dragover\", $da1f6dc1cffd4cb1$var$_checkOutsideTargetEl);\n var options = this.options;\n // Apply effect\n !fallback && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.dragClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.ghostClass, true);\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active = this;\n fallback && this._appendGhost();\n // Drag start event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"start\",\n originalEvent: evt\n });\n } else this._nulling();\n },\n _emulateDragOver: function _emulateDragOver() {\n if ($da1f6dc1cffd4cb1$var$touchEvt) {\n this._lastX = $da1f6dc1cffd4cb1$var$touchEvt.clientX;\n this._lastY = $da1f6dc1cffd4cb1$var$touchEvt.clientY;\n $da1f6dc1cffd4cb1$var$_hideGhostForTarget();\n var target = document.elementFromPoint($da1f6dc1cffd4cb1$var$touchEvt.clientX, $da1f6dc1cffd4cb1$var$touchEvt.clientY);\n var parent = target;\n while(target && target.shadowRoot){\n target = target.shadowRoot.elementFromPoint($da1f6dc1cffd4cb1$var$touchEvt.clientX, $da1f6dc1cffd4cb1$var$touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n $da1f6dc1cffd4cb1$var$dragEl.parentNode[$da1f6dc1cffd4cb1$var$expando]._isOutsideThisEl(target);\n if (parent) do {\n if (parent[$da1f6dc1cffd4cb1$var$expando]) {\n var inserted = void 0;\n inserted = parent[$da1f6dc1cffd4cb1$var$expando]._onDragOver({\n clientX: $da1f6dc1cffd4cb1$var$touchEvt.clientX,\n clientY: $da1f6dc1cffd4cb1$var$touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) break;\n }\n target = parent; // store last element\n }while (parent = parent.parentNode);\n $da1f6dc1cffd4cb1$var$_unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(/**TouchEvent*/ evt) {\n if ($da1f6dc1cffd4cb1$var$tapEvt) {\n var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = $da1f6dc1cffd4cb1$var$ghostEl && $da1f6dc1cffd4cb1$var$matrix($da1f6dc1cffd4cb1$var$ghostEl, true), scaleX = $da1f6dc1cffd4cb1$var$ghostEl && ghostMatrix && ghostMatrix.a, scaleY = $da1f6dc1cffd4cb1$var$ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely && $da1f6dc1cffd4cb1$var$ghostRelativeParent && $da1f6dc1cffd4cb1$var$getRelativeScrollOffset($da1f6dc1cffd4cb1$var$ghostRelativeParent), dx = (touch.clientX - $da1f6dc1cffd4cb1$var$tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - $da1f6dc1cffd4cb1$var$tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n // only set the status to dragging, when we are actually dragging\n if (!$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active && !$da1f6dc1cffd4cb1$var$awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) return;\n this._onDragStart(evt, true);\n }\n if ($da1f6dc1cffd4cb1$var$ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - ($da1f6dc1cffd4cb1$var$lastDx || 0);\n ghostMatrix.f += dy - ($da1f6dc1cffd4cb1$var$lastDy || 0);\n } else ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"webkitTransform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"mozTransform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"msTransform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$lastDx = dx;\n $da1f6dc1cffd4cb1$var$lastDy = dy;\n $da1f6dc1cffd4cb1$var$touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!$da1f6dc1cffd4cb1$var$ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : $da1f6dc1cffd4cb1$var$rootEl, rect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl, true, $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely, true, container), options = this.options;\n // Position absolutely\n if ($da1f6dc1cffd4cb1$var$PositionGhostAbsolutely) {\n // Get relatively positioned parent\n $da1f6dc1cffd4cb1$var$ghostRelativeParent = container;\n while($da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostRelativeParent, \"position\") === \"static\" && $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostRelativeParent, \"transform\") === \"none\" && $da1f6dc1cffd4cb1$var$ghostRelativeParent !== document)$da1f6dc1cffd4cb1$var$ghostRelativeParent = $da1f6dc1cffd4cb1$var$ghostRelativeParent.parentNode;\n if ($da1f6dc1cffd4cb1$var$ghostRelativeParent !== document.body && $da1f6dc1cffd4cb1$var$ghostRelativeParent !== document.documentElement) {\n if ($da1f6dc1cffd4cb1$var$ghostRelativeParent === document) $da1f6dc1cffd4cb1$var$ghostRelativeParent = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n rect.top += $da1f6dc1cffd4cb1$var$ghostRelativeParent.scrollTop;\n rect.left += $da1f6dc1cffd4cb1$var$ghostRelativeParent.scrollLeft;\n } else $da1f6dc1cffd4cb1$var$ghostRelativeParent = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll = $da1f6dc1cffd4cb1$var$getRelativeScrollOffset($da1f6dc1cffd4cb1$var$ghostRelativeParent);\n }\n $da1f6dc1cffd4cb1$var$ghostEl = $da1f6dc1cffd4cb1$var$dragEl.cloneNode(true);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$ghostEl, options.ghostClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$ghostEl, options.fallbackClass, true);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$ghostEl, options.dragClass, true);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transition\", \"\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transform\", \"\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"box-sizing\", \"border-box\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"margin\", 0);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"top\", rect.top);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"left\", rect.left);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"width\", rect.width);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"height\", rect.height);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"opacity\", \"0.8\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"position\", $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely ? \"absolute\" : \"fixed\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"zIndex\", \"100000\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"pointerEvents\", \"none\");\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost = $da1f6dc1cffd4cb1$var$ghostEl;\n container.appendChild($da1f6dc1cffd4cb1$var$ghostEl);\n // Set transform-origin\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transform-origin\", $da1f6dc1cffd4cb1$var$tapDistanceLeft / parseInt($da1f6dc1cffd4cb1$var$ghostEl.style.width) * 100 + \"% \" + $da1f6dc1cffd4cb1$var$tapDistanceTop / parseInt($da1f6dc1cffd4cb1$var$ghostEl.style.height) * 100 + \"%\");\n }\n },\n _onDragStart: function _onDragStart(/**Event*/ evt, /**boolean*/ fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n $da1f6dc1cffd4cb1$var$pluginEvent(\"dragStart\", this, {\n evt: evt\n });\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n $da1f6dc1cffd4cb1$var$pluginEvent(\"setupClone\", this);\n if (!$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n $da1f6dc1cffd4cb1$var$cloneEl = $da1f6dc1cffd4cb1$var$clone($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$cloneEl.removeAttribute(\"id\");\n $da1f6dc1cffd4cb1$var$cloneEl.draggable = false;\n $da1f6dc1cffd4cb1$var$cloneEl.style[\"will-change\"] = \"\";\n this._hideClone();\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$cloneEl, this.options.chosenClass, false);\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.clone = $da1f6dc1cffd4cb1$var$cloneEl;\n }\n // #1143: IFrame support workaround\n _this.cloneId = $da1f6dc1cffd4cb1$var$_nextTick(function() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"clone\", _this);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$dragEl);\n _this._hideClone();\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n name: \"clone\"\n });\n });\n !fallback && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.dragClass, true);\n // Set proper drop events\n if (fallback) {\n $da1f6dc1cffd4cb1$var$ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n $da1f6dc1cffd4cb1$var$off(document, \"mouseup\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$off(document, \"touchend\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$off(document, \"touchcancel\", _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = \"move\";\n options.setData && options.setData.call(_this, dataTransfer, $da1f6dc1cffd4cb1$var$dragEl);\n }\n $da1f6dc1cffd4cb1$var$on(document, \"drop\", _this);\n // #1276 fix:\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$dragEl, \"transform\", \"translateZ(0)\");\n }\n $da1f6dc1cffd4cb1$var$awaitingDragStarted = true;\n _this._dragStartId = $da1f6dc1cffd4cb1$var$_nextTick(_this._dragStarted.bind(_this, fallback, evt));\n $da1f6dc1cffd4cb1$var$on(document, \"selectstart\", _this);\n $da1f6dc1cffd4cb1$var$moved = true;\n if ($da1f6dc1cffd4cb1$var$Safari) $da1f6dc1cffd4cb1$var$css(document.body, \"user-select\", \"none\");\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(/**Event*/ evt) {\n var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active, isOwner = $da1f6dc1cffd4cb1$var$activeGroup === group, canSort = options.sort, fromSortable = $da1f6dc1cffd4cb1$var$putSortable || activeSortable, vertical, _this = this, completedFired = false;\n if ($da1f6dc1cffd4cb1$var$_silent) return;\n function dragOverEvent(name, extra) {\n $da1f6dc1cffd4cb1$var$pluginEvent(name, _this, $da1f6dc1cffd4cb1$var$_objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? \"vertical\" : \"horizontal\",\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return $da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, $da1f6dc1cffd4cb1$var$getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n // Capture animation state\n function capture() {\n dragOverEvent(\"dragOverAnimationCapture\");\n _this.captureAnimationState();\n if (_this !== fromSortable) fromSortable.captureAnimationState();\n }\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent(\"dragOverCompleted\", {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n else activeSortable._showClone(_this);\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$putSortable ? $da1f6dc1cffd4cb1$var$putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.ghostClass, true);\n }\n if ($da1f6dc1cffd4cb1$var$putSortable !== _this && _this !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active) $da1f6dc1cffd4cb1$var$putSortable = _this;\n else if (_this === $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active && $da1f6dc1cffd4cb1$var$putSortable) $da1f6dc1cffd4cb1$var$putSortable = null;\n // Animation\n if (fromSortable === _this) _this._ignoreWhileAnimating = target;\n _this.animateAll(function() {\n dragOverEvent(\"dragOverAnimationComplete\");\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n // Null lastTarget if it is not inside a previously swapped element\n if (target === $da1f6dc1cffd4cb1$var$dragEl && !$da1f6dc1cffd4cb1$var$dragEl.animated || target === el && !target.animated) $da1f6dc1cffd4cb1$var$lastTarget = null;\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n $da1f6dc1cffd4cb1$var$dragEl.parentNode[$da1f6dc1cffd4cb1$var$expando]._isOutsideThisEl(evt.target);\n // Do not detect for empty insert if already inserted\n !insertion && $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n // Call when dragEl has been inserted\n function changed() {\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl, options.draggable);\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n name: \"change\",\n toEl: el,\n newIndex: $da1f6dc1cffd4cb1$var$newIndex,\n newDraggableIndex: $da1f6dc1cffd4cb1$var$newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) evt.cancelable && evt.preventDefault();\n target = $da1f6dc1cffd4cb1$var$closest(target, options.draggable, el, true);\n dragOverEvent(\"dragOver\");\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if ($da1f6dc1cffd4cb1$var$dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) return completed(false);\n $da1f6dc1cffd4cb1$var$ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = $da1f6dc1cffd4cb1$var$parentEl !== $da1f6dc1cffd4cb1$var$rootEl // Reverting item into the original list\n ) : $da1f6dc1cffd4cb1$var$putSortable === this || (this.lastPutMode = $da1f6dc1cffd4cb1$var$activeGroup.checkPull(this, activeSortable, $da1f6dc1cffd4cb1$var$dragEl, evt)) && group.checkPut(this, activeSortable, $da1f6dc1cffd4cb1$var$dragEl, evt))) {\n vertical = this._getDirection(evt, target) === \"vertical\";\n dragRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl);\n dragOverEvent(\"dragOverValid\");\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if (revert) {\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent(\"revert\");\n if (!$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n if ($da1f6dc1cffd4cb1$var$nextEl) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$nextEl);\n else $da1f6dc1cffd4cb1$var$rootEl.appendChild($da1f6dc1cffd4cb1$var$dragEl);\n }\n return completed(true);\n }\n var elLastChild = $da1f6dc1cffd4cb1$var$lastChild(el, options.draggable);\n if (!elLastChild || $da1f6dc1cffd4cb1$var$_ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === $da1f6dc1cffd4cb1$var$dragEl) return completed(false);\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) target = elLastChild;\n if (target) targetRect = $da1f6dc1cffd4cb1$var$getRect(target);\n if ($da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) // the last draggable element is not the last node\n el.insertBefore($da1f6dc1cffd4cb1$var$dragEl, elLastChild.nextSibling);\n else el.appendChild($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (elLastChild && $da1f6dc1cffd4cb1$var$_ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = $da1f6dc1cffd4cb1$var$getChild(el, 0, options, true);\n if (firstChild === $da1f6dc1cffd4cb1$var$dragEl) return completed(false);\n target = firstChild;\n targetRect = $da1f6dc1cffd4cb1$var$getRect(target);\n if ($da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore($da1f6dc1cffd4cb1$var$dragEl, firstChild);\n $da1f6dc1cffd4cb1$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = $da1f6dc1cffd4cb1$var$getRect(target);\n var direction = 0, targetBeforeFirstSwap, differentLevel = $da1f6dc1cffd4cb1$var$dragEl.parentNode !== el, differentRowCol = !$da1f6dc1cffd4cb1$var$_dragElInRowColumn($da1f6dc1cffd4cb1$var$dragEl.animated && $da1f6dc1cffd4cb1$var$dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? \"top\" : \"left\", scrolledPastTop = $da1f6dc1cffd4cb1$var$isScrolledPast(target, \"top\", \"top\") || $da1f6dc1cffd4cb1$var$isScrolledPast($da1f6dc1cffd4cb1$var$dragEl, \"top\", \"top\"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if ($da1f6dc1cffd4cb1$var$lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = false;\n $da1f6dc1cffd4cb1$var$isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = $da1f6dc1cffd4cb1$var$_getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, $da1f6dc1cffd4cb1$var$isCircumstantialInvert, $da1f6dc1cffd4cb1$var$lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n do {\n dragIndex -= direction;\n sibling = $da1f6dc1cffd4cb1$var$parentEl.children[dragIndex];\n }while (sibling && ($da1f6dc1cffd4cb1$var$css(sibling, \"display\") === \"none\" || sibling === $da1f6dc1cffd4cb1$var$ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) return completed(false);\n $da1f6dc1cffd4cb1$var$lastTarget = target;\n $da1f6dc1cffd4cb1$var$lastDirection = direction;\n var nextSibling = target.nextElementSibling, after = false;\n after = direction === 1;\n var moveVector = $da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) after = moveVector === 1;\n $da1f6dc1cffd4cb1$var$_silent = true;\n setTimeout($da1f6dc1cffd4cb1$var$_unsilent, 30);\n capture();\n if (after && !nextSibling) el.appendChild($da1f6dc1cffd4cb1$var$dragEl);\n else target.parentNode.insertBefore($da1f6dc1cffd4cb1$var$dragEl, after ? nextSibling : target);\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) $da1f6dc1cffd4cb1$var$scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$dragEl.parentNode; // actualization\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !$da1f6dc1cffd4cb1$var$isCircumstantialInvert) $da1f6dc1cffd4cb1$var$targetMoveDistance = Math.abs(targetBeforeFirstSwap - $da1f6dc1cffd4cb1$var$getRect(target)[side1]);\n changed();\n return completed(true);\n }\n }\n if (el.contains($da1f6dc1cffd4cb1$var$dragEl)) return completed(false);\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n $da1f6dc1cffd4cb1$var$off(document, \"mousemove\", this._onTouchMove);\n $da1f6dc1cffd4cb1$var$off(document, \"touchmove\", this._onTouchMove);\n $da1f6dc1cffd4cb1$var$off(document, \"pointermove\", this._onTouchMove);\n $da1f6dc1cffd4cb1$var$off(document, \"dragover\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$off(document, \"mousemove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$off(document, \"touchmove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"mouseup\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchend\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"pointerup\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchcancel\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(document, \"selectstart\", this);\n },\n _onDrop: function _onDrop(/**Event*/ evt) {\n var el = this.el, options = this.options;\n // Get the index of the dragged element within its parent\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl, options.draggable);\n $da1f6dc1cffd4cb1$var$pluginEvent(\"drop\", this, {\n evt: evt\n });\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$dragEl && $da1f6dc1cffd4cb1$var$dragEl.parentNode;\n // Get again after plugin event\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl, options.draggable);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n this._nulling();\n return;\n }\n $da1f6dc1cffd4cb1$var$awaitingDragStarted = false;\n $da1f6dc1cffd4cb1$var$isCircumstantialInvert = false;\n $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n $da1f6dc1cffd4cb1$var$_cancelNextTick(this.cloneId);\n $da1f6dc1cffd4cb1$var$_cancelNextTick(this._dragStartId);\n // Unbind events\n if (this.nativeDraggable) {\n $da1f6dc1cffd4cb1$var$off(document, \"drop\", this);\n $da1f6dc1cffd4cb1$var$off(el, \"dragstart\", this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if ($da1f6dc1cffd4cb1$var$Safari) $da1f6dc1cffd4cb1$var$css(document.body, \"user-select\", \"\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$dragEl, \"transform\", \"\");\n if (evt) {\n if ($da1f6dc1cffd4cb1$var$moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n $da1f6dc1cffd4cb1$var$ghostEl && $da1f6dc1cffd4cb1$var$ghostEl.parentNode && $da1f6dc1cffd4cb1$var$ghostEl.parentNode.removeChild($da1f6dc1cffd4cb1$var$ghostEl);\n if ($da1f6dc1cffd4cb1$var$rootEl === $da1f6dc1cffd4cb1$var$parentEl || $da1f6dc1cffd4cb1$var$putSortable && $da1f6dc1cffd4cb1$var$putSortable.lastPutMode !== \"clone\") // Remove clone(s)\n $da1f6dc1cffd4cb1$var$cloneEl && $da1f6dc1cffd4cb1$var$cloneEl.parentNode && $da1f6dc1cffd4cb1$var$cloneEl.parentNode.removeChild($da1f6dc1cffd4cb1$var$cloneEl);\n if ($da1f6dc1cffd4cb1$var$dragEl) {\n if (this.nativeDraggable) $da1f6dc1cffd4cb1$var$off($da1f6dc1cffd4cb1$var$dragEl, \"dragend\", this);\n $da1f6dc1cffd4cb1$var$_disableDraggable($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$dragEl.style[\"will-change\"] = \"\";\n // Remove classes\n // ghostClass is added in dragStarted\n if ($da1f6dc1cffd4cb1$var$moved && !$da1f6dc1cffd4cb1$var$awaitingDragStarted) $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$putSortable ? $da1f6dc1cffd4cb1$var$putSortable.options.ghostClass : this.options.ghostClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, this.options.chosenClass, false);\n // Drag stop event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"unchoose\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if ($da1f6dc1cffd4cb1$var$rootEl !== $da1f6dc1cffd4cb1$var$parentEl) {\n if ($da1f6dc1cffd4cb1$var$newIndex >= 0) {\n // Add event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n rootEl: $da1f6dc1cffd4cb1$var$parentEl,\n name: \"add\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n fromEl: $da1f6dc1cffd4cb1$var$rootEl,\n originalEvent: evt\n });\n // Remove event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"remove\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n // drag from one list and drop into another\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n rootEl: $da1f6dc1cffd4cb1$var$parentEl,\n name: \"sort\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n fromEl: $da1f6dc1cffd4cb1$var$rootEl,\n originalEvent: evt\n });\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n }\n $da1f6dc1cffd4cb1$var$putSortable && $da1f6dc1cffd4cb1$var$putSortable.save();\n } else {\n if ($da1f6dc1cffd4cb1$var$newIndex !== $da1f6dc1cffd4cb1$var$oldIndex) {\n if ($da1f6dc1cffd4cb1$var$newIndex >= 0) {\n // drag & drop within the same list\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"update\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active) {\n /* jshint eqnull:true */ if ($da1f6dc1cffd4cb1$var$newIndex == null || $da1f6dc1cffd4cb1$var$newIndex === -1) {\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$oldIndex;\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$oldDraggableIndex;\n }\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"end\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"nulling\", this);\n $da1f6dc1cffd4cb1$var$rootEl = $da1f6dc1cffd4cb1$var$dragEl = $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$ghostEl = $da1f6dc1cffd4cb1$var$nextEl = $da1f6dc1cffd4cb1$var$cloneEl = $da1f6dc1cffd4cb1$var$lastDownEl = $da1f6dc1cffd4cb1$var$cloneHidden = $da1f6dc1cffd4cb1$var$tapEvt = $da1f6dc1cffd4cb1$var$touchEvt = $da1f6dc1cffd4cb1$var$moved = $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$oldIndex = $da1f6dc1cffd4cb1$var$oldDraggableIndex = $da1f6dc1cffd4cb1$var$lastTarget = $da1f6dc1cffd4cb1$var$lastDirection = $da1f6dc1cffd4cb1$var$putSortable = $da1f6dc1cffd4cb1$var$activeGroup = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.clone = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active = null;\n $da1f6dc1cffd4cb1$var$savedInputChecked.forEach(function(el) {\n el.checked = true;\n });\n $da1f6dc1cffd4cb1$var$savedInputChecked.length = $da1f6dc1cffd4cb1$var$lastDx = $da1f6dc1cffd4cb1$var$lastDy = 0;\n },\n handleEvent: function handleEvent(/**Event*/ evt) {\n switch(evt.type){\n case \"drop\":\n case \"dragend\":\n this._onDrop(evt);\n break;\n case \"dragenter\":\n case \"dragover\":\n if ($da1f6dc1cffd4cb1$var$dragEl) {\n this._onDragOver(evt);\n $da1f6dc1cffd4cb1$var$_globalDragOver(evt);\n }\n break;\n case \"selectstart\":\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */ toArray: function toArray() {\n var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;\n for(; i < n; i++){\n el = children[i];\n if ($da1f6dc1cffd4cb1$var$closest(el, options.draggable, this.el, false)) order.push(el.getAttribute(options.dataIdAttr) || $da1f6dc1cffd4cb1$var$_generateId(el));\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */ sort: function sort(order, useAnimation) {\n var items = {}, rootEl = this.el;\n this.toArray().forEach(function(id, i) {\n var el = rootEl.children[i];\n if ($da1f6dc1cffd4cb1$var$closest(el, this.options.draggable, rootEl, false)) items[id] = el;\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function(id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */ save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */ closest: function closest$1(el, selector) {\n return $da1f6dc1cffd4cb1$var$closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */ option: function option(name, value) {\n var options = this.options;\n if (value === void 0) return options[name];\n else {\n var modifiedValue = $da1f6dc1cffd4cb1$var$PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== \"undefined\") options[name] = modifiedValue;\n else options[name] = value;\n if (name === \"group\") $da1f6dc1cffd4cb1$var$_prepareGroup(options);\n }\n },\n /**\r\n * Destroy\r\n */ destroy: function destroy() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"destroy\", this);\n var el = this.el;\n el[$da1f6dc1cffd4cb1$var$expando] = null;\n $da1f6dc1cffd4cb1$var$off(el, \"mousedown\", this._onTapStart);\n $da1f6dc1cffd4cb1$var$off(el, \"touchstart\", this._onTapStart);\n $da1f6dc1cffd4cb1$var$off(el, \"pointerdown\", this._onTapStart);\n if (this.nativeDraggable) {\n $da1f6dc1cffd4cb1$var$off(el, \"dragover\", this);\n $da1f6dc1cffd4cb1$var$off(el, \"dragenter\", this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll(\"[draggable]\"), function(el) {\n el.removeAttribute(\"draggable\");\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n $da1f6dc1cffd4cb1$var$sortables.splice($da1f6dc1cffd4cb1$var$sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!$da1f6dc1cffd4cb1$var$cloneHidden) {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"hideClone\", this);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return;\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$cloneEl, \"display\", \"none\");\n if (this.options.removeCloneOnHide && $da1f6dc1cffd4cb1$var$cloneEl.parentNode) $da1f6dc1cffd4cb1$var$cloneEl.parentNode.removeChild($da1f6dc1cffd4cb1$var$cloneEl);\n $da1f6dc1cffd4cb1$var$cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== \"clone\") {\n this._hideClone();\n return;\n }\n if ($da1f6dc1cffd4cb1$var$cloneHidden) {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"showClone\", this);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return;\n // show clone at dragEl or original position\n if ($da1f6dc1cffd4cb1$var$dragEl.parentNode == $da1f6dc1cffd4cb1$var$rootEl && !this.options.group.revertClone) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$dragEl);\n else if ($da1f6dc1cffd4cb1$var$nextEl) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$nextEl);\n else $da1f6dc1cffd4cb1$var$rootEl.appendChild($da1f6dc1cffd4cb1$var$cloneEl);\n if (this.options.group.revertClone) this.animate($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$cloneEl);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$cloneEl, \"display\", \"\");\n $da1f6dc1cffd4cb1$var$cloneHidden = false;\n }\n }\n};\nfunction $da1f6dc1cffd4cb1$var$_globalDragOver(/**Event*/ evt) {\n if (evt.dataTransfer) evt.dataTransfer.dropEffect = \"move\";\n evt.cancelable && evt.preventDefault();\n}\nfunction $da1f6dc1cffd4cb1$var$_onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt, sortable = fromEl[$da1f6dc1cffd4cb1$var$expando], onMoveFn = sortable.options.onMove, retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$da1f6dc1cffd4cb1$var$IE11OrLess && !$da1f6dc1cffd4cb1$var$Edge) evt = new CustomEvent(\"move\", {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(\"move\", true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || $da1f6dc1cffd4cb1$var$getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) retVal = onMoveFn.call(sortable, evt, originalEvent);\n return retVal;\n}\nfunction $da1f6dc1cffd4cb1$var$_disableDraggable(el) {\n el.draggable = false;\n}\nfunction $da1f6dc1cffd4cb1$var$_unsilent() {\n $da1f6dc1cffd4cb1$var$_silent = false;\n}\nfunction $da1f6dc1cffd4cb1$var$_ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = $da1f6dc1cffd4cb1$var$getChildContainingRectFromElement(sortable.el, sortable.options, $da1f6dc1cffd4cb1$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction $da1f6dc1cffd4cb1$var$_ghostIsLast(evt, vertical, sortable) {\n var lastElRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = $da1f6dc1cffd4cb1$var$getChildContainingRectFromElement(sortable.el, sortable.options, $da1f6dc1cffd4cb1$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction $da1f6dc1cffd4cb1$var$_getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && $da1f6dc1cffd4cb1$var$targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!$da1f6dc1cffd4cb1$var$pastFirstInvertThresh && ($da1f6dc1cffd4cb1$var$lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = true;\n if (!$da1f6dc1cffd4cb1$var$pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if ($da1f6dc1cffd4cb1$var$lastDirection === 1 ? mouseOnAxis < targetS1 + $da1f6dc1cffd4cb1$var$targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - $da1f6dc1cffd4cb1$var$targetMoveDistance) return -$da1f6dc1cffd4cb1$var$lastDirection;\n } else invert = true;\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) return $da1f6dc1cffd4cb1$var$_getInsertDirection(target);\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n return 0;\n}\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */ function $da1f6dc1cffd4cb1$var$_getInsertDirection(target) {\n if ($da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl) < $da1f6dc1cffd4cb1$var$index(target)) return 1;\n else return -1;\n}\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */ function $da1f6dc1cffd4cb1$var$_generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;\n while(i--)sum += str.charCodeAt(i);\n return sum.toString(36);\n}\nfunction $da1f6dc1cffd4cb1$var$_saveInputCheckedState(root) {\n $da1f6dc1cffd4cb1$var$savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName(\"input\");\n var idx = inputs.length;\n while(idx--){\n var el = inputs[idx];\n el.checked && $da1f6dc1cffd4cb1$var$savedInputChecked.push(el);\n }\n}\nfunction $da1f6dc1cffd4cb1$var$_nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction $da1f6dc1cffd4cb1$var$_cancelNextTick(id) {\n return clearTimeout(id);\n}\n// Fixed #973:\nif ($da1f6dc1cffd4cb1$var$documentExists) $da1f6dc1cffd4cb1$var$on(document, \"touchmove\", function(evt) {\n if (($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active || $da1f6dc1cffd4cb1$var$awaitingDragStarted) && evt.cancelable) evt.preventDefault();\n});\n// Export utils\n$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.utils = {\n on: $da1f6dc1cffd4cb1$var$on,\n off: $da1f6dc1cffd4cb1$var$off,\n css: $da1f6dc1cffd4cb1$var$css,\n find: $da1f6dc1cffd4cb1$var$find,\n is: function is(el, selector) {\n return !!$da1f6dc1cffd4cb1$var$closest(el, selector, el, false);\n },\n extend: $da1f6dc1cffd4cb1$var$extend,\n throttle: $da1f6dc1cffd4cb1$var$throttle,\n closest: $da1f6dc1cffd4cb1$var$closest,\n toggleClass: $da1f6dc1cffd4cb1$var$toggleClass,\n clone: $da1f6dc1cffd4cb1$var$clone,\n index: $da1f6dc1cffd4cb1$var$index,\n nextTick: $da1f6dc1cffd4cb1$var$_nextTick,\n cancelNextTick: $da1f6dc1cffd4cb1$var$_cancelNextTick,\n detectDirection: $da1f6dc1cffd4cb1$var$_detectDirection,\n getChild: $da1f6dc1cffd4cb1$var$getChild\n};\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */ $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.get = function(element) {\n return element[$da1f6dc1cffd4cb1$var$expando];\n};\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */ $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.mount = function() {\n for(var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++)plugins[_key] = arguments[_key];\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function(plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) throw \"Sortable: Mounted plugin must be a constructor function, not \".concat(({}).toString.call(plugin));\n if (plugin.utils) $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.utils = $da1f6dc1cffd4cb1$var$_objectSpread2($da1f6dc1cffd4cb1$var$_objectSpread2({}, $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.utils), plugin.utils);\n $da1f6dc1cffd4cb1$var$PluginManager.mount(plugin);\n });\n};\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.create = function(el, options) {\n return new $da1f6dc1cffd4cb1$export$31b3ca70d8f57423(el, options);\n};\n// Export\n$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.version = $da1f6dc1cffd4cb1$var$version;\nvar $da1f6dc1cffd4cb1$var$autoScrolls = [], $da1f6dc1cffd4cb1$var$scrollEl, $da1f6dc1cffd4cb1$var$scrollRootEl, $da1f6dc1cffd4cb1$var$scrolling = false, $da1f6dc1cffd4cb1$var$lastAutoScrollX, $da1f6dc1cffd4cb1$var$lastAutoScrollY, $da1f6dc1cffd4cb1$var$touchEvt$1, $da1f6dc1cffd4cb1$var$pointerElemChangedInterval;\nfunction $da1f6dc1cffd4cb1$export$3fb39aee5567f02e() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) $da1f6dc1cffd4cb1$var$on(document, \"dragover\", this._handleAutoScroll);\n else {\n if (this.options.supportPointer) $da1f6dc1cffd4cb1$var$on(document, \"pointermove\", this._handleFallbackAutoScroll);\n else if (originalEvent.touches) $da1f6dc1cffd4cb1$var$on(document, \"touchmove\", this._handleFallbackAutoScroll);\n else $da1f6dc1cffd4cb1$var$on(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) this._handleAutoScroll(originalEvent);\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) $da1f6dc1cffd4cb1$var$off(document, \"dragover\", this._handleAutoScroll);\n else {\n $da1f6dc1cffd4cb1$var$off(document, \"pointermove\", this._handleFallbackAutoScroll);\n $da1f6dc1cffd4cb1$var$off(document, \"touchmove\", this._handleFallbackAutoScroll);\n $da1f6dc1cffd4cb1$var$off(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n $da1f6dc1cffd4cb1$var$clearPointerElemChangedInterval();\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n $da1f6dc1cffd4cb1$var$cancelThrottle();\n },\n nulling: function nulling() {\n $da1f6dc1cffd4cb1$var$touchEvt$1 = $da1f6dc1cffd4cb1$var$scrollRootEl = $da1f6dc1cffd4cb1$var$scrollEl = $da1f6dc1cffd4cb1$var$scrolling = $da1f6dc1cffd4cb1$var$pointerElemChangedInterval = $da1f6dc1cffd4cb1$var$lastAutoScrollX = $da1f6dc1cffd4cb1$var$lastAutoScrollY = null;\n $da1f6dc1cffd4cb1$var$autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y);\n $da1f6dc1cffd4cb1$var$touchEvt$1 = evt;\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || $da1f6dc1cffd4cb1$var$Edge || $da1f6dc1cffd4cb1$var$IE11OrLess || $da1f6dc1cffd4cb1$var$Safari) {\n $da1f6dc1cffd4cb1$var$autoScroll(evt, this.options, elem, fallback);\n // Listener for pointer element change\n var ogElemScroller = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(elem, true);\n if ($da1f6dc1cffd4cb1$var$scrolling && (!$da1f6dc1cffd4cb1$var$pointerElemChangedInterval || x !== $da1f6dc1cffd4cb1$var$lastAutoScrollX || y !== $da1f6dc1cffd4cb1$var$lastAutoScrollY)) {\n $da1f6dc1cffd4cb1$var$pointerElemChangedInterval && $da1f6dc1cffd4cb1$var$clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n $da1f6dc1cffd4cb1$var$pointerElemChangedInterval = setInterval(function() {\n var newElem = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n }\n $da1f6dc1cffd4cb1$var$autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n $da1f6dc1cffd4cb1$var$lastAutoScrollX = x;\n $da1f6dc1cffd4cb1$var$lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(elem, true) === $da1f6dc1cffd4cb1$var$getWindowScrollingElement()) {\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n return;\n }\n $da1f6dc1cffd4cb1$var$autoScroll(evt, this.options, $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return $da1f6dc1cffd4cb1$var$_extends(AutoScroll, {\n pluginName: \"scroll\",\n initializeByDefault: true\n });\n}\nfunction $da1f6dc1cffd4cb1$var$clearAutoScrolls() {\n $da1f6dc1cffd4cb1$var$autoScrolls.forEach(function(autoScroll) {\n clearInterval(autoScroll.pid);\n });\n $da1f6dc1cffd4cb1$var$autoScrolls = [];\n}\nfunction $da1f6dc1cffd4cb1$var$clearPointerElemChangedInterval() {\n clearInterval($da1f6dc1cffd4cb1$var$pointerElemChangedInterval);\n}\nvar $da1f6dc1cffd4cb1$var$autoScroll = $da1f6dc1cffd4cb1$var$throttle(function(evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n var scrollThisInstance = false, scrollCustomFn;\n // New scroll root, set scrollEl\n if ($da1f6dc1cffd4cb1$var$scrollRootEl !== rootEl) {\n $da1f6dc1cffd4cb1$var$scrollRootEl = rootEl;\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n $da1f6dc1cffd4cb1$var$scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if ($da1f6dc1cffd4cb1$var$scrollEl === true) $da1f6dc1cffd4cb1$var$scrollEl = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(rootEl, true);\n }\n var layersOut = 0;\n var currentParent = $da1f6dc1cffd4cb1$var$scrollEl;\n do {\n var el = currentParent, rect = $da1f6dc1cffd4cb1$var$getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = $da1f6dc1cffd4cb1$var$css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\" || elCSS.overflowX === \"visible\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\" || elCSS.overflowY === \"visible\");\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\");\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!$da1f6dc1cffd4cb1$var$autoScrolls[layersOut]) {\n for(var i = 0; i <= layersOut; i++)if (!$da1f6dc1cffd4cb1$var$autoScrolls[i]) $da1f6dc1cffd4cb1$var$autoScrolls[i] = {};\n }\n if ($da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vx != vx || $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vy != vy || $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].el !== el) {\n $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].el = el;\n $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vx = vx;\n $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vy = vy;\n clearInterval($da1f6dc1cffd4cb1$var$autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */ $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].pid = setInterval((function() {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active._onTouchMove($da1f6dc1cffd4cb1$var$touchEvt$1); // To move ghost if it is positioned absolutely\n var scrollOffsetY = $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vy ? $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vx ? $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === \"function\") {\n if (scrollCustomFn.call($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged.parentNode[$da1f6dc1cffd4cb1$var$expando], scrollOffsetX, scrollOffsetY, evt, $da1f6dc1cffd4cb1$var$touchEvt$1, $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].el) !== \"continue\") return;\n }\n $da1f6dc1cffd4cb1$var$scrollBy($da1f6dc1cffd4cb1$var$autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }).bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n }while (options.bubbleScroll && currentParent !== winScroller && (currentParent = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(currentParent, false)));\n $da1f6dc1cffd4cb1$var$scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\nvar $da1f6dc1cffd4cb1$var$drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, dragEl = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent(\"spill\");\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction $da1f6dc1cffd4cb1$var$Revert() {}\n$da1f6dc1cffd4cb1$var$Revert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl, putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) putSortable.captureAnimationState();\n var nextSibling = $da1f6dc1cffd4cb1$var$getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) this.sortable.el.insertBefore(dragEl, nextSibling);\n else this.sortable.el.appendChild(dragEl);\n this.sortable.animateAll();\n if (putSortable) putSortable.animateAll();\n },\n drop: $da1f6dc1cffd4cb1$var$drop\n};\n$da1f6dc1cffd4cb1$var$_extends($da1f6dc1cffd4cb1$var$Revert, {\n pluginName: \"revertOnSpill\"\n});\nfunction $da1f6dc1cffd4cb1$var$Remove() {}\n$da1f6dc1cffd4cb1$var$Remove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl, putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: $da1f6dc1cffd4cb1$var$drop\n};\n$da1f6dc1cffd4cb1$var$_extends($da1f6dc1cffd4cb1$var$Remove, {\n pluginName: \"removeOnSpill\"\n});\nvar $da1f6dc1cffd4cb1$export$55b3d9f7b2513474 = [\n $da1f6dc1cffd4cb1$var$Remove,\n $da1f6dc1cffd4cb1$var$Revert\n];\nvar $da1f6dc1cffd4cb1$var$lastSwapEl;\nfunction $da1f6dc1cffd4cb1$export$bdb5f0a1b77546f4() {\n function Swap() {\n this.defaults = {\n swapClass: \"sortable-swap-highlight\"\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n $da1f6dc1cffd4cb1$var$lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed, target = _ref2.target, onMove = _ref2.onMove, activeSortable = _ref2.activeSortable, changed = _ref2.changed, cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el, options = this.options;\n if (target && target !== el) {\n var prevSwapEl = $da1f6dc1cffd4cb1$var$lastSwapEl;\n if (onMove(target) !== false) {\n $da1f6dc1cffd4cb1$var$toggleClass(target, options.swapClass, true);\n $da1f6dc1cffd4cb1$var$lastSwapEl = target;\n } else $da1f6dc1cffd4cb1$var$lastSwapEl = null;\n if (prevSwapEl && prevSwapEl !== $da1f6dc1cffd4cb1$var$lastSwapEl) $da1f6dc1cffd4cb1$var$toggleClass(prevSwapEl, options.swapClass, false);\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable, putSortable = _ref3.putSortable, dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n $da1f6dc1cffd4cb1$var$lastSwapEl && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$lastSwapEl, options.swapClass, false);\n if ($da1f6dc1cffd4cb1$var$lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== $da1f6dc1cffd4cb1$var$lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n $da1f6dc1cffd4cb1$var$swapNodes(dragEl, $da1f6dc1cffd4cb1$var$lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n $da1f6dc1cffd4cb1$var$lastSwapEl = null;\n }\n };\n return $da1f6dc1cffd4cb1$var$_extends(Swap, {\n pluginName: \"swap\",\n eventProperties: function eventProperties() {\n return {\n swapItem: $da1f6dc1cffd4cb1$var$lastSwapEl\n };\n }\n });\n}\nfunction $da1f6dc1cffd4cb1$var$swapNodes(n1, n2) {\n var p1 = n1.parentNode, p2 = n2.parentNode, i1, i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = $da1f6dc1cffd4cb1$var$index(n1);\n i2 = $da1f6dc1cffd4cb1$var$index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) i2++;\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\nvar $da1f6dc1cffd4cb1$var$multiDragElements = [], $da1f6dc1cffd4cb1$var$multiDragClones = [], $da1f6dc1cffd4cb1$var$lastMultiDragSelect, // for selection with modifier key down (SHIFT)\n$da1f6dc1cffd4cb1$var$multiDragSortable, $da1f6dc1cffd4cb1$var$initialFolding = false, // Initial multi-drag fold when drag started\n$da1f6dc1cffd4cb1$var$folding = false, // Folding any other time\n$da1f6dc1cffd4cb1$var$dragStarted = false, $da1f6dc1cffd4cb1$var$dragEl$1, $da1f6dc1cffd4cb1$var$clonesFromRect, $da1f6dc1cffd4cb1$var$clonesHidden;\nfunction $da1f6dc1cffd4cb1$export$18e5d2a5d1df842d() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) $da1f6dc1cffd4cb1$var$on(document, \"pointerup\", this._deselectMultiDrag);\n else {\n $da1f6dc1cffd4cb1$var$on(document, \"mouseup\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$on(document, \"touchend\", this._deselectMultiDrag);\n }\n }\n $da1f6dc1cffd4cb1$var$on(document, \"keydown\", this._checkKeyDown);\n $da1f6dc1cffd4cb1$var$on(document, \"keyup\", this._checkKeyUp);\n this.defaults = {\n selectedClass: \"sortable-selected\",\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = \"\";\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length && $da1f6dc1cffd4cb1$var$multiDragSortable === sortable) $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement, i) {\n data += (!i ? \"\" : \", \") + multiDragElement.textContent;\n });\n else data = dragEl.textContent;\n dataTransfer.setData(\"Text\", data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n $da1f6dc1cffd4cb1$var$dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable, cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for(var i = 0; i < $da1f6dc1cffd4cb1$var$multiDragElements.length; i++){\n $da1f6dc1cffd4cb1$var$multiDragClones.push($da1f6dc1cffd4cb1$var$clone($da1f6dc1cffd4cb1$var$multiDragElements[i]));\n $da1f6dc1cffd4cb1$var$multiDragClones[i].sortableIndex = $da1f6dc1cffd4cb1$var$multiDragElements[i].sortableIndex;\n $da1f6dc1cffd4cb1$var$multiDragClones[i].draggable = false;\n $da1f6dc1cffd4cb1$var$multiDragClones[i].style[\"will-change\"] = \"\";\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$multiDragClones[i], this.options.selectedClass, false);\n $da1f6dc1cffd4cb1$var$multiDragElements[i] === $da1f6dc1cffd4cb1$var$dragEl$1 && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable, rootEl = _ref3.rootEl, dispatchSortableEvent = _ref3.dispatchSortableEvent, cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length && $da1f6dc1cffd4cb1$var$multiDragSortable === sortable) {\n $da1f6dc1cffd4cb1$var$insertMultiDragClones(true, rootEl);\n dispatchSortableEvent(\"clone\");\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown, rootEl = _ref4.rootEl, cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n $da1f6dc1cffd4cb1$var$insertMultiDragClones(false, rootEl);\n $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n $da1f6dc1cffd4cb1$var$css(clone, \"display\", \"\");\n });\n cloneNowShown();\n $da1f6dc1cffd4cb1$var$clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable, cloneNowHidden = _ref5.cloneNowHidden, cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n $da1f6dc1cffd4cb1$var$css(clone, \"display\", \"none\");\n if (_this.options.removeCloneOnHide && clone.parentNode) clone.parentNode.removeChild(clone);\n });\n cloneNowHidden();\n $da1f6dc1cffd4cb1$var$clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && $da1f6dc1cffd4cb1$var$multiDragSortable) $da1f6dc1cffd4cb1$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.sortableIndex = $da1f6dc1cffd4cb1$var$index(multiDragElement);\n });\n // Sort multi-drag elements\n $da1f6dc1cffd4cb1$var$multiDragElements = $da1f6dc1cffd4cb1$var$multiDragElements.sort(function(a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n $da1f6dc1cffd4cb1$var$dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n if (this.options.animation) {\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n $da1f6dc1cffd4cb1$var$css(multiDragElement, \"position\", \"absolute\");\n });\n var dragRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl$1, false, true, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n $da1f6dc1cffd4cb1$var$setRect(multiDragElement, dragRect);\n });\n $da1f6dc1cffd4cb1$var$folding = true;\n $da1f6dc1cffd4cb1$var$initialFolding = true;\n }\n }\n sortable.animateAll(function() {\n $da1f6dc1cffd4cb1$var$folding = false;\n $da1f6dc1cffd4cb1$var$initialFolding = false;\n if (_this2.options.animation) $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n $da1f6dc1cffd4cb1$var$unsetRect(multiDragElement);\n });\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target, completed = _ref8.completed, cancel = _ref8.cancel;\n if ($da1f6dc1cffd4cb1$var$folding && ~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable, rootEl = _ref9.rootEl, sortable = _ref9.sortable, dragRect = _ref9.dragRect;\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length > 1) {\n // Setup unfold animation\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: $da1f6dc1cffd4cb1$var$folding ? $da1f6dc1cffd4cb1$var$getRect(multiDragElement) : dragRect\n });\n $da1f6dc1cffd4cb1$var$unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n $da1f6dc1cffd4cb1$var$folding = false;\n $da1f6dc1cffd4cb1$var$insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable, isOwner = _ref10.isOwner, insertion = _ref10.insertion, activeSortable = _ref10.activeSortable, parentEl = _ref10.parentEl, putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n $da1f6dc1cffd4cb1$var$initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && $da1f6dc1cffd4cb1$var$multiDragElements.length > 1 && ($da1f6dc1cffd4cb1$var$folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl$1, false, true, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n $da1f6dc1cffd4cb1$var$setRect(multiDragElement, dragRectAbsolute);\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n $da1f6dc1cffd4cb1$var$folding = true;\n }\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!$da1f6dc1cffd4cb1$var$folding) $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length > 1) {\n var clonesHiddenBefore = $da1f6dc1cffd4cb1$var$clonesHidden;\n activeSortable._showClone(sortable);\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !$da1f6dc1cffd4cb1$var$clonesHidden && clonesHiddenBefore) $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: $da1f6dc1cffd4cb1$var$clonesFromRect\n });\n clone.fromRect = $da1f6dc1cffd4cb1$var$clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n } else activeSortable._showClone(sortable);\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect, isOwner = _ref11.isOwner, activeSortable = _ref11.activeSortable;\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n $da1f6dc1cffd4cb1$var$clonesFromRect = $da1f6dc1cffd4cb1$var$_extends({}, dragRect);\n var dragMatrix = $da1f6dc1cffd4cb1$var$matrix($da1f6dc1cffd4cb1$var$dragEl$1, true);\n $da1f6dc1cffd4cb1$var$clonesFromRect.top -= dragMatrix.f;\n $da1f6dc1cffd4cb1$var$clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if ($da1f6dc1cffd4cb1$var$folding) {\n $da1f6dc1cffd4cb1$var$folding = false;\n $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent, rootEl = _ref12.rootEl, parentEl = _ref12.parentEl, sortable = _ref12.sortable, dispatchSortableEvent = _ref12.dispatchSortableEvent, oldIndex = _ref12.oldIndex, putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options, children = parentEl.children;\n // Multi-drag selection\n if (!$da1f6dc1cffd4cb1$var$dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) this._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl$1, options.selectedClass, !~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1));\n if (!~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1)) {\n $da1f6dc1cffd4cb1$var$multiDragElements.push($da1f6dc1cffd4cb1$var$dragEl$1);\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: $da1f6dc1cffd4cb1$var$dragEl$1,\n originalEvent: evt\n });\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && $da1f6dc1cffd4cb1$var$lastMultiDragSelect && sortable.el.contains($da1f6dc1cffd4cb1$var$lastMultiDragSelect)) {\n var lastIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$lastMultiDragSelect), currentIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for(; i < n; i++){\n if (~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf(children[i])) continue;\n $da1f6dc1cffd4cb1$var$toggleClass(children[i], options.selectedClass, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.push(children[i]);\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else $da1f6dc1cffd4cb1$var$lastMultiDragSelect = $da1f6dc1cffd4cb1$var$dragEl$1;\n $da1f6dc1cffd4cb1$var$multiDragSortable = toSortable;\n } else {\n $da1f6dc1cffd4cb1$var$multiDragElements.splice($da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1), 1);\n $da1f6dc1cffd4cb1$var$lastMultiDragSelect = null;\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"deselect\",\n targetEl: $da1f6dc1cffd4cb1$var$dragEl$1,\n originalEvent: evt\n });\n }\n }\n // Multi-drag drop\n if ($da1f6dc1cffd4cb1$var$dragStarted && this.isMultiDrag) {\n $da1f6dc1cffd4cb1$var$folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[$da1f6dc1cffd4cb1$var$expando].options.sort || parentEl !== rootEl) && $da1f6dc1cffd4cb1$var$multiDragElements.length > 1) {\n var dragRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl$1), multiDragIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl$1, \":not(.\" + this.options.selectedClass + \")\");\n if (!$da1f6dc1cffd4cb1$var$initialFolding && options.animation) $da1f6dc1cffd4cb1$var$dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!$da1f6dc1cffd4cb1$var$initialFolding) {\n if (options.animation) {\n $da1f6dc1cffd4cb1$var$dragEl$1.fromRect = dragRect;\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== $da1f6dc1cffd4cb1$var$dragEl$1) {\n var rect = $da1f6dc1cffd4cb1$var$folding ? $da1f6dc1cffd4cb1$var$getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (children[multiDragIndex]) parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n else parentEl.appendChild(multiDragElement);\n multiDragIndex++;\n });\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl$1)) {\n var update = false;\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement.sortableIndex !== $da1f6dc1cffd4cb1$var$index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent(\"update\");\n dispatchSortableEvent(\"sort\");\n }\n }\n }\n // Must be done after capturing individual rects (scroll bar)\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n $da1f6dc1cffd4cb1$var$unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n $da1f6dc1cffd4cb1$var$multiDragSortable = toSortable;\n }\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== \"clone\") $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = $da1f6dc1cffd4cb1$var$dragStarted = false;\n $da1f6dc1cffd4cb1$var$multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$off(document, \"pointerup\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$off(document, \"mouseup\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$off(document, \"touchend\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$off(document, \"keydown\", this._checkKeyDown);\n $da1f6dc1cffd4cb1$var$off(document, \"keyup\", this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof $da1f6dc1cffd4cb1$var$dragStarted !== \"undefined\" && $da1f6dc1cffd4cb1$var$dragStarted) return;\n // Only deselect if selection is in this sortable\n if ($da1f6dc1cffd4cb1$var$multiDragSortable !== this.sortable) return;\n // Only deselect if target is not item in this sortable\n if (evt && $da1f6dc1cffd4cb1$var$closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while($da1f6dc1cffd4cb1$var$multiDragElements.length){\n var el = $da1f6dc1cffd4cb1$var$multiDragElements[0];\n $da1f6dc1cffd4cb1$var$toggleClass(el, this.options.selectedClass, false);\n $da1f6dc1cffd4cb1$var$multiDragElements.shift();\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: \"deselect\",\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = true;\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = false;\n }\n };\n return $da1f6dc1cffd4cb1$var$_extends(MultiDrag, {\n // Static methods & properties\n pluginName: \"multiDrag\",\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */ select: function select(el) {\n var sortable = el.parentNode[$da1f6dc1cffd4cb1$var$expando];\n if (!sortable || !sortable.options.multiDrag || ~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf(el)) return;\n if ($da1f6dc1cffd4cb1$var$multiDragSortable && $da1f6dc1cffd4cb1$var$multiDragSortable !== sortable) {\n $da1f6dc1cffd4cb1$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$multiDragSortable = sortable;\n }\n $da1f6dc1cffd4cb1$var$toggleClass(el, sortable.options.selectedClass, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */ deselect: function deselect(el) {\n var sortable = el.parentNode[$da1f6dc1cffd4cb1$var$expando], index = $da1f6dc1cffd4cb1$var$multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n $da1f6dc1cffd4cb1$var$toggleClass(el, sortable.options.selectedClass, false);\n $da1f6dc1cffd4cb1$var$multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [], newIndicies = [];\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n // multiDragElements will already be sorted if folding\n var newIndex;\n if ($da1f6dc1cffd4cb1$var$folding && multiDragElement !== $da1f6dc1cffd4cb1$var$dragEl$1) newIndex = -1;\n else if ($da1f6dc1cffd4cb1$var$folding) newIndex = $da1f6dc1cffd4cb1$var$index(multiDragElement, \":not(.\" + _this3.options.selectedClass + \")\");\n else newIndex = $da1f6dc1cffd4cb1$var$index(multiDragElement);\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: $da1f6dc1cffd4cb1$var$_toConsumableArray($da1f6dc1cffd4cb1$var$multiDragElements),\n clones: [].concat($da1f6dc1cffd4cb1$var$multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === \"ctrl\") key = \"Control\";\n else if (key.length > 1) key = key.charAt(0).toUpperCase() + key.substr(1);\n return key;\n }\n }\n });\n}\nfunction $da1f6dc1cffd4cb1$var$insertMultiDragElements(clonesInserted, rootEl) {\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(multiDragElement, target);\n else rootEl.appendChild(multiDragElement);\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */ function $da1f6dc1cffd4cb1$var$insertMultiDragClones(elementsInserted, rootEl) {\n $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(clone, target);\n else rootEl.appendChild(clone);\n });\n}\nfunction $da1f6dc1cffd4cb1$var$removeMultiDragElements() {\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\nvar $da1f6dc1cffd4cb1$export$2e2bcd8739ae039 = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423;\n\n\n\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */ const $f7942db15ba0cc81$export$61fc7d43ac8f84b0 = (fn, wait = 0, immediate = false)=>{\n let timerId = null;\n if (typeof fn !== \"function\") throw new TypeError(\"Expected a function for first argument\");\n return (...args)=>{\n clearTimeout(timerId);\n if (immediate && !timerId) fn(...args);\n timerId = setTimeout(()=>{\n timerId = null;\n if (!immediate) fn(...args);\n }, wait);\n };\n};\n\n\n\n\n\nconst $038088370be83852$var$template = document.createElement(\"template\");\n$038088370be83852$var$template.innerHTML = /* html */ `\n \n\n \n From file\n \n
          \n \n Drag 'n' drop a file, or click to select file to import\n
          \n (Only JSON files are allowed)\n
          \n
          \n
          \n\n From text\n \n
          \n \n \n
          \n
          \n
          \n`;\nclass $038088370be83852$var$ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($038088370be83852$var$template.content.cloneNode(true));\n }\n this.#dropzoneEl = this.shadowRoot.querySelector(\"files-dropzone\");\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n }\n connectedCallback() {\n this.#dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n #handleFilesDropzoneDropAccepted = (evt)=>{\n const { acceptedFiles: acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n if (!file) return;\n const reader = new FileReader();\n reader.readAsText(file, \"utf-8\");\n reader.onload = this.#handleFileReaderLoad;\n };\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) return alert(\"Invalid file or no feeds found.\");\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n for (const feed of feedsToImport){\n const feedExists = Boolean(feeds.find((f)=>f.url === feed.url));\n const { url: url, title: title } = feed;\n const isValidURL = (0, $8ca5c59aef5015ba$export$981c5d1bd3894713)(url);\n if (!feedExists && isValidURL) await (0, $b36f6cb20f27a9a6$export$4b77448646caf424)({\n url: url,\n title: title\n });\n }\n this.dispatchEvent(new Event(\"feeds-imported\", {\n bubbles: true,\n composed: true\n }));\n }\n #handleFileReaderLoad = async (evt)=>{\n try {\n const { result: result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert(\"The file is not valid.\");\n }\n };\n #handleImportFormSubmit = async (evt)=>{\n evt.preventDefault();\n const formData = new FormData(evt.target);\n const data = formData.get(\"import-data\");\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert(\"The data is not valid.\");\n }\n };\n}\nif (!window.customElements.get(\"import-feeds\")) window.customElements.define(\"import-feeds\", $038088370be83852$var$ImportFeeds);\n\n\nfunction $94933cc6427541bd$export$c37129e465f64ef0(a) {\n return null !== a && \"object\" == typeof a ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\n\n\nconst $4724280f8ebb5bb4$var$template = document.createElement(\"template\");\n$4724280f8ebb5bb4$var$template.innerHTML = /* html */ `\n \n\n
          \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
          \n\n
          \n
          \n
          \n
          \n
          \n\n \n`;\nclass $4724280f8ebb5bb4$var$ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($4724280f8ebb5bb4$var$template.content.cloneNode(true));\n }\n this.#exportCodeEl = this.shadowRoot.getElementById(\"exportCode\");\n this.#clipboardCopyEl = this.shadowRoot.querySelector(\"clipboard-copy\");\n this.#webShareEl = this.shadowRoot.querySelector(\"web-share\");\n this.#downloadButton = this.shadowRoot.getElementById(\"downloadButton\");\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feeds\"\n ];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"feeds\" && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n connectedCallback() {\n this.#downloadButton.addEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n disconnectedCallback() {\n this.#downloadButton.removeEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n get feeds() {\n return this.getAttribute(\"feeds\");\n }\n set feeds(value) {\n this.setAttribute(\"feeds\", value);\n }\n #getFeedsToExportString() {\n let feedsToExport = \"\";\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n return feedsToExport;\n }\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([\n data\n ], {\n type: \"application/json\"\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n #handleDownloadButtonClick = async ()=>{\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n this.#exportFeeds(feeds);\n };\n}\nif (!window.customElements.get(\"export-feeds\")) window.customElements.define(\"export-feeds\", $4724280f8ebb5bb4$var$ExportFeeds);\n\n\nconst $d02789f57ae99481$var$template = document.createElement(\"template\");\n$d02789f57ae99481$var$template.innerHTML = /* html */ `\n \n\n
          \n
          \n
          \n \n \n \n \n \n\n \n\n \n
          \n\n
          \n \n\n \n\n \n
          \n
          \n\n
            \n
            \n\n
            \n

            \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

            \n\n

            \n \n

            \n
            \n\n \n

            Import feeds

            \n \n
            \n\n \n

            Export feeds

            \n \n
            \n`;\nclass $d02789f57ae99481$var$FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($d02789f57ae99481$var$template.content.cloneNode(true));\n }\n this.#isEditable = false;\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n this.#feedsContainerEl = this.shadowRoot.getElementById(\"feedsContainer\");\n this.#feedsListEl = this.shadowRoot.getElementById(\"feedsList\");\n this.#editBtn = this.shadowRoot.getElementById(\"editBtn\");\n this.#importBtn = this.shadowRoot.getElementById(\"importBtn\");\n this.#importAltBtn = this.shadowRoot.getElementById(\"importAltBtn\");\n this.#exportBtn = this.shadowRoot.getElementById(\"exportBtn\");\n this.#searchInput = this.shadowRoot.getElementById(\"searchInput\");\n this.#searchClearBtn = this.shadowRoot.getElementById(\"searchClearBtn\");\n this.#importDialog = this.shadowRoot.getElementById(\"importDialog\");\n this.#exportDialog = this.shadowRoot.getElementById(\"exportDialog\");\n this.#importFeedsEl = this.shadowRoot.querySelector(\"import-feeds\");\n this.#exportFeedsEl = this.shadowRoot.querySelector(\"export-feeds\");\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById(\"noFeedsDisclaimer\");\n }\n async connectedCallback() {\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n feeds.forEach((feed)=>this.#addFeed(feed));\n this.#toggleFeedsVisibility();\n this.#feedsListEl.addEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.addEventListener(\"click\", this.#handleEditRequest);\n this.#importAltBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#importBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.addEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.addEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.addEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener(\"me-close\", this.#handleExportDialogClose);\n this.addEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.addEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n new (0, $da1f6dc1cffd4cb1$export$2e2bcd8739ae039)(this.#feedsListEl, {\n animation: 150,\n handle: \".sort-handler\",\n onEnd: async (evt)=>{\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll(\"li\"), (el)=>{\n return {\n url: el.getAttribute(\"data-url\"),\n title: el.getAttribute(\"data-title\") || \"\"\n };\n });\n await (0, $b36f6cb20f27a9a6$export$a8ce8a4ec117f05e)(feeds, false);\n }\n });\n }\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.removeEventListener(\"click\", this.#handleEditRequest);\n this.#importBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#importAltBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.removeEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.removeEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.removeEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-close\", this.#handleExportDialogClose);\n this.removeEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.removeEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n }\n #searchFeeds = (searchValue = \"\")=>{\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n if (feedEls.length === 0) return;\n feedEls.forEach((el)=>{\n const url = (el.getAttribute(\"data-url\") || \"\").toLowerCase();\n const title = (el.getAttribute(\"data-title\") || \"\").toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n #debounceSearchFeeds = (0, $f7942db15ba0cc81$export$61fc7d43ac8f84b0)(this.#searchFeeds, 250);\n #handleSearchInputDebounced = (evt)=>{\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle(\"d-none\", !value);\n return this.#debounceSearchFeeds(value);\n };\n #handleSearchClear = ()=>{\n this.#searchInput.value = \"\";\n this.#searchInput.dispatchEvent(new Event(\"input\"));\n };\n #handleEditRequest = (evt)=>{\n this.#isEditable = !this.#isEditable;\n evt.currentTarget.classList.toggle(\"active\");\n this.shadowRoot.querySelectorAll(\".sort-handler, .delete-button\").forEach((el)=>{\n el.hidden = !el.hidden;\n });\n };\n #handleImportRequest = ()=>{\n this.#importDialog.open = true;\n };\n #handleExportRequest = ()=>{\n this.#exportDialog.open = true;\n };\n #handleImportDialogOpen = ()=>{\n try {\n this.#importFeedsEl.shadowRoot.querySelector(\"a-tab-group\").selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector(\"textarea\").value = \"\";\n } catch {\n // Fail silently\n }\n };\n #handleExportDialogOpen = async ()=>{\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n this.#exportFeedsEl.setAttribute(\"feeds\", JSON.stringify(feeds));\n };\n #handleExportDialogClose = ()=>{\n this.#exportFeedsEl.removeAttribute(\"feeds\");\n };\n #handleFeedsImported = ()=>{\n this.#importDialog.open = false;\n };\n #handleFeedsUpdateSuccess = (evt)=>{\n if (evt.detail.action === \"delete\") this.#removeFeed(evt.detail.feed);\n if (evt.detail.action === \"create\") {\n this.#addFeed(evt.detail.feed);\n if (this.#searchInput.value) {\n this.#searchInput.value = \"\";\n this.#searchFeeds(\"\");\n }\n }\n if (evt.detail.action === \"update\") {\n const { url: url, title: title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n if (feedEl) {\n const linkContent = feedEl.querySelector(\".link-content\");\n feedEl.setAttribute(\"data-title\", title || \"\");\n if (linkContent) linkContent.innerHTML = title ? `${title}
            ${url}` : url;\n }\n }\n };\n #handleActionsClick = (evt)=>{\n const target = evt.target;\n const deleteBtn = target.closest(\"button.delete-button\");\n const linkEl = target.closest(\"a.link\");\n if (!linkEl && !deleteBtn) return;\n const feedItem = target.closest(\"li\");\n const feedUrl = feedItem.getAttribute(\"data-url\");\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) (0, $b36f6cb20f27a9a6$export$4e54c6fd9fa8b09b)(feedUrl);\n }\n if (linkEl) {\n evt.preventDefault();\n document.querySelector(\"feed-reader\").feedUrl = feedUrl;\n }\n };\n #addFeed(feed) {\n const { url: url, title: title } = feed;\n const link = document.createElement(\"a\");\n link.className = \"link text-decoration-none d-flex align-items-center h-100\";\n link.style.flex = \"1\";\n link.style.minWidth = 0;\n link.style.color = \"inherit\";\n link.href = url;\n const linkContent = document.createElement(\"div\");\n linkContent.className = \"text-truncate link-content\";\n linkContent.innerHTML = title ? `${title}
            ${url}` : url;\n const deleteButton = document.createElement(\"button\");\n deleteButton.type = \"button\";\n deleteButton.title = \"Delete feed\";\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = \"delete-button btn btn-default text-danger p-0\";\n deleteButton.style.lineHeight = \"1\";\n deleteButton.innerHTML = /* html */ `\n \n \n \n Delete\n `;\n const listItem = document.createElement(\"li\");\n listItem.className = \"list-group-item p-0 d-flex justify-content-between align-items-center\";\n listItem.style.height = \"var(--list-item-height)\";\n listItem.setAttribute(\"data-url\", url || \"\");\n listItem.setAttribute(\"data-title\", title || \"\");\n const sortHandler = document.createElement(\"div\");\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = \"sort-handler text-primary\";\n sortHandler.innerHTML = /* html */ `\n \n \n \n Reorder\n `;\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n this.#feedsListEl.appendChild(listItem);\n this.#toggleFeedsVisibility();\n }\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n this.#feedsContainerEl.classList.toggle(\"d-none\", feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle(\"d-none\", feeds.length > 0);\n }\n}\nif (!window.customElements.get(\"feeds-list\")) window.customElements.define(\"feeds-list\", $d02789f57ae99481$var$FeedsList);\n\n\n\nconst $0acd7cf489ccbd45$var$cache = new Map();\nconst $0acd7cf489ccbd45$export$5b107dfb127cada8 = async (url, requestOptions = {})=>{\n const cachedFeed = $0acd7cf489ccbd45$var$cache.get(url);\n if (cachedFeed) return cachedFeed;\n const res = await fetch(\"https://api.rss2json.com/v1/api.json?rss_url=\" + url, requestOptions);\n if (!res.ok) throw new Error(\"Error fetching data\");\n const json = await res.json();\n $0acd7cf489ccbd45$var$cache.set(url, json);\n return json;\n};\n\n\n\nlet $9af02a843127b0d7$var$controller;\nconst $9af02a843127b0d7$var$template = document.createElement(\"template\");\n$9af02a843127b0d7$var$template.innerHTML = /* html */ `\n \n\n \n

            \n\n

            \n\n
            \n
            \n \n Please wait...\n
            \n\n
            \n \n \n \n There was an error while fetching the feed.\n
            \n\n
            \n
            \n
            \n`;\nclass $9af02a843127b0d7$var$FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($9af02a843127b0d7$var$template.content.cloneNode(true));\n }\n this.#spinnerEl = this.shadowRoot.getElementById(\"spinner\");\n this.#dialogEl = this.shadowRoot.querySelector(\"modal-element\");\n this.#modalTitle = this.#dialogEl.querySelector(\"#feedTitle\");\n this.#feedsViewer = this.shadowRoot.getElementById(\"feedsViewer\");\n this.#errorEl = this.shadowRoot.getElementById(\"error\");\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feed-url\"\n ];\n }\n attributeChangedCallback(name) {\n if (name === \"feed-url\") this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n connectedCallback() {\n this.#dialogEl.addEventListener(\"me-close\", this.#handleFeedClose);\n }\n disconnectedCallback() {\n this.#dialogEl.removeEventListener(\"me-close\", this.#handleFeedClose);\n }\n get feedUrl() {\n return this.getAttribute(\"feed-url\");\n }\n set feedUrl(value) {\n if (value) this.setAttribute(\"feed-url\", value);\n else this.removeAttribute(\"feed-url\");\n }\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n #handleFeedClose = ()=>{\n $9af02a843127b0d7$var$controller && $9af02a843127b0d7$var$controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll(\".card\").forEach((el)=>el.remove());\n this.#modalTitle.innerHTML = \"\";\n this.#spinnerEl.classList.add(\"d-none\");\n this.#errorEl.classList.add(\"d-none\");\n }\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove(\"d-none\");\n $9af02a843127b0d7$var$controller = new AbortController();\n try {\n const data = await (0, $0acd7cf489ccbd45$export$5b107dfb127cada8)(feedUrl, {\n signal: $9af02a843127b0d7$var$controller.signal\n });\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n const currentFeed = feeds.find((feed)=>feed.url === feedUrl);\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) await (0, $b36f6cb20f27a9a6$export$4b77448646caf424)({\n url: feedUrl,\n title: data.feed.title || \"\"\n });\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n data.items.forEach((item)=>{\n this.#feedsViewer.insertAdjacentHTML(\"beforeend\", this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n this.#modalTitle.textContent = \"\";\n this.#errorEl.classList.remove(\"d-none\");\n }\n } finally{\n this.#spinnerEl.classList.add(\"d-none\");\n }\n }\n #feedsReaderTemplate(item) {\n const { link: link, title: title, description: description, author: author, pubDate: pubDate, thumbnail: thumbnail } = item;\n let formattedDate = \"\";\n try {\n formattedDate = new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\"\n }).format(new Date(pubDate));\n } catch {\n formattedDate = \"-\";\n }\n return /* html */ `\n
            \n \n
            \n `;\n }\n}\nif (!window.customElements.get(\"feed-reader\")) window.customElements.define(\"feed-reader\", $9af02a843127b0d7$var$FeedReader);\n\n\ndocument.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n\n})();\n//# sourceMappingURL=index.c4734e4f.js.map\n","import '@georapbox/clipboard-copy-element/dist/clipboard-copy-defined.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport '@georapbox/a-tab-group/dist/a-tab-group.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport 'construct-style-sheets-polyfill/dist/adoptedStyleSheets.js';\nimport { styleSheets } from './helpers/styles.js';\nimport './components/add-feed.js';\nimport './components/feeds-list.js';\nimport './components/feed-reader.js';\n\ndocument.adoptedStyleSheets = styleSheets;\n","Object.defineProperty({},\"ClipboardCopy\",{get:function(){return i},set:void 0,enumerable:!0,configurable:!0});let t=\"clipboard-copy\",e=\"success\",o=\"error\",s=document.createElement(\"template\");s.innerHTML=`\n \n\n \n`;class i extends HTMLElement{#t=null;#e;#o;#s;#i;constructor(){super(),this.shadowRoot||(this.attachShadow({mode:\"open\"}),this.shadowRoot.appendChild(s.content.cloneNode(!0))),this.#e=this.shadowRoot.querySelector(\"button\"),this.#o=this.shadowRoot.querySelector('slot[name=\"copy\"]'),this.#s=this.shadowRoot.querySelector('slot[name=\"success\"]'),this.#i=this.shadowRoot.querySelector('slot[name=\"error\"]')}static get observedAttributes(){return[\"disabled\"]}connectedCallback(){this.#r(\"value\"),this.#r(\"from\"),this.#r(\"disabled\"),this.#r(\"feedbackDuration\"),this.#e.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#e.removeEventListener(\"click\",this.#n),this.#a()}attributeChangedCallback(t){\"disabled\"===t&&(this.#e.disabled=this.disabled,this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}get value(){return this.getAttribute(\"value\")}set value(t){this.setAttribute(\"value\",t)}get from(){return this.getAttribute(\"from\")}set from(t){this.setAttribute(\"from\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get feedbackDuration(){return Number(this.getAttribute(\"feedback-duration\"))||1e3}set feedbackDuration(t){this.setAttribute(\"feedback-duration\",t)}async #l(){if(this.value||this.from)try{let o=\"\";if(this.value)o=this.value;else if(this.from){let t=\"getRootNode\"in Element.prototype?this.#e.getRootNode({composed:!0}):this.#e.ownerDocument;if(!t||!(t instanceof Document||t instanceof ShadowRoot))return;let e=t.querySelector(this.from);if(!e)return;o=e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement?e.value:e instanceof HTMLAnchorElement&&e.hasAttribute(\"href\")?e.href:e.textContent}await navigator.clipboard.writeText(o),this.#d(e),this.dispatchEvent(new CustomEvent(`${t}-success`,{bubbles:!0,composed:!0,detail:{value:o}}))}catch(e){this.#d(o),this.dispatchEvent(new CustomEvent(`${t}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}#n=t=>{t.preventDefault(),this.disabled||this.#t||this.#l()};#d(t){this.#o.hidden=!0,this.#s.hidden=t!==e,this.#i.hidden=t!==o,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\"),this.#e.part.add(`button--${t}`),this.#t&&clearTimeout(this.#t),this.#t=setTimeout(()=>{this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(`button--${t}`),this.#t=null},this.feedbackDuration)}#a(){this.#t&&clearTimeout(this.#t),this.#t=null,this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\")}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(e=t){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,i)}}i.defineCustomElement();export{i as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $a4c1285108bf4a9d$exports = {};\n\n$parcel$export($a4c1285108bf4a9d$exports, \"ClipboardCopy\", function () { return $a4c1285108bf4a9d$export$ea3b71af1761ff40; });\nconst $a4c1285108bf4a9d$var$COMPONENT_NAME = \"clipboard-copy\";\nconst $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION = 1000;\nconst $a4c1285108bf4a9d$var$SUCCESS_STATUS = \"success\";\nconst $a4c1285108bf4a9d$var$ERROR_STATUS = \"error\";\nconst $a4c1285108bf4a9d$var$template = document.createElement(\"template\");\n$a4c1285108bf4a9d$var$template.innerHTML = /* html */ `\n \n\n \n`;\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */ class $a4c1285108bf4a9d$export$ea3b71af1761ff40 extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($a4c1285108bf4a9d$var$template.content.cloneNode(true));\n }\n this.#buttonEl = this.shadowRoot.querySelector(\"button\");\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#upgradeProperty(\"value\");\n this.#upgradeProperty(\"from\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"feedbackDuration\");\n this.#buttonEl.addEventListener(\"click\", this.#handleClick);\n }\n disconnectedCallback() {\n this.#buttonEl.removeEventListener(\"click\", this.#handleClick);\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n attributeChangedCallback(name) {\n if (name === \"disabled\") {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute(\"aria-disabled\", this.disabled.toString());\n if (this.#buttonEl.part.contains(\"button\")) this.#buttonEl.part.toggle(\"button--disabled\", this.disabled);\n }\n }\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */ get value() {\n return this.getAttribute(\"value\");\n }\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */ set value(value) {\n this.setAttribute(\"value\", value);\n }\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */ get from() {\n return this.getAttribute(\"from\");\n }\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */ set from(value) {\n this.setAttribute(\"from\", value);\n }\n /**\n * Getter for the disabled state.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */ set disabled(value) {\n if (value) this.setAttribute(\"disabled\", \"\");\n else this.removeAttribute(\"disabled\");\n }\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */ get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION;\n }\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */ set feedbackDuration(value) {\n this.setAttribute(\"feedback-duration\", value);\n }\n /**\n * Copies the value to the clipboard and handles success or error states.\n */ async #copy() {\n if (!this.value && !this.from) return;\n try {\n let copyValue = \"\";\n if (this.value) copyValue = this.value;\n else if (this.from) {\n const root = \"getRootNode\" in Element.prototype ? this.#buttonEl.getRootNode({\n composed: true\n }) : this.#buttonEl.ownerDocument;\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) return;\n const element = root.querySelector(this.from);\n if (!element) return;\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) copyValue = element.value;\n else if (element instanceof HTMLAnchorElement && element.hasAttribute(\"href\")) copyValue = element.href;\n else copyValue = element.textContent;\n }\n await navigator.clipboard.writeText(copyValue);\n this.#showStatus($a4c1285108bf4a9d$var$SUCCESS_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: {\n value: copyValue\n }\n }));\n } catch (error) {\n this.#showStatus($a4c1285108bf4a9d$var$ERROR_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */ #handleClick = (evt)=>{\n evt.preventDefault();\n if (this.disabled || this.#timeout) return;\n this.#copy();\n };\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */ #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== $a4c1285108bf4a9d$var$SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== $a4c1285108bf4a9d$var$ERROR_STATUS;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n this.#buttonEl.part.add(`button--${status}`);\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = setTimeout(()=>{\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(`button--${status}`);\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */ #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n }\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */ #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */ static defineCustomElement(elementName = $a4c1285108bf4a9d$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $a4c1285108bf4a9d$export$ea3b71af1761ff40);\n }\n}\n\n\n(0, $a4c1285108bf4a9d$export$ea3b71af1761ff40).defineCustomElement();\n\n\nexport {$a4c1285108bf4a9d$export$ea3b71af1761ff40 as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","import { ClipboardCopy } from './clipboard-copy.js';\n\nClipboardCopy.defineCustomElement();\n\nexport { ClipboardCopy };\n","const COMPONENT_NAME = 'clipboard-copy';\nconst DEFAULT_FEEDBACK_DURATION = 1000;\nconst SUCCESS_STATUS = 'success';\nconst ERROR_STATUS = 'error';\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n`;\n\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */\nclass ClipboardCopy extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonEl = this.shadowRoot.querySelector('button');\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n connectedCallback() {\n this.#upgradeProperty('value');\n this.#upgradeProperty('from');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('feedbackDuration');\n\n this.#buttonEl.addEventListener('click', this.#handleClick);\n }\n\n disconnectedCallback() {\n this.#buttonEl.removeEventListener('click', this.#handleClick);\n\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n\n attributeChangedCallback(name) {\n if (name === 'disabled') {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */\n get value() {\n return this.getAttribute('value');\n }\n\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */\n set value(value) {\n this.setAttribute('value', value);\n }\n\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */\n get from() {\n return this.getAttribute('from');\n }\n\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */\n set from(value) {\n this.setAttribute('from', value);\n }\n\n /**\n * Getter for the disabled state.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */\n set disabled(value) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */\n get feedbackDuration() {\n return Number(this.getAttribute('feedback-duration')) || DEFAULT_FEEDBACK_DURATION;\n }\n\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */\n set feedbackDuration(value) {\n this.setAttribute('feedback-duration', value);\n }\n\n /**\n * Copies the value to the clipboard and handles success or error states.\n */\n async #copy() {\n if (!this.value && !this.from) {\n return;\n }\n\n try {\n let copyValue = '';\n\n if (this.value) {\n copyValue = this.value;\n } else if (this.from) {\n const root = 'getRootNode' in Element.prototype\n ? this.#buttonEl.getRootNode({ composed: true })\n : this.#buttonEl.ownerDocument;\n\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) {\n return;\n }\n\n const element = root.querySelector(this.from);\n\n if (!element) {\n return;\n }\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n copyValue = element.value;\n } else if (element instanceof HTMLAnchorElement && element.hasAttribute('href')) {\n copyValue = element.href;\n } else {\n copyValue = element.textContent;\n }\n }\n\n await navigator.clipboard.writeText(copyValue);\n\n this.#showStatus(SUCCESS_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: { value: copyValue }\n }));\n } catch (error) {\n this.#showStatus(ERROR_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled || this.#timeout) {\n return;\n }\n\n this.#copy();\n };\n\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */\n #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== ERROR_STATUS;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n this.#buttonEl.part.add(`button--${status}`);\n\n this.#timeout && clearTimeout(this.#timeout);\n\n this.#timeout = setTimeout(() => {\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove(`button--${status}`);\n\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */\n #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n }\n\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */\n #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ClipboardCopy);\n }\n }\n}\n\nexport { ClipboardCopy };\n","Object.defineProperty({},\"WebShare\",{get:function(){return s},set:void 0,enumerable:!0,configurable:!0});let t=`\n :host {\n display: inline-block;\n }\n`,e=document.createElement(\"template\");e.innerHTML=`\n \n \n`;class s extends HTMLElement{#t;#e;#s=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(e.content.cloneNode(!0)),this.#t=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#e=this.#i()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,s){\"disabled\"===t&&e!==s&&this.#e&&(this.#e.toggleAttribute(\"disabled\",this.disabled),this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part&&this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#r(\"shareUrl\"),this.#r(\"shareTitle\"),this.#r(\"shareText\"),this.#r(\"shareFiles\"),this.#r(\"disabled\"),this.#t?.addEventListener(\"slotchange\",this.#a),this.#e?.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#t?.removeEventListener(\"slotchange\",this.#a),this.#e?.removeEventListener(\"click\",this.#n)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#s}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#s=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&\"AbortError\"===t.name){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#n=t=>{t.preventDefault(),this.disabled||this.share()};#a=t=>{t.target&&\"button\"===t.target.name&&(this.#e?.removeEventListener(\"click\",this.#n),this.#e=this.#i(),this.#e&&(this.#e.addEventListener(\"click\",this.#n),\"BUTTON\"===this.#e.nodeName||this.#e.hasAttribute(\"role\")||this.#e.setAttribute(\"role\",\"button\")))};#i(){return this.#t&&this.#t.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"button\"===t.getAttribute(\"slot\"))||null}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(t=\"web-share\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,s)}}s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */ function $442be162a818aed4$export$c37129e465f64ef0(options) {\n if (options !== null && typeof options === \"object\") return \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(options);\n return \"share\" in navigator;\n}\n\n\nexport {$442be162a818aed4$export$c37129e465f64ef0 as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */`\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles)\n && this.shareFiles.length > 0\n && navigator.canShare\n && navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n\n return;\n }\n\n this.dispatchEvent(new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","Object.defineProperty({},\"FilesDropzone\",{get:function(){return m},set:void 0,enumerable:!0,configurable:!0});let e=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),t=[\".DS_Store\",\"Thumbs.db\"],o=t=>{let{name:o}=t;if(o&&-1!==o.lastIndexOf(\".\")&&!t.type){let i=(o.split(\".\").pop()||\"\").toLowerCase(),r=e.get(i);r&&Object.defineProperty(t,\"type\",{value:r,writable:!1,configurable:!1,enumerable:!0})}return t},i=(e,t)=>{let i=o(e);if(\"string\"!=typeof i.path){let{webkitRelativePath:o}=e;Object.defineProperty(i,\"path\",{value:\"string\"==typeof t?t:o||e.name,writable:!1,configurable:!1,enumerable:!0})}return i},r=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),a=async e=>{let t=[],o=await r(e);for(;o.length>0;)t.push(...o),o=await r(e);return t},n=e=>new Promise((t,o)=>{e.file(o=>t(i(o,e.fullPath)),o)}),s=async e=>{let o=[],i=[];for(let t of e){if(\"file\"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();i.push(e)}for(;i.length>0;){let e=i.shift();if(e){if(e.isFile){let i=await n(e);-1===t.indexOf(i.name)&&o.push(i)}else e.isDirectory&&i.push(...await a(e.createReader()))}}return o},d=async e=>{let o=[];for(let r of e)-1===t.indexOf(r.name)&&o.push(i(r));return o},l=async e=>e.dataTransfer?e.dataTransfer.items?await s(e.dataTransfer.items):await d(e.dataTransfer.files):await d(e.target.files),p=\"files-dropzone\",c=\"TOO_MANY_FILES\",h=document.createElement(\"template\"),u=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;h.innerHTML=`\n \n\n \n\n
            \n Drag 'n' drop files here, or click to select files\n
            \n`;class m extends HTMLElement{#e=null;#t=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(h.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.getElementById(\"file-input\"),this.#t=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,o){\"accept\"===e&&t!==o&&this.#e&&(this.#e.accept=this.accept),\"disabled\"===e&&t!==o&&this.#e&&(this.#e.disabled=this.disabled,this.disabled?(this.#t?.removeAttribute(\"tabindex\"),this.#t?.setAttribute(\"aria-disabled\",\"true\")):(this.#t?.setAttribute(\"tabindex\",\"0\"),this.#t?.setAttribute(\"aria-disabled\",\"false\"))),\"multiple\"===e&&t!==o&&this.#e&&(this.#e.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#e?.addEventListener(\"change\",this.#i),this.#t?.addEventListener(\"dragenter\",this.#r),this.#t?.addEventListener(\"dragover\",this.#a),this.#t?.addEventListener(\"dragleave\",this.#n),this.#t?.addEventListener(\"drop\",this.#s),this.#t?.addEventListener(\"click\",this.#d),this.#t?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#t?.focus()}disconnectedCallback(){this.#e?.removeEventListener(\"change\",this.#i),this.#t?.removeEventListener(\"dragenter\",this.#r),this.#t?.removeEventListener(\"dragover\",this.#a),this.#t?.removeEventListener(\"dragleave\",this.#n),this.#t?.removeEventListener(\"drop\",this.#s),this.#t?.removeEventListener(\"click\",this.#d),this.#t?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",null!=e?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",null!=e?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${p}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#t&&(this.#t.classList.add(\"dropzone--dragover\"),this.#t.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragleave`,{bubbles:!0,composed:!0})))};#s=async e=>{if(!this.disabled){e.preventDefault(),this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\"));try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#d=()=>{this.disabled||this.#e?.click()};#l=e=>{this.disabled||\" \"!==e.key&&\"Enter\"!==e.key||this.#e?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:c,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:c,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let i of e){let e=function(e,t=\"\"){if(!t)return!0;let o=[...new Set(t.split(\",\").map(e=>e.trim()).filter(Boolean))],i=e.type,r=i.replace(/\\/.*$/,\"\");for(let t of o)if(\".\"===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\\/\\*$/.test(t)){if(r===t.replace(/\\/.*$/,\"\"))return!0}else if(i===t)return!0;return!1}(i,this.accept),r=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${p}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${p}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#e&&(this.#e.value=this.#e.defaultValue)}openFileDialog(){this.disabled||this.#e?.click()}#o(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=p){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,m)}}m.defineCustomElement();export{m as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $862aa3736b0514bc$exports = {};\n\n$parcel$export($862aa3736b0514bc$exports, \"FilesDropzone\", function () { return $862aa3736b0514bc$export$6ccd1735166caad9; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ // @ts-check\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */ function $38f222170fd4d21a$export$7c47054fed488f80(file, acceptedTypeSpecifiers = \"\") {\n if (!acceptedTypeSpecifiers) return true;\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(\",\").map((v)=>v.trim()).filter(Boolean))\n ];\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, \"\");\n for (const validType of acceptedMimeTypesList){\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n } else {\n if (fileMimeType === validType) return true;\n }\n }\n return false;\n}\n\n\n// @ts-check\n/**\n * A map of common file extensions and their associated MIME types.\n */ const $f31161edf38949e9$var$COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n // Others\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]);\nconst $f31161edf38949e9$var$FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n \".DS_Store\",\n \"Thumbs.db\" // Windows\n];\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */ const $f31161edf38949e9$var$toFileWithMimeType = (file)=>{\n const { name: name } = file;\n const hasExtension = name && name.lastIndexOf(\".\") !== -1;\n if (hasExtension && !file.type) {\n const extension = (name.split(\".\").pop() || \"\").toLowerCase();\n const type = $f31161edf38949e9$var$COMMON_MIME_TYPES.get(extension);\n if (type) Object.defineProperty(file, \"type\", {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return file;\n};\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */ const $f31161edf38949e9$var$toFileWithPath = (file, path)=>{\n const fileWithMimeType = $f31161edf38949e9$var$toFileWithMimeType(file);\n // @ts-ignore\n if (typeof fileWithMimeType.path !== \"string\") {\n const { webkitRelativePath: webkitRelativePath } = file;\n Object.defineProperty(fileWithMimeType, \"path\", {\n value: typeof path === \"string\" ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return fileWithMimeType;\n};\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readEntriesPromise = async (directoryReader)=>{\n return await new Promise((resolve, reject)=>{\n directoryReader.readEntries(resolve, reject);\n });\n};\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readAllDirectoryEntries = async (directoryReader)=>{\n const entries = [];\n let readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n while(readEntries.length > 0){\n entries.push(...readEntries);\n readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n }\n return entries;\n};\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */ const $f31161edf38949e9$var$getFileFromFileEntry = (fileEntry)=>{\n return new Promise((resolve, reject)=>{\n fileEntry.file((file)=>resolve($f31161edf38949e9$var$toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromDataTransferItemList = async (dataTransferItemList)=>{\n const files = [];\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n for (const item of dataTransferItemList){\n if (item.kind !== \"file\") continue;\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n queue.push(entry);\n }\n while(queue.length > 0){\n const entry = queue.shift();\n if (!entry) continue;\n else if (entry.isFile) {\n const file = await $f31161edf38949e9$var$getFileFromFileEntry(entry);\n if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push(file);\n } else if (entry.isDirectory) queue.push(...await $f31161edf38949e9$var$readAllDirectoryEntries(entry.createReader()));\n }\n return files;\n};\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromFileList = async (fileList)=>{\n const files = [];\n for (const file of fileList)if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push($f31161edf38949e9$var$toFileWithPath(file));\n return files;\n};\nconst $f31161edf38949e9$export$6d52664cd15c442 = async (evt)=>{\n if (evt.dataTransfer) return evt.dataTransfer.items ? await $f31161edf38949e9$var$getFilesFromDataTransferItemList(evt.dataTransfer.items) : await $f31161edf38949e9$var$getFilesFromFileList(evt.dataTransfer.files);\n return await $f31161edf38949e9$var$getFilesFromFileList(evt.target.files);\n};\n\n\nconst $862aa3736b0514bc$var$COMPONENT_NAME = \"files-dropzone\";\nconst $862aa3736b0514bc$var$TOO_MANY_FILES = \"TOO_MANY_FILES\";\nconst $862aa3736b0514bc$var$FILE_TOO_LARGE = \"FILE_TOO_LARGE\";\nconst $862aa3736b0514bc$var$FILE_TOO_SMALL = \"FILE_TOO_SMALL\";\nconst $862aa3736b0514bc$var$INVALID_MIME_TYPE = \"INVALID_MIME_TYPE\";\nconst $862aa3736b0514bc$var$template = document.createElement(\"template\");\nconst $862aa3736b0514bc$var$styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$862aa3736b0514bc$var$template.innerHTML = /* html */ `\n \n\n \n\n
            \n Drag 'n' drop files here, or click to select files\n
            \n`;\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */ class $862aa3736b0514bc$export$6ccd1735166caad9 extends HTMLElement {\n /** @type {Nullable} */ #fileInput = null;\n /** @type {Nullable} */ #dropzoneEl = null;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($862aa3736b0514bc$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ this.shadowRoot.getElementById(\"file-input\");\n this.#dropzoneEl = this.shadowRoot.getElementById(\"dropzone\");\n }\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"accept\" && oldValue !== newValue && this.#fileInput) this.#fileInput.accept = this.accept;\n if (name === \"disabled\" && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute(\"tabindex\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.#dropzoneEl?.setAttribute(\"tabindex\", \"0\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"false\");\n }\n }\n if (name === \"multiple\" && oldValue !== newValue && this.#fileInput) this.#fileInput.multiple = this.multiple;\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"accept\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"maxFiles\");\n this.#upgradeProperty(\"maxSize\");\n this.#upgradeProperty(\"minSize\");\n this.#upgradeProperty(\"multiple\");\n this.#upgradeProperty(\"autoFocus\");\n this.#upgradeProperty(\"noStyle\");\n this.#fileInput?.addEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.addEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.addEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.addEventListener(\"keyup\", this.#handleKeyUp);\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#fileInput?.removeEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.removeEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.removeEventListener(\"keyup\", this.#handleKeyUp);\n }\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */ get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(value) {\n this.setAttribute(\"accept\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */ get maxFiles() {\n const num = Number(this.getAttribute(\"max-files\")) || 0;\n if (num <= 0) return Infinity;\n return Math.floor(Math.abs(num));\n }\n set maxFiles(value) {\n this.setAttribute(\"max-files\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */ get maxSize() {\n const value = this.getAttribute(\"max-size\");\n if (value === null) return Infinity;\n const num = Number(value);\n return Number.isNaN(num) ? Infinity : num;\n }\n set maxSize(value) {\n this.setAttribute(\"max-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */ get minSize() {\n const value = this.getAttribute(\"min-size\");\n if (value === null) return 0;\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n set minSize(value) {\n this.setAttribute(\"min-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */ get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(value) {\n this.toggleAttribute(\"multiple\", !!value);\n }\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */ get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(value) {\n this.toggleAttribute(\"auto-focus\", !!value);\n }\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */ get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(value) {\n this.toggleAttribute(\"no-style\", !!value);\n }\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */ #handleFileInputChange = async (evt)=>{\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the dragenter event of the dropzone.\n */ #handleDragEnter = ()=>{\n if (this.disabled) return;\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDragOver = (evt)=>{\n evt.preventDefault();\n if (this.disabled) {\n evt.dataTransfer.dropEffect = \"none\";\n return;\n }\n evt.dataTransfer.dropEffect = \"copy\";\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add(\"dropzone--dragover\");\n this.#dropzoneEl.part.add(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragleave event of the dropzone.\n */ #handleDragLeave = ()=>{\n if (this.disabled) return;\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDrop = async (evt)=>{\n if (this.disabled) return;\n evt.preventDefault();\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the click event of the dropzone.\n */ #handleClick = ()=>{\n if (this.disabled) return;\n this.#fileInput?.click();\n };\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleKeyUp = (evt)=>{\n if (this.disabled) return;\n if (evt.key === \" \" || evt.key === \"Enter\") this.#fileInput?.click();\n };\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */ #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) return;\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n else if (this.multiple && filesLength > this.maxFiles) // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files){\n const fileHasValidType = (0, $38f222170fd4d21a$export$7c47054fed488f80)(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) acceptedFiles.push(file);\n else {\n const errors = [];\n if (!fileHasValidType) errors.push({\n code: $862aa3736b0514bc$var$INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n if (fileExceedsMaxSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n if (fileIsSmallerThanMinSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n rejectedFiles.push({\n file: file,\n errors: errors\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles,\n rejectedFiles: rejectedFiles\n }\n }));\n if (acceptedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles\n }\n }));\n if (rejectedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles: rejectedFiles\n }\n }));\n if (this.#fileInput) this.#fileInput.value = this.#fileInput.defaultValue;\n }\n /**\n * Opens the file dialog programmatically.\n */ openFileDialog() {\n if (this.disabled) return;\n this.#fileInput?.click();\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */ static defineCustomElement(elementName = $862aa3736b0514bc$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $862aa3736b0514bc$export$6ccd1735166caad9);\n }\n}\n\n\n(0, $862aa3736b0514bc$export$6ccd1735166caad9).defineCustomElement();\n\n\nexport {$862aa3736b0514bc$export$6ccd1735166caad9 as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n
            \n Drag 'n' drop files here, or click to select files\n
            \n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */(this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n }));\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n }));\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n }));\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(',').map(v => v.trim()).filter(Boolean))\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...await readAllDirectoryEntries(entry.createReader()));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","let t=(t=\"\",e=\"\")=>{let s=Math.random().toString(36).substring(2,8);return`${\"string\"==typeof t&&\"\"!==t?t+\"-\":\"\"}${s}${\"string\"==typeof e&&\"\"!==e?\"-\"+e:\"\"}`},e=(t,e)=>{if(Object.prototype.hasOwnProperty.call(e,t)){let s=e[t];delete e[t],e[t]=s}},s=0,o=`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`,a=document.createElement(\"template\");a.innerHTML=`\n \n\n
            \n \n
            \n`;class l extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(a.content.cloneNode(!0))}static get observedAttributes(){return[\"selected\",\"disabled\",\"closable\"]}attributeChangedCallback(t,e,s){if(\"selected\"===t&&e!==s&&this.setAttribute(\"aria-selected\",this.selected.toString()),\"disabled\"===t&&e!==s&&(this.setAttribute(\"aria-disabled\",this.disabled.toString()),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")),\"closable\"===t&&e!==s){if(this.closable){let t=document.createElement(\"span\");t.className=\"tab__close\",t.setAttribute(\"part\",\"close-tab\"),t.innerHTML='',this.shadowRoot?.querySelector(\".tab\")?.appendChild(t),t.addEventListener(\"click\",this.#t)}else{let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t),t?.remove()}}}connectedCallback(){this.#e(\"selected\"),this.#e(\"disabled\"),this.#e(\"closable\"),this.id||(this.id=t(\"tab\",(++s).toString())),this.setAttribute(\"slot\",\"tab\"),this.setAttribute(\"role\",\"tab\"),this.setAttribute(\"aria-selected\",\"false\"),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t)}get selected(){return this.hasAttribute(\"selected\")}set selected(t){this.toggleAttribute(\"selected\",!!t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get closable(){return this.hasAttribute(\"closable\")}set closable(t){this.toggleAttribute(\"closable\",!!t)}#t=t=>{t.stopPropagation(),this.dispatchEvent(new CustomEvent(\"a-tab-close\",{bubbles:!0,composed:!0,detail:{tabId:this.id}}))};#e(t){return e(t,this)}static defineCustomElement(t=\"a-tab\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,l)}}l.defineCustomElement();let i=0,r=`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`,n=document.createElement(\"template\");n.innerHTML=`\n \n\n
            \n \n
            \n`;class c extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(n.content.cloneNode(!0))}connectedCallback(){this.setAttribute(\"slot\",\"panel\"),this.setAttribute(\"role\",\"tabpanel\"),this.setAttribute(\"hidden\",\"\"),this.id||(this.id=t(\"panel\",(++i).toString()))}static defineCustomElement(t=\"a-tab-panel\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,c)}}c.defineCustomElement();let d={TOP:\"top\",BOTTOM:\"bottom\",START:\"start\",END:\"end\"},h=Object.entries(d).map(([,t])=>t),b={AUTO:\"auto\",MANUAL:\"manual\"},u={DOWN:\"ArrowDown\",LEFT:\"ArrowLeft\",RIGHT:\"ArrowRight\",UP:\"ArrowUp\",HOME:\"Home\",END:\"End\",ENTER:\"Enter\",SPACE:\" \"},p=`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`,g=document.createElement(\"template\");g.innerHTML=`\n \n\n
            \n
            \n \n\n
            \n \n
            \n\n \n
            \n\n
            \n \n
            \n
            \n`;class m extends HTMLElement{#s=null;#o=null;#a=!1;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(g.content.cloneNode(!0))}static get observedAttributes(){return[\"placement\",\"no-scroll-controls\"]}attributeChangedCallback(t,e,s){\"placement\"===t&&e!==s&&this.#l(),\"no-scroll-controls\"===t&&e!==s&&this.#l()}get placement(){return this.getAttribute(\"placement\")||d.TOP}set placement(t){null!=t&&this.setAttribute(\"placement\",t)}get noScrollControls(){return this.hasAttribute(\"no-scroll-controls\")}set noScrollControls(t){this.toggleAttribute(\"no-scroll-controls\",!!t)}get scrollDistance(){return Math.abs(Number(this.getAttribute(\"scroll-distance\")))||200}set scrollDistance(t){this.setAttribute(\"scroll-distance\",Math.abs(t).toString()||\"200\")}get activation(){return this.getAttribute(\"activation\")||b.AUTO}set activation(t){this.setAttribute(\"activation\",t||b.AUTO)}get noTabCycling(){return this.hasAttribute(\"no-tab-cycling\")}set noTabCycling(t){this.toggleAttribute(\"no-tab-cycling\",!!t)}connectedCallback(){this.#e(\"placement\"),this.#e(\"noScrollControls\"),this.#e(\"scrollDistance\"),this.#e(\"activation\"),this.#e(\"noTabCycling\");let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=this.shadowRoot?.querySelector(\".tab-group__nav\"),a=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.addEventListener(\"slotchange\",this.#i),e?.addEventListener(\"slotchange\",this.#i),s?.addEventListener(\"click\",this.#r),s?.addEventListener(\"keydown\",this.#n),a.forEach(t=>t.addEventListener(\"click\",this.#c)),this.addEventListener(\"a-tab-close\",this.#d),\"ResizeObserver\"in window&&(this.#s=new ResizeObserver(t=>{this.#o=window.requestAnimationFrame(()=>{let e=t?.[0],s=e?.target,l=s?.scrollWidth>s?.clientWidth;a.forEach(t=>t.toggleAttribute(\"hidden\",!l)),o?.part.toggle(\"nav--has-scroll-controls\",l),o?.classList.toggle(\"tab-group__nav--has-scroll-controls\",l)})})),this.#h(),this.#l()}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.removeEventListener(\"slotchange\",this.#i),e?.removeEventListener(\"slotchange\",this.#i),s?.removeEventListener(\"click\",this.#r),s?.removeEventListener(\"keydown\",this.#n),o.forEach(t=>t.removeEventListener(\"click\",this.#c)),this.removeEventListener(\"a-tab-close\",this.#d),this.#b()}#u(){if(!this.#s)return;let t=this.shadowRoot?.querySelector(\".tab-group__tabs\");t&&(this.#s.unobserve(t),this.#s.observe(t))}#b(){this.#s&&(this.#s.disconnect(),null!==this.#o&&(window.cancelAnimationFrame(this.#o),this.#o=null))}#p(){return getComputedStyle(this).direction||\"ltr\"}#h(){this.hidden=0===this.#g().length}#m(){let t=this.#g();this.#h(),t.forEach(t=>{let e=t.nextElementSibling;if(!e||\"a-tab-panel\"!==e.tagName.toLowerCase())return console.error(`Tab #${t.id} is not a sibling of a `);t.setAttribute(\"aria-controls\",e.id),e.setAttribute(\"aria-labelledby\",t.id)})}#v(){return Array.from(this.querySelectorAll(\"a-tab-panel\"))}#g(){return Array.from(this.querySelectorAll(\"a-tab\"))}#f(t){let e=t.getAttribute(\"aria-controls\");return this.querySelector(`#${e}`)}#w(){return this.#g().find(t=>!t.disabled)||null}#T(){let t=this.#g();for(let e=t.length-1;e>=0;e--)if(!t[e].disabled)return t[e];return null}#y(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))-1:t.findIndex(t=>t.selected)-1;for(;t[(e+t.length)%t.length].disabled;)e--;return this.noTabCycling&&e<0?null:t[(e+t.length)%t.length]}#A(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))+1:t.findIndex(t=>t.selected)+1;for(;t[e%t.length].disabled;)e++;return this.noTabCycling&&e>=t.length?null:t[e%t.length]}#_(){let t=this.#g(),e=this.#v();t.forEach(t=>t.selected=!1),e.forEach(t=>t.hidden=!0)}#l(){let t=this.shadowRoot?.querySelector(\".tab-group__nav\"),e=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);this.noScrollControls||this.placement===d.START||this.placement===d.END?(this.#b(),e.forEach(t=>t.hidden=!0),t?.part.remove(\"nav--has-scroll-controls\"),t?.classList.remove(\"tab-group__nav--has-scroll-controls\")):(this.#u(),e.forEach(t=>t.hidden=!1))}#E(){let t=this.#g(),e=t.find(t=>t.selected&&!t.disabled)||t.find(t=>!t.disabled);e&&(this.#a&&!e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.#C(e))}#C(t){this.#_(),t&&(t.selected=!0);let e=this.#f(t);e&&(e.hidden=!1)}#i=t=>{this.#m(),this.#l(),this.#E(),\"tab\"===t.target.name&&(this.#a=!0)};#n=t=>{if(\"a-tab\"!==t.target.tagName.toLowerCase()||t.altKey)return;let e=h.includes(this.placement||\"\")?this.placement:d.TOP,s=[d.TOP,d.BOTTOM].includes(e||\"\")?\"horizontal\":\"vertical\",o=this.#p(),a=null;switch(t.key){case u.LEFT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#y():this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.RIGHT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#A():this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.UP:\"vertical\"===s&&(a=this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.DOWN:\"vertical\"===s&&(a=this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.HOME:(a=this.#w())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.END:(a=this.#T())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.ENTER:case u.SPACE:(a=t.target)&&this.selectTab(a);break;default:return}t.preventDefault()};#r=t=>{let e=t.target.closest(\"a-tab\");e&&this.selectTab(e)};#c=t=>{let e=t.target.closest(\".tab-group__scroll-button\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\");if(!e||!s)return;let o=e.classList.contains(\"tab-group__scroll-button--start\")?-1:1,a=s.scrollLeft;s.scrollTo({left:a+o*this.scrollDistance})};#d=t=>{let e=t.target,s=this.#f(e);e&&(e.remove(),e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}}))),s&&\"a-tab-panel\"===s.tagName.toLowerCase()&&s.remove()};#e(t){return e(t,this)}selectTabByIndex(t){let e=this.#g()[t];e&&this.selectTab(e)}selectTabById(t){let e=this.#g().find(e=>e.id===t);e&&this.selectTab(e)}selectTab(t){let e=this.#g().find(t=>t.selected);!t||t.disabled||t.selected||\"a-tab\"!==t.tagName.toLowerCase()||(this.#C(t),window.requestAnimationFrame(()=>{t.scrollIntoView({inline:\"nearest\",block:\"nearest\"}),t.focus()}),e&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:t.id}})))}static defineCustomElement(t=\"a-tab-group\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,m)}}m.defineCustomElement();export{m as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /** @typedef {import('./a-tab').Tab} Tab */ /** @typedef {import('./a-tab-panel').TabPanel} TabPanel */ // @ts-check\n// @ts-check\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $aa07eeb3067ea186$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n// @ts-check\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */ const $2b7397b7d9d03d51$export$f7b23927dede22b3 = (prop, instance)=>{\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\n\nlet $4b127c96b8d62b28$var$tabCounter = 0;\nconst $4b127c96b8d62b28$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\nconst $4b127c96b8d62b28$var$template = document.createElement(\"template\");\n$4b127c96b8d62b28$var$template.innerHTML = /* html */ `\n \n\n
            \n \n
            \n`;\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */ class $4b127c96b8d62b28$export$3e41faf802a29e71 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($4b127c96b8d62b28$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"selected\" && oldValue !== newValue) this.setAttribute(\"aria-selected\", this.selected.toString());\n if (name === \"disabled\" && oldValue !== newValue) {\n this.setAttribute(\"aria-disabled\", this.disabled.toString());\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n if (name === \"closable\" && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement(\"span\");\n closeButton.className = \"tab__close\";\n closeButton.setAttribute(\"part\", \"close-tab\");\n closeButton.innerHTML = /* html */ ``;\n this.shadowRoot?.querySelector(\".tab\")?.appendChild(closeButton);\n closeButton.addEventListener(\"click\", this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"selected\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"closable\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"tab\", (++$4b127c96b8d62b28$var$tabCounter).toString());\n this.setAttribute(\"slot\", \"tab\");\n this.setAttribute(\"role\", \"tab\");\n this.setAttribute(\"aria-selected\", \"false\");\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n }\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */ get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(value) {\n this.toggleAttribute(\"selected\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */ get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(value) {\n this.toggleAttribute(\"closable\", !!value);\n }\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n evt.stopPropagation();\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: {\n tabId: this.id\n }\n }));\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n static defineCustomElement(elementName = \"a-tab\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $4b127c96b8d62b28$export$3e41faf802a29e71);\n }\n}\n$4b127c96b8d62b28$export$3e41faf802a29e71.defineCustomElement();\n\n\n// @ts-check\n\nlet $17a63ddf0f11756d$var$panelCounter = 0;\nconst $17a63ddf0f11756d$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\nconst $17a63ddf0f11756d$var$template = document.createElement(\"template\");\n$17a63ddf0f11756d$var$template.innerHTML = /* html */ `\n \n\n
            \n \n
            \n`;\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */ class $17a63ddf0f11756d$export$3d96ec278d3efce4 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($17a63ddf0f11756d$var$template.content.cloneNode(true));\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.setAttribute(\"slot\", \"panel\");\n this.setAttribute(\"role\", \"tabpanel\");\n this.setAttribute(\"hidden\", \"\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"panel\", (++$17a63ddf0f11756d$var$panelCounter).toString());\n }\n static defineCustomElement(elementName = \"a-tab-panel\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $17a63ddf0f11756d$export$3d96ec278d3efce4);\n }\n}\n$17a63ddf0f11756d$export$3d96ec278d3efce4.defineCustomElement();\n\n\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */ const $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE = 200;\n/**\n * The available placements for the tabs.\n */ const $6ed9897cfe6c2018$var$PLACEMENT = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n};\n/**\n * The valid placements for the tabs.\n */ const $6ed9897cfe6c2018$var$validPlacements = Object.entries($6ed9897cfe6c2018$var$PLACEMENT).map(([, value])=>value);\n/**\n * The available activation modes for the tabs.\n */ const $6ed9897cfe6c2018$var$ACTIVATION = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n};\n/**\n * Defines key codes to help with handling keyboard events.\n */ const $6ed9897cfe6c2018$var$KEYCODE = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n};\nconst $6ed9897cfe6c2018$var$styles = /* css */ `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\nconst $6ed9897cfe6c2018$var$template = document.createElement(\"template\");\n$6ed9897cfe6c2018$var$template.innerHTML = /* html */ `\n \n\n
            \n
            \n \n\n
            \n \n
            \n\n \n
            \n\n
            \n \n
            \n
            \n`;\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */ class $6ed9897cfe6c2018$export$85fd4ed3b8ca1010 extends HTMLElement {\n /** @type {Nullable} */ #resizeObserver = null;\n /** @type {Nullable} */ #rafId = null;\n /** @type {boolean} */ #hasTabSlotChangedOnce = false;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($6ed9897cfe6c2018$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"placement\" && oldValue !== newValue) this.#syncNav();\n if (name === \"no-scroll-controls\" && oldValue !== newValue) this.#syncNav();\n }\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */ get placement() {\n return this.getAttribute(\"placement\") || $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n }\n set placement(value) {\n if (value != null) this.setAttribute(\"placement\", value);\n }\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */ get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(value) {\n this.toggleAttribute(\"no-scroll-controls\", !!value);\n }\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */ get scrollDistance() {\n const value = Number(this.getAttribute(\"scroll-distance\"));\n return Math.abs(value) || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE;\n }\n set scrollDistance(value) {\n this.setAttribute(\"scroll-distance\", Math.abs(value).toString() || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE.toString());\n }\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */ get activation() {\n return this.getAttribute(\"activation\") || $6ed9897cfe6c2018$var$ACTIVATION.AUTO;\n }\n set activation(value) {\n this.setAttribute(\"activation\", value || $6ed9897cfe6c2018$var$ACTIVATION.AUTO);\n }\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */ get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(value) {\n this.toggleAttribute(\"no-tab-cycling\", !!value);\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"placement\");\n this.#upgradeProperty(\"noScrollControls\");\n this.#upgradeProperty(\"scrollDistance\");\n this.#upgradeProperty(\"activation\");\n this.#upgradeProperty(\"noTabCycling\");\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.addEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.addEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.addEventListener(\"click\", this.#handleScrollButtonClick));\n this.addEventListener(\"a-tab-close\", this.#handleTabClose);\n if (\"ResizeObserver\" in window) this.#resizeObserver = new ResizeObserver((entries)=>{\n this.#rafId = window.requestAnimationFrame(()=>{\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach((el)=>el.toggleAttribute(\"hidden\", !isElementScrollable));\n navContainer?.part.toggle(\"nav--has-scroll-controls\", isElementScrollable);\n navContainer?.classList.toggle(\"tab-group__nav--has-scroll-controls\", isElementScrollable);\n });\n });\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.removeEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.removeEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.removeEventListener(\"click\", this.#handleScrollButtonClick));\n this.removeEventListener(\"a-tab-close\", this.#handleTabClose);\n this.#stopResizeObserver();\n }\n /**\n * Starts observing the tabs container for resize events.\n */ #startResizeObserver() {\n if (!this.#resizeObserver) return;\n const scrollElement = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n /**\n * Stops observing the tabs container for resize events.\n */ #stopResizeObserver() {\n if (!this.#resizeObserver) return;\n this.#resizeObserver.disconnect();\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */ #getDirection() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n /**\n * Hides the tab group if there are no tabs.\n */ #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */ #linkPanels() {\n const tabs = this.#allTabs();\n this.#hideEmptyTabGroup();\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach((tab)=>{\n const panel = tab.nextElementSibling;\n if (!panel || panel.tagName.toLowerCase() !== \"a-tab-panel\") return console.error(`Tab #${tab.id} is not a sibling of a `);\n tab.setAttribute(\"aria-controls\", panel.id);\n panel.setAttribute(\"aria-labelledby\", tab.id);\n });\n }\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */ #allPanels() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */ #allTabs() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */ #panelForTab(tab) {\n const panelId = tab.getAttribute(\"aria-controls\");\n return this.querySelector(`#${panelId}`);\n }\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */ #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find((tab)=>!tab.disabled) || null;\n }\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */ #lastTab() {\n const tabs = this.#allTabs();\n for(let i = tabs.length - 1; i >= 0; i--){\n if (!tabs[i].disabled) return tabs[i];\n }\n return null;\n }\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */ #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) - 1 : tabs.findIndex((tab)=>tab.selected) - 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[(newIdx + tabs.length) % tabs.length].disabled)newIdx--;\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) return null;\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */ #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) + 1 : tabs.findIndex((tab)=>tab.selected) + 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[newIdx % tabs.length].disabled)newIdx++;\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) return null;\n return tabs[newIdx % tabs.length];\n }\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */ #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n tabs.forEach((tab)=>tab.selected = false);\n panels.forEach((panel)=>panel.hidden = true);\n }\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */ #syncNav() {\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n /** @type {HTMLButtonElement[]} */ const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n if (this.noScrollControls || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.START || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = true);\n navContainer?.part.remove(\"nav--has-scroll-controls\");\n navContainer?.classList.remove(\"tab-group__nav--has-scroll-controls\");\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = false);\n }\n }\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */ #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find((tab)=>tab.selected && !tab.disabled) || tabs.find((tab)=>!tab.disabled);\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n this.#setSelectedTab(tab);\n }\n }\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */ #setSelectedTab(tab) {\n this.#reset();\n if (tab) tab.selected = true;\n const panel = this.#panelForTab(tab);\n if (panel) panel.hidden = false;\n }\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */ #handleSlotChange = (evt)=>{\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n if (evt.target.name === \"tab\") this.#hasTabSlotChangedOnce = true;\n };\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */ #handleKeyDown = (evt)=>{\n if (evt.target.tagName.toLowerCase() !== \"a-tab\" // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) return;\n const placement = $6ed9897cfe6c2018$var$validPlacements.includes(this.placement || \"\") ? this.placement : $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n const orientation = [\n $6ed9897cfe6c2018$var$PLACEMENT.TOP,\n $6ed9897cfe6c2018$var$PLACEMENT.BOTTOM\n ].includes(placement || \"\") ? \"horizontal\" : \"vertical\";\n const direction = this.#getDirection();\n let tab = null;\n switch(evt.key){\n case $6ed9897cfe6c2018$var$KEYCODE.LEFT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#prevTab() : this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.RIGHT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#nextTab() : this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.UP:\n if (orientation === \"vertical\") {\n tab = this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.DOWN:\n if (orientation === \"vertical\") {\n tab = this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.END:\n tab = this.#lastTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.ENTER:\n case $6ed9897cfe6c2018$var$KEYCODE.SPACE:\n tab = evt.target;\n if (tab) this.selectTab(tab);\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */ #handleTabClick = (evt)=>{\n const tab = evt.target.closest(\"a-tab\");\n if (tab) this.selectTab(tab);\n };\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */ #handleScrollButtonClick = (evt)=>{\n const scrollButton = evt.target.closest(\".tab-group__scroll-button\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!scrollButton || !tabsContainer) return;\n const sign = scrollButton.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */ #handleTabClose = (evt)=>{\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n if (tab) {\n tab.remove();\n tab.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n if (panel && panel.tagName.toLowerCase() === \"a-tab-panel\") panel.remove();\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */ selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */ selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find((tab)=>tab.id === id);\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */ selectTab(tab) {\n const oldTab = this.#allTabs().find((t)=>t.selected);\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== \"a-tab\") return;\n this.#setSelectedTab(tab);\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(()=>{\n tab.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n });\n tab.focus();\n });\n if (oldTab) this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: oldTab.id\n }\n }));\n this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n static defineCustomElement(elementName = \"a-tab-group\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $6ed9897cfe6c2018$export$85fd4ed3b8ca1010);\n }\n}\n$6ed9897cfe6c2018$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nexport {$6ed9897cfe6c2018$export$85fd4ed3b8ca1010 as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/** @typedef {import('./a-tab').Tab} Tab */\n/** @typedef {import('./a-tab-panel').TabPanel} TabPanel */\n\nimport './a-tab.js';\nimport './a-tab-panel.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */\nconst DEFAULT_SCROLL_DISTANCE = 200;\n\n/**\n * The available placements for the tabs.\n */\nconst PLACEMENT = {\n TOP: 'top',\n BOTTOM: 'bottom',\n START: 'start',\n END: 'end'\n};\n\n/**\n * The valid placements for the tabs.\n */\nconst validPlacements = Object.entries(PLACEMENT).map(([, value]) => value);\n\n/**\n * The available activation modes for the tabs.\n */\nconst ACTIVATION = {\n AUTO: 'auto',\n MANUAL: 'manual'\n};\n\n/**\n * Defines key codes to help with handling keyboard events.\n */\nconst KEYCODE = {\n DOWN: 'ArrowDown',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n HOME: 'Home',\n END: 'End',\n ENTER: 'Enter',\n SPACE: ' '\n};\n\nconst styles = /* css */`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
            \n
            \n \n\n
            \n \n
            \n\n \n
            \n\n
            \n \n
            \n
            \n`;\n\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */\nclass TabGroup extends HTMLElement {\n /** @type {Nullable} */\n #resizeObserver = null;\n\n /** @type {Nullable} */\n #rafId = null;\n\n /** @type {boolean} */\n #hasTabSlotChangedOnce = false;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['placement', 'no-scroll-controls'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'placement' && oldValue !== newValue) {\n this.#syncNav();\n }\n\n if (name === 'no-scroll-controls' && oldValue !== newValue) {\n this.#syncNav();\n }\n }\n\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || PLACEMENT.TOP;\n }\n\n set placement(value) {\n if (value != null) {\n this.setAttribute('placement', value);\n }\n }\n\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */\n get noScrollControls() {\n return this.hasAttribute('no-scroll-controls');\n }\n\n set noScrollControls(value) {\n this.toggleAttribute('no-scroll-controls', !!value);\n }\n\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */\n get scrollDistance() {\n const value = Number(this.getAttribute('scroll-distance'));\n return Math.abs(value) || DEFAULT_SCROLL_DISTANCE;\n }\n\n set scrollDistance(value) {\n this.setAttribute('scroll-distance', Math.abs(value).toString() || DEFAULT_SCROLL_DISTANCE.toString());\n }\n\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */\n get activation() {\n return this.getAttribute('activation') || ACTIVATION.AUTO;\n }\n\n set activation(value) {\n this.setAttribute('activation', value || ACTIVATION.AUTO);\n }\n\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */\n get noTabCycling() {\n return this.hasAttribute('no-tab-cycling');\n }\n\n set noTabCycling(value) {\n this.toggleAttribute('no-tab-cycling', !!value);\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('placement');\n this.#upgradeProperty('noScrollControls');\n this.#upgradeProperty('scrollDistance');\n this.#upgradeProperty('activation');\n this.#upgradeProperty('noTabCycling');\n\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.addEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.addEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.addEventListener('click', this.#handleTabClick);\n tabsContainer?.addEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.addEventListener('click', this.#handleScrollButtonClick));\n this.addEventListener('a-tab-close', this.#handleTabClose);\n\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(entries => {\n this.#rafId = window.requestAnimationFrame(() => {\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach(el => el.toggleAttribute('hidden', !isElementScrollable));\n navContainer?.part.toggle('nav--has-scroll-controls', isElementScrollable);\n navContainer?.classList.toggle('tab-group__nav--has-scroll-controls', isElementScrollable);\n });\n });\n }\n\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.removeEventListener('click', this.#handleTabClick);\n tabsContainer?.removeEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.removeEventListener('click', this.#handleScrollButtonClick));\n this.removeEventListener('a-tab-close', this.#handleTabClose);\n this.#stopResizeObserver();\n }\n\n /**\n * Starts observing the tabs container for resize events.\n */\n #startResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n const scrollElement = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n\n /**\n * Stops observing the tabs container for resize events.\n */\n #stopResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n this.#resizeObserver.disconnect();\n\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */\n #getDirection() {\n return getComputedStyle(this).direction || 'ltr';\n }\n\n /**\n * Hides the tab group if there are no tabs.\n */\n #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */\n #linkPanels() {\n const tabs = this.#allTabs();\n\n this.#hideEmptyTabGroup();\n\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach(tab => {\n const panel = tab.nextElementSibling;\n\n if (!panel || panel.tagName.toLowerCase() !== 'a-tab-panel') {\n return console.error(`Tab #${tab.id} is not a sibling of a `);\n }\n\n tab.setAttribute('aria-controls', panel.id);\n panel.setAttribute('aria-labelledby', tab.id);\n });\n }\n\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */\n #allPanels() {\n return Array.from(this.querySelectorAll('a-tab-panel'));\n }\n\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */\n #allTabs() {\n return Array.from(this.querySelectorAll('a-tab'));\n }\n\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */\n #panelForTab(tab) {\n const panelId = tab.getAttribute('aria-controls');\n return this.querySelector(`#${panelId}`);\n }\n\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */\n #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find(tab => !tab.disabled) || null;\n }\n\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */\n #lastTab() {\n const tabs = this.#allTabs();\n\n for (let i = tabs.length - 1; i >= 0; i--) {\n if (!tabs[i].disabled) {\n return tabs[i];\n }\n }\n\n return null;\n }\n\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */\n #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) - 1\n : tabs.findIndex(tab => tab.selected) - 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[(newIdx + tabs.length) % tabs.length].disabled) {\n newIdx--;\n }\n\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) {\n return null;\n }\n\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */\n #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) + 1\n : tabs.findIndex(tab => tab.selected) + 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[newIdx % tabs.length].disabled) {\n newIdx++;\n }\n\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) {\n return null;\n }\n\n return tabs[newIdx % tabs.length];\n }\n\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */\n #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n\n tabs.forEach(tab => tab.selected = false);\n panels.forEach(panel => panel.hidden = true);\n }\n\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */\n #syncNav() {\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n\n /** @type {HTMLButtonElement[]} */\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n if (this.noScrollControls || this.placement === PLACEMENT.START || this.placement === PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach(el => el.hidden = true);\n navContainer?.part.remove('nav--has-scroll-controls');\n navContainer?.classList.remove('tab-group__nav--has-scroll-controls');\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach(el => el.hidden = false);\n }\n }\n\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */\n #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find(tab => tab.selected && !tab.disabled) || tabs.find(tab => !tab.disabled);\n\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) {\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n this.#setSelectedTab(tab);\n }\n }\n\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n #setSelectedTab(tab) {\n this.#reset();\n\n if (tab) {\n tab.selected = true;\n }\n\n const panel = this.#panelForTab(tab);\n\n if (panel) {\n panel.hidden = false;\n }\n }\n\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */\n #handleSlotChange = evt => {\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n\n if (evt.target.name === 'tab') {\n this.#hasTabSlotChangedOnce = true;\n }\n };\n\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */\n #handleKeyDown = evt => {\n if (\n evt.target.tagName.toLowerCase() !== 'a-tab' // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) {\n return;\n }\n\n const placement = validPlacements.includes(this.placement || '') ? this.placement : PLACEMENT.TOP;\n const orientation = [PLACEMENT.TOP, PLACEMENT.BOTTOM].includes(placement || '') ? 'horizontal' : 'vertical';\n const direction = this.#getDirection();\n let tab = null;\n\n switch (evt.key) {\n case KEYCODE.LEFT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#prevTab() : this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.RIGHT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#nextTab() : this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.UP:\n if (orientation === 'vertical') {\n tab = this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.DOWN:\n if (orientation === 'vertical') {\n tab = this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.END:\n tab = this.#lastTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.ENTER:\n case KEYCODE.SPACE:\n tab = evt.target;\n if (tab) {\n this.selectTab(tab);\n }\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClick = evt => {\n const tab = evt.target.closest('a-tab');\n\n if (tab) {\n this.selectTab(tab);\n }\n };\n\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleScrollButtonClick = evt => {\n const scrollButton = evt.target.closest('.tab-group__scroll-button');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (!scrollButton || !tabsContainer) {\n return;\n }\n\n const sign = scrollButton.classList.contains('tab-group__scroll-button--start') ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClose = evt => {\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n\n if (tab) {\n tab.remove();\n\n tab.selected && this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n if (panel && panel.tagName.toLowerCase() === 'a-tab-panel') {\n panel.remove();\n }\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */\n selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */\n selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find(tab => tab.id === id);\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n selectTab(tab) {\n const oldTab = this.#allTabs().find(t => t.selected);\n\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== 'a-tab') {\n return;\n }\n\n this.#setSelectedTab(tab);\n\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(() => {\n tab.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n tab.focus();\n });\n\n if (oldTab) {\n this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: oldTab.id }\n }));\n }\n\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n static defineCustomElement(elementName = 'a-tab-group') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabGroup);\n }\n }\n}\n\nTabGroup.defineCustomElement();\n\nexport { TabGroup };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\nlet tabCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
            \n \n
            \n`;\n\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */\nclass Tab extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['selected', 'disabled', 'closable'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'selected' && oldValue !== newValue) {\n this.setAttribute('aria-selected', this.selected.toString());\n }\n\n if (name === 'disabled' && oldValue !== newValue) {\n this.setAttribute('aria-disabled', this.disabled.toString());\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n if (name === 'closable' && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement('span');\n closeButton.className = 'tab__close';\n closeButton.setAttribute('part', 'close-tab');\n closeButton.innerHTML = /* html */``;\n this.shadowRoot?.querySelector('.tab')?.appendChild(closeButton);\n closeButton.addEventListener('click', this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('selected');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('closable');\n\n if (!this.id) {\n this.id = uid('tab', (++tabCounter).toString());\n }\n\n this.setAttribute('slot', 'tab');\n this.setAttribute('role', 'tab');\n this.setAttribute('aria-selected', 'false');\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n }\n\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */\n get selected() {\n return this.hasAttribute('selected');\n }\n\n set selected(value) {\n this.toggleAttribute('selected', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */\n get closable() {\n return this.hasAttribute('closable');\n }\n\n set closable(value) {\n this.toggleAttribute('closable', !!value);\n }\n\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n evt.stopPropagation();\n\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: { tabId: this.id }\n }));\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n static defineCustomElement(elementName = 'a-tab') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, Tab);\n }\n }\n}\n\nTab.defineCustomElement();\n\nexport { Tab };\n","// @ts-check\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","// @ts-check\n\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */\nconst upgradeProperty = (prop, instance) => {\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\nexport { upgradeProperty };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\n\nlet panelCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
            \n \n
            \n`;\n\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */\nclass TabPanel extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.setAttribute('slot', 'panel');\n this.setAttribute('role', 'tabpanel');\n this.setAttribute('hidden', '');\n\n if (!this.id) {\n this.id = uid('panel', (++panelCounter).toString());\n }\n }\n\n static defineCustomElement(elementName = 'a-tab-panel') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabPanel);\n }\n }\n}\n\nTabPanel.defineCustomElement();\n\nexport { TabPanel };\n","Object.defineProperty({},\"ModalElement\",{get:function(){return o},set:void 0,enumerable:!0,configurable:!0});let e=document.createElement(\"template\"),t=/* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;e.innerHTML=/* html */`\n \n\n \n
            \n
            \n \n\n
            \n \n
            \n
            \n\n \n\n
            \n \n
            \n
            \n
            \n`;/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */class o extends HTMLElement{/** @type {Nullable} */#e=null;/** @type {Nullable} */#t=null;/** @type {ReturnType | undefined} */#o=void 0;constructor(){if(super(),!this.shadowRoot){let t=this.attachShadow({mode:\"open\"});t.appendChild(e.content.cloneNode(!0))}this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#t=this.shadowRoot.querySelector('slot[name=\"footer\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\"]}/**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */attributeChangedCallback(e,t,o){if(null!==this.#e){if(\"open\"===e&&t!==o&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"hidden\")):this.#e.close()),\"no-header\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__header\");null!==e&&(e.hidden=this.noHeader)}if(\"no-animations\"===e&&t!==o&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),\"no-close-button\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__close\");null!==e&&(e.hidden=this.noCloseButton)}}}/**\n * Lifecycle method that is called when the element is added to the DOM.\n */connectedCallback(){this.#i(\"open\"),this.#i(\"staticBackdrop\"),this.#i(\"noHeader\"),this.#i(\"noAnimations\"),this.#i(\"noCloseButton\"),this.#i(\"fullscreen\"),this.#i(\"preserveOverflow\"),this.#e?.addEventListener(\"click\",this.#a),this.#e?.addEventListener(\"close\",this.#l),this.#e?.addEventListener(\"cancel\",this.#r),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#s),this.#t?.addEventListener(\"slotchange\",this.#n)}/**\n * Lifecycle method that is called when the element is removed from the DOM.\n */disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#e?.addEventListener(\"click\",this.#a),this.#e?.removeEventListener(\"close\",this.#l),this.#e?.removeEventListener(\"cancel\",this.#r),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#s),this.#t?.removeEventListener(\"slotchange\",this.#n)}/**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */get open(){return this.hasAttribute(\"open\")}set open(e){this.toggleAttribute(\"open\",!!e)}/**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){this.toggleAttribute(\"static-backdrop\",!!e)}/**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){this.toggleAttribute(\"no-header\",!!e)}/**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){this.toggleAttribute(\"no-animations\",!!e)}/**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){this.toggleAttribute(\"no-close-button\",!!e)}/**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){this.toggleAttribute(\"fullscreen\",!!e)}/**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */get preserveOverflow(){return this.hasAttribute(\"preserve-overflow\")}set preserveOverflow(e){this.toggleAttribute(\"preserve-overflow\",!!e)}/**\n * Applies a pulse effect on the dialog.\n */#d(){this.#o||(this.#e?.classList.add(\"dialog--pulse\"),this.#o=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#o),this.#o=void 0},300))}/**\n * Handles the close event of the dialog.\n */#l=()=>{// This is required because the dialog element does not reset\n// the open property when the dialog is closed by the user.\nthis.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}})),document.body&&!this.preserveOverflow&&(document.body.style.overflow=\"\")};/**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */#r=e=>{let t=this.#c(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */#s=e=>{let t=this.#c(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */#a=e=>{if(e.target!==e.currentTarget)return;let t=this.#c(\"backdrop-click\");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#e?.close()};/**\n * Handles the slotchange event of the footer slot.\n */#n=()=>{if(null===this.#e)return;/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__footer\");if(null===e)return;let t=this.#t?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};/**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */#c(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow'} prop - The property to upgrade.\n */#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}/**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */show(){this.open||(this.open=!0)}/**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */hide(){this.open&&(this.open=!1)}/**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */static defineCustomElement(e=\"modal-element\"){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,o)}}o.defineCustomElement();export{o as ModalElement};//# sourceMappingURL=modal-element-defined.js.map\n\n//# sourceMappingURL=modal-element-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $180b6dcf923bafc7$exports = {};\n\n$parcel$export($180b6dcf923bafc7$exports, \"ModalElement\", function () { return $180b6dcf923bafc7$export$32589115725b904b; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ const $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION = 300;\nconst $180b6dcf923bafc7$var$template = document.createElement(\"template\");\nconst $180b6dcf923bafc7$var$styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${$180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$180b6dcf923bafc7$var$template.innerHTML = /* html */ `\n \n\n \n
            \n
            \n \n\n
            \n \n
            \n
            \n\n \n\n
            \n \n
            \n
            \n
            \n`;\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ class $180b6dcf923bafc7$export$32589115725b904b extends HTMLElement {\n /** @type {Nullable} */ #dialogEl = null;\n /** @type {Nullable} */ #footerSlotEl = null;\n /** @type {ReturnType | undefined} */ #pulseAnimationTimeout = void 0;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($180b6dcf923bafc7$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector(\"dialog\");\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) return;\n if (name === \"open\" && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"hidden\";\n } else this.#dialogEl.close();\n }\n if (name === \"no-header\" && oldValue !== newValue) {\n /** @type {Nullable} */ const headerEl = this.#dialogEl.querySelector(\".dialog__header\");\n if (headerEl !== null) headerEl.hidden = this.noHeader;\n }\n if (name === \"no-animations\" && oldValue !== newValue) this.#dialogEl.classList.toggle(\"dialog--no-animations\", this.noAnimations);\n if (name === \"no-close-button\" && oldValue !== newValue) {\n /** @type {Nullable} */ const closeBtnEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeBtnEl !== null) closeBtnEl.hidden = this.noCloseButton;\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"open\");\n this.#upgradeProperty(\"staticBackdrop\");\n this.#upgradeProperty(\"noHeader\");\n this.#upgradeProperty(\"noAnimations\");\n this.#upgradeProperty(\"noCloseButton\");\n this.#upgradeProperty(\"fullscreen\");\n this.#upgradeProperty(\"preserveOverflow\");\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.addEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.addEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.removeEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.removeEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */ get open() {\n return this.hasAttribute(\"open\");\n }\n set open(value) {\n this.toggleAttribute(\"open\", !!value);\n }\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */ get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(value) {\n this.toggleAttribute(\"static-backdrop\", !!value);\n }\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */ get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(value) {\n this.toggleAttribute(\"no-header\", !!value);\n }\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */ get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(value) {\n this.toggleAttribute(\"no-animations\", !!value);\n }\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */ get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(value) {\n this.toggleAttribute(\"no-close-button\", !!value);\n }\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */ get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(value) {\n this.toggleAttribute(\"fullscreen\", !!value);\n }\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */ get preserveOverflow() {\n return this.hasAttribute(\"preserve-overflow\");\n }\n set preserveOverflow(value) {\n this.toggleAttribute(\"preserve-overflow\", !!value);\n }\n /**\n * Applies a pulse effect on the dialog.\n */ #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) return;\n this.#dialogEl?.classList.add(\"dialog--pulse\");\n this.#pulseAnimationTimeout = setTimeout(()=>{\n this.#dialogEl?.classList.remove(\"dialog--pulse\");\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION);\n }\n /**\n * Handles the close event of the dialog.\n */ #handleDialogClose = ()=>{\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n if (document.body && !this.preserveOverflow) document.body.style.overflow = \"\";\n };\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */ #handleDialogCancel = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"escape-key\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"close-button\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */ #handleDialogClick = (evt)=>{\n if (evt.target !== evt.currentTarget) return;\n const requestCloseEvent = this.#createRequestCloseEvent(\"backdrop-click\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n this.#dialogEl?.close();\n };\n /**\n * Handles the slotchange event of the footer slot.\n */ #handleFooterSlotChange = ()=>{\n if (this.#dialogEl === null) return;\n /** @type {Nullable} */ const footerEl = this.#dialogEl.querySelector(\".dialog__footer\");\n if (footerEl === null) return;\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n footerEl.hidden = !hasFooterSlotNodes;\n };\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */ #createRequestCloseEvent(reason) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason: reason,\n element: this\n }\n });\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */ show() {\n if (this.open) return;\n this.open = true;\n }\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */ hide() {\n if (!this.open) return;\n this.open = false;\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */ static defineCustomElement(elementName = \"modal-element\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $180b6dcf923bafc7$export$32589115725b904b);\n }\n}\n\n\n(0, $180b6dcf923bafc7$export$32589115725b904b).defineCustomElement();\n\n\nexport {$180b6dcf923bafc7$export$32589115725b904b as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nconst PULSE_ANIMATION_DURATION = 300;\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n
            \n
            \n \n\n
            \n \n
            \n
            \n\n \n\n
            \n \n
            \n
            \n
            \n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines whether the modal is open or not.\n * @property {boolean} staticBackdrop - Determines whether the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines whether the modal should have a header or not.\n * @property {boolean} noAnimations - Determines whether the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines whether the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines whether the modal should be fullscreen or not.\n * @property {boolean} preserveOverflow - Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @attribute {boolean} open - Reflects the open property.\n * @attribute {boolean} static-backdrop - Reflects the staticBackdrop property.\n * @attribute {boolean} no-header - Reflects the noHeader property.\n * @attribute {boolean} no-animations - Reflects the noAnimations property.\n * @attribute {boolean} no-close-button - Reflects the noCloseButton property.\n * @attribute {boolean} fullscreen - Reflects the fullscreen property.\n * @attribute {boolean} preserve-overflow - Reflects the preserveOverflow property.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = 'hidden';\n }\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n this.#upgradeProperty('preserveOverflow');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n this.toggleAttribute('open', !!value);\n }\n\n /**\n * Determines whether the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n this.toggleAttribute('static-backdrop', !!value);\n }\n\n /**\n * Determines whether the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n this.toggleAttribute('no-header', !!value);\n }\n\n /**\n * Determines whether the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n this.toggleAttribute('no-animations', !!value);\n }\n\n /**\n * Determines whether the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n this.toggleAttribute('no-close-button', !!value);\n }\n\n /**\n * Determines whether the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n this.toggleAttribute('fullscreen', !!value);\n }\n\n /**\n * Determines whether the overflow of the body should be preserved when the modal is open.\n *\n * @type {boolean} - True if the overflow of the body should be preserved, otherwise false.\n * @default false\n * @attribute preserve-overflow - Reflects the preserveOverflow property.\n */\n get preserveOverflow() {\n return this.hasAttribute('preserve-overflow');\n }\n\n set preserveOverflow(value) {\n this.toggleAttribute('preserve-overflow', !!value);\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is required because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n\n if (document.body && !this.preserveOverflow) {\n document.body.style.overflow = '';\n }\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n if (evt.target !== evt.currentTarget) {\n return;\n }\n\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n\n this.#dialogEl?.close();\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen' | 'preserveOverflow'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","(function () {\n 'use strict';\n\n if (typeof document === 'undefined' || 'adoptedStyleSheets' in document) { return; }\n\n var hasShadyCss = 'ShadyCSS' in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument('');\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === 'object' ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, '');\n if (_contents !== contents) {\n console.warn('@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418');\n }\n return _contents.trim();\n }\n function isElementConnected(element) {\n return 'isConnected' in element\n ? element.isConnected\n : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function (value, index) { return arr.indexOf(value) === index; });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function (value) { return arr2.indexOf(value) === -1; });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n\n var cssStyleSheetMethods = [\n 'addRule',\n 'deleteRule',\n 'insertRule',\n 'removeRule',\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function () {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function () {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? proto$1.isPrototypeOf(instance) ||\n nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement('style');\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function (_location) { return _location !== location; }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function () {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods\n .get(sheet)\n .forEach(function (command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) {\n throw new TypeError('Illegal invocation');\n }\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement('style');\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n }\n catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === 'string') {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function (location) {\n if (location.isConnected()) {\n restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n }\n });\n }\n };\n defineProperty(proto$1, 'cssRules', {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n },\n });\n defineProperty(proto$1, 'media', {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n },\n });\n cssStyleSheetMethods.forEach(function (method) {\n proto$1[method] = function () {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({ method: method, args: args });\n $locations.get(self).forEach(function (location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance,\n });\n\n var defaultObserverOptions = {\n childList: true,\n subtree: true,\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, 'adoptedStyleSheets', {\n configurable: true,\n enumerable: true,\n get: function () {\n return getAssociatedLocation(this).sheets;\n },\n set: function (sheets) {\n getAssociatedLocation(this).update(sheets);\n },\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function (foundNode) {\n return getShadowRoot(foundNode)\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_REJECT;\n },\n null, false);\n for (var next = void 0; (next = iter.nextNode());) {\n callback(getShadowRoot(next));\n }\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return (element instanceof HTMLStyleElement &&\n $uniqueSheets.get(self).some(function (sheet) { return getAdopterByLocation(sheet, self); }));\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function (sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function (sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function (mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function (mutation) {\n if (!hasShadyCss) {\n forEach.call(mutation.addedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).connect();\n });\n });\n }\n forEach.call(mutation.removedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n if (isExistingAdopter(self, node)) {\n adopt(self);\n }\n if (!hasShadyCss) {\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).disconnect();\n });\n }\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function () {\n var element = $element.get(this);\n return element instanceof Document\n ? element.readyState !== 'loading'\n : isElementConnected(element.host);\n },\n connect: function () {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) {\n adopt(this);\n }\n traverseWebComponents(container, function (root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function () {\n $observer.get(this).disconnect();\n },\n update: function (sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? 'Document' : 'ShadowRoot';\n if (!Array.isArray(sheets)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n }\n if (!sheets.every(isCSSStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n }\n if (sheets.some(isNonConstructedStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n }\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function (sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) {\n adopt(self);\n }\n },\n };\n\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if ('ShadowRoot' in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === 'closed') {\n closedShadowRootRegistry.set(this, root);\n }\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) {\n documentLocation.connect();\n }\n else {\n document.addEventListener('DOMContentLoaded', documentLocation.connect.bind(documentLocation));\n }\n\n}());\n","import * as bootstrapStyleSheet from 'url:bootstrap/dist/css/bootstrap.css';\nimport * as mainStyleSheet from 'url:../../../src/css/main.css';\n\nconst styleURLs = [bootstrapStyleSheet, mainStyleSheet];\n\nconst styleSheets = [];\n\nfor (let i = 0; i < styleURLs.length; i += 1) {\n styleSheets.push(new CSSStyleSheet());\n}\n\n(async function () {\n const styles = await Promise.all(styleURLs.map(async styleURL => {\n const res = await fetch(styleURL);\n return res.text();\n }));\n\n for (let i = 0; i < styles.length; i += 1) {\n await styleSheets[i].replace(styles[i]);\n }\n\n document.body.style.visibility = 'visible';\n}());\n\nexport { styleSheets };\n","module.exports = require('./helpers/bundle-url').getBundleURL('jBxQq') + \"bootstrap.33ff2998.css\";","module.exports = require('./helpers/bundle-url').getBundleURL('jBxQq') + \"main.2238cf96.css\";","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
            \n
            \n \n
            \n
            \n \n
            \n
            \n`;\n\nclass AddFeed extends HTMLElement {\n #formEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n\n connectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n disconnectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n\n const input = evt.target['feed-url'];\n const url = input.value.trim();\n const { value: feeds = [] } = await getFeeds();\n const urlExists = Boolean(feeds.find(feed => feed.url === url));\n const isValidURL = canParseURL(url);\n\n if (!urlExists && isValidURL) {\n await saveFeed({\n url,\n title: '' // Title is not available at this point; it will be fetched later.\n });\n }\n\n input.value = '';\n }\n}\n\nif (!window.customElements.get('add-feed')) {\n window.customElements.define('add-feed', AddFeed);\n}\n","import { set, get, del } from 'idb-keyval';\n\nconst STORAGE_PREFIX = 'rss-reader/';\nconst STORAGE_FEEDS_KEY = STORAGE_PREFIX + 'feeds';\n\nconst getItem = async key => {\n try {\n return {\n value: await get(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error\n };\n }\n};\n\nconst setItem = async (key, data) => {\n try {\n await set(key, data);\n\n return {\n error: void 0\n };\n } catch (error) {\n return { error };\n }\n};\n\nexport const getFeeds = async () => {\n return getItem(STORAGE_FEEDS_KEY);\n};\n\nexport const setFeeds = async (feeds, shouldDispatchEvent = true) => {\n if (!Array.isArray(feeds)) {\n return;\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'set',\n feeds\n }\n }));\n }\n\n return { error };\n};\n\nexport const saveFeed = async (feed, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const foundFeed = feeds.find(f => f.url === feed.url);\n let action = '';\n\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = 'update';\n } else {\n feeds.push(feed);\n action = 'create';\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action,\n feed\n }\n }));\n }\n\n return { error };\n};\n\nexport const deleteFeed = async (feedUrl, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const filteredFeeds = feeds.filter(f => f.url !== feedUrl);\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, filteredFeeds);\n\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) {\n await del(STORAGE_FEEDS_KEY);\n }\n\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'delete',\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n\n return { error };\n};\n","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction promisifyRequest(request) {\n return new Promise(function (resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function () {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n\n\n request.onabort = request.onerror = function () {\n return reject(request.error);\n };\n });\n}\n\nfunction createStore(dbName, storeName) {\n var request = indexedDB.open(dbName);\n\n request.onupgradeneeded = function () {\n return request.result.createObjectStore(storeName);\n };\n\n var dbp = promisifyRequest(request);\n return function (txMode, callback) {\n return dbp.then(function (db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\n\nvar defaultGetStoreFunc;\n\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction get(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return promisifyRequest(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction set(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction setMany(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n entries.forEach(function (entry) {\n return store.put(entry[1], entry[0]);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction getMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return Promise.all(keys.map(function (key) {\n return promisifyRequest(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction update(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n return (// Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function (resolve, reject) {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n })\n );\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction del(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction delMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n keys.forEach(function (key) {\n return store.delete(key);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction clear() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\n\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction keys() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.key);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction values() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.value);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction entries() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([promisifyRequest(store.getAllKeys()), promisifyRequest(store.getAll())]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n keys = _ref2[0],\n values = _ref2[1];\n\n return keys.map(function (key, i) {\n return [key, values[i]];\n });\n });\n }\n\n var items = [];\n return customStore('readonly', function (store) {\n return eachCursor(store, function (cursor) {\n return items.push([cursor.key, cursor.value]);\n }).then(function () {\n return items;\n });\n });\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */\nexport const canParseURL = url => {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n","import Sortable from 'sortablejs/modular/sortable.core.esm.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, setFeeds, deleteFeed } from '../helpers/storage.js';\nimport { debounce } from '../utils/debounce.js';\nimport './import-feeds.js';\nimport './export-feeds.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
            \n
            \n
            \n \n \n \n \n \n\n \n\n \n
            \n\n
            \n \n\n \n\n \n
            \n
            \n\n
              \n
              \n\n
              \n

              \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

              \n\n

              \n \n

              \n
              \n\n \n

              Import feeds

              \n \n
              \n\n \n

              Export feeds

              \n \n
              \n`;\n\nclass FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#isEditable = false;\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#feedsContainerEl = this.shadowRoot.getElementById('feedsContainer');\n this.#feedsListEl = this.shadowRoot.getElementById('feedsList');\n this.#editBtn = this.shadowRoot.getElementById('editBtn');\n this.#importBtn = this.shadowRoot.getElementById('importBtn');\n this.#importAltBtn = this.shadowRoot.getElementById('importAltBtn');\n this.#exportBtn = this.shadowRoot.getElementById('exportBtn');\n this.#searchInput = this.shadowRoot.getElementById('searchInput');\n this.#searchClearBtn = this.shadowRoot.getElementById('searchClearBtn');\n this.#importDialog = this.shadowRoot.getElementById('importDialog');\n this.#exportDialog = this.shadowRoot.getElementById('exportDialog');\n this.#importFeedsEl = this.shadowRoot.querySelector('import-feeds');\n this.#exportFeedsEl = this.shadowRoot.querySelector('export-feeds');\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById('noFeedsDisclaimer');\n }\n\n async connectedCallback() {\n const { value: feeds = [] } = await getFeeds();\n\n feeds.forEach((feed => this.#addFeed(feed)));\n\n this.#toggleFeedsVisibility();\n\n this.#feedsListEl.addEventListener('click', this.#handleActionsClick);\n this.#editBtn.addEventListener('click', this.#handleEditRequest);\n this.#importAltBtn.addEventListener('click', this.#handleImportRequest);\n this.#importBtn.addEventListener('click', this.#handleImportRequest);\n this.#exportBtn.addEventListener('click', this.#handleExportRequest);\n this.#searchInput.addEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener('click', this.#handleSearchClear);\n this.#importDialog.addEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener('me-close', this.#handleExportDialogClose);\n this.addEventListener('feeds-imported', this.#handleFeedsImported);\n document.addEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n\n new Sortable(this.#feedsListEl, {\n animation: 150,\n handle: '.sort-handler',\n onEnd: async evt => {\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll('li'), (el) => {\n return {\n url: el.getAttribute('data-url'),\n title: el.getAttribute('data-title') || ''\n };\n });\n\n await setFeeds(feeds, false);\n }\n });\n }\n\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener('click', this.#handleActionsClick);\n this.#editBtn.removeEventListener('click', this.#handleEditRequest);\n this.#importBtn.removeEventListener('click', this.#handleImportRequest);\n this.#importAltBtn.removeEventListener('click', this.#handleImportRequest);\n this.#exportBtn.removeEventListener('click', this.#handleExportRequest);\n this.#searchInput.removeEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener('click', this.#handleSearchClear);\n this.#importDialog.removeEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener('me-close', this.#handleExportDialogClose);\n this.removeEventListener('feeds-imported', this.#handleFeedsImported);\n document.removeEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n }\n\n #searchFeeds = (searchValue = '') => {\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n\n if (feedEls.length === 0) {\n return;\n }\n\n feedEls.forEach(el => {\n const url = (el.getAttribute('data-url') || '').toLowerCase();\n const title = (el.getAttribute('data-title') || '').toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n\n #debounceSearchFeeds = debounce(this.#searchFeeds, 250);\n\n #handleSearchInputDebounced = evt => {\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle('d-none', !value);\n return this.#debounceSearchFeeds(value);\n };\n\n #handleSearchClear = () => {\n this.#searchInput.value = '';\n this.#searchInput.dispatchEvent(new Event('input'));\n };\n\n #handleEditRequest = evt => {\n this.#isEditable = !this.#isEditable;\n\n evt.currentTarget.classList.toggle('active');\n\n this.shadowRoot.querySelectorAll('.sort-handler, .delete-button').forEach(el => {\n el.hidden = !el.hidden;\n });\n };\n\n #handleImportRequest = () => {\n this.#importDialog.open = true;\n };\n\n #handleExportRequest = () => {\n this.#exportDialog.open = true;\n };\n\n #handleImportDialogOpen = () => {\n try {\n this.#importFeedsEl.shadowRoot.querySelector('a-tab-group').selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector('textarea').value = '';\n } catch {\n // Fail silently\n }\n };\n\n #handleExportDialogOpen = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeedsEl.setAttribute('feeds', JSON.stringify(feeds));\n };\n\n #handleExportDialogClose = () => {\n this.#exportFeedsEl.removeAttribute('feeds');\n };\n\n #handleFeedsImported = () => {\n this.#importDialog.open = false;\n };\n\n #handleFeedsUpdateSuccess = evt => {\n if (evt.detail.action === 'delete') {\n this.#removeFeed(evt.detail.feed);\n }\n\n if (evt.detail.action === 'create') {\n this.#addFeed(evt.detail.feed);\n\n if (this.#searchInput.value) {\n this.#searchInput.value = '';\n this.#searchFeeds('');\n }\n }\n\n if (evt.detail.action === 'update') {\n const { url, title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n\n if (feedEl) {\n const linkContent = feedEl.querySelector('.link-content');\n\n feedEl.setAttribute('data-title', title || '');\n\n if (linkContent) {\n linkContent.innerHTML = title ? `${title}
              ${url}` : url;\n }\n }\n }\n };\n\n #handleActionsClick = evt => {\n const target = evt.target;\n const deleteBtn = target.closest('button.delete-button');\n const linkEl = target.closest('a.link');\n\n if (!linkEl && !deleteBtn) {\n return;\n }\n\n const feedItem = target.closest('li');\n const feedUrl = feedItem.getAttribute('data-url');\n\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) {\n deleteFeed(feedUrl);\n }\n }\n\n if (linkEl) {\n evt.preventDefault();\n document.querySelector('feed-reader').feedUrl = feedUrl;\n }\n };\n\n #addFeed(feed) {\n const { url, title } = feed;\n\n const link = document.createElement('a');\n link.className = 'link text-decoration-none d-flex align-items-center h-100';\n link.style.flex = '1';\n link.style.minWidth = 0;\n link.style.color = 'inherit';\n link.href = url;\n\n const linkContent = document.createElement('div');\n linkContent.className = 'text-truncate link-content';\n linkContent.innerHTML = title ? `${title}
              ${url}` : url;\n\n const deleteButton = document.createElement('button');\n deleteButton.type = 'button';\n deleteButton.title = 'Delete feed';\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = 'delete-button btn btn-default text-danger p-0';\n deleteButton.style.lineHeight = '1';\n deleteButton.innerHTML = /* html */`\n \n \n \n Delete\n `;\n\n const listItem = document.createElement('li');\n listItem.className = 'list-group-item p-0 d-flex justify-content-between align-items-center';\n listItem.style.height = 'var(--list-item-height)';\n listItem.setAttribute('data-url', url || '');\n listItem.setAttribute('data-title', title || '');\n\n const sortHandler = document.createElement('div');\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = 'sort-handler text-primary';\n sortHandler.innerHTML = /* html */`\n \n \n \n Reorder\n `;\n\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n\n this.#feedsListEl.appendChild(listItem);\n\n this.#toggleFeedsVisibility();\n }\n\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await getFeeds();\n this.#feedsContainerEl.classList.toggle('d-none', feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle('d-none', feeds.length > 0);\n }\n}\n\nif (!window.customElements.get('feeds-list')) {\n window.customElements.define('feeds-list', FeedsList);\n}\n","/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = parent.parentNode);\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\nvar OnSpill = [Remove, Revert];\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nexport default Sortable;\nexport { AutoScrollPlugin as AutoScroll, MultiDragPlugin as MultiDrag, OnSpill, Sortable, SwapPlugin as Swap };\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */\nexport const debounce = (fn, wait = 0, immediate = false) => {\n let timerId = null;\n\n if (typeof fn !== 'function') {\n throw new TypeError('Expected a function for first argument');\n }\n\n return (...args) => {\n clearTimeout(timerId);\n\n if (immediate && !timerId) {\n fn(...args);\n }\n\n timerId = setTimeout(() => {\n timerId = null;\n if (!immediate) {\n fn(...args);\n }\n }, wait);\n };\n};\n","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n From file\n \n
              \n \n Drag 'n' drop a file, or click to select file to import\n
              \n (Only JSON files are allowed)\n
              \n
              \n
              \n\n From text\n \n
              \n \n \n
              \n
              \n
              \n`;\n\nclass ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#dropzoneEl = this.shadowRoot.querySelector('files-dropzone');\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n connectedCallback() {\n this.#dropzoneEl.addEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener('submit', this.#handleImportFormSubmit);\n }\n\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener('submit', this.#handleImportFormSubmit);\n }\n\n #handleFilesDropzoneDropAccepted = evt => {\n const { acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.readAsText(file, 'utf-8');\n reader.onload = this.#handleFileReaderLoad;\n };\n\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) {\n return alert('Invalid file or no feeds found.');\n }\n\n const { value: feeds = [] } = await getFeeds();\n\n for (const feed of feedsToImport) {\n const feedExists = Boolean(feeds.find(f => f.url === feed.url));\n const { url, title } = feed;\n const isValidURL = canParseURL(url);\n\n if (!feedExists && isValidURL) {\n await saveFeed({ url, title });\n }\n }\n\n this.dispatchEvent(new Event('feeds-imported', {\n bubbles: true,\n composed: true\n }));\n }\n\n #handleFileReaderLoad = async (evt) => {\n try {\n const { result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert('The file is not valid.');\n }\n };\n\n #handleImportFormSubmit = async (evt) => {\n evt.preventDefault();\n\n const formData = new FormData(evt.target);\n const data = formData.get('import-data');\n\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert('The data is not valid.');\n }\n };\n}\n\nif (!window.customElements.get('import-feeds')) {\n window.customElements.define('import-feeds', ImportFeeds);\n}\n","import { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds } from '../helpers/storage.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
              \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
              \n\n
              \n
              \n
              \n
              \n
              \n\n \n`;\n\nclass ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#exportCodeEl = this.shadowRoot.getElementById('exportCode');\n this.#clipboardCopyEl = this.shadowRoot.querySelector('clipboard-copy');\n this.#webShareEl = this.shadowRoot.querySelector('web-share');\n this.#downloadButton = this.shadowRoot.getElementById('downloadButton');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feeds'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'feeds' && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n\n connectedCallback() {\n this.#downloadButton.addEventListener('click', this.#handleDownloadButtonClick);\n }\n\n disconnectedCallback() {\n this.#downloadButton.removeEventListener('click', this.#handleDownloadButtonClick);\n }\n\n get feeds() {\n return this.getAttribute('feeds');\n }\n\n set feeds(value) {\n this.setAttribute('feeds', value);\n }\n\n #getFeedsToExportString() {\n let feedsToExport = '';\n\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n\n return feedsToExport;\n }\n\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([data], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n #handleDownloadButtonClick = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeeds(feeds);\n };\n}\n\nif (!window.customElements.get('export-feeds')) {\n window.customElements.define('export-feeds', ExportFeeds);\n}\n","function a(a){return null!==a&&\"object\"==typeof a?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{a as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","import { styleSheets } from '../helpers/styles.js';\nimport { fetchFeed } from '../helpers/fetch-feeds.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\n\nlet controller;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n

              \n\n

              \n\n
              \n
              \n \n Please wait...\n
              \n\n
              \n \n \n \n There was an error while fetching the feed.\n
              \n\n
              \n
              \n
              \n`;\n\nclass FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#spinnerEl = this.shadowRoot.getElementById('spinner');\n this.#dialogEl = this.shadowRoot.querySelector('modal-element');\n this.#modalTitle = this.#dialogEl.querySelector('#feedTitle');\n this.#feedsViewer = this.shadowRoot.getElementById('feedsViewer');\n this.#errorEl = this.shadowRoot.getElementById('error');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feed-url'];\n }\n\n attributeChangedCallback(name) {\n if (name === 'feed-url') {\n this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n }\n\n connectedCallback() {\n this.#dialogEl.addEventListener('me-close', this.#handleFeedClose);\n }\n\n disconnectedCallback() {\n this.#dialogEl.removeEventListener('me-close', this.#handleFeedClose);\n }\n\n get feedUrl() {\n return this.getAttribute('feed-url');\n }\n\n set feedUrl(value) {\n if (value) {\n this.setAttribute('feed-url', value);\n } else {\n this.removeAttribute('feed-url');\n }\n }\n\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n\n #handleFeedClose = () => {\n controller && controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll('.card').forEach(el => el.remove());\n this.#modalTitle.innerHTML = '';\n this.#spinnerEl.classList.add('d-none');\n this.#errorEl.classList.add('d-none');\n }\n\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove('d-none');\n\n controller = new AbortController();\n\n try {\n const data = await fetchFeed(feedUrl, {\n signal: controller.signal\n });\n\n const { value: feeds = [] } = await getFeeds();\n const currentFeed = feeds.find(feed => feed.url === feedUrl);\n\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) {\n await saveFeed({\n url: feedUrl,\n title: data.feed.title || ''\n });\n }\n\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n\n data.items.forEach(item => {\n this.#feedsViewer.insertAdjacentHTML('beforeend', this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== 'AbortError') {\n console.error(error);\n this.#modalTitle.textContent = '';\n this.#errorEl.classList.remove('d-none');\n }\n } finally {\n this.#spinnerEl.classList.add('d-none');\n }\n }\n\n #feedsReaderTemplate(item) {\n const { link, title, description, author, pubDate, thumbnail } = item;\n let formattedDate = '';\n\n try {\n formattedDate = new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium'\n }).format(new Date(pubDate));\n } catch {\n formattedDate = '-';\n }\n\n return /* html */`\n
              \n
              \n \n
              \n
              ${title}
              \n

              ${formattedDate} ${author ? `• ${author}` : ''}

              \n
              \n\n \"${title}\"\n
              \n\n
              \n Read more...\n
              \n ${description}\n
              \n
              \n
              \n
              \n `;\n }\n}\n\nif (!window.customElements.get('feed-reader')) {\n window.customElements.define('feed-reader', FeedReader);\n}\n","const cache = new Map();\n\nexport const fetchFeed = async (url, requestOptions = {}) => {\n const cachedFeed = cache.get(url);\n\n if (cachedFeed) {\n return cachedFeed;\n }\n\n const res = await fetch('https://api.rss2json.com/v1/api.json?rss_url=' + url, requestOptions);\n\n if (!res.ok) {\n throw new Error('Error fetching data');\n }\n\n const json = await res.json();\n\n cache.set(url, json);\n\n return json;\n};\n"],"names":["$9af02a843127b0d7$var$controller","a","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","Object","defineProperty","get","$0da3d504155236c3$export$ea3b71af1761ff40","set","enumerable","configurable","$0da3d504155236c3$var$t","$0da3d504155236c3$var$e","$0da3d504155236c3$var$o","$0da3d504155236c3$var$s","document","createElement","innerHTML","HTMLElement","t","e","o","s","i","constructor","shadowRoot","attachShadow","mode","appendChild","content","cloneNode","querySelector","observedAttributes","connectedCallback","r","addEventListener","n","disconnectedCallback","removeEventListener","attributeChangedCallback","disabled","setAttribute","toString","part","contains","toggle","value","getAttribute","from","hasAttribute","removeAttribute","feedbackDuration","Number","l","Element","prototype","getRootNode","composed","ownerDocument","Document","ShadowRoot","HTMLInputElement","HTMLTextAreaElement","HTMLAnchorElement","href","textContent","navigator","clipboard","writeText","d","dispatchEvent","CustomEvent","bubbles","detail","error","preventDefault","hidden","remove","add","clearTimeout","setTimeout","hasOwnProperty","defineCustomElement","customElements","define","$4f74a8126e204146$export$30b344bef3e55b67","$4f74a8126e204146$var$t","$4f74a8126e204146$var$e","delegatesFocus","toggleAttribute","shareUrl","shareTitle","shareText","shareFiles","Array","isArray","length","share","url","title","text","canShare","files","shareData","name","target","nodeName","assignedElements","flatten","find","$7aad62ebc3d6fae8$export$6ccd1735166caad9","$7aad62ebc3d6fae8$var$e","Map","$7aad62ebc3d6fae8$var$t","$7aad62ebc3d6fae8$var$o","lastIndexOf","type","split","pop","toLowerCase","writable","$7aad62ebc3d6fae8$var$i","path","webkitRelativePath","$7aad62ebc3d6fae8$var$r","Promise","readEntries","$7aad62ebc3d6fae8$var$a","push","$7aad62ebc3d6fae8$var$n","file","fullPath","$7aad62ebc3d6fae8$var$s","kind","getAsEntry","webkitGetAsEntry","shift","isFile","indexOf","isDirectory","createReader","$7aad62ebc3d6fae8$var$d","$7aad62ebc3d6fae8$var$l","dataTransfer","items","$7aad62ebc3d6fae8$var$p","$7aad62ebc3d6fae8$var$c","$7aad62ebc3d6fae8$var$h","$7aad62ebc3d6fae8$var$u","getElementById","accept","multiple","autoFocus","focus","maxFiles","Math","floor","abs","maxSize","isNaN","minSize","noStyle","p","Event","dropEffect","classList","click","key","errors","message","Set","map","trim","filter","Boolean","replace","charAt","test","size","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$c172d40c323f9126$var$t","random","substring","$c172d40c323f9126$var$e","$c172d40c323f9126$var$s","$c172d40c323f9126$var$o","$c172d40c323f9126$var$a","$c172d40c323f9126$var$l","selected","closable","className","stopPropagation","tabId","$c172d40c323f9126$var$i","$c172d40c323f9126$var$r","$c172d40c323f9126$var$n","$c172d40c323f9126$var$c","$c172d40c323f9126$var$d","TOP","BOTTOM","START","END","$c172d40c323f9126$var$h","entries","$c172d40c323f9126$var$b","AUTO","MANUAL","$c172d40c323f9126$var$u","DOWN","LEFT","RIGHT","UP","HOME","ENTER","SPACE","$c172d40c323f9126$var$p","$c172d40c323f9126$var$g","$c172d40c323f9126$export$85fd4ed3b8ca1010","placement","noScrollControls","scrollDistance","activation","noTabCycling","querySelectorAll","forEach","c","ResizeObserver","requestAnimationFrame","scrollWidth","clientWidth","h","b","u","unobserve","observe","disconnect","cancelAnimationFrame","getComputedStyle","direction","g","m","nextElementSibling","tagName","console","v","f","w","T","y","findIndex","matches","A","_","E","C","altKey","includes","selectTab","closest","scrollLeft","scrollTo","left","selectTabByIndex","selectTabById","scrollIntoView","inline","block","$4da30046ce6d9325$export$32589115725b904b","$4da30046ce6d9325$var$e","$4da30046ce6d9325$var$t","open","showModal","element","body","preserveOverflow","style","overflow","close","noHeader","noAnimations","noCloseButton","staticBackdrop","fullscreen","defaultPrevented","currentTarget","assignedNodes","cancelable","reason","show","hide","hasShadyCss","ShadyCSS","nativeShadow","bootstrapper","implementation","createHTMLDocument","closedShadowRootRegistry","WeakMap","_DOMException","DOMException","importPattern","nonConstructedProto","NonConstructedStyleSheet","CSSStyleSheet","reject","replaceSync","$basicStyleElement","$locations","$adoptersByLocation","$appliedMethods","proto$1","ConstructedStyleSheet","contents","resolve","checkInvocationCorrectness","_contents","self_1","warn","location","isConnected","restyleAdopter","getAdopterByLocation","sheet","cssRules","media","cssStyleSheetMethods","method","args","arguments","apply","basicSheet","Symbol","hasInstance","isCSSStyleSheetInstance","defaultObserverOptions","childList","subtree","locations","$element","$uniqueSheets","$observer","Location","readyState","host","connect","container","getAdopterContainer","adopt","traverseWebComponents","root","getAssociatedLocation","update","sheets","locationType","TypeError","every","some","isNonConstructedStyleSheetInstance","oldUniqueSheets","uniqueSheets","arr","index","removedSheets","arr1","arr2","removeNode","node","parentNode","removeChild","delete","_location","attachAdoptedStyleSheetProperty","proto","attach_1","documentLocation","bind","getShadowRoot","instance","isPrototypeOf","adopter","command","has","callback","iter","createNodeIterator","NodeFilter","SHOW_ELEMENT","foundNode","FILTER_ACCEPT","FILTER_REJECT","next","nextNode","styleList","createDocumentFragment","observer","insertBefore","MutationObserver","mutations","mutation","addedNodes","removedNodes","HTMLStyleElement","$821acccc985d5f51$exports","getBundleURL","$053c683f8862b85c$var$styleURLs","$053c683f8862b85c$export$4b9cd30c41328fdd","$e92a13782f6c06ba$export$b327150396135fe7","request","oncomplete","onsuccess","result","onabort","onerror","$e92a13782f6c06ba$var$defaultGetStore","$e92a13782f6c06ba$var$defaultGetStoreFunc","dbName","storeName","dbp","indexedDB","onupgradeneeded","createObjectStore","txMode","then","db","transaction","objectStore","styles","all","styleURL","res","fetch","visibility","$b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY","$b36f6cb20f27a9a6$var$STORAGE_PREFIX","$b36f6cb20f27a9a6$var$getItem","customStore","undefined","store","$b36f6cb20f27a9a6$var$setItem","data","put","$b36f6cb20f27a9a6$export$4890c08c4ffbd57b","$b36f6cb20f27a9a6$export$a8ce8a4ec117f05e","feeds","shouldDispatchEvent","action","$b36f6cb20f27a9a6$export$4b77448646caf424","feed","foundFeed","$b36f6cb20f27a9a6$export$4e54c6fd9fa8b09b","feedUrl","filteredFeeds","$8ca5c59aef5015ba$export$981c5d1bd3894713","URL","$0c951fb6e39d40f6$var$template","$0c951fb6e39d40f6$var$AddFeed","formEl","adoptedStyleSheets","handleFormSubmission","evt","input","urlExists","isValidURL","$da1f6dc1cffd4cb1$var$ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","$da1f6dc1cffd4cb1$var$_objectSpread2","source","obj","getOwnPropertyDescriptors","defineProperties","$da1f6dc1cffd4cb1$var$_typeof","iterator","$da1f6dc1cffd4cb1$var$_extends","assign","$da1f6dc1cffd4cb1$var$userAgent","pattern","userAgent","match","$da1f6dc1cffd4cb1$var$IE11OrLess","$da1f6dc1cffd4cb1$var$Edge","$da1f6dc1cffd4cb1$var$FireFox","$da1f6dc1cffd4cb1$var$Safari","$da1f6dc1cffd4cb1$var$IOS","$da1f6dc1cffd4cb1$var$ChromeForAndroid","$da1f6dc1cffd4cb1$var$captureMode","capture","passive","$da1f6dc1cffd4cb1$var$on","el","event","fn","$da1f6dc1cffd4cb1$var$off","$da1f6dc1cffd4cb1$var$matches","selector","msMatchesSelector","webkitMatchesSelector","$da1f6dc1cffd4cb1$var$closest","ctx","includeCTX","nodeType","$da1f6dc1cffd4cb1$var$R_SPACE","$da1f6dc1cffd4cb1$var$toggleClass","state","$da1f6dc1cffd4cb1$var$css","prop","val","defaultView","currentStyle","$da1f6dc1cffd4cb1$var$matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","$da1f6dc1cffd4cb1$var$find","list","getElementsByTagName","$da1f6dc1cffd4cb1$var$getWindowScrollingElement","scrollingElement","documentElement","$da1f6dc1cffd4cb1$var$getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","getBoundingClientRect","top","elRect","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","scaleY","$da1f6dc1cffd4cb1$var$isScrolledPast","elSide","parentSide","parent","$da1f6dc1cffd4cb1$var$getParentAutoScrollElement","elSideVal","parentSideVal","$da1f6dc1cffd4cb1$var$getChild","childNum","options","includeDragEl","currentChild","children","display","$da1f6dc1cffd4cb1$export$31b3ca70d8f57423","ghost","dragged","draggable","$da1f6dc1cffd4cb1$var$lastChild","last","lastElementChild","previousElementSibling","$da1f6dc1cffd4cb1$var$index","toUpperCase","clone","$da1f6dc1cffd4cb1$var$getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollTop","includeSelf","elem","gotSelf","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","$da1f6dc1cffd4cb1$var$isRectEqual","rect1","rect2","round","$da1f6dc1cffd4cb1$var$throttle","ms","$da1f6dc1cffd4cb1$var$_throttleTimeout","$da1f6dc1cffd4cb1$var$scrollBy","x","$da1f6dc1cffd4cb1$var$clone","Polymer","$","jQuery","Zepto","dom","$da1f6dc1cffd4cb1$var$getChildContainingRectFromElement","ghostEl","rect","child","animated","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","min","Infinity","max","$da1f6dc1cffd4cb1$var$expando","Date","getTime","$da1f6dc1cffd4cb1$var$plugins","$da1f6dc1cffd4cb1$var$defaults","initializeByDefault","$da1f6dc1cffd4cb1$var$PluginManager","mount","plugin","option","pluginName","concat","pluginEvent","eventName","sortable","_this","eventCanceled","cancel","eventNameGlobal","initializePlugins","defaults","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","$da1f6dc1cffd4cb1$var$_excluded","$da1f6dc1cffd4cb1$var$pluginEvent","_ref","originalEvent","$da1f6dc1cffd4cb1$var$_objectWithoutProperties","excluded","$da1f6dc1cffd4cb1$var$_objectWithoutPropertiesLoose","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","dragEl","$da1f6dc1cffd4cb1$var$dragEl","parentEl","$da1f6dc1cffd4cb1$var$parentEl","$da1f6dc1cffd4cb1$var$ghostEl","rootEl","$da1f6dc1cffd4cb1$var$rootEl","nextEl","$da1f6dc1cffd4cb1$var$nextEl","lastDownEl","$da1f6dc1cffd4cb1$var$lastDownEl","cloneEl","$da1f6dc1cffd4cb1$var$cloneEl","cloneHidden","$da1f6dc1cffd4cb1$var$cloneHidden","dragStarted","$da1f6dc1cffd4cb1$var$moved","putSortable","$da1f6dc1cffd4cb1$var$putSortable","activeSortable","active","oldIndex","$da1f6dc1cffd4cb1$var$oldIndex","oldDraggableIndex","$da1f6dc1cffd4cb1$var$oldDraggableIndex","newIndex","$da1f6dc1cffd4cb1$var$newIndex","newDraggableIndex","$da1f6dc1cffd4cb1$var$newDraggableIndex","hideGhostForTarget","$da1f6dc1cffd4cb1$var$_hideGhostForTarget","unhideGhostForTarget","$da1f6dc1cffd4cb1$var$_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","$da1f6dc1cffd4cb1$var$_dispatchEvent","info","$da1f6dc1cffd4cb1$var$dispatchEvent","targetEl","toEl","fromEl","extraEventProperties","onName","substr","createEvent","initEvent","to","item","pullMode","lastPutMode","allEventProperties","$da1f6dc1cffd4cb1$var$activeGroup","$da1f6dc1cffd4cb1$var$tapEvt","$da1f6dc1cffd4cb1$var$touchEvt","$da1f6dc1cffd4cb1$var$lastDx","$da1f6dc1cffd4cb1$var$lastDy","$da1f6dc1cffd4cb1$var$tapDistanceLeft","$da1f6dc1cffd4cb1$var$tapDistanceTop","$da1f6dc1cffd4cb1$var$lastTarget","$da1f6dc1cffd4cb1$var$lastDirection","$da1f6dc1cffd4cb1$var$targetMoveDistance","$da1f6dc1cffd4cb1$var$ghostRelativeParent","$da1f6dc1cffd4cb1$var$awaitingDragStarted","$da1f6dc1cffd4cb1$var$ignoreNextClick","$da1f6dc1cffd4cb1$var$sortables","$da1f6dc1cffd4cb1$var$pastFirstInvertThresh","$da1f6dc1cffd4cb1$var$isCircumstantialInvert","$da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll","$da1f6dc1cffd4cb1$var$_silent","$da1f6dc1cffd4cb1$var$savedInputChecked","$da1f6dc1cffd4cb1$var$documentExists","$da1f6dc1cffd4cb1$var$CSSFloatProperty","$da1f6dc1cffd4cb1$var$supportDraggable","$da1f6dc1cffd4cb1$var$supportCssPointerEvents","cssText","pointerEvents","$da1f6dc1cffd4cb1$var$_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","clear","$da1f6dc1cffd4cb1$var$_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","$da1f6dc1cffd4cb1$var$_detectNearestEmptySortable","ret","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","$da1f6dc1cffd4cb1$var$_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","revertClone","stopImmediatePropagation","$da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent","nearest","touches","clientX","clientY","_onDragOver","$da1f6dc1cffd4cb1$var$_checkOutsideTargetEl","_isOutsideThisEl","animationCallbackId","animationStates","sort","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","animation","easing","setData","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","captureAnimationState","slice","fromRect","thisAnimationDuration","childMatrix","addAnimationState","removeAnimationState","splice","$da1f6dc1cffd4cb1$var$indexOfObject","animateAll","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","sqrt","pow","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","offsetWidth","$da1f6dc1cffd4cb1$var$_onMove","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","$da1f6dc1cffd4cb1$var$_disableDraggable","$da1f6dc1cffd4cb1$var$_unsilent","$da1f6dc1cffd4cb1$var$_nextTick","$da1f6dc1cffd4cb1$var$_cancelNextTick","_getDirection","touch","pointerType","originalTarget","composedPath","$da1f6dc1cffd4cb1$var$_saveInputCheckedState","inputs","idx","checked","button","isContentEditable","criteria","_prepareDragStart","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","$da1f6dc1cffd4cb1$var$PositionGhostAbsolutely","dx","dy","cssMatrix","_hideClone","cloneId","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","$da1f6dc1cffd4cb1$var$_ghostIsLast","lastElRect","childContainingRect","changed","firstElRect","firstChild","sibling","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","$da1f6dc1cffd4cb1$var$_getSwapDirection","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","dragIndex","after","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","save","handleEvent","toArray","order","$da1f6dc1cffd4cb1$var$_generateId","str","src","sum","charCodeAt","useAnimation","destroy","utils","on","off","css","is","extend","dst","throttle","toggleClass","nextTick","cancelNextTick","detectDirection","getChild","_len","plugins","_key","create","version","$da1f6dc1cffd4cb1$var$scrollEl","$da1f6dc1cffd4cb1$var$scrollRootEl","$da1f6dc1cffd4cb1$var$touchEvt$1","$da1f6dc1cffd4cb1$var$autoScrolls","isFallback","scroll","scrollCustomFn","sens","scrollSensitivity","speed","scrollSpeed","autoScroll","pid","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","$da1f6dc1cffd4cb1$var$drop","toSortable","changedTouches","onSpill","$da1f6dc1cffd4cb1$var$Revert","$da1f6dc1cffd4cb1$var$Remove","startIndex","dragStart","_ref2","_ref3","drop","_ref4","parentSortable","$f7942db15ba0cc81$export$61fc7d43ac8f84b0","wait","immediate","timerId","$038088370be83852$var$template","$038088370be83852$var$ImportFeeds","dropzoneEl","importForm","handleFilesDropzoneDropAccepted","handleImportFormSubmit","reader","FileReader","readAsText","onload","handleFileReaderLoad","importFeeds","feedsToImport","alert","feedExists","JSON","parse","formData","FormData","$4724280f8ebb5bb4$var$template","$4724280f8ebb5bb4$var$ExportFeeds","exportCodeEl","clipboardCopyEl","webShareEl","downloadButton","oldValue","newValue","feedsToExport","getFeedsToExportString","handleDownloadButtonClick","stringify","exportFeeds","blob","Blob","createObjectURL","link","download","revokeObjectURL","$d02789f57ae99481$var$template","$d02789f57ae99481$var$FeedsList","isEditable","feedsContainerEl","feedsListEl","editBtn","importBtn","importAltBtn","exportBtn","searchInput","searchClearBtn","importDialog","exportDialog","importFeedsEl","exportFeedsEl","noFeedsDisclaimerEl","addFeed","toggleFeedsVisibility","handleActionsClick","handleEditRequest","handleImportRequest","handleExportRequest","handleSearchInputDebounced","handleSearchClear","handleImportDialogOpen","handleExportDialogOpen","handleExportDialogClose","handleFeedsImported","handleFeedsUpdateSuccess","onEnd","searchFeeds","searchValue","feedEls","searchQuery","debounceSearchFeeds","removeFeed","feedEl","linkContent","deleteBtn","linkEl","feedItem","confirm","flex","minWidth","color","deleteButton","lineHeight","listItem","sortHandler","$0acd7cf489ccbd45$var$cache","$0acd7cf489ccbd45$export$5b107dfb127cada8","requestOptions","cachedFeed","ok","json","$9af02a843127b0d7$var$template","$9af02a843127b0d7$var$FeedReader","spinnerEl","dialogEl","modalTitle","feedsViewer","errorEl","openFeed","closeFeed","handleFeedClose","renderFeed","abort","resetDialogContent","AbortController","signal","currentFeed","insertAdjacentHTML","feedsReaderTemplate","description","author","pubDate","thumbnail","formattedDate","Intl","DateTimeFormat","dateStyle","format","$a4c1285108bf4a9d$export$ea3b71af1761ff40","$a4c1285108bf4a9d$var$COMPONENT_NAME","$a4c1285108bf4a9d$var$SUCCESS_STATUS","$a4c1285108bf4a9d$var$ERROR_STATUS","$a4c1285108bf4a9d$var$template","timeout","buttonEl","copySlot","successSlot","errorSlot","upgradeProperty","handleClick","forceResetStatus","copy","copyValue","showStatus","status","elementName","ClipboardCopy","$e179325634270afd$export$30b344bef3e55b67","$e179325634270afd$var$styles","$e179325634270afd$var$template","buttonSlot","getButton","handleSlotChange","WebShare","$862aa3736b0514bc$export$6ccd1735166caad9","$f31161edf38949e9$var$COMMON_MIME_TYPES","$f31161edf38949e9$var$FILES_TO_IGNORE","$f31161edf38949e9$var$toFileWithMimeType","hasExtension","extension","$f31161edf38949e9$var$toFileWithPath","fileWithMimeType","$f31161edf38949e9$var$readEntriesPromise","directoryReader","$f31161edf38949e9$var$readAllDirectoryEntries","$f31161edf38949e9$var$getFileFromFileEntry","fileEntry","$f31161edf38949e9$var$getFilesFromDataTransferItemList","dataTransferItemList","queue","entry","$f31161edf38949e9$var$getFilesFromFileList","fileList","$f31161edf38949e9$export$6d52664cd15c442","$862aa3736b0514bc$var$COMPONENT_NAME","$862aa3736b0514bc$var$TOO_MANY_FILES","$862aa3736b0514bc$var$template","$862aa3736b0514bc$var$styles","fileInput","handleFileInputChange","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleKeyUp","num","handleFilesSelect","filesLength","fileHasValidType","acceptedTypeSpecifiers","acceptedMimeTypesList","fileMimeType","baseMimeType","validType","fileExceedsMaxSize","fileIsSmallerThanMinSize","FilesDropzone","$aa07eeb3067ea186$export$e2a22331486dcca0","prefix","suffix","randomString","$2b7397b7d9d03d51$export$f7b23927dede22b3","$4b127c96b8d62b28$var$tabCounter","$4b127c96b8d62b28$var$styles","$4b127c96b8d62b28$var$template","$4b127c96b8d62b28$export$3e41faf802a29e71","closeButton","handleCloseButtonClick","$17a63ddf0f11756d$var$panelCounter","$17a63ddf0f11756d$var$styles","$17a63ddf0f11756d$var$template","$17a63ddf0f11756d$export$3d96ec278d3efce4","$6ed9897cfe6c2018$var$PLACEMENT","$6ed9897cfe6c2018$var$validPlacements","$6ed9897cfe6c2018$var$ACTIVATION","$6ed9897cfe6c2018$var$KEYCODE","$6ed9897cfe6c2018$var$styles","$6ed9897cfe6c2018$var$template","$6ed9897cfe6c2018$export$85fd4ed3b8ca1010","resizeObserver","rafId","hasTabSlotChangedOnce","syncNav","$6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE","tabSlot","panelSlot","tabsContainer","navContainer","scrollButtons","handleTabClick","handleKeyDown","handleScrollButtonClick","handleTabClose","targetElement","isElementScrollable","hideEmptyTabGroup","stopResizeObserver","startResizeObserver","scrollElement","getDirection","allTabs","linkPanels","tabs","tab","panel","allPanels","panelForTab","panelId","firstTab","lastTab","prevTab","newIdx","nextTab","reset","panels","setSelectedTabOnSlotChange","setSelectedTab","orientation","scrollButton","sign","oldTab","TabGroup","$180b6dcf923bafc7$export$32589115725b904b","$180b6dcf923bafc7$var$template","$180b6dcf923bafc7$var$styles","footerSlotEl","pulseAnimationTimeout","headerEl","closeBtnEl","handleDialogClick","handleDialogClose","handleDialogCancel","handleFooterSlotChange","applyPulseEffectOnDialog","requestCloseEvent","createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","ModalElement","$442be162a818aed4$export$c37129e465f64ef0","isWebShareSupported"],"version":3,"file":"index.c4734e4f.js.map"} \ No newline at end of file diff --git a/docs/index.fdee3dc7.js.map b/docs/index.fdee3dc7.js.map deleted file mode 100644 index ea1109a..0000000 --- a/docs/index.fdee3dc7.js.map +++ /dev/null @@ -1 +0,0 @@ -{"mappings":"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","sources":["","src/js/main.js","node_modules/@georapbox/clipboard-copy-element/dist/clipboard-copy-defined.js","node_modules/@georapbox/clipboard-copy-element/dist/","node_modules/@georapbox/clipboard-copy-element/dist/src/clipboard-copy-defined.js","node_modules/@georapbox/clipboard-copy-element/dist/src/clipboard-copy.js","node_modules/@georapbox/web-share-element/dist/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/","node_modules/@georapbox/web-share-element/dist/src/web-share-defined.js","node_modules/@georapbox/web-share-element/dist/src/web-share.js","node_modules/@georapbox/files-dropzone-element/dist/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone-defined.js","node_modules/@georapbox/files-dropzone-element/dist/src/files-dropzone.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/is-valid-file.js","node_modules/@georapbox/files-dropzone-element/dist/src/utils/files-selector.js","node_modules/@georapbox/a-tab-group/dist/a-tab-group.js","node_modules/@georapbox/a-tab-group/dist/","node_modules/@georapbox/a-tab-group/dist/src/a-tab-group.js","node_modules/@georapbox/a-tab-group/dist/src/a-tab.js","node_modules/@georapbox/a-tab-group/dist/src/utils/uid.js","node_modules/@georapbox/a-tab-group/dist/src/utils/upgrade-property.js","node_modules/@georapbox/a-tab-group/dist/src/a-tab-panel.js","node_modules/@georapbox/modal-element/dist/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/","node_modules/@georapbox/modal-element/dist/src/modal-element-defined.js","node_modules/@georapbox/modal-element/dist/src/modal-element.js","node_modules/construct-style-sheets-polyfill/dist/adoptedStyleSheets.js","src/js/helpers/styles.js","node_modules/@parcel/runtime-js/lib/runtime-d83b42299c6939be.js","node_modules/@parcel/runtime-js/lib/runtime-d447c53210e8ff45.js","src/js/components/add-feed.js","src/js/helpers/storage.js","node_modules/idb-keyval/dist/compat.js","src/js/utils/canParseURL.js","src/js/components/feeds-list.js","node_modules/sortablejs/modular/sortable.core.esm.js","src/js/utils/debounce.js","src/js/components/import-feeds.js","src/js/components/export-feeds.js","node_modules/@georapbox/web-share-element/dist/is-web-share-supported.js","node_modules/@georapbox/web-share-element/dist/src/is-web-share-supported.js","src/js/components/feed-reader.js","src/js/helpers/fetch-feeds.js"],"sourcesContent":["(function () {\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire3ec4\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire3ec4\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nObject.defineProperty({}, \"ClipboardCopy\", {\n get: function() {\n return $0da3d504155236c3$export$ea3b71af1761ff40;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $0da3d504155236c3$var$t = \"clipboard-copy\", $0da3d504155236c3$var$e = \"success\", $0da3d504155236c3$var$o = \"error\", $0da3d504155236c3$var$s = document.createElement(\"template\");\n$0da3d504155236c3$var$s.innerHTML = `\n \n\n \n`;\nclass $0da3d504155236c3$export$ea3b71af1761ff40 extends HTMLElement {\n #t = null;\n #e;\n #o;\n #s;\n #i;\n constructor(){\n super(), this.shadowRoot || (this.attachShadow({\n mode: \"open\"\n }), this.shadowRoot.appendChild($0da3d504155236c3$var$s.content.cloneNode(!0))), this.#e = this.shadowRoot.querySelector(\"button\"), this.#o = this.shadowRoot.querySelector('slot[name=\"copy\"]'), this.#s = this.shadowRoot.querySelector('slot[name=\"success\"]'), this.#i = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#r(\"value\"), this.#r(\"from\"), this.#r(\"disabled\"), this.#r(\"feedbackDuration\"), this.#e.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#e.removeEventListener(\"click\", this.#n), this.#a();\n }\n attributeChangedCallback(t) {\n \"disabled\" === t && (this.#e.disabled = this.disabled, this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n get value() {\n return this.getAttribute(\"value\");\n }\n set value(t) {\n this.setAttribute(\"value\", t);\n }\n get from() {\n return this.getAttribute(\"from\");\n }\n set from(t) {\n this.setAttribute(\"from\", t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n t ? this.setAttribute(\"disabled\", \"\") : this.removeAttribute(\"disabled\");\n }\n get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || 1e3;\n }\n set feedbackDuration(t) {\n this.setAttribute(\"feedback-duration\", t);\n }\n async #l() {\n if (this.value || this.from) try {\n let o = \"\";\n if (this.value) o = this.value;\n else if (this.from) {\n let t = \"getRootNode\" in Element.prototype ? this.#e.getRootNode({\n composed: !0\n }) : this.#e.ownerDocument;\n if (!t || !(t instanceof Document || t instanceof ShadowRoot)) return;\n let e = t.querySelector(this.from);\n if (!e) return;\n o = e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement ? e.value : e instanceof HTMLAnchorElement && e.hasAttribute(\"href\") ? e.href : e.textContent;\n }\n await navigator.clipboard.writeText(o), this.#d($0da3d504155236c3$var$e), this.dispatchEvent(new CustomEvent(`${$0da3d504155236c3$var$t}-success`, {\n bubbles: !0,\n composed: !0,\n detail: {\n value: o\n }\n }));\n } catch (e) {\n this.#d($0da3d504155236c3$var$o), this.dispatchEvent(new CustomEvent(`${$0da3d504155236c3$var$t}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.#t || this.#l();\n };\n #d(t) {\n this.#o.hidden = !0, this.#s.hidden = t !== $0da3d504155236c3$var$e, this.#i.hidden = t !== $0da3d504155236c3$var$o, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\"), this.#e.part.add(`button--${t}`), this.#t && clearTimeout(this.#t), this.#t = setTimeout(()=>{\n this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(`button--${t}`), this.#t = null;\n }, this.feedbackDuration);\n }\n #a() {\n this.#t && clearTimeout(this.#t), this.#t = null, this.#o.hidden = !1, this.#s.hidden = !0, this.#i.hidden = !0, this.#e.part.remove(\"button--success\"), this.#e.part.remove(\"button--error\");\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(e = $0da3d504155236c3$var$t) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $0da3d504155236c3$export$ea3b71af1761ff40);\n }\n}\n$0da3d504155236c3$export$ea3b71af1761ff40.defineCustomElement();\n\n\nObject.defineProperty({}, \"WebShare\", {\n get: function() {\n return $4f74a8126e204146$export$30b344bef3e55b67;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $4f74a8126e204146$var$t = `\n :host {\n display: inline-block;\n }\n`, $4f74a8126e204146$var$e = document.createElement(\"template\");\n$4f74a8126e204146$var$e.innerHTML = `\n \n \n`;\nclass $4f74a8126e204146$export$30b344bef3e55b67 extends HTMLElement {\n #t;\n #e;\n #s = [];\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($4f74a8126e204146$var$e.content.cloneNode(!0)), this.#t = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null, this.#e = this.#i();\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"disabled\" === t && e !== s && this.#e && (this.#e.toggleAttribute(\"disabled\", this.disabled), this.#e.setAttribute(\"aria-disabled\", this.disabled.toString()), this.#e.part && this.#e.part.contains(\"button\") && this.#e.part.toggle(\"button--disabled\", this.disabled));\n }\n connectedCallback() {\n this.#r(\"shareUrl\"), this.#r(\"shareTitle\"), this.#r(\"shareText\"), this.#r(\"shareFiles\"), this.#r(\"disabled\"), this.#t?.addEventListener(\"slotchange\", this.#a), this.#e?.addEventListener(\"click\", this.#n);\n }\n disconnectedCallback() {\n this.#t?.removeEventListener(\"slotchange\", this.#a), this.#e?.removeEventListener(\"click\", this.#n);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get shareUrl() {\n return this.getAttribute(\"share-url\") || \"\";\n }\n set shareUrl(t) {\n this.setAttribute(\"share-url\", t);\n }\n get shareTitle() {\n return this.getAttribute(\"share-title\") || \"\";\n }\n set shareTitle(t) {\n this.setAttribute(\"share-title\", t);\n }\n get shareText() {\n return this.getAttribute(\"share-text\") || \"\";\n }\n set shareText(t) {\n this.setAttribute(\"share-text\", t);\n }\n get shareFiles() {\n return this.#s;\n }\n set shareFiles(t) {\n Array.isArray(t) && t.length > 0 && (this.#s = t);\n }\n async share() {\n if (!this.disabled) try {\n let t = {};\n this.shareUrl && (t.url = this.shareUrl), this.shareTitle && (t.title = this.shareTitle), this.shareText && (t.text = this.shareText), Array.isArray(this.shareFiles) && this.shareFiles.length > 0 && navigator.canShare && navigator.canShare({\n files: this.shareFiles\n }) && (t.files = this.shareFiles), await navigator.share(t), this.dispatchEvent(new CustomEvent(\"web-share:success\", {\n bubbles: !0,\n composed: !0,\n detail: {\n shareData: t\n }\n }));\n } catch (t) {\n if (t instanceof Error && \"AbortError\" === t.name) {\n this.dispatchEvent(new CustomEvent(\"web-share:abort\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n return;\n }\n this.dispatchEvent(new CustomEvent(\"web-share:error\", {\n bubbles: !0,\n composed: !0,\n detail: {\n error: t\n }\n }));\n }\n }\n #n = (t)=>{\n t.preventDefault(), this.disabled || this.share();\n };\n #a = (t)=>{\n t.target && \"button\" === t.target.name && (this.#e?.removeEventListener(\"click\", this.#n), this.#e = this.#i(), this.#e && (this.#e.addEventListener(\"click\", this.#n), \"BUTTON\" === this.#e.nodeName || this.#e.hasAttribute(\"role\") || this.#e.setAttribute(\"role\", \"button\")));\n };\n #i() {\n return this.#t && this.#t.assignedElements({\n flatten: !0\n }).find((t)=>\"BUTTON\" === t.nodeName || \"button\" === t.getAttribute(\"slot\")) || null;\n }\n #r(t) {\n if (Object.prototype.hasOwnProperty.call(this, t)) {\n let e = this[t];\n delete this[t], this[t] = e;\n }\n }\n static defineCustomElement(t = \"web-share\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $4f74a8126e204146$export$30b344bef3e55b67);\n }\n}\n$4f74a8126e204146$export$30b344bef3e55b67.defineCustomElement();\n\n\nObject.defineProperty({}, \"FilesDropzone\", {\n get: function() {\n return $7aad62ebc3d6fae8$export$6ccd1735166caad9;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $7aad62ebc3d6fae8$var$e = new Map([\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]), $7aad62ebc3d6fae8$var$t = [\n \".DS_Store\",\n \"Thumbs.db\"\n], $7aad62ebc3d6fae8$var$o = (t)=>{\n let { name: o } = t;\n if (o && -1 !== o.lastIndexOf(\".\") && !t.type) {\n let i = (o.split(\".\").pop() || \"\").toLowerCase(), r = $7aad62ebc3d6fae8$var$e.get(i);\n r && Object.defineProperty(t, \"type\", {\n value: r,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return t;\n}, $7aad62ebc3d6fae8$var$i = (e, t)=>{\n let i = $7aad62ebc3d6fae8$var$o(e);\n if (\"string\" != typeof i.path) {\n let { webkitRelativePath: o } = e;\n Object.defineProperty(i, \"path\", {\n value: \"string\" == typeof t ? t : o || e.name,\n writable: !1,\n configurable: !1,\n enumerable: !0\n });\n }\n return i;\n}, $7aad62ebc3d6fae8$var$r = async (e)=>await new Promise((t, o)=>{\n e.readEntries(t, o);\n }), $7aad62ebc3d6fae8$var$a = async (e)=>{\n let t = [], o = await $7aad62ebc3d6fae8$var$r(e);\n for(; o.length > 0;)t.push(...o), o = await $7aad62ebc3d6fae8$var$r(e);\n return t;\n}, $7aad62ebc3d6fae8$var$n = (e)=>new Promise((t, o)=>{\n e.file((o)=>t($7aad62ebc3d6fae8$var$i(o, e.fullPath)), o);\n }), $7aad62ebc3d6fae8$var$s = async (e)=>{\n let o = [], i = [];\n for (let t of e){\n if (\"file\" !== t.kind) continue;\n let e = t.getAsEntry ? t.getAsEntry() : t.webkitGetAsEntry();\n i.push(e);\n }\n for(; i.length > 0;){\n let e = i.shift();\n if (e) {\n if (e.isFile) {\n let i = await $7aad62ebc3d6fae8$var$n(e);\n -1 === $7aad62ebc3d6fae8$var$t.indexOf(i.name) && o.push(i);\n } else e.isDirectory && i.push(...await $7aad62ebc3d6fae8$var$a(e.createReader()));\n }\n }\n return o;\n}, $7aad62ebc3d6fae8$var$d = async (e)=>{\n let o = [];\n for (let r of e)-1 === $7aad62ebc3d6fae8$var$t.indexOf(r.name) && o.push($7aad62ebc3d6fae8$var$i(r));\n return o;\n}, $7aad62ebc3d6fae8$var$l = async (e)=>e.dataTransfer ? e.dataTransfer.items ? await $7aad62ebc3d6fae8$var$s(e.dataTransfer.items) : await $7aad62ebc3d6fae8$var$d(e.dataTransfer.files) : await $7aad62ebc3d6fae8$var$d(e.target.files), $7aad62ebc3d6fae8$var$p = \"files-dropzone\", $7aad62ebc3d6fae8$var$c = \"TOO_MANY_FILES\", $7aad62ebc3d6fae8$var$h = document.createElement(\"template\"), $7aad62ebc3d6fae8$var$u = `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$7aad62ebc3d6fae8$var$h.innerHTML = `\n \n\n \n\n
              \n Drag 'n' drop files here, or click to select files\n
              \n`;\nclass $7aad62ebc3d6fae8$export$6ccd1735166caad9 extends HTMLElement {\n #e = null;\n #t = null;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\",\n delegatesFocus: !0\n }).appendChild($7aad62ebc3d6fae8$var$h.content.cloneNode(!0)), this.shadowRoot && (this.#e = this.shadowRoot.getElementById(\"file-input\"), this.#t = this.shadowRoot.getElementById(\"dropzone\"));\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n \"accept\" === e && t !== o && this.#e && (this.#e.accept = this.accept), \"disabled\" === e && t !== o && this.#e && (this.#e.disabled = this.disabled, this.disabled ? (this.#t?.removeAttribute(\"tabindex\"), this.#t?.setAttribute(\"aria-disabled\", \"true\")) : (this.#t?.setAttribute(\"tabindex\", \"0\"), this.#t?.setAttribute(\"aria-disabled\", \"false\"))), \"multiple\" === e && t !== o && this.#e && (this.#e.multiple = this.multiple);\n }\n connectedCallback() {\n this.#o(\"accept\"), this.#o(\"disabled\"), this.#o(\"maxFiles\"), this.#o(\"maxSize\"), this.#o(\"minSize\"), this.#o(\"multiple\"), this.#o(\"autoFocus\"), this.#o(\"noStyle\"), this.#e?.addEventListener(\"change\", this.#i), this.#t?.addEventListener(\"dragenter\", this.#r), this.#t?.addEventListener(\"dragover\", this.#a), this.#t?.addEventListener(\"dragleave\", this.#n), this.#t?.addEventListener(\"drop\", this.#s), this.#t?.addEventListener(\"click\", this.#d), this.#t?.addEventListener(\"keyup\", this.#l), this.autoFocus && this.#t?.focus();\n }\n disconnectedCallback() {\n this.#e?.removeEventListener(\"change\", this.#i), this.#t?.removeEventListener(\"dragenter\", this.#r), this.#t?.removeEventListener(\"dragover\", this.#a), this.#t?.removeEventListener(\"dragleave\", this.#n), this.#t?.removeEventListener(\"drop\", this.#s), this.#t?.removeEventListener(\"click\", this.#d), this.#t?.removeEventListener(\"keyup\", this.#l);\n }\n get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(e) {\n this.setAttribute(\"accept\", null != e ? e.toString() : e);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(e) {\n this.toggleAttribute(\"disabled\", !!e);\n }\n get maxFiles() {\n let e = Number(this.getAttribute(\"max-files\")) || 0;\n return e <= 0 ? 1 / 0 : Math.floor(Math.abs(e));\n }\n set maxFiles(e) {\n this.setAttribute(\"max-files\", null != e ? e.toString() : e);\n }\n get maxSize() {\n let e = this.getAttribute(\"max-size\");\n if (null === e) return 1 / 0;\n let t = Number(e);\n return Number.isNaN(t) ? 1 / 0 : t;\n }\n set maxSize(e) {\n this.setAttribute(\"max-size\", null != e ? e.toString() : e);\n }\n get minSize() {\n let e = this.getAttribute(\"min-size\");\n if (null === e) return 0;\n let t = Number(e);\n return Number.isNaN(t) ? 0 : t;\n }\n set minSize(e) {\n this.setAttribute(\"min-size\", null != e ? e.toString() : e);\n }\n get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(e) {\n this.toggleAttribute(\"multiple\", !!e);\n }\n get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(e) {\n this.toggleAttribute(\"auto-focus\", !!e);\n }\n get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(e) {\n this.toggleAttribute(\"no-style\", !!e);\n }\n #i = async (e)=>{\n try {\n this.#p(await $7aad62ebc3d6fae8$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n };\n #r = ()=>{\n this.disabled || this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragenter`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #a = (e)=>{\n if (e.preventDefault(), this.disabled) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n e.dataTransfer.dropEffect = \"copy\", this.#t && (this.#t.classList.add(\"dropzone--dragover\"), this.#t.part.add(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragover`, {\n bubbles: !0,\n composed: !0\n }));\n };\n #n = ()=>{\n this.disabled || (this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\")), this.dispatchEvent(new Event(`${$7aad62ebc3d6fae8$var$p}-dragleave`, {\n bubbles: !0,\n composed: !0\n })));\n };\n #s = async (e)=>{\n if (!this.disabled) {\n e.preventDefault(), this.#t && (this.#t.classList.remove(\"dropzone--dragover\"), this.#t.part.remove(\"dropzone--dragover\"));\n try {\n this.#p(await $7aad62ebc3d6fae8$var$l(e));\n } catch (e) {\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-error`, {\n bubbles: !0,\n composed: !0,\n detail: {\n error: e\n }\n }));\n }\n }\n };\n #d = ()=>{\n this.disabled || this.#e?.click();\n };\n #l = (e)=>{\n this.disabled || \" \" !== e.key && \"Enter\" !== e.key || this.#e?.click();\n };\n #p(e) {\n if (!Array.isArray(e) || !e.length) return;\n let t = [], o = [], i = e.length;\n if (!this.multiple && i > 1) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$c,\n message: \"Too many files selected. Only 1 file is allowed.\"\n }\n ]\n });\n else if (this.multiple && i > this.maxFiles) for (let t of e)o.push({\n file: t,\n errors: [\n {\n code: $7aad62ebc3d6fae8$var$c,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else for (let i of e){\n let e = function(e, t = \"\") {\n if (!t) return !0;\n let o = [\n ...new Set(t.split(\",\").map((e)=>e.trim()).filter(Boolean))\n ], i = e.type, r = i.replace(/\\/.*$/, \"\");\n for (let t of o)if (\".\" === t.charAt(0)) {\n if (-1 !== e.name.toLowerCase().indexOf(t.toLowerCase(), e.name.length - t.length)) return !0;\n } else if (/\\/\\*$/.test(t)) {\n if (r === t.replace(/\\/.*$/, \"\")) return !0;\n } else if (i === t) return !0;\n return !1;\n }(i, this.accept), r = i.size > this.maxSize, a = i.size < this.minSize;\n if (!e || r || a) {\n let t = [];\n e || t.push({\n code: \"INVALID_MIME_TYPE\",\n message: `File type \"${i.type}\" is not accepted.`\n }), r && t.push({\n code: \"FILE_TOO_LARGE\",\n message: `File size ${i.size} exceeds the maximum size of ${this.maxSize}.`\n }), a && t.push({\n code: \"FILE_TOO_SMALL\",\n message: `File size ${i.size} is smaller than the minimum size of ${this.minSize}.`\n }), o.push({\n file: i,\n errors: t\n });\n } else t.push(i);\n }\n this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t,\n rejectedFiles: o\n }\n })), t.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop-accepted`, {\n bubbles: !0,\n composed: !0,\n detail: {\n acceptedFiles: t\n }\n })), o.length > 0 && this.dispatchEvent(new CustomEvent(`${$7aad62ebc3d6fae8$var$p}-drop-rejected`, {\n bubbles: !0,\n composed: !0,\n detail: {\n rejectedFiles: o\n }\n })), this.#e && (this.#e.value = this.#e.defaultValue);\n }\n openFileDialog() {\n this.disabled || this.#e?.click();\n }\n #o(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n static defineCustomElement(e = $7aad62ebc3d6fae8$var$p) {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $7aad62ebc3d6fae8$export$6ccd1735166caad9);\n }\n}\n$7aad62ebc3d6fae8$export$6ccd1735166caad9.defineCustomElement();\n\n\nlet $c172d40c323f9126$var$t = (t = \"\", e = \"\")=>{\n let s = Math.random().toString(36).substring(2, 8);\n return `${\"string\" == typeof t && \"\" !== t ? t + \"-\" : \"\"}${s}${\"string\" == typeof e && \"\" !== e ? \"-\" + e : \"\"}`;\n}, $c172d40c323f9126$var$e = (t, e)=>{\n if (Object.prototype.hasOwnProperty.call(e, t)) {\n let s = e[t];\n delete e[t], e[t] = s;\n }\n}, $c172d40c323f9126$var$s = 0, $c172d40c323f9126$var$o = `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`, $c172d40c323f9126$var$a = document.createElement(\"template\");\n$c172d40c323f9126$var$a.innerHTML = `\n \n\n
              \n \n
              \n`;\nclass $c172d40c323f9126$var$l extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($c172d40c323f9126$var$a.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n if (\"selected\" === t && e !== s && this.setAttribute(\"aria-selected\", this.selected.toString()), \"disabled\" === t && e !== s && (this.setAttribute(\"aria-disabled\", this.disabled.toString()), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\")), \"closable\" === t && e !== s) {\n if (this.closable) {\n let t = document.createElement(\"span\");\n t.className = \"tab__close\", t.setAttribute(\"part\", \"close-tab\"), t.innerHTML = '', this.shadowRoot?.querySelector(\".tab\")?.appendChild(t), t.addEventListener(\"click\", this.#t);\n } else {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t), t?.remove();\n }\n }\n }\n connectedCallback() {\n this.#e(\"selected\"), this.#e(\"disabled\"), this.#e(\"closable\"), this.id || (this.id = $c172d40c323f9126$var$t(\"tab\", (++$c172d40c323f9126$var$s).toString())), this.setAttribute(\"slot\", \"tab\"), this.setAttribute(\"role\", \"tab\"), this.setAttribute(\"aria-selected\", \"false\"), this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\".tab__close\");\n t?.removeEventListener(\"click\", this.#t);\n }\n get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(t) {\n this.toggleAttribute(\"selected\", !!t);\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(t) {\n this.toggleAttribute(\"disabled\", !!t);\n }\n get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(t) {\n this.toggleAttribute(\"closable\", !!t);\n }\n #t = (t)=>{\n t.stopPropagation(), this.dispatchEvent(new CustomEvent(\"a-tab-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: this.id\n }\n }));\n };\n #e(t) {\n return $c172d40c323f9126$var$e(t, this);\n }\n static defineCustomElement(t = \"a-tab\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $c172d40c323f9126$var$l);\n }\n}\n$c172d40c323f9126$var$l.defineCustomElement();\nlet $c172d40c323f9126$var$i = 0, $c172d40c323f9126$var$r = `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`, $c172d40c323f9126$var$n = document.createElement(\"template\");\n$c172d40c323f9126$var$n.innerHTML = `\n \n\n
              \n \n
              \n`;\nclass $c172d40c323f9126$var$c extends HTMLElement {\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($c172d40c323f9126$var$n.content.cloneNode(!0));\n }\n connectedCallback() {\n this.setAttribute(\"slot\", \"panel\"), this.setAttribute(\"role\", \"tabpanel\"), this.setAttribute(\"hidden\", \"\"), this.id || (this.id = $c172d40c323f9126$var$t(\"panel\", (++$c172d40c323f9126$var$i).toString()));\n }\n static defineCustomElement(t = \"a-tab-panel\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $c172d40c323f9126$var$c);\n }\n}\n$c172d40c323f9126$var$c.defineCustomElement();\nlet $c172d40c323f9126$var$d = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n}, $c172d40c323f9126$var$h = Object.entries($c172d40c323f9126$var$d).map(([, t])=>t), $c172d40c323f9126$var$b = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n}, $c172d40c323f9126$var$u = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n}, $c172d40c323f9126$var$p = `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$c172d40c323f9126$var$d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$c172d40c323f9126$var$d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$c172d40c323f9126$var$d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$c172d40c323f9126$var$d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`, $c172d40c323f9126$var$g = document.createElement(\"template\");\n$c172d40c323f9126$var$g.innerHTML = `\n \n\n
              \n
              \n \n\n
              \n \n
              \n\n \n
              \n\n
              \n \n
              \n
              \n`;\nclass $c172d40c323f9126$export$85fd4ed3b8ca1010 extends HTMLElement {\n #s = null;\n #o = null;\n #a = !1;\n constructor(){\n super(), this.shadowRoot || this.attachShadow({\n mode: \"open\"\n }).appendChild($c172d40c323f9126$var$g.content.cloneNode(!0));\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n attributeChangedCallback(t, e, s) {\n \"placement\" === t && e !== s && this.#l(), \"no-scroll-controls\" === t && e !== s && this.#l();\n }\n get placement() {\n return this.getAttribute(\"placement\") || $c172d40c323f9126$var$d.TOP;\n }\n set placement(t) {\n null != t && this.setAttribute(\"placement\", t);\n }\n get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(t) {\n this.toggleAttribute(\"no-scroll-controls\", !!t);\n }\n get scrollDistance() {\n return Math.abs(Number(this.getAttribute(\"scroll-distance\"))) || 200;\n }\n set scrollDistance(t) {\n this.setAttribute(\"scroll-distance\", Math.abs(t).toString() || \"200\");\n }\n get activation() {\n return this.getAttribute(\"activation\") || $c172d40c323f9126$var$b.AUTO;\n }\n set activation(t) {\n this.setAttribute(\"activation\", t || $c172d40c323f9126$var$b.AUTO);\n }\n get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(t) {\n this.toggleAttribute(\"no-tab-cycling\", !!t);\n }\n connectedCallback() {\n this.#e(\"placement\"), this.#e(\"noScrollControls\"), this.#e(\"scrollDistance\"), this.#e(\"activation\"), this.#e(\"noTabCycling\");\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = this.shadowRoot?.querySelector(\".tab-group__nav\"), a = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.addEventListener(\"slotchange\", this.#i), e?.addEventListener(\"slotchange\", this.#i), s?.addEventListener(\"click\", this.#r), s?.addEventListener(\"keydown\", this.#n), a.forEach((t)=>t.addEventListener(\"click\", this.#c)), this.addEventListener(\"a-tab-close\", this.#d), \"ResizeObserver\" in window && (this.#s = new ResizeObserver((t)=>{\n this.#o = window.requestAnimationFrame(()=>{\n let e = t?.[0], s = e?.target, l = s?.scrollWidth > s?.clientWidth;\n a.forEach((t)=>t.toggleAttribute(\"hidden\", !l)), o?.part.toggle(\"nav--has-scroll-controls\", l), o?.classList.toggle(\"tab-group__nav--has-scroll-controls\", l);\n });\n })), this.#h(), this.#l();\n }\n disconnectedCallback() {\n let t = this.shadowRoot?.querySelector(\"slot[name=tab]\"), e = this.shadowRoot?.querySelector(\"slot[name=panel]\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\"), o = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n t?.removeEventListener(\"slotchange\", this.#i), e?.removeEventListener(\"slotchange\", this.#i), s?.removeEventListener(\"click\", this.#r), s?.removeEventListener(\"keydown\", this.#n), o.forEach((t)=>t.removeEventListener(\"click\", this.#c)), this.removeEventListener(\"a-tab-close\", this.#d), this.#b();\n }\n #u() {\n if (!this.#s) return;\n let t = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n t && (this.#s.unobserve(t), this.#s.observe(t));\n }\n #b() {\n this.#s && (this.#s.disconnect(), null !== this.#o && (window.cancelAnimationFrame(this.#o), this.#o = null));\n }\n #p() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n #h() {\n this.hidden = 0 === this.#g().length;\n }\n #m() {\n let t = this.#g();\n this.#h(), t.forEach((t)=>{\n let e = t.nextElementSibling;\n if (!e || \"a-tab-panel\" !== e.tagName.toLowerCase()) return console.error(`Tab #${t.id} is not a sibling of a `);\n t.setAttribute(\"aria-controls\", e.id), e.setAttribute(\"aria-labelledby\", t.id);\n });\n }\n #v() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n #g() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n #f(t) {\n let e = t.getAttribute(\"aria-controls\");\n return this.querySelector(`#${e}`);\n }\n #w() {\n return this.#g().find((t)=>!t.disabled) || null;\n }\n #T() {\n let t = this.#g();\n for(let e = t.length - 1; e >= 0; e--)if (!t[e].disabled) return t[e];\n return null;\n }\n #y() {\n let t = this.#g(), e = this.activation === $c172d40c323f9126$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) - 1 : t.findIndex((t)=>t.selected) - 1;\n for(; t[(e + t.length) % t.length].disabled;)e--;\n return this.noTabCycling && e < 0 ? null : t[(e + t.length) % t.length];\n }\n #A() {\n let t = this.#g(), e = this.activation === $c172d40c323f9126$var$b.MANUAL ? t.findIndex((t)=>t.matches(\":focus\")) + 1 : t.findIndex((t)=>t.selected) + 1;\n for(; t[e % t.length].disabled;)e++;\n return this.noTabCycling && e >= t.length ? null : t[e % t.length];\n }\n #_() {\n let t = this.#g(), e = this.#v();\n t.forEach((t)=>t.selected = !1), e.forEach((t)=>t.hidden = !0);\n }\n #l() {\n let t = this.shadowRoot?.querySelector(\".tab-group__nav\"), e = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n this.noScrollControls || this.placement === $c172d40c323f9126$var$d.START || this.placement === $c172d40c323f9126$var$d.END ? (this.#b(), e.forEach((t)=>t.hidden = !0), t?.part.remove(\"nav--has-scroll-controls\"), t?.classList.remove(\"tab-group__nav--has-scroll-controls\")) : (this.#u(), e.forEach((t)=>t.hidden = !1));\n }\n #E() {\n let t = this.#g(), e = t.find((t)=>t.selected && !t.disabled) || t.find((t)=>!t.disabled);\n e && (this.#a && !e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.#C(e));\n }\n #C(t) {\n this.#_(), t && (t.selected = !0);\n let e = this.#f(t);\n e && (e.hidden = !1);\n }\n #i = (t)=>{\n this.#m(), this.#l(), this.#E(), \"tab\" === t.target.name && (this.#a = !0);\n };\n #n = (t)=>{\n if (\"a-tab\" !== t.target.tagName.toLowerCase() || t.altKey) return;\n let e = $c172d40c323f9126$var$h.includes(this.placement || \"\") ? this.placement : $c172d40c323f9126$var$d.TOP, s = [\n $c172d40c323f9126$var$d.TOP,\n $c172d40c323f9126$var$d.BOTTOM\n ].includes(e || \"\") ? \"horizontal\" : \"vertical\", o = this.#p(), a = null;\n switch(t.key){\n case $c172d40c323f9126$var$u.LEFT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#y() : this.#A()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.RIGHT:\n \"horizontal\" === s && (a = \"ltr\" === o ? this.#A() : this.#y()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.UP:\n \"vertical\" === s && (a = this.#y()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.DOWN:\n \"vertical\" === s && (a = this.#A()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.HOME:\n (a = this.#w()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.END:\n (a = this.#T()) && (this.activation === $c172d40c323f9126$var$b.MANUAL ? a.focus() : this.selectTab(a));\n break;\n case $c172d40c323f9126$var$u.ENTER:\n case $c172d40c323f9126$var$u.SPACE:\n (a = t.target) && this.selectTab(a);\n break;\n default:\n return;\n }\n t.preventDefault();\n };\n #r = (t)=>{\n let e = t.target.closest(\"a-tab\");\n e && this.selectTab(e);\n };\n #c = (t)=>{\n let e = t.target.closest(\".tab-group__scroll-button\"), s = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!e || !s) return;\n let o = e.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1, a = s.scrollLeft;\n s.scrollTo({\n left: a + o * this.scrollDistance\n });\n };\n #d = (t)=>{\n let e = t.target, s = this.#f(e);\n e && (e.remove(), e.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n }))), s && \"a-tab-panel\" === s.tagName.toLowerCase() && s.remove();\n };\n #e(t) {\n return $c172d40c323f9126$var$e(t, this);\n }\n selectTabByIndex(t) {\n let e = this.#g()[t];\n e && this.selectTab(e);\n }\n selectTabById(t) {\n let e = this.#g().find((e)=>e.id === t);\n e && this.selectTab(e);\n }\n selectTab(t) {\n let e = this.#g().find((t)=>t.selected);\n !t || t.disabled || t.selected || \"a-tab\" !== t.tagName.toLowerCase() || (this.#C(t), window.requestAnimationFrame(()=>{\n t.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n }), t.focus();\n }), e && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: e.id\n }\n })), this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: !0,\n composed: !0,\n detail: {\n tabId: t.id\n }\n })));\n }\n static defineCustomElement(t = \"a-tab-group\") {\n \"undefined\" == typeof window || window.customElements.get(t) || window.customElements.define(t, $c172d40c323f9126$export$85fd4ed3b8ca1010);\n }\n}\n$c172d40c323f9126$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nObject.defineProperty({}, \"ModalElement\", {\n get: function() {\n return $4da30046ce6d9325$export$32589115725b904b;\n },\n set: void 0,\n enumerable: !0,\n configurable: !0\n});\nlet $4da30046ce6d9325$var$e = document.createElement(\"template\"), $4da30046ce6d9325$var$t = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$4da30046ce6d9325$var$e.innerHTML = /* html */ `\n \n\n \n
              \n
              \n \n\n
              \n \n
              \n
              \n\n \n\n
              \n \n
              \n
              \n
              \n`; /**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ \nclass $4da30046ce6d9325$export$32589115725b904b extends HTMLElement {\n #e = null;\n #t = null;\n #o = void 0;\n constructor(){\n if (super(), !this.shadowRoot) {\n let t = this.attachShadow({\n mode: \"open\"\n });\n t.appendChild($4da30046ce6d9325$var$e.content.cloneNode(!0));\n }\n this.shadowRoot && (this.#e = this.shadowRoot.querySelector(\"dialog\"), this.#t = this.shadowRoot.querySelector('slot[name=\"footer\"]'));\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n attributeChangedCallback(e, t, o) {\n if (null !== this.#e) {\n if (\"open\" === e && t !== o && (this.open ? (this.#e.showModal(), this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n }))) : this.#e.close()), \"no-header\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__header\");\n null !== e && (e.hidden = this.noHeader);\n }\n if (\"no-animations\" === e && t !== o && this.#e.classList.toggle(\"dialog--no-animations\", this.noAnimations), \"no-close-button\" === e && t !== o) {\n let e = this.#e.querySelector(\".dialog__close\");\n null !== e && (e.hidden = this.noCloseButton);\n }\n }\n }\n connectedCallback() {\n this.#i(\"open\"), this.#i(\"staticBackdrop\"), this.#i(\"noHeader\"), this.#i(\"noAnimations\"), this.#i(\"noCloseButton\"), this.#i(\"fullscreen\"), this.#e?.addEventListener(\"click\", this.#a), this.#e?.addEventListener(\"close\", this.#l), this.#e?.addEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#n), this.#t?.addEventListener(\"slotchange\", this.#r);\n }\n disconnectedCallback() {\n this.#o && clearTimeout(this.#o), this.#e?.addEventListener(\"click\", this.#a), this.#e?.removeEventListener(\"close\", this.#l), this.#e?.removeEventListener(\"cancel\", this.#s), this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#n), this.#t?.removeEventListener(\"slotchange\", this.#r);\n }\n get open() {\n return this.hasAttribute(\"open\");\n }\n set open(e) {\n e ? this.setAttribute(\"open\", \"\") : this.removeAttribute(\"open\");\n }\n get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(e) {\n e ? this.setAttribute(\"static-backdrop\", \"\") : this.removeAttribute(\"static-backdrop\");\n }\n get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(e) {\n e ? this.setAttribute(\"no-header\", \"\") : this.removeAttribute(\"no-header\");\n }\n get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(e) {\n e ? this.setAttribute(\"no-animations\", \"\") : this.removeAttribute(\"no-animations\");\n }\n get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(e) {\n e ? this.setAttribute(\"no-close-button\", \"\") : this.removeAttribute(\"no-close-button\");\n }\n get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(e) {\n e ? this.setAttribute(\"fullscreen\", \"\") : this.removeAttribute(\"fullscreen\");\n }\n #d() {\n this.#o || (this.#e?.classList.add(\"dialog--pulse\"), this.#o = setTimeout(()=>{\n this.#e?.classList.remove(\"dialog--pulse\"), clearTimeout(this.#o), this.#o = void 0;\n }, 300));\n }\n #l = ()=>{\n // the open property when the dialog is closed by the user.\n this.open = !1, this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: !0,\n composed: !0,\n detail: {\n element: this\n }\n }));\n };\n #s = (e)=>{\n let t = this.#c(\"escape-key\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #n = (e)=>{\n let t = this.#c(\"close-button\");\n this.dispatchEvent(t), t.defaultPrevented && (e.preventDefault(), this.noAnimations || this.#d());\n };\n #a = (e)=>{\n if (e.target !== e.currentTarget) return;\n let t = this.#c(\"backdrop-click\");\n if (this.dispatchEvent(t), t.defaultPrevented || this.staticBackdrop) {\n this.noAnimations || this.#d();\n return;\n }\n this.#e?.close();\n };\n #r = ()=>{\n if (null === this.#e) return; /** @type {Nullable} */ \n let e = this.#e.querySelector(\".dialog__footer\");\n if (null === e) return;\n let t = this.#t?.assignedNodes(), o = !!t && t.length > 0;\n e.hidden = !o;\n };\n #c(e) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: !0,\n composed: !0,\n cancelable: !0,\n detail: {\n reason: e,\n element: this\n }\n });\n }\n #i(e) {\n if (Object.prototype.hasOwnProperty.call(this, e)) {\n let t = this[e];\n delete this[e], this[e] = t;\n }\n }\n show() {\n this.open || (this.open = !0);\n }\n hide() {\n this.open && (this.open = !1);\n }\n static defineCustomElement(e = \"modal-element\") {\n \"undefined\" == typeof window || window.customElements.get(e) || window.customElements.define(e, $4da30046ce6d9325$export$32589115725b904b);\n }\n}\n$4da30046ce6d9325$export$32589115725b904b.defineCustomElement();\n //# sourceMappingURL=modal-element-defined.js.map\n\n\n(function() {\n \"use strict\";\n if (typeof document === \"undefined\" || \"adoptedStyleSheets\" in document) return;\n var hasShadyCss = \"ShadyCSS\" in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument(\"\");\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === \"object\" ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, \"\");\n if (_contents !== contents) console.warn(\"@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418\");\n return _contents.trim();\n }\n function isElementConnected(element) {\n return \"isConnected\" in element ? element.isConnected : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function(value, index) {\n return arr.indexOf(value) === index;\n });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function(value) {\n return arr2.indexOf(value) === -1;\n });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n var cssStyleSheetMethods = [\n \"addRule\",\n \"deleteRule\",\n \"insertRule\",\n \"removeRule\"\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function() {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function() {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? proto$1.isPrototypeOf(instance) || nonConstructedProto.isPrototypeOf(instance) : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === \"object\" ? nonConstructedProto.isPrototypeOf(instance) : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement(\"style\");\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function(_location) {\n return _location !== location;\n }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function() {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods.get(sheet).forEach(function(command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) throw new TypeError(\"Illegal invocation\");\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement(\"style\");\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n } catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === \"string\") {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function(location) {\n if (location.isConnected()) restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n });\n }\n };\n defineProperty(proto$1, \"cssRules\", {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n }\n });\n defineProperty(proto$1, \"media\", {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n }\n });\n cssStyleSheetMethods.forEach(function(method) {\n proto$1[method] = function() {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({\n method: method,\n args: args\n });\n $locations.get(self).forEach(function(location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance\n });\n var defaultObserverOptions = {\n childList: true,\n subtree: true\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, \"adoptedStyleSheets\", {\n configurable: true,\n enumerable: true,\n get: function() {\n return getAssociatedLocation(this).sheets;\n },\n set: function(sheets) {\n getAssociatedLocation(this).update(sheets);\n }\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function(foundNode) {\n return getShadowRoot(foundNode) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, null, false);\n for(var next = void 0; next = iter.nextNode();)callback(getShadowRoot(next));\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return element instanceof HTMLStyleElement && $uniqueSheets.get(self).some(function(sheet) {\n return getAdopterByLocation(sheet, self);\n });\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function(sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function(sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function(mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function(mutation) {\n if (!hasShadyCss) forEach.call(mutation.addedNodes, function(node) {\n if (!(node instanceof Element)) return;\n traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).connect();\n });\n });\n forEach.call(mutation.removedNodes, function(node) {\n if (!(node instanceof Element)) return;\n if (isExistingAdopter(self, node)) adopt(self);\n if (!hasShadyCss) traverseWebComponents(node, function(root) {\n getAssociatedLocation(root).disconnect();\n });\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function() {\n var element = $element.get(this);\n return element instanceof Document ? element.readyState !== \"loading\" : isElementConnected(element.host);\n },\n connect: function() {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) adopt(this);\n traverseWebComponents(container, function(root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function() {\n $observer.get(this).disconnect();\n },\n update: function(sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? \"Document\" : \"ShadowRoot\";\n if (!Array.isArray(sheets)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n if (!sheets.every(isCSSStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n if (sheets.some(isNonConstructedStyleSheetInstance)) throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function(sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) adopt(self);\n }\n };\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if (\"ShadowRoot\" in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === \"closed\") closedShadowRootRegistry.set(this, root);\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) documentLocation.connect();\n else document.addEventListener(\"DOMContentLoaded\", documentLocation.connect.bind(documentLocation));\n})();\n\n\nvar $821acccc985d5f51$exports = {};\n\n$821acccc985d5f51$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"jBxQq\") + \"bootstrap.33ff2998.css\";\n\n\nvar $215eadd5da70ce75$exports = {};\n\n$215eadd5da70ce75$exports = (parcelRequire(\"aNJCr\")).getBundleURL(\"jBxQq\") + \"main.2238cf96.css\";\n\n\nconst $053c683f8862b85c$var$styleURLs = [\n $821acccc985d5f51$exports,\n $215eadd5da70ce75$exports\n];\nconst $053c683f8862b85c$export$4b9cd30c41328fdd = [];\nfor(let i = 0; i < $053c683f8862b85c$var$styleURLs.length; i += 1)$053c683f8862b85c$export$4b9cd30c41328fdd.push(new CSSStyleSheet());\n(async function() {\n const styles = await Promise.all($053c683f8862b85c$var$styleURLs.map(async (styleURL)=>{\n const res = await fetch(styleURL);\n return res.text();\n }));\n for(let i = 0; i < styles.length; i += 1)await $053c683f8862b85c$export$4b9cd30c41328fdd[i].replace(styles[i]);\n document.body.style.visibility = \"visible\";\n})();\n\n\n\nfunction $e92a13782f6c06ba$var$_slicedToArray(arr, i) {\n return $e92a13782f6c06ba$var$_arrayWithHoles(arr) || $e92a13782f6c06ba$var$_iterableToArrayLimit(arr, i) || $e92a13782f6c06ba$var$_unsupportedIterableToArray(arr, i) || $e92a13782f6c06ba$var$_nonIterableRest();\n}\nfunction $e92a13782f6c06ba$var$_nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction $e92a13782f6c06ba$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $e92a13782f6c06ba$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $e92a13782f6c06ba$var$_arrayLikeToArray(o, minLen);\n}\nfunction $e92a13782f6c06ba$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $e92a13782f6c06ba$var$_iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction $e92a13782f6c06ba$var$_arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction $e92a13782f6c06ba$export$b327150396135fe7(request) {\n return new Promise(function(resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function() {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n request.onabort = request.onerror = function() {\n return reject(request.error);\n };\n });\n}\nfunction $e92a13782f6c06ba$export$f51a9068ac82ea43(dbName, storeName) {\n var request = indexedDB.open(dbName);\n request.onupgradeneeded = function() {\n return request.result.createObjectStore(storeName);\n };\n var dbp = $e92a13782f6c06ba$export$b327150396135fe7(request);\n return function(txMode, callback) {\n return dbp.then(function(db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\nvar $e92a13782f6c06ba$var$defaultGetStoreFunc;\nfunction $e92a13782f6c06ba$var$defaultGetStore() {\n if (!$e92a13782f6c06ba$var$defaultGetStoreFunc) $e92a13782f6c06ba$var$defaultGetStoreFunc = $e92a13782f6c06ba$export$f51a9068ac82ea43(\"keyval-store\", \"keyval\");\n return $e92a13782f6c06ba$var$defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$3988ae62b71be9a3(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return $e92a13782f6c06ba$export$b327150396135fe7(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$adaa4cf7ef1b65be(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.put(value, key);\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$daa0a5170277c7a8(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n entries.forEach(function(entry) {\n return store.put(entry[1], entry[0]);\n });\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$5df405cccea42673(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n return Promise.all(keys.map(function(key) {\n return $e92a13782f6c06ba$export$b327150396135fe7(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$722fbec263ad908a(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n return(// If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function(resolve, reject) {\n store.get(key).onsuccess = function() {\n try {\n store.put(updater(this.result), key);\n resolve($e92a13782f6c06ba$export$b327150396135fe7(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n }));\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$1d2f21e549771e67(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.delete(key);\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$c8aa84257229cac8(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n keys.forEach(function(key) {\n return store.delete(key);\n });\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$42ffd38884aecdac() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readwrite\", function(store) {\n store.clear();\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n });\n}\nfunction $e92a13782f6c06ba$var$eachCursor(store, callback) {\n store.openCursor().onsuccess = function() {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n return $e92a13782f6c06ba$export$b327150396135fe7(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$ed97f33186d4b816() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAllKeys) return $e92a13782f6c06ba$export$b327150396135fe7(store.getAllKeys());\n var items = [];\n return $e92a13782f6c06ba$var$eachCursor(store, function(cursor) {\n return items.push(cursor.key);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$68c286be0e7e55b7() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n if (store.getAll) return $e92a13782f6c06ba$export$b327150396135fe7(store.getAll());\n var items = [];\n return $e92a13782f6c06ba$var$eachCursor(store, function(cursor) {\n return items.push(cursor.value);\n }).then(function() {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */ function $e92a13782f6c06ba$export$3e9f948b41964866() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $e92a13782f6c06ba$var$defaultGetStore();\n return customStore(\"readonly\", function(store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) return Promise.all([\n $e92a13782f6c06ba$export$b327150396135fe7(store.getAllKeys()),\n $e92a13782f6c06ba$export$b327150396135fe7(store.getAll())\n ]).then(function(_ref) {\n var _ref2 = $e92a13782f6c06ba$var$_slicedToArray(_ref, 2), keys = _ref2[0], values = _ref2[1];\n return keys.map(function(key, i) {\n return [\n key,\n values[i]\n ];\n });\n });\n var items = [];\n return customStore(\"readonly\", function(store) {\n return $e92a13782f6c06ba$var$eachCursor(store, function(cursor) {\n return items.push([\n cursor.key,\n cursor.value\n ]);\n }).then(function() {\n return items;\n });\n });\n });\n}\n\n\nconst $b36f6cb20f27a9a6$var$STORAGE_PREFIX = \"rss-reader/\";\nconst $b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY = $b36f6cb20f27a9a6$var$STORAGE_PREFIX + \"feeds\";\nconst $b36f6cb20f27a9a6$var$getItem = async (key)=>{\n try {\n return {\n value: await (0, $e92a13782f6c06ba$export$3988ae62b71be9a3)(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error: error\n };\n }\n};\nconst $b36f6cb20f27a9a6$var$setItem = async (key, data)=>{\n try {\n await (0, $e92a13782f6c06ba$export$adaa4cf7ef1b65be)(key, data);\n return {\n error: void 0\n };\n } catch (error) {\n return {\n error: error\n };\n }\n};\nconst $b36f6cb20f27a9a6$export$4890c08c4ffbd57b = async ()=>{\n return $b36f6cb20f27a9a6$var$getItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY);\n};\nconst $b36f6cb20f27a9a6$export$a8ce8a4ec117f05e = async (feeds, shouldDispatchEvent = true)=>{\n if (!Array.isArray(feeds)) return;\n const { error: error } = await $b36f6cb20f27a9a6$var$setItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"set\",\n feeds: feeds\n }\n }));\n return {\n error: error\n };\n};\nconst $b36f6cb20f27a9a6$export$4b77448646caf424 = async (feed, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $b36f6cb20f27a9a6$export$4890c08c4ffbd57b();\n const foundFeed = feeds.find((f)=>f.url === feed.url);\n let action = \"\";\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = \"update\";\n } else {\n feeds.push(feed);\n action = \"create\";\n }\n const { error: error } = await $b36f6cb20f27a9a6$var$setItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY, feeds);\n if (!error && shouldDispatchEvent) document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: action,\n feed: feed\n }\n }));\n return {\n error: error\n };\n};\nconst $b36f6cb20f27a9a6$export$4e54c6fd9fa8b09b = async (feedUrl, shouldDispatchEvent = true)=>{\n const { value: feeds = [] } = await $b36f6cb20f27a9a6$export$4890c08c4ffbd57b();\n const filteredFeeds = feeds.filter((f)=>f.url !== feedUrl);\n const { error: error } = await $b36f6cb20f27a9a6$var$setItem($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY, filteredFeeds);\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) await (0, $e92a13782f6c06ba$export$1d2f21e549771e67)($b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY);\n document.dispatchEvent(new CustomEvent(\"feeds-updated\", {\n bubbles: true,\n detail: {\n action: \"delete\",\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n return {\n error: error\n };\n};\n\n\n/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */ const $8ca5c59aef5015ba$export$981c5d1bd3894713 = (url)=>{\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n\n\nconst $0c951fb6e39d40f6$var$template = document.createElement(\"template\");\n$0c951fb6e39d40f6$var$template.innerHTML = /* html */ `\n \n\n
              \n
              \n \n
              \n
              \n \n
              \n
              \n`;\nclass $0c951fb6e39d40f6$var$AddFeed extends HTMLElement {\n #formEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($0c951fb6e39d40f6$var$template.content.cloneNode(true));\n }\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n connectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n disconnectedCallback() {\n this.#formEl.addEventListener(\"submit\", this.#handleFormSubmission);\n }\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n const input = evt.target[\"feed-url\"];\n const url = input.value.trim();\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n const urlExists = Boolean(feeds.find((feed)=>feed.url === url));\n const isValidURL = (0, $8ca5c59aef5015ba$export$981c5d1bd3894713)(url);\n if (!urlExists && isValidURL) await (0, $b36f6cb20f27a9a6$export$4b77448646caf424)({\n url: url,\n title: \"\" // Title is not available at this point; it will be fetched later.\n });\n input.value = \"\";\n }\n}\nif (!window.customElements.get(\"add-feed\")) window.customElements.define(\"add-feed\", $0c951fb6e39d40f6$var$AddFeed);\n\n\n/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */ function $da1f6dc1cffd4cb1$var$ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction $da1f6dc1cffd4cb1$var$_objectSpread2(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) $da1f6dc1cffd4cb1$var$ownKeys(Object(source), true).forEach(function(key) {\n $da1f6dc1cffd4cb1$var$_defineProperty(target, key, source[key]);\n });\n else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else $da1f6dc1cffd4cb1$var$ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction $da1f6dc1cffd4cb1$var$_typeof(obj) {\n \"@babel/helpers - typeof\";\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") $da1f6dc1cffd4cb1$var$_typeof = function(obj) {\n return typeof obj;\n };\n else $da1f6dc1cffd4cb1$var$_typeof = function(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n return $da1f6dc1cffd4cb1$var$_typeof(obj);\n}\nfunction $da1f6dc1cffd4cb1$var$_defineProperty(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction $da1f6dc1cffd4cb1$var$_extends() {\n $da1f6dc1cffd4cb1$var$_extends = Object.assign || function(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n return target;\n };\n return $da1f6dc1cffd4cb1$var$_extends.apply(this, arguments);\n}\nfunction $da1f6dc1cffd4cb1$var$_objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction $da1f6dc1cffd4cb1$var$_objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = $da1f6dc1cffd4cb1$var$_objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceSymbolKeys.length; i++){\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction $da1f6dc1cffd4cb1$var$_toConsumableArray(arr) {\n return $da1f6dc1cffd4cb1$var$_arrayWithoutHoles(arr) || $da1f6dc1cffd4cb1$var$_iterableToArray(arr) || $da1f6dc1cffd4cb1$var$_unsupportedIterableToArray(arr) || $da1f6dc1cffd4cb1$var$_nonIterableSpread();\n}\nfunction $da1f6dc1cffd4cb1$var$_arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return $da1f6dc1cffd4cb1$var$_arrayLikeToArray(arr);\n}\nfunction $da1f6dc1cffd4cb1$var$_iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction $da1f6dc1cffd4cb1$var$_unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return $da1f6dc1cffd4cb1$var$_arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return $da1f6dc1cffd4cb1$var$_arrayLikeToArray(o, minLen);\n}\nfunction $da1f6dc1cffd4cb1$var$_arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction $da1f6dc1cffd4cb1$var$_nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nvar $da1f6dc1cffd4cb1$var$version = \"1.15.2\";\nfunction $da1f6dc1cffd4cb1$var$userAgent(pattern) {\n if (typeof window !== \"undefined\" && window.navigator) return !!/*@__PURE__*/ navigator.userAgent.match(pattern);\n}\nvar $da1f6dc1cffd4cb1$var$IE11OrLess = $da1f6dc1cffd4cb1$var$userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar $da1f6dc1cffd4cb1$var$Edge = $da1f6dc1cffd4cb1$var$userAgent(/Edge/i);\nvar $da1f6dc1cffd4cb1$var$FireFox = $da1f6dc1cffd4cb1$var$userAgent(/firefox/i);\nvar $da1f6dc1cffd4cb1$var$Safari = $da1f6dc1cffd4cb1$var$userAgent(/safari/i) && !$da1f6dc1cffd4cb1$var$userAgent(/chrome/i) && !$da1f6dc1cffd4cb1$var$userAgent(/android/i);\nvar $da1f6dc1cffd4cb1$var$IOS = $da1f6dc1cffd4cb1$var$userAgent(/iP(ad|od|hone)/i);\nvar $da1f6dc1cffd4cb1$var$ChromeForAndroid = $da1f6dc1cffd4cb1$var$userAgent(/chrome/i) && $da1f6dc1cffd4cb1$var$userAgent(/android/i);\nvar $da1f6dc1cffd4cb1$var$captureMode = {\n capture: false,\n passive: false\n};\nfunction $da1f6dc1cffd4cb1$var$on(el, event, fn) {\n el.addEventListener(event, fn, !$da1f6dc1cffd4cb1$var$IE11OrLess && $da1f6dc1cffd4cb1$var$captureMode);\n}\nfunction $da1f6dc1cffd4cb1$var$off(el, event, fn) {\n el.removeEventListener(event, fn, !$da1f6dc1cffd4cb1$var$IE11OrLess && $da1f6dc1cffd4cb1$var$captureMode);\n}\nfunction $da1f6dc1cffd4cb1$var$matches(/**HTMLElement*/ el, /**String*/ selector) {\n if (!selector) return;\n selector[0] === \">\" && (selector = selector.substring(1));\n if (el) try {\n if (el.matches) return el.matches(selector);\n else if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n } catch (_) {\n return false;\n }\n return false;\n}\nfunction $da1f6dc1cffd4cb1$var$getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction $da1f6dc1cffd4cb1$var$closest(/**HTMLElement*/ el, /**String*/ selector, /**HTMLElement*/ ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === \">\" ? el.parentNode === ctx && $da1f6dc1cffd4cb1$var$matches(el, selector) : $da1f6dc1cffd4cb1$var$matches(el, selector)) || includeCTX && el === ctx) return el;\n if (el === ctx) break;\n /* jshint boss:true */ }while (el = $da1f6dc1cffd4cb1$var$getParentOrHost(el));\n }\n return null;\n}\nvar $da1f6dc1cffd4cb1$var$R_SPACE = /\\s+/g;\nfunction $da1f6dc1cffd4cb1$var$toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) el.classList[state ? \"add\" : \"remove\"](name);\n else {\n var className = (\" \" + el.className + \" \").replace($da1f6dc1cffd4cb1$var$R_SPACE, \" \").replace(\" \" + name + \" \", \" \");\n el.className = (className + (state ? \" \" + name : \"\")).replace($da1f6dc1cffd4cb1$var$R_SPACE, \" \");\n }\n }\n}\nfunction $da1f6dc1cffd4cb1$var$css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) val = document.defaultView.getComputedStyle(el, \"\");\n else if (el.currentStyle) val = el.currentStyle;\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf(\"webkit\") === -1) prop = \"-webkit-\" + prop;\n style[prop] = val + (typeof val === \"string\" ? \"\" : \"px\");\n }\n }\n}\nfunction $da1f6dc1cffd4cb1$var$matrix(el, selfOnly) {\n var appliedTransforms = \"\";\n if (typeof el === \"string\") appliedTransforms = el;\n else do {\n var transform = $da1f6dc1cffd4cb1$var$css(el, \"transform\");\n if (transform && transform !== \"none\") appliedTransforms = transform + \" \" + appliedTransforms;\n /* jshint boss:true */ }while (!selfOnly && (el = el.parentNode));\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */ return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction $da1f6dc1cffd4cb1$var$find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;\n if (iterator) for(; i < n; i++)iterator(list[i], i);\n return list;\n }\n return [];\n}\nfunction $da1f6dc1cffd4cb1$var$getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) return scrollingElement;\n else return document.documentElement;\n}\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */ function $da1f6dc1cffd4cb1$var$getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== $da1f6dc1cffd4cb1$var$getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!$da1f6dc1cffd4cb1$var$IE11OrLess) {\n do if (container && container.getBoundingClientRect && ($da1f6dc1cffd4cb1$var$css(container, \"transform\") !== \"none\" || relativeToNonStaticParent && $da1f6dc1cffd4cb1$var$css(container, \"position\") !== \"static\")) {\n var containerRect = container.getBoundingClientRect();\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt($da1f6dc1cffd4cb1$var$css(container, \"border-top-width\"));\n left -= containerRect.left + parseInt($da1f6dc1cffd4cb1$var$css(container, \"border-left-width\"));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = $da1f6dc1cffd4cb1$var$matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */ function $da1f6dc1cffd4cb1$var$isScrolledPast(el, elSide, parentSide) {\n var parent = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(el, true), elSideVal = $da1f6dc1cffd4cb1$var$getRect(el)[elSide];\n /* jshint boss:true */ while(parent){\n var parentSideVal = $da1f6dc1cffd4cb1$var$getRect(parent)[parentSide], visible = void 0;\n if (parentSide === \"top\" || parentSide === \"left\") visible = elSideVal >= parentSideVal;\n else visible = elSideVal <= parentSideVal;\n if (!visible) return parent;\n if (parent === $da1f6dc1cffd4cb1$var$getWindowScrollingElement()) break;\n parent = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */ function $da1f6dc1cffd4cb1$var$getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0, i = 0, children = el.children;\n while(i < children.length){\n if (children[i].style.display !== \"none\" && children[i] !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost && (includeDragEl || children[i] !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged) && $da1f6dc1cffd4cb1$var$closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) return children[i];\n currentChild++;\n }\n i++;\n }\n return null;\n}\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */ function $da1f6dc1cffd4cb1$var$lastChild(el, selector) {\n var last = el.lastElementChild;\n while(last && (last === $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost || $da1f6dc1cffd4cb1$var$css(last, \"display\") === \"none\" || selector && !$da1f6dc1cffd4cb1$var$matches(last, selector)))last = last.previousElementSibling;\n return last || null;\n}\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */ function $da1f6dc1cffd4cb1$var$index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) return -1;\n /* jshint boss:true */ while(el = el.previousElementSibling)if (el.nodeName.toUpperCase() !== \"TEMPLATE\" && el !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.clone && (!selector || $da1f6dc1cffd4cb1$var$matches(el, selector))) index++;\n return index;\n}\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */ function $da1f6dc1cffd4cb1$var$getRelativeScrollOffset(el) {\n var offsetLeft = 0, offsetTop = 0, winScroller = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n if (el) do {\n var elMatrix = $da1f6dc1cffd4cb1$var$matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n }while (el !== winScroller && (el = el.parentNode));\n return [\n offsetLeft,\n offsetTop\n ];\n}\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */ function $da1f6dc1cffd4cb1$var$indexOfObject(arr, obj) {\n for(var i in arr){\n if (!arr.hasOwnProperty(i)) continue;\n for(var key in obj){\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = $da1f6dc1cffd4cb1$var$css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == \"auto\" || elemCSS.overflowX == \"scroll\") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == \"auto\" || elemCSS.overflowY == \"scroll\")) {\n if (!elem.getBoundingClientRect || elem === document.body) return $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n while (elem = elem.parentNode);\n return $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n}\nfunction $da1f6dc1cffd4cb1$var$extend(dst, src) {\n if (dst && src) {\n for(var key in src)if (src.hasOwnProperty(key)) dst[key] = src[key];\n }\n return dst;\n}\nfunction $da1f6dc1cffd4cb1$var$isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar $da1f6dc1cffd4cb1$var$_throttleTimeout;\nfunction $da1f6dc1cffd4cb1$var$throttle(callback, ms) {\n return function() {\n if (!$da1f6dc1cffd4cb1$var$_throttleTimeout) {\n var args = arguments, _this = this;\n if (args.length === 1) callback.call(_this, args[0]);\n else callback.apply(_this, args);\n $da1f6dc1cffd4cb1$var$_throttleTimeout = setTimeout(function() {\n $da1f6dc1cffd4cb1$var$_throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction $da1f6dc1cffd4cb1$var$cancelThrottle() {\n clearTimeout($da1f6dc1cffd4cb1$var$_throttleTimeout);\n $da1f6dc1cffd4cb1$var$_throttleTimeout = void 0;\n}\nfunction $da1f6dc1cffd4cb1$var$scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction $da1f6dc1cffd4cb1$var$clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) return Polymer.dom(el).cloneNode(true);\n else if ($) return $(el).clone(true)[0];\n else return el.cloneNode(true);\n}\nfunction $da1f6dc1cffd4cb1$var$setRect(el, rect) {\n $da1f6dc1cffd4cb1$var$css(el, \"position\", \"absolute\");\n $da1f6dc1cffd4cb1$var$css(el, \"top\", rect.top);\n $da1f6dc1cffd4cb1$var$css(el, \"left\", rect.left);\n $da1f6dc1cffd4cb1$var$css(el, \"width\", rect.width);\n $da1f6dc1cffd4cb1$var$css(el, \"height\", rect.height);\n}\nfunction $da1f6dc1cffd4cb1$var$unsetRect(el) {\n $da1f6dc1cffd4cb1$var$css(el, \"position\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"top\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"left\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"width\", \"\");\n $da1f6dc1cffd4cb1$var$css(el, \"height\", \"\");\n}\nfunction $da1f6dc1cffd4cb1$var$getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function(child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!$da1f6dc1cffd4cb1$var$closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = $da1f6dc1cffd4cb1$var$getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar $da1f6dc1cffd4cb1$var$expando = \"Sortable\" + new Date().getTime();\nfunction $da1f6dc1cffd4cb1$var$AnimationStateManager() {\n var animationStates = [], animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function(child) {\n if ($da1f6dc1cffd4cb1$var$css(child, \"display\") === \"none\" || child === $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost) return;\n animationStates.push({\n target: child,\n rect: $da1f6dc1cffd4cb1$var$getRect(child)\n });\n var fromRect = $da1f6dc1cffd4cb1$var$_objectSpread2({}, animationStates[animationStates.length - 1].rect);\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = $da1f6dc1cffd4cb1$var$matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice($da1f6dc1cffd4cb1$var$indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === \"function\") callback();\n return;\n }\n var animating = false, animationTime = 0;\n animationStates.forEach(function(state) {\n var time = 0, target = state.target, fromRect = target.fromRect, toRect = $da1f6dc1cffd4cb1$var$getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = $da1f6dc1cffd4cb1$var$matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) // Could also check if animatingRect is between fromRect and toRect\n {\n if ($da1f6dc1cffd4cb1$var$isRectEqual(prevFromRect, toRect) && !$da1f6dc1cffd4cb1$var$isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) // If returning to same place as started from animation and on same axis\n time = $da1f6dc1cffd4cb1$var$calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n // if fromRect != toRect: animate\n if (!$da1f6dc1cffd4cb1$var$isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) time = _this.options.animation;\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function() {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === \"function\") callback();\n } else animationCallbackId = setTimeout(function() {\n if (typeof callback === \"function\") callback();\n }, animationTime);\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n $da1f6dc1cffd4cb1$var$css(target, \"transition\", \"\");\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"\");\n var elMatrix = $da1f6dc1cffd4cb1$var$matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"translate3d(\" + translateX + \"px,\" + translateY + \"px,0)\");\n this.forRepaintDummy = $da1f6dc1cffd4cb1$var$repaint(target); // repaint\n $da1f6dc1cffd4cb1$var$css(target, \"transition\", \"transform \" + duration + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\"));\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"translate3d(0,0,0)\");\n typeof target.animated === \"number\" && clearTimeout(target.animated);\n target.animated = setTimeout(function() {\n $da1f6dc1cffd4cb1$var$css(target, \"transition\", \"\");\n $da1f6dc1cffd4cb1$var$css(target, \"transform\", \"\");\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction $da1f6dc1cffd4cb1$var$repaint(target) {\n return target.offsetWidth;\n}\nfunction $da1f6dc1cffd4cb1$var$calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\nvar $da1f6dc1cffd4cb1$var$plugins = [];\nvar $da1f6dc1cffd4cb1$var$defaults = {\n initializeByDefault: true\n};\nvar $da1f6dc1cffd4cb1$var$PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for(var option in $da1f6dc1cffd4cb1$var$defaults)if ($da1f6dc1cffd4cb1$var$defaults.hasOwnProperty(option) && !(option in plugin)) plugin[option] = $da1f6dc1cffd4cb1$var$defaults[option];\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(p) {\n if (p.pluginName === plugin.pluginName) throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n });\n $da1f6dc1cffd4cb1$var$plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function() {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + \"Global\";\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) sortable[plugin.pluginName][eventNameGlobal]($da1f6dc1cffd4cb1$var$_objectSpread2({\n sortable: sortable\n }, evt));\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) sortable[plugin.pluginName][eventName]($da1f6dc1cffd4cb1$var$_objectSpread2({\n sortable: sortable\n }, evt));\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n // Add default options from plugin\n $da1f6dc1cffd4cb1$var$_extends(defaults, initialized.defaults);\n });\n for(var option in sortable.options){\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== \"undefined\") sortable.options[option] = modified;\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n if (typeof plugin.eventProperties !== \"function\") return;\n $da1f6dc1cffd4cb1$var$_extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n $da1f6dc1cffd4cb1$var$plugins.forEach(function(plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === \"function\") modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n });\n return modifiedValue;\n }\n};\nfunction $da1f6dc1cffd4cb1$var$dispatchEvent(_ref) {\n var sortable = _ref.sortable, rootEl = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex = _ref.oldIndex, newIndex = _ref.newIndex, oldDraggableIndex = _ref.oldDraggableIndex, newDraggableIndex = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[$da1f6dc1cffd4cb1$var$expando];\n if (!sortable) return;\n var evt, options = sortable.options, onName = \"on\" + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$da1f6dc1cffd4cb1$var$IE11OrLess && !$da1f6dc1cffd4cb1$var$Edge) evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = $da1f6dc1cffd4cb1$var$_objectSpread2($da1f6dc1cffd4cb1$var$_objectSpread2({}, extraEventProperties), $da1f6dc1cffd4cb1$var$PluginManager.getEventProperties(name, sortable));\n for(var option in allEventProperties)evt[option] = allEventProperties[option];\n if (rootEl) rootEl.dispatchEvent(evt);\n if (options[onName]) options[onName].call(sortable, evt);\n}\nvar $da1f6dc1cffd4cb1$var$_excluded = [\n \"evt\"\n];\nvar $da1f6dc1cffd4cb1$var$pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, originalEvent = _ref.evt, data = $da1f6dc1cffd4cb1$var$_objectWithoutProperties(_ref, $da1f6dc1cffd4cb1$var$_excluded);\n $da1f6dc1cffd4cb1$var$PluginManager.pluginEvent.bind($da1f6dc1cffd4cb1$export$31b3ca70d8f57423)(eventName, sortable, $da1f6dc1cffd4cb1$var$_objectSpread2({\n dragEl: $da1f6dc1cffd4cb1$var$dragEl,\n parentEl: $da1f6dc1cffd4cb1$var$parentEl,\n ghostEl: $da1f6dc1cffd4cb1$var$ghostEl,\n rootEl: $da1f6dc1cffd4cb1$var$rootEl,\n nextEl: $da1f6dc1cffd4cb1$var$nextEl,\n lastDownEl: $da1f6dc1cffd4cb1$var$lastDownEl,\n cloneEl: $da1f6dc1cffd4cb1$var$cloneEl,\n cloneHidden: $da1f6dc1cffd4cb1$var$cloneHidden,\n dragStarted: $da1f6dc1cffd4cb1$var$moved,\n putSortable: $da1f6dc1cffd4cb1$var$putSortable,\n activeSortable: $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active,\n originalEvent: originalEvent,\n oldIndex: $da1f6dc1cffd4cb1$var$oldIndex,\n oldDraggableIndex: $da1f6dc1cffd4cb1$var$oldDraggableIndex,\n newIndex: $da1f6dc1cffd4cb1$var$newIndex,\n newDraggableIndex: $da1f6dc1cffd4cb1$var$newDraggableIndex,\n hideGhostForTarget: $da1f6dc1cffd4cb1$var$_hideGhostForTarget,\n unhideGhostForTarget: $da1f6dc1cffd4cb1$var$_unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n $da1f6dc1cffd4cb1$var$cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n $da1f6dc1cffd4cb1$var$cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction $da1f6dc1cffd4cb1$var$_dispatchEvent(info) {\n $da1f6dc1cffd4cb1$var$dispatchEvent($da1f6dc1cffd4cb1$var$_objectSpread2({\n putSortable: $da1f6dc1cffd4cb1$var$putSortable,\n cloneEl: $da1f6dc1cffd4cb1$var$cloneEl,\n targetEl: $da1f6dc1cffd4cb1$var$dragEl,\n rootEl: $da1f6dc1cffd4cb1$var$rootEl,\n oldIndex: $da1f6dc1cffd4cb1$var$oldIndex,\n oldDraggableIndex: $da1f6dc1cffd4cb1$var$oldDraggableIndex,\n newIndex: $da1f6dc1cffd4cb1$var$newIndex,\n newDraggableIndex: $da1f6dc1cffd4cb1$var$newDraggableIndex\n }, info));\n}\nvar $da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$parentEl, $da1f6dc1cffd4cb1$var$ghostEl, $da1f6dc1cffd4cb1$var$rootEl, $da1f6dc1cffd4cb1$var$nextEl, $da1f6dc1cffd4cb1$var$lastDownEl, $da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$cloneHidden, $da1f6dc1cffd4cb1$var$oldIndex, $da1f6dc1cffd4cb1$var$newIndex, $da1f6dc1cffd4cb1$var$oldDraggableIndex, $da1f6dc1cffd4cb1$var$newDraggableIndex, $da1f6dc1cffd4cb1$var$activeGroup, $da1f6dc1cffd4cb1$var$putSortable, $da1f6dc1cffd4cb1$var$awaitingDragStarted = false, $da1f6dc1cffd4cb1$var$ignoreNextClick = false, $da1f6dc1cffd4cb1$var$sortables = [], $da1f6dc1cffd4cb1$var$tapEvt, $da1f6dc1cffd4cb1$var$touchEvt, $da1f6dc1cffd4cb1$var$lastDx, $da1f6dc1cffd4cb1$var$lastDy, $da1f6dc1cffd4cb1$var$tapDistanceLeft, $da1f6dc1cffd4cb1$var$tapDistanceTop, $da1f6dc1cffd4cb1$var$moved, $da1f6dc1cffd4cb1$var$lastTarget, $da1f6dc1cffd4cb1$var$lastDirection, $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = false, $da1f6dc1cffd4cb1$var$isCircumstantialInvert = false, $da1f6dc1cffd4cb1$var$targetMoveDistance, // For positioning ghost absolutely\n$da1f6dc1cffd4cb1$var$ghostRelativeParent, $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll = [], // (left, top)\n$da1f6dc1cffd4cb1$var$_silent = false, $da1f6dc1cffd4cb1$var$savedInputChecked = [];\n/** @const */ var $da1f6dc1cffd4cb1$var$documentExists = typeof document !== \"undefined\", $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely = $da1f6dc1cffd4cb1$var$IOS, $da1f6dc1cffd4cb1$var$CSSFloatProperty = $da1f6dc1cffd4cb1$var$Edge || $da1f6dc1cffd4cb1$var$IE11OrLess ? \"cssFloat\" : \"float\", // This will not pass for IE9, because IE9 DnD only works on anchors\n$da1f6dc1cffd4cb1$var$supportDraggable = $da1f6dc1cffd4cb1$var$documentExists && !$da1f6dc1cffd4cb1$var$ChromeForAndroid && !$da1f6dc1cffd4cb1$var$IOS && \"draggable\" in document.createElement(\"div\"), $da1f6dc1cffd4cb1$var$supportCssPointerEvents = function() {\n if (!$da1f6dc1cffd4cb1$var$documentExists) return;\n // false when <= IE11\n if ($da1f6dc1cffd4cb1$var$IE11OrLess) return false;\n var el = document.createElement(\"x\");\n el.style.cssText = \"pointer-events:auto\";\n return el.style.pointerEvents === \"auto\";\n}(), $da1f6dc1cffd4cb1$var$_detectDirection = function _detectDirection(el, options) {\n var elCSS = $da1f6dc1cffd4cb1$var$css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = $da1f6dc1cffd4cb1$var$getChild(el, 0, options), child2 = $da1f6dc1cffd4cb1$var$getChild(el, 1, options), firstChildCSS = child1 && $da1f6dc1cffd4cb1$var$css(child1), secondChildCSS = child2 && $da1f6dc1cffd4cb1$var$css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + $da1f6dc1cffd4cb1$var$getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + $da1f6dc1cffd4cb1$var$getRect(child2).width;\n if (elCSS.display === \"flex\") return elCSS.flexDirection === \"column\" || elCSS.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n if (elCSS.display === \"grid\") return elCSS.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== \"none\") {\n var touchingSideChild2 = firstChildCSS[\"float\"] === \"left\" ? \"left\" : \"right\";\n return child2 && (secondChildCSS.clear === \"both\" || secondChildCSS.clear === touchingSideChild2) ? \"vertical\" : \"horizontal\";\n }\n return child1 && (firstChildCSS.display === \"block\" || firstChildCSS.display === \"flex\" || firstChildCSS.display === \"table\" || firstChildCSS.display === \"grid\" || firstChildWidth >= elWidth && elCSS[$da1f6dc1cffd4cb1$var$CSSFloatProperty] === \"none\" || child2 && elCSS[$da1f6dc1cffd4cb1$var$CSSFloatProperty] === \"none\" && firstChildWidth + secondChildWidth > elWidth) ? \"vertical\" : \"horizontal\";\n}, $da1f6dc1cffd4cb1$var$_dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n}, /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */ $da1f6dc1cffd4cb1$var$_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n $da1f6dc1cffd4cb1$var$sortables.some(function(sortable) {\n var threshold = sortable[$da1f6dc1cffd4cb1$var$expando].options.emptyInsertThreshold;\n if (!threshold || $da1f6dc1cffd4cb1$var$lastChild(sortable)) return;\n var rect = $da1f6dc1cffd4cb1$var$getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) return ret = sortable;\n });\n return ret;\n}, $da1f6dc1cffd4cb1$var$_prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function(to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) // Default pull value\n // Default pull and put value if same group\n return true;\n else if (value == null || value === false) return false;\n else if (pull && value === \"clone\") return value;\n else if (typeof value === \"function\") return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === \"string\" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || $da1f6dc1cffd4cb1$var$_typeof(originalGroup) != \"object\") originalGroup = {\n name: originalGroup\n };\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n}, $da1f6dc1cffd4cb1$var$_hideGhostForTarget = function _hideGhostForTarget() {\n if (!$da1f6dc1cffd4cb1$var$supportCssPointerEvents && $da1f6dc1cffd4cb1$var$ghostEl) $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"display\", \"none\");\n}, $da1f6dc1cffd4cb1$var$_unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!$da1f6dc1cffd4cb1$var$supportCssPointerEvents && $da1f6dc1cffd4cb1$var$ghostEl) $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"display\", \"\");\n};\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif ($da1f6dc1cffd4cb1$var$documentExists && !$da1f6dc1cffd4cb1$var$ChromeForAndroid) document.addEventListener(\"click\", function(evt) {\n if ($da1f6dc1cffd4cb1$var$ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n $da1f6dc1cffd4cb1$var$ignoreNextClick = false;\n return false;\n }\n}, true);\nvar $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if ($da1f6dc1cffd4cb1$var$dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = $da1f6dc1cffd4cb1$var$_detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for(var i in evt)if (evt.hasOwnProperty(i)) event[i] = evt[i];\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[$da1f6dc1cffd4cb1$var$expando]._onDragOver(event);\n }\n }\n};\nvar $da1f6dc1cffd4cb1$var$_checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if ($da1f6dc1cffd4cb1$var$dragEl) $da1f6dc1cffd4cb1$var$dragEl.parentNode[$da1f6dc1cffd4cb1$var$expando]._isOutsideThisEl(evt.target);\n};\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ function $da1f6dc1cffd4cb1$export$31b3ca70d8f57423(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) throw \"Sortable: `el` must be an HTMLElement, not \".concat(({}).toString.call(el));\n this.el = el; // root element\n this.options = options = $da1f6dc1cffd4cb1$var$_extends({}, options);\n // Export instance\n el[$da1f6dc1cffd4cb1$var$expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? \">li\" : \">*\",\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return $da1f6dc1cffd4cb1$var$_detectDirection(el, this.options);\n },\n ghostClass: \"sortable-ghost\",\n chosenClass: \"sortable-chosen\",\n dragClass: \"sortable-drag\",\n ignore: \"a, img\",\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData(\"Text\", dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: \"data-id\",\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: \"sortable-fallback\",\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.supportPointer !== false && \"PointerEvent\" in window && !$da1f6dc1cffd4cb1$var$Safari,\n emptyInsertThreshold: 5\n };\n $da1f6dc1cffd4cb1$var$PluginManager.initializePlugins(this, el, defaults);\n // Set default options\n for(var name in defaults)!(name in options) && (options[name] = defaults[name]);\n $da1f6dc1cffd4cb1$var$_prepareGroup(options);\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : $da1f6dc1cffd4cb1$var$supportDraggable;\n if (this.nativeDraggable) // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n // Bind events\n if (options.supportPointer) $da1f6dc1cffd4cb1$var$on(el, \"pointerdown\", this._onTapStart);\n else {\n $da1f6dc1cffd4cb1$var$on(el, \"mousedown\", this._onTapStart);\n $da1f6dc1cffd4cb1$var$on(el, \"touchstart\", this._onTapStart);\n }\n if (this.nativeDraggable) {\n $da1f6dc1cffd4cb1$var$on(el, \"dragover\", this);\n $da1f6dc1cffd4cb1$var$on(el, \"dragenter\", this);\n }\n $da1f6dc1cffd4cb1$var$sortables.push(this.el);\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n // Add animation state manager\n $da1f6dc1cffd4cb1$var$_extends(this, $da1f6dc1cffd4cb1$var$AnimationStateManager());\n}\n$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.prototype = /** @lends Sortable.prototype */ {\n constructor: $da1f6dc1cffd4cb1$export$31b3ca70d8f57423,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) $da1f6dc1cffd4cb1$var$lastTarget = null;\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === \"function\" ? this.options.direction.call(this, evt, target, $da1f6dc1cffd4cb1$var$dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(/** Event|TouchEvent */ evt) {\n if (!evt.cancelable) return;\n var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === \"touch\" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter;\n $da1f6dc1cffd4cb1$var$_saveInputCheckedState(el);\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if ($da1f6dc1cffd4cb1$var$dragEl) return;\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) return; // only left button and enabled\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) return;\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && $da1f6dc1cffd4cb1$var$Safari && target && target.tagName.toUpperCase() === \"SELECT\") return;\n target = $da1f6dc1cffd4cb1$var$closest(target, options.draggable, el, false);\n if (target && target.animated) return;\n if ($da1f6dc1cffd4cb1$var$lastDownEl === target) // Ignoring duplicate `down`\n return;\n // Get the index of the dragged element within its parent\n $da1f6dc1cffd4cb1$var$oldIndex = $da1f6dc1cffd4cb1$var$index(target);\n $da1f6dc1cffd4cb1$var$oldDraggableIndex = $da1f6dc1cffd4cb1$var$index(target, options.draggable);\n // Check filter\n if (typeof filter === \"function\") {\n if (filter.call(this, evt, target, this)) {\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: \"filter\",\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n $da1f6dc1cffd4cb1$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(\",\").some(function(criteria) {\n criteria = $da1f6dc1cffd4cb1$var$closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: \"filter\",\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n $da1f6dc1cffd4cb1$var$pluginEvent(\"filter\", _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !$da1f6dc1cffd4cb1$var$closest(originalTarget, options.handle, el, false)) return;\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(/** Event */ evt, /** Touch */ touch, /** HTMLElement */ target) {\n var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;\n if (target && !$da1f6dc1cffd4cb1$var$dragEl && target.parentNode === el) {\n var dragRect = $da1f6dc1cffd4cb1$var$getRect(target);\n $da1f6dc1cffd4cb1$var$rootEl = el;\n $da1f6dc1cffd4cb1$var$dragEl = target;\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$dragEl.parentNode;\n $da1f6dc1cffd4cb1$var$nextEl = $da1f6dc1cffd4cb1$var$dragEl.nextSibling;\n $da1f6dc1cffd4cb1$var$lastDownEl = target;\n $da1f6dc1cffd4cb1$var$activeGroup = options.group;\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged = $da1f6dc1cffd4cb1$var$dragEl;\n $da1f6dc1cffd4cb1$var$tapEvt = {\n target: $da1f6dc1cffd4cb1$var$dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n $da1f6dc1cffd4cb1$var$tapDistanceLeft = $da1f6dc1cffd4cb1$var$tapEvt.clientX - dragRect.left;\n $da1f6dc1cffd4cb1$var$tapDistanceTop = $da1f6dc1cffd4cb1$var$tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n $da1f6dc1cffd4cb1$var$dragEl.style[\"will-change\"] = \"all\";\n dragStartFn = function dragStartFn() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"delayEnded\", _this, {\n evt: evt\n });\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!$da1f6dc1cffd4cb1$var$FireFox && _this.nativeDraggable) $da1f6dc1cffd4cb1$var$dragEl.draggable = true;\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n // Drag start event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n name: \"choose\",\n originalEvent: evt\n });\n // Chosen item\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.chosenClass, true);\n };\n // Disable \"draggable\"\n options.ignore.split(\",\").forEach(function(criteria) {\n $da1f6dc1cffd4cb1$var$find($da1f6dc1cffd4cb1$var$dragEl, criteria.trim(), $da1f6dc1cffd4cb1$var$_disableDraggable);\n });\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"dragover\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mousemove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchmove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mouseup\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchend\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchcancel\", _this._onDrop);\n // Make dragEl draggable (must be before delay for FireFox)\n if ($da1f6dc1cffd4cb1$var$FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n $da1f6dc1cffd4cb1$var$dragEl.draggable = true;\n }\n $da1f6dc1cffd4cb1$var$pluginEvent(\"delayStart\", this, {\n evt: evt\n });\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !($da1f6dc1cffd4cb1$var$Edge || $da1f6dc1cffd4cb1$var$IE11OrLess))) {\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mouseup\", _this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchend\", _this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchcancel\", _this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"mousemove\", _this._delayedDragTouchMoveHandler);\n $da1f6dc1cffd4cb1$var$on(ownerDocument, \"touchmove\", _this._delayedDragTouchMoveHandler);\n options.supportPointer && $da1f6dc1cffd4cb1$var$on(ownerDocument, \"pointermove\", _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else dragStartFn();\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(/** TouchEvent|PointerEvent **/ e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) this._disableDelayedDrag();\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n $da1f6dc1cffd4cb1$var$dragEl && $da1f6dc1cffd4cb1$var$_disableDraggable($da1f6dc1cffd4cb1$var$dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"mouseup\", this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchend\", this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchcancel\", this._disableDelayedDrag);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"mousemove\", this._delayedDragTouchMoveHandler);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchmove\", this._delayedDragTouchMoveHandler);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"pointermove\", this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(/** Event */ evt, /** Touch */ touch) {\n touch = touch || evt.pointerType == \"touch\" && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) $da1f6dc1cffd4cb1$var$on(document, \"pointermove\", this._onTouchMove);\n else if (touch) $da1f6dc1cffd4cb1$var$on(document, \"touchmove\", this._onTouchMove);\n else $da1f6dc1cffd4cb1$var$on(document, \"mousemove\", this._onTouchMove);\n } else {\n $da1f6dc1cffd4cb1$var$on($da1f6dc1cffd4cb1$var$dragEl, \"dragend\", this);\n $da1f6dc1cffd4cb1$var$on($da1f6dc1cffd4cb1$var$rootEl, \"dragstart\", this._onDragStart);\n }\n try {\n if (document.selection) // Timeout neccessary for IE9\n $da1f6dc1cffd4cb1$var$_nextTick(function() {\n document.selection.empty();\n });\n else window.getSelection().removeAllRanges();\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n $da1f6dc1cffd4cb1$var$awaitingDragStarted = false;\n if ($da1f6dc1cffd4cb1$var$rootEl && $da1f6dc1cffd4cb1$var$dragEl) {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"dragStarted\", this, {\n evt: evt\n });\n if (this.nativeDraggable) $da1f6dc1cffd4cb1$var$on(document, \"dragover\", $da1f6dc1cffd4cb1$var$_checkOutsideTargetEl);\n var options = this.options;\n // Apply effect\n !fallback && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.dragClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.ghostClass, true);\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active = this;\n fallback && this._appendGhost();\n // Drag start event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"start\",\n originalEvent: evt\n });\n } else this._nulling();\n },\n _emulateDragOver: function _emulateDragOver() {\n if ($da1f6dc1cffd4cb1$var$touchEvt) {\n this._lastX = $da1f6dc1cffd4cb1$var$touchEvt.clientX;\n this._lastY = $da1f6dc1cffd4cb1$var$touchEvt.clientY;\n $da1f6dc1cffd4cb1$var$_hideGhostForTarget();\n var target = document.elementFromPoint($da1f6dc1cffd4cb1$var$touchEvt.clientX, $da1f6dc1cffd4cb1$var$touchEvt.clientY);\n var parent = target;\n while(target && target.shadowRoot){\n target = target.shadowRoot.elementFromPoint($da1f6dc1cffd4cb1$var$touchEvt.clientX, $da1f6dc1cffd4cb1$var$touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n $da1f6dc1cffd4cb1$var$dragEl.parentNode[$da1f6dc1cffd4cb1$var$expando]._isOutsideThisEl(target);\n if (parent) do {\n if (parent[$da1f6dc1cffd4cb1$var$expando]) {\n var inserted = void 0;\n inserted = parent[$da1f6dc1cffd4cb1$var$expando]._onDragOver({\n clientX: $da1f6dc1cffd4cb1$var$touchEvt.clientX,\n clientY: $da1f6dc1cffd4cb1$var$touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) break;\n }\n target = parent; // store last element\n }while (parent = parent.parentNode);\n $da1f6dc1cffd4cb1$var$_unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(/**TouchEvent*/ evt) {\n if ($da1f6dc1cffd4cb1$var$tapEvt) {\n var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = $da1f6dc1cffd4cb1$var$ghostEl && $da1f6dc1cffd4cb1$var$matrix($da1f6dc1cffd4cb1$var$ghostEl, true), scaleX = $da1f6dc1cffd4cb1$var$ghostEl && ghostMatrix && ghostMatrix.a, scaleY = $da1f6dc1cffd4cb1$var$ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely && $da1f6dc1cffd4cb1$var$ghostRelativeParent && $da1f6dc1cffd4cb1$var$getRelativeScrollOffset($da1f6dc1cffd4cb1$var$ghostRelativeParent), dx = (touch.clientX - $da1f6dc1cffd4cb1$var$tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - $da1f6dc1cffd4cb1$var$tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n // only set the status to dragging, when we are actually dragging\n if (!$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active && !$da1f6dc1cffd4cb1$var$awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) return;\n this._onDragStart(evt, true);\n }\n if ($da1f6dc1cffd4cb1$var$ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - ($da1f6dc1cffd4cb1$var$lastDx || 0);\n ghostMatrix.f += dy - ($da1f6dc1cffd4cb1$var$lastDy || 0);\n } else ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"webkitTransform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"mozTransform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"msTransform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transform\", cssMatrix);\n $da1f6dc1cffd4cb1$var$lastDx = dx;\n $da1f6dc1cffd4cb1$var$lastDy = dy;\n $da1f6dc1cffd4cb1$var$touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!$da1f6dc1cffd4cb1$var$ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : $da1f6dc1cffd4cb1$var$rootEl, rect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl, true, $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely, true, container), options = this.options;\n // Position absolutely\n if ($da1f6dc1cffd4cb1$var$PositionGhostAbsolutely) {\n // Get relatively positioned parent\n $da1f6dc1cffd4cb1$var$ghostRelativeParent = container;\n while($da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostRelativeParent, \"position\") === \"static\" && $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostRelativeParent, \"transform\") === \"none\" && $da1f6dc1cffd4cb1$var$ghostRelativeParent !== document)$da1f6dc1cffd4cb1$var$ghostRelativeParent = $da1f6dc1cffd4cb1$var$ghostRelativeParent.parentNode;\n if ($da1f6dc1cffd4cb1$var$ghostRelativeParent !== document.body && $da1f6dc1cffd4cb1$var$ghostRelativeParent !== document.documentElement) {\n if ($da1f6dc1cffd4cb1$var$ghostRelativeParent === document) $da1f6dc1cffd4cb1$var$ghostRelativeParent = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n rect.top += $da1f6dc1cffd4cb1$var$ghostRelativeParent.scrollTop;\n rect.left += $da1f6dc1cffd4cb1$var$ghostRelativeParent.scrollLeft;\n } else $da1f6dc1cffd4cb1$var$ghostRelativeParent = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n $da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll = $da1f6dc1cffd4cb1$var$getRelativeScrollOffset($da1f6dc1cffd4cb1$var$ghostRelativeParent);\n }\n $da1f6dc1cffd4cb1$var$ghostEl = $da1f6dc1cffd4cb1$var$dragEl.cloneNode(true);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$ghostEl, options.ghostClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$ghostEl, options.fallbackClass, true);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$ghostEl, options.dragClass, true);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transition\", \"\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transform\", \"\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"box-sizing\", \"border-box\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"margin\", 0);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"top\", rect.top);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"left\", rect.left);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"width\", rect.width);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"height\", rect.height);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"opacity\", \"0.8\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"position\", $da1f6dc1cffd4cb1$var$PositionGhostAbsolutely ? \"absolute\" : \"fixed\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"zIndex\", \"100000\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"pointerEvents\", \"none\");\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost = $da1f6dc1cffd4cb1$var$ghostEl;\n container.appendChild($da1f6dc1cffd4cb1$var$ghostEl);\n // Set transform-origin\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$ghostEl, \"transform-origin\", $da1f6dc1cffd4cb1$var$tapDistanceLeft / parseInt($da1f6dc1cffd4cb1$var$ghostEl.style.width) * 100 + \"% \" + $da1f6dc1cffd4cb1$var$tapDistanceTop / parseInt($da1f6dc1cffd4cb1$var$ghostEl.style.height) * 100 + \"%\");\n }\n },\n _onDragStart: function _onDragStart(/**Event*/ evt, /**boolean*/ fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n $da1f6dc1cffd4cb1$var$pluginEvent(\"dragStart\", this, {\n evt: evt\n });\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n this._onDrop();\n return;\n }\n $da1f6dc1cffd4cb1$var$pluginEvent(\"setupClone\", this);\n if (!$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n $da1f6dc1cffd4cb1$var$cloneEl = $da1f6dc1cffd4cb1$var$clone($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$cloneEl.removeAttribute(\"id\");\n $da1f6dc1cffd4cb1$var$cloneEl.draggable = false;\n $da1f6dc1cffd4cb1$var$cloneEl.style[\"will-change\"] = \"\";\n this._hideClone();\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$cloneEl, this.options.chosenClass, false);\n $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.clone = $da1f6dc1cffd4cb1$var$cloneEl;\n }\n // #1143: IFrame support workaround\n _this.cloneId = $da1f6dc1cffd4cb1$var$_nextTick(function() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"clone\", _this);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$dragEl);\n _this._hideClone();\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n name: \"clone\"\n });\n });\n !fallback && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.dragClass, true);\n // Set proper drop events\n if (fallback) {\n $da1f6dc1cffd4cb1$var$ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n $da1f6dc1cffd4cb1$var$off(document, \"mouseup\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$off(document, \"touchend\", _this._onDrop);\n $da1f6dc1cffd4cb1$var$off(document, \"touchcancel\", _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = \"move\";\n options.setData && options.setData.call(_this, dataTransfer, $da1f6dc1cffd4cb1$var$dragEl);\n }\n $da1f6dc1cffd4cb1$var$on(document, \"drop\", _this);\n // #1276 fix:\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$dragEl, \"transform\", \"translateZ(0)\");\n }\n $da1f6dc1cffd4cb1$var$awaitingDragStarted = true;\n _this._dragStartId = $da1f6dc1cffd4cb1$var$_nextTick(_this._dragStarted.bind(_this, fallback, evt));\n $da1f6dc1cffd4cb1$var$on(document, \"selectstart\", _this);\n $da1f6dc1cffd4cb1$var$moved = true;\n if ($da1f6dc1cffd4cb1$var$Safari) $da1f6dc1cffd4cb1$var$css(document.body, \"user-select\", \"none\");\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(/**Event*/ evt) {\n var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active, isOwner = $da1f6dc1cffd4cb1$var$activeGroup === group, canSort = options.sort, fromSortable = $da1f6dc1cffd4cb1$var$putSortable || activeSortable, vertical, _this = this, completedFired = false;\n if ($da1f6dc1cffd4cb1$var$_silent) return;\n function dragOverEvent(name, extra) {\n $da1f6dc1cffd4cb1$var$pluginEvent(name, _this, $da1f6dc1cffd4cb1$var$_objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? \"vertical\" : \"horizontal\",\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return $da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, $da1f6dc1cffd4cb1$var$getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n // Capture animation state\n function capture() {\n dragOverEvent(\"dragOverAnimationCapture\");\n _this.captureAnimationState();\n if (_this !== fromSortable) fromSortable.captureAnimationState();\n }\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent(\"dragOverCompleted\", {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n else activeSortable._showClone(_this);\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$putSortable ? $da1f6dc1cffd4cb1$var$putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, options.ghostClass, true);\n }\n if ($da1f6dc1cffd4cb1$var$putSortable !== _this && _this !== $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active) $da1f6dc1cffd4cb1$var$putSortable = _this;\n else if (_this === $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active && $da1f6dc1cffd4cb1$var$putSortable) $da1f6dc1cffd4cb1$var$putSortable = null;\n // Animation\n if (fromSortable === _this) _this._ignoreWhileAnimating = target;\n _this.animateAll(function() {\n dragOverEvent(\"dragOverAnimationComplete\");\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n // Null lastTarget if it is not inside a previously swapped element\n if (target === $da1f6dc1cffd4cb1$var$dragEl && !$da1f6dc1cffd4cb1$var$dragEl.animated || target === el && !target.animated) $da1f6dc1cffd4cb1$var$lastTarget = null;\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n $da1f6dc1cffd4cb1$var$dragEl.parentNode[$da1f6dc1cffd4cb1$var$expando]._isOutsideThisEl(evt.target);\n // Do not detect for empty insert if already inserted\n !insertion && $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n // Call when dragEl has been inserted\n function changed() {\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl, options.draggable);\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: _this,\n name: \"change\",\n toEl: el,\n newIndex: $da1f6dc1cffd4cb1$var$newIndex,\n newDraggableIndex: $da1f6dc1cffd4cb1$var$newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) evt.cancelable && evt.preventDefault();\n target = $da1f6dc1cffd4cb1$var$closest(target, options.draggable, el, true);\n dragOverEvent(\"dragOver\");\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if ($da1f6dc1cffd4cb1$var$dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) return completed(false);\n $da1f6dc1cffd4cb1$var$ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = $da1f6dc1cffd4cb1$var$parentEl !== $da1f6dc1cffd4cb1$var$rootEl // Reverting item into the original list\n ) : $da1f6dc1cffd4cb1$var$putSortable === this || (this.lastPutMode = $da1f6dc1cffd4cb1$var$activeGroup.checkPull(this, activeSortable, $da1f6dc1cffd4cb1$var$dragEl, evt)) && group.checkPut(this, activeSortable, $da1f6dc1cffd4cb1$var$dragEl, evt))) {\n vertical = this._getDirection(evt, target) === \"vertical\";\n dragRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl);\n dragOverEvent(\"dragOverValid\");\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return completedFired;\n if (revert) {\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent(\"revert\");\n if (!$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n if ($da1f6dc1cffd4cb1$var$nextEl) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$nextEl);\n else $da1f6dc1cffd4cb1$var$rootEl.appendChild($da1f6dc1cffd4cb1$var$dragEl);\n }\n return completed(true);\n }\n var elLastChild = $da1f6dc1cffd4cb1$var$lastChild(el, options.draggable);\n if (!elLastChild || $da1f6dc1cffd4cb1$var$_ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === $da1f6dc1cffd4cb1$var$dragEl) return completed(false);\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) target = elLastChild;\n if (target) targetRect = $da1f6dc1cffd4cb1$var$getRect(target);\n if ($da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) // the last draggable element is not the last node\n el.insertBefore($da1f6dc1cffd4cb1$var$dragEl, elLastChild.nextSibling);\n else el.appendChild($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (elLastChild && $da1f6dc1cffd4cb1$var$_ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = $da1f6dc1cffd4cb1$var$getChild(el, 0, options, true);\n if (firstChild === $da1f6dc1cffd4cb1$var$dragEl) return completed(false);\n target = firstChild;\n targetRect = $da1f6dc1cffd4cb1$var$getRect(target);\n if ($da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore($da1f6dc1cffd4cb1$var$dragEl, firstChild);\n $da1f6dc1cffd4cb1$var$parentEl = el; // actualization\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = $da1f6dc1cffd4cb1$var$getRect(target);\n var direction = 0, targetBeforeFirstSwap, differentLevel = $da1f6dc1cffd4cb1$var$dragEl.parentNode !== el, differentRowCol = !$da1f6dc1cffd4cb1$var$_dragElInRowColumn($da1f6dc1cffd4cb1$var$dragEl.animated && $da1f6dc1cffd4cb1$var$dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? \"top\" : \"left\", scrolledPastTop = $da1f6dc1cffd4cb1$var$isScrolledPast(target, \"top\", \"top\") || $da1f6dc1cffd4cb1$var$isScrolledPast($da1f6dc1cffd4cb1$var$dragEl, \"top\", \"top\"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if ($da1f6dc1cffd4cb1$var$lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = false;\n $da1f6dc1cffd4cb1$var$isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = $da1f6dc1cffd4cb1$var$_getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, $da1f6dc1cffd4cb1$var$isCircumstantialInvert, $da1f6dc1cffd4cb1$var$lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n do {\n dragIndex -= direction;\n sibling = $da1f6dc1cffd4cb1$var$parentEl.children[dragIndex];\n }while (sibling && ($da1f6dc1cffd4cb1$var$css(sibling, \"display\") === \"none\" || sibling === $da1f6dc1cffd4cb1$var$ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) return completed(false);\n $da1f6dc1cffd4cb1$var$lastTarget = target;\n $da1f6dc1cffd4cb1$var$lastDirection = direction;\n var nextSibling = target.nextElementSibling, after = false;\n after = direction === 1;\n var moveVector = $da1f6dc1cffd4cb1$var$_onMove($da1f6dc1cffd4cb1$var$rootEl, el, $da1f6dc1cffd4cb1$var$dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) after = moveVector === 1;\n $da1f6dc1cffd4cb1$var$_silent = true;\n setTimeout($da1f6dc1cffd4cb1$var$_unsilent, 30);\n capture();\n if (after && !nextSibling) el.appendChild($da1f6dc1cffd4cb1$var$dragEl);\n else target.parentNode.insertBefore($da1f6dc1cffd4cb1$var$dragEl, after ? nextSibling : target);\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) $da1f6dc1cffd4cb1$var$scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$dragEl.parentNode; // actualization\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !$da1f6dc1cffd4cb1$var$isCircumstantialInvert) $da1f6dc1cffd4cb1$var$targetMoveDistance = Math.abs(targetBeforeFirstSwap - $da1f6dc1cffd4cb1$var$getRect(target)[side1]);\n changed();\n return completed(true);\n }\n }\n if (el.contains($da1f6dc1cffd4cb1$var$dragEl)) return completed(false);\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n $da1f6dc1cffd4cb1$var$off(document, \"mousemove\", this._onTouchMove);\n $da1f6dc1cffd4cb1$var$off(document, \"touchmove\", this._onTouchMove);\n $da1f6dc1cffd4cb1$var$off(document, \"pointermove\", this._onTouchMove);\n $da1f6dc1cffd4cb1$var$off(document, \"dragover\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$off(document, \"mousemove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n $da1f6dc1cffd4cb1$var$off(document, \"touchmove\", $da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"mouseup\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchend\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"pointerup\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(ownerDocument, \"touchcancel\", this._onDrop);\n $da1f6dc1cffd4cb1$var$off(document, \"selectstart\", this);\n },\n _onDrop: function _onDrop(/**Event*/ evt) {\n var el = this.el, options = this.options;\n // Get the index of the dragged element within its parent\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl, options.draggable);\n $da1f6dc1cffd4cb1$var$pluginEvent(\"drop\", this, {\n evt: evt\n });\n $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$dragEl && $da1f6dc1cffd4cb1$var$dragEl.parentNode;\n // Get again after plugin event\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl, options.draggable);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) {\n this._nulling();\n return;\n }\n $da1f6dc1cffd4cb1$var$awaitingDragStarted = false;\n $da1f6dc1cffd4cb1$var$isCircumstantialInvert = false;\n $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n $da1f6dc1cffd4cb1$var$_cancelNextTick(this.cloneId);\n $da1f6dc1cffd4cb1$var$_cancelNextTick(this._dragStartId);\n // Unbind events\n if (this.nativeDraggable) {\n $da1f6dc1cffd4cb1$var$off(document, \"drop\", this);\n $da1f6dc1cffd4cb1$var$off(el, \"dragstart\", this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if ($da1f6dc1cffd4cb1$var$Safari) $da1f6dc1cffd4cb1$var$css(document.body, \"user-select\", \"\");\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$dragEl, \"transform\", \"\");\n if (evt) {\n if ($da1f6dc1cffd4cb1$var$moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n $da1f6dc1cffd4cb1$var$ghostEl && $da1f6dc1cffd4cb1$var$ghostEl.parentNode && $da1f6dc1cffd4cb1$var$ghostEl.parentNode.removeChild($da1f6dc1cffd4cb1$var$ghostEl);\n if ($da1f6dc1cffd4cb1$var$rootEl === $da1f6dc1cffd4cb1$var$parentEl || $da1f6dc1cffd4cb1$var$putSortable && $da1f6dc1cffd4cb1$var$putSortable.lastPutMode !== \"clone\") // Remove clone(s)\n $da1f6dc1cffd4cb1$var$cloneEl && $da1f6dc1cffd4cb1$var$cloneEl.parentNode && $da1f6dc1cffd4cb1$var$cloneEl.parentNode.removeChild($da1f6dc1cffd4cb1$var$cloneEl);\n if ($da1f6dc1cffd4cb1$var$dragEl) {\n if (this.nativeDraggable) $da1f6dc1cffd4cb1$var$off($da1f6dc1cffd4cb1$var$dragEl, \"dragend\", this);\n $da1f6dc1cffd4cb1$var$_disableDraggable($da1f6dc1cffd4cb1$var$dragEl);\n $da1f6dc1cffd4cb1$var$dragEl.style[\"will-change\"] = \"\";\n // Remove classes\n // ghostClass is added in dragStarted\n if ($da1f6dc1cffd4cb1$var$moved && !$da1f6dc1cffd4cb1$var$awaitingDragStarted) $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$putSortable ? $da1f6dc1cffd4cb1$var$putSortable.options.ghostClass : this.options.ghostClass, false);\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl, this.options.chosenClass, false);\n // Drag stop event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"unchoose\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if ($da1f6dc1cffd4cb1$var$rootEl !== $da1f6dc1cffd4cb1$var$parentEl) {\n if ($da1f6dc1cffd4cb1$var$newIndex >= 0) {\n // Add event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n rootEl: $da1f6dc1cffd4cb1$var$parentEl,\n name: \"add\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n fromEl: $da1f6dc1cffd4cb1$var$rootEl,\n originalEvent: evt\n });\n // Remove event\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"remove\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n // drag from one list and drop into another\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n rootEl: $da1f6dc1cffd4cb1$var$parentEl,\n name: \"sort\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n fromEl: $da1f6dc1cffd4cb1$var$rootEl,\n originalEvent: evt\n });\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n }\n $da1f6dc1cffd4cb1$var$putSortable && $da1f6dc1cffd4cb1$var$putSortable.save();\n } else {\n if ($da1f6dc1cffd4cb1$var$newIndex !== $da1f6dc1cffd4cb1$var$oldIndex) {\n if ($da1f6dc1cffd4cb1$var$newIndex >= 0) {\n // drag & drop within the same list\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"update\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"sort\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active) {\n /* jshint eqnull:true */ if ($da1f6dc1cffd4cb1$var$newIndex == null || $da1f6dc1cffd4cb1$var$newIndex === -1) {\n $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$oldIndex;\n $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$oldDraggableIndex;\n }\n $da1f6dc1cffd4cb1$var$_dispatchEvent({\n sortable: this,\n name: \"end\",\n toEl: $da1f6dc1cffd4cb1$var$parentEl,\n originalEvent: evt\n });\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"nulling\", this);\n $da1f6dc1cffd4cb1$var$rootEl = $da1f6dc1cffd4cb1$var$dragEl = $da1f6dc1cffd4cb1$var$parentEl = $da1f6dc1cffd4cb1$var$ghostEl = $da1f6dc1cffd4cb1$var$nextEl = $da1f6dc1cffd4cb1$var$cloneEl = $da1f6dc1cffd4cb1$var$lastDownEl = $da1f6dc1cffd4cb1$var$cloneHidden = $da1f6dc1cffd4cb1$var$tapEvt = $da1f6dc1cffd4cb1$var$touchEvt = $da1f6dc1cffd4cb1$var$moved = $da1f6dc1cffd4cb1$var$newIndex = $da1f6dc1cffd4cb1$var$newDraggableIndex = $da1f6dc1cffd4cb1$var$oldIndex = $da1f6dc1cffd4cb1$var$oldDraggableIndex = $da1f6dc1cffd4cb1$var$lastTarget = $da1f6dc1cffd4cb1$var$lastDirection = $da1f6dc1cffd4cb1$var$putSortable = $da1f6dc1cffd4cb1$var$activeGroup = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.ghost = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.clone = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active = null;\n $da1f6dc1cffd4cb1$var$savedInputChecked.forEach(function(el) {\n el.checked = true;\n });\n $da1f6dc1cffd4cb1$var$savedInputChecked.length = $da1f6dc1cffd4cb1$var$lastDx = $da1f6dc1cffd4cb1$var$lastDy = 0;\n },\n handleEvent: function handleEvent(/**Event*/ evt) {\n switch(evt.type){\n case \"drop\":\n case \"dragend\":\n this._onDrop(evt);\n break;\n case \"dragenter\":\n case \"dragover\":\n if ($da1f6dc1cffd4cb1$var$dragEl) {\n this._onDragOver(evt);\n $da1f6dc1cffd4cb1$var$_globalDragOver(evt);\n }\n break;\n case \"selectstart\":\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */ toArray: function toArray() {\n var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;\n for(; i < n; i++){\n el = children[i];\n if ($da1f6dc1cffd4cb1$var$closest(el, options.draggable, this.el, false)) order.push(el.getAttribute(options.dataIdAttr) || $da1f6dc1cffd4cb1$var$_generateId(el));\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */ sort: function sort(order, useAnimation) {\n var items = {}, rootEl = this.el;\n this.toArray().forEach(function(id, i) {\n var el = rootEl.children[i];\n if ($da1f6dc1cffd4cb1$var$closest(el, this.options.draggable, rootEl, false)) items[id] = el;\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function(id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */ save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */ closest: function closest$1(el, selector) {\n return $da1f6dc1cffd4cb1$var$closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */ option: function option(name, value) {\n var options = this.options;\n if (value === void 0) return options[name];\n else {\n var modifiedValue = $da1f6dc1cffd4cb1$var$PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== \"undefined\") options[name] = modifiedValue;\n else options[name] = value;\n if (name === \"group\") $da1f6dc1cffd4cb1$var$_prepareGroup(options);\n }\n },\n /**\r\n * Destroy\r\n */ destroy: function destroy() {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"destroy\", this);\n var el = this.el;\n el[$da1f6dc1cffd4cb1$var$expando] = null;\n $da1f6dc1cffd4cb1$var$off(el, \"mousedown\", this._onTapStart);\n $da1f6dc1cffd4cb1$var$off(el, \"touchstart\", this._onTapStart);\n $da1f6dc1cffd4cb1$var$off(el, \"pointerdown\", this._onTapStart);\n if (this.nativeDraggable) {\n $da1f6dc1cffd4cb1$var$off(el, \"dragover\", this);\n $da1f6dc1cffd4cb1$var$off(el, \"dragenter\", this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll(\"[draggable]\"), function(el) {\n el.removeAttribute(\"draggable\");\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n $da1f6dc1cffd4cb1$var$sortables.splice($da1f6dc1cffd4cb1$var$sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!$da1f6dc1cffd4cb1$var$cloneHidden) {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"hideClone\", this);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return;\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$cloneEl, \"display\", \"none\");\n if (this.options.removeCloneOnHide && $da1f6dc1cffd4cb1$var$cloneEl.parentNode) $da1f6dc1cffd4cb1$var$cloneEl.parentNode.removeChild($da1f6dc1cffd4cb1$var$cloneEl);\n $da1f6dc1cffd4cb1$var$cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== \"clone\") {\n this._hideClone();\n return;\n }\n if ($da1f6dc1cffd4cb1$var$cloneHidden) {\n $da1f6dc1cffd4cb1$var$pluginEvent(\"showClone\", this);\n if ($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.eventCanceled) return;\n // show clone at dragEl or original position\n if ($da1f6dc1cffd4cb1$var$dragEl.parentNode == $da1f6dc1cffd4cb1$var$rootEl && !this.options.group.revertClone) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$dragEl);\n else if ($da1f6dc1cffd4cb1$var$nextEl) $da1f6dc1cffd4cb1$var$rootEl.insertBefore($da1f6dc1cffd4cb1$var$cloneEl, $da1f6dc1cffd4cb1$var$nextEl);\n else $da1f6dc1cffd4cb1$var$rootEl.appendChild($da1f6dc1cffd4cb1$var$cloneEl);\n if (this.options.group.revertClone) this.animate($da1f6dc1cffd4cb1$var$dragEl, $da1f6dc1cffd4cb1$var$cloneEl);\n $da1f6dc1cffd4cb1$var$css($da1f6dc1cffd4cb1$var$cloneEl, \"display\", \"\");\n $da1f6dc1cffd4cb1$var$cloneHidden = false;\n }\n }\n};\nfunction $da1f6dc1cffd4cb1$var$_globalDragOver(/**Event*/ evt) {\n if (evt.dataTransfer) evt.dataTransfer.dropEffect = \"move\";\n evt.cancelable && evt.preventDefault();\n}\nfunction $da1f6dc1cffd4cb1$var$_onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt, sortable = fromEl[$da1f6dc1cffd4cb1$var$expando], onMoveFn = sortable.options.onMove, retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !$da1f6dc1cffd4cb1$var$IE11OrLess && !$da1f6dc1cffd4cb1$var$Edge) evt = new CustomEvent(\"move\", {\n bubbles: true,\n cancelable: true\n });\n else {\n evt = document.createEvent(\"Event\");\n evt.initEvent(\"move\", true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || $da1f6dc1cffd4cb1$var$getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) retVal = onMoveFn.call(sortable, evt, originalEvent);\n return retVal;\n}\nfunction $da1f6dc1cffd4cb1$var$_disableDraggable(el) {\n el.draggable = false;\n}\nfunction $da1f6dc1cffd4cb1$var$_unsilent() {\n $da1f6dc1cffd4cb1$var$_silent = false;\n}\nfunction $da1f6dc1cffd4cb1$var$_ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = $da1f6dc1cffd4cb1$var$getChildContainingRectFromElement(sortable.el, sortable.options, $da1f6dc1cffd4cb1$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction $da1f6dc1cffd4cb1$var$_ghostIsLast(evt, vertical, sortable) {\n var lastElRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = $da1f6dc1cffd4cb1$var$getChildContainingRectFromElement(sortable.el, sortable.options, $da1f6dc1cffd4cb1$var$ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction $da1f6dc1cffd4cb1$var$_getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && $da1f6dc1cffd4cb1$var$targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!$da1f6dc1cffd4cb1$var$pastFirstInvertThresh && ($da1f6dc1cffd4cb1$var$lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n $da1f6dc1cffd4cb1$var$pastFirstInvertThresh = true;\n if (!$da1f6dc1cffd4cb1$var$pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if ($da1f6dc1cffd4cb1$var$lastDirection === 1 ? mouseOnAxis < targetS1 + $da1f6dc1cffd4cb1$var$targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - $da1f6dc1cffd4cb1$var$targetMoveDistance) return -$da1f6dc1cffd4cb1$var$lastDirection;\n } else invert = true;\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) return $da1f6dc1cffd4cb1$var$_getInsertDirection(target);\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n return 0;\n}\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */ function $da1f6dc1cffd4cb1$var$_getInsertDirection(target) {\n if ($da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl) < $da1f6dc1cffd4cb1$var$index(target)) return 1;\n else return -1;\n}\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */ function $da1f6dc1cffd4cb1$var$_generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;\n while(i--)sum += str.charCodeAt(i);\n return sum.toString(36);\n}\nfunction $da1f6dc1cffd4cb1$var$_saveInputCheckedState(root) {\n $da1f6dc1cffd4cb1$var$savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName(\"input\");\n var idx = inputs.length;\n while(idx--){\n var el = inputs[idx];\n el.checked && $da1f6dc1cffd4cb1$var$savedInputChecked.push(el);\n }\n}\nfunction $da1f6dc1cffd4cb1$var$_nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction $da1f6dc1cffd4cb1$var$_cancelNextTick(id) {\n return clearTimeout(id);\n}\n// Fixed #973:\nif ($da1f6dc1cffd4cb1$var$documentExists) $da1f6dc1cffd4cb1$var$on(document, \"touchmove\", function(evt) {\n if (($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active || $da1f6dc1cffd4cb1$var$awaitingDragStarted) && evt.cancelable) evt.preventDefault();\n});\n// Export utils\n$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.utils = {\n on: $da1f6dc1cffd4cb1$var$on,\n off: $da1f6dc1cffd4cb1$var$off,\n css: $da1f6dc1cffd4cb1$var$css,\n find: $da1f6dc1cffd4cb1$var$find,\n is: function is(el, selector) {\n return !!$da1f6dc1cffd4cb1$var$closest(el, selector, el, false);\n },\n extend: $da1f6dc1cffd4cb1$var$extend,\n throttle: $da1f6dc1cffd4cb1$var$throttle,\n closest: $da1f6dc1cffd4cb1$var$closest,\n toggleClass: $da1f6dc1cffd4cb1$var$toggleClass,\n clone: $da1f6dc1cffd4cb1$var$clone,\n index: $da1f6dc1cffd4cb1$var$index,\n nextTick: $da1f6dc1cffd4cb1$var$_nextTick,\n cancelNextTick: $da1f6dc1cffd4cb1$var$_cancelNextTick,\n detectDirection: $da1f6dc1cffd4cb1$var$_detectDirection,\n getChild: $da1f6dc1cffd4cb1$var$getChild\n};\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */ $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.get = function(element) {\n return element[$da1f6dc1cffd4cb1$var$expando];\n};\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */ $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.mount = function() {\n for(var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++)plugins[_key] = arguments[_key];\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function(plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) throw \"Sortable: Mounted plugin must be a constructor function, not \".concat(({}).toString.call(plugin));\n if (plugin.utils) $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.utils = $da1f6dc1cffd4cb1$var$_objectSpread2($da1f6dc1cffd4cb1$var$_objectSpread2({}, $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.utils), plugin.utils);\n $da1f6dc1cffd4cb1$var$PluginManager.mount(plugin);\n });\n};\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */ $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.create = function(el, options) {\n return new $da1f6dc1cffd4cb1$export$31b3ca70d8f57423(el, options);\n};\n// Export\n$da1f6dc1cffd4cb1$export$31b3ca70d8f57423.version = $da1f6dc1cffd4cb1$var$version;\nvar $da1f6dc1cffd4cb1$var$autoScrolls = [], $da1f6dc1cffd4cb1$var$scrollEl, $da1f6dc1cffd4cb1$var$scrollRootEl, $da1f6dc1cffd4cb1$var$scrolling = false, $da1f6dc1cffd4cb1$var$lastAutoScrollX, $da1f6dc1cffd4cb1$var$lastAutoScrollY, $da1f6dc1cffd4cb1$var$touchEvt$1, $da1f6dc1cffd4cb1$var$pointerElemChangedInterval;\nfunction $da1f6dc1cffd4cb1$export$3fb39aee5567f02e() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) $da1f6dc1cffd4cb1$var$on(document, \"dragover\", this._handleAutoScroll);\n else {\n if (this.options.supportPointer) $da1f6dc1cffd4cb1$var$on(document, \"pointermove\", this._handleFallbackAutoScroll);\n else if (originalEvent.touches) $da1f6dc1cffd4cb1$var$on(document, \"touchmove\", this._handleFallbackAutoScroll);\n else $da1f6dc1cffd4cb1$var$on(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) this._handleAutoScroll(originalEvent);\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) $da1f6dc1cffd4cb1$var$off(document, \"dragover\", this._handleAutoScroll);\n else {\n $da1f6dc1cffd4cb1$var$off(document, \"pointermove\", this._handleFallbackAutoScroll);\n $da1f6dc1cffd4cb1$var$off(document, \"touchmove\", this._handleFallbackAutoScroll);\n $da1f6dc1cffd4cb1$var$off(document, \"mousemove\", this._handleFallbackAutoScroll);\n }\n $da1f6dc1cffd4cb1$var$clearPointerElemChangedInterval();\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n $da1f6dc1cffd4cb1$var$cancelThrottle();\n },\n nulling: function nulling() {\n $da1f6dc1cffd4cb1$var$touchEvt$1 = $da1f6dc1cffd4cb1$var$scrollRootEl = $da1f6dc1cffd4cb1$var$scrollEl = $da1f6dc1cffd4cb1$var$scrolling = $da1f6dc1cffd4cb1$var$pointerElemChangedInterval = $da1f6dc1cffd4cb1$var$lastAutoScrollX = $da1f6dc1cffd4cb1$var$lastAutoScrollY = null;\n $da1f6dc1cffd4cb1$var$autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y);\n $da1f6dc1cffd4cb1$var$touchEvt$1 = evt;\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || $da1f6dc1cffd4cb1$var$Edge || $da1f6dc1cffd4cb1$var$IE11OrLess || $da1f6dc1cffd4cb1$var$Safari) {\n $da1f6dc1cffd4cb1$var$autoScroll(evt, this.options, elem, fallback);\n // Listener for pointer element change\n var ogElemScroller = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(elem, true);\n if ($da1f6dc1cffd4cb1$var$scrolling && (!$da1f6dc1cffd4cb1$var$pointerElemChangedInterval || x !== $da1f6dc1cffd4cb1$var$lastAutoScrollX || y !== $da1f6dc1cffd4cb1$var$lastAutoScrollY)) {\n $da1f6dc1cffd4cb1$var$pointerElemChangedInterval && $da1f6dc1cffd4cb1$var$clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n $da1f6dc1cffd4cb1$var$pointerElemChangedInterval = setInterval(function() {\n var newElem = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n }\n $da1f6dc1cffd4cb1$var$autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n $da1f6dc1cffd4cb1$var$lastAutoScrollX = x;\n $da1f6dc1cffd4cb1$var$lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(elem, true) === $da1f6dc1cffd4cb1$var$getWindowScrollingElement()) {\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n return;\n }\n $da1f6dc1cffd4cb1$var$autoScroll(evt, this.options, $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return $da1f6dc1cffd4cb1$var$_extends(AutoScroll, {\n pluginName: \"scroll\",\n initializeByDefault: true\n });\n}\nfunction $da1f6dc1cffd4cb1$var$clearAutoScrolls() {\n $da1f6dc1cffd4cb1$var$autoScrolls.forEach(function(autoScroll) {\n clearInterval(autoScroll.pid);\n });\n $da1f6dc1cffd4cb1$var$autoScrolls = [];\n}\nfunction $da1f6dc1cffd4cb1$var$clearPointerElemChangedInterval() {\n clearInterval($da1f6dc1cffd4cb1$var$pointerElemChangedInterval);\n}\nvar $da1f6dc1cffd4cb1$var$autoScroll = $da1f6dc1cffd4cb1$var$throttle(function(evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = $da1f6dc1cffd4cb1$var$getWindowScrollingElement();\n var scrollThisInstance = false, scrollCustomFn;\n // New scroll root, set scrollEl\n if ($da1f6dc1cffd4cb1$var$scrollRootEl !== rootEl) {\n $da1f6dc1cffd4cb1$var$scrollRootEl = rootEl;\n $da1f6dc1cffd4cb1$var$clearAutoScrolls();\n $da1f6dc1cffd4cb1$var$scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if ($da1f6dc1cffd4cb1$var$scrollEl === true) $da1f6dc1cffd4cb1$var$scrollEl = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(rootEl, true);\n }\n var layersOut = 0;\n var currentParent = $da1f6dc1cffd4cb1$var$scrollEl;\n do {\n var el = currentParent, rect = $da1f6dc1cffd4cb1$var$getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = $da1f6dc1cffd4cb1$var$css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\" || elCSS.overflowX === \"visible\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\" || elCSS.overflowY === \"visible\");\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\");\n canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\");\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!$da1f6dc1cffd4cb1$var$autoScrolls[layersOut]) {\n for(var i = 0; i <= layersOut; i++)if (!$da1f6dc1cffd4cb1$var$autoScrolls[i]) $da1f6dc1cffd4cb1$var$autoScrolls[i] = {};\n }\n if ($da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vx != vx || $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vy != vy || $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].el !== el) {\n $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].el = el;\n $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vx = vx;\n $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].vy = vy;\n clearInterval($da1f6dc1cffd4cb1$var$autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */ $da1f6dc1cffd4cb1$var$autoScrolls[layersOut].pid = setInterval((function() {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) $da1f6dc1cffd4cb1$export$31b3ca70d8f57423.active._onTouchMove($da1f6dc1cffd4cb1$var$touchEvt$1); // To move ghost if it is positioned absolutely\n var scrollOffsetY = $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vy ? $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vx ? $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === \"function\") {\n if (scrollCustomFn.call($da1f6dc1cffd4cb1$export$31b3ca70d8f57423.dragged.parentNode[$da1f6dc1cffd4cb1$var$expando], scrollOffsetX, scrollOffsetY, evt, $da1f6dc1cffd4cb1$var$touchEvt$1, $da1f6dc1cffd4cb1$var$autoScrolls[this.layer].el) !== \"continue\") return;\n }\n $da1f6dc1cffd4cb1$var$scrollBy($da1f6dc1cffd4cb1$var$autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }).bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n }while (options.bubbleScroll && currentParent !== winScroller && (currentParent = $da1f6dc1cffd4cb1$var$getParentAutoScrollElement(currentParent, false)));\n $da1f6dc1cffd4cb1$var$scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\nvar $da1f6dc1cffd4cb1$var$drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent, putSortable = _ref.putSortable, dragEl = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent(\"spill\");\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction $da1f6dc1cffd4cb1$var$Revert() {}\n$da1f6dc1cffd4cb1$var$Revert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl, putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) putSortable.captureAnimationState();\n var nextSibling = $da1f6dc1cffd4cb1$var$getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) this.sortable.el.insertBefore(dragEl, nextSibling);\n else this.sortable.el.appendChild(dragEl);\n this.sortable.animateAll();\n if (putSortable) putSortable.animateAll();\n },\n drop: $da1f6dc1cffd4cb1$var$drop\n};\n$da1f6dc1cffd4cb1$var$_extends($da1f6dc1cffd4cb1$var$Revert, {\n pluginName: \"revertOnSpill\"\n});\nfunction $da1f6dc1cffd4cb1$var$Remove() {}\n$da1f6dc1cffd4cb1$var$Remove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl, putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: $da1f6dc1cffd4cb1$var$drop\n};\n$da1f6dc1cffd4cb1$var$_extends($da1f6dc1cffd4cb1$var$Remove, {\n pluginName: \"removeOnSpill\"\n});\nvar $da1f6dc1cffd4cb1$export$55b3d9f7b2513474 = [\n $da1f6dc1cffd4cb1$var$Remove,\n $da1f6dc1cffd4cb1$var$Revert\n];\nvar $da1f6dc1cffd4cb1$var$lastSwapEl;\nfunction $da1f6dc1cffd4cb1$export$bdb5f0a1b77546f4() {\n function Swap() {\n this.defaults = {\n swapClass: \"sortable-swap-highlight\"\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n $da1f6dc1cffd4cb1$var$lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed, target = _ref2.target, onMove = _ref2.onMove, activeSortable = _ref2.activeSortable, changed = _ref2.changed, cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el, options = this.options;\n if (target && target !== el) {\n var prevSwapEl = $da1f6dc1cffd4cb1$var$lastSwapEl;\n if (onMove(target) !== false) {\n $da1f6dc1cffd4cb1$var$toggleClass(target, options.swapClass, true);\n $da1f6dc1cffd4cb1$var$lastSwapEl = target;\n } else $da1f6dc1cffd4cb1$var$lastSwapEl = null;\n if (prevSwapEl && prevSwapEl !== $da1f6dc1cffd4cb1$var$lastSwapEl) $da1f6dc1cffd4cb1$var$toggleClass(prevSwapEl, options.swapClass, false);\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable, putSortable = _ref3.putSortable, dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n $da1f6dc1cffd4cb1$var$lastSwapEl && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$lastSwapEl, options.swapClass, false);\n if ($da1f6dc1cffd4cb1$var$lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== $da1f6dc1cffd4cb1$var$lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n $da1f6dc1cffd4cb1$var$swapNodes(dragEl, $da1f6dc1cffd4cb1$var$lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n $da1f6dc1cffd4cb1$var$lastSwapEl = null;\n }\n };\n return $da1f6dc1cffd4cb1$var$_extends(Swap, {\n pluginName: \"swap\",\n eventProperties: function eventProperties() {\n return {\n swapItem: $da1f6dc1cffd4cb1$var$lastSwapEl\n };\n }\n });\n}\nfunction $da1f6dc1cffd4cb1$var$swapNodes(n1, n2) {\n var p1 = n1.parentNode, p2 = n2.parentNode, i1, i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = $da1f6dc1cffd4cb1$var$index(n1);\n i2 = $da1f6dc1cffd4cb1$var$index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) i2++;\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\nvar $da1f6dc1cffd4cb1$var$multiDragElements = [], $da1f6dc1cffd4cb1$var$multiDragClones = [], $da1f6dc1cffd4cb1$var$lastMultiDragSelect, // for selection with modifier key down (SHIFT)\n$da1f6dc1cffd4cb1$var$multiDragSortable, $da1f6dc1cffd4cb1$var$initialFolding = false, // Initial multi-drag fold when drag started\n$da1f6dc1cffd4cb1$var$folding = false, // Folding any other time\n$da1f6dc1cffd4cb1$var$dragStarted = false, $da1f6dc1cffd4cb1$var$dragEl$1, $da1f6dc1cffd4cb1$var$clonesFromRect, $da1f6dc1cffd4cb1$var$clonesHidden;\nfunction $da1f6dc1cffd4cb1$export$18e5d2a5d1df842d() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for(var fn in this)if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") this[fn] = this[fn].bind(this);\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) $da1f6dc1cffd4cb1$var$on(document, \"pointerup\", this._deselectMultiDrag);\n else {\n $da1f6dc1cffd4cb1$var$on(document, \"mouseup\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$on(document, \"touchend\", this._deselectMultiDrag);\n }\n }\n $da1f6dc1cffd4cb1$var$on(document, \"keydown\", this._checkKeyDown);\n $da1f6dc1cffd4cb1$var$on(document, \"keyup\", this._checkKeyUp);\n this.defaults = {\n selectedClass: \"sortable-selected\",\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = \"\";\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length && $da1f6dc1cffd4cb1$var$multiDragSortable === sortable) $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement, i) {\n data += (!i ? \"\" : \", \") + multiDragElement.textContent;\n });\n else data = dragEl.textContent;\n dataTransfer.setData(\"Text\", data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n $da1f6dc1cffd4cb1$var$dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable, cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for(var i = 0; i < $da1f6dc1cffd4cb1$var$multiDragElements.length; i++){\n $da1f6dc1cffd4cb1$var$multiDragClones.push($da1f6dc1cffd4cb1$var$clone($da1f6dc1cffd4cb1$var$multiDragElements[i]));\n $da1f6dc1cffd4cb1$var$multiDragClones[i].sortableIndex = $da1f6dc1cffd4cb1$var$multiDragElements[i].sortableIndex;\n $da1f6dc1cffd4cb1$var$multiDragClones[i].draggable = false;\n $da1f6dc1cffd4cb1$var$multiDragClones[i].style[\"will-change\"] = \"\";\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$multiDragClones[i], this.options.selectedClass, false);\n $da1f6dc1cffd4cb1$var$multiDragElements[i] === $da1f6dc1cffd4cb1$var$dragEl$1 && $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable, rootEl = _ref3.rootEl, dispatchSortableEvent = _ref3.dispatchSortableEvent, cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length && $da1f6dc1cffd4cb1$var$multiDragSortable === sortable) {\n $da1f6dc1cffd4cb1$var$insertMultiDragClones(true, rootEl);\n dispatchSortableEvent(\"clone\");\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown, rootEl = _ref4.rootEl, cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n $da1f6dc1cffd4cb1$var$insertMultiDragClones(false, rootEl);\n $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n $da1f6dc1cffd4cb1$var$css(clone, \"display\", \"\");\n });\n cloneNowShown();\n $da1f6dc1cffd4cb1$var$clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable, cloneNowHidden = _ref5.cloneNowHidden, cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n $da1f6dc1cffd4cb1$var$css(clone, \"display\", \"none\");\n if (_this.options.removeCloneOnHide && clone.parentNode) clone.parentNode.removeChild(clone);\n });\n cloneNowHidden();\n $da1f6dc1cffd4cb1$var$clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && $da1f6dc1cffd4cb1$var$multiDragSortable) $da1f6dc1cffd4cb1$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.sortableIndex = $da1f6dc1cffd4cb1$var$index(multiDragElement);\n });\n // Sort multi-drag elements\n $da1f6dc1cffd4cb1$var$multiDragElements = $da1f6dc1cffd4cb1$var$multiDragElements.sort(function(a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n $da1f6dc1cffd4cb1$var$dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n if (this.options.animation) {\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n $da1f6dc1cffd4cb1$var$css(multiDragElement, \"position\", \"absolute\");\n });\n var dragRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl$1, false, true, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n $da1f6dc1cffd4cb1$var$setRect(multiDragElement, dragRect);\n });\n $da1f6dc1cffd4cb1$var$folding = true;\n $da1f6dc1cffd4cb1$var$initialFolding = true;\n }\n }\n sortable.animateAll(function() {\n $da1f6dc1cffd4cb1$var$folding = false;\n $da1f6dc1cffd4cb1$var$initialFolding = false;\n if (_this2.options.animation) $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n $da1f6dc1cffd4cb1$var$unsetRect(multiDragElement);\n });\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target, completed = _ref8.completed, cancel = _ref8.cancel;\n if ($da1f6dc1cffd4cb1$var$folding && ~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable, rootEl = _ref9.rootEl, sortable = _ref9.sortable, dragRect = _ref9.dragRect;\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length > 1) {\n // Setup unfold animation\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: $da1f6dc1cffd4cb1$var$folding ? $da1f6dc1cffd4cb1$var$getRect(multiDragElement) : dragRect\n });\n $da1f6dc1cffd4cb1$var$unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n $da1f6dc1cffd4cb1$var$folding = false;\n $da1f6dc1cffd4cb1$var$insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable, isOwner = _ref10.isOwner, insertion = _ref10.insertion, activeSortable = _ref10.activeSortable, parentEl = _ref10.parentEl, putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) activeSortable._hideClone();\n $da1f6dc1cffd4cb1$var$initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && $da1f6dc1cffd4cb1$var$multiDragElements.length > 1 && ($da1f6dc1cffd4cb1$var$folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl$1, false, true, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n $da1f6dc1cffd4cb1$var$setRect(multiDragElement, dragRectAbsolute);\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n $da1f6dc1cffd4cb1$var$folding = true;\n }\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!$da1f6dc1cffd4cb1$var$folding) $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n if ($da1f6dc1cffd4cb1$var$multiDragElements.length > 1) {\n var clonesHiddenBefore = $da1f6dc1cffd4cb1$var$clonesHidden;\n activeSortable._showClone(sortable);\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !$da1f6dc1cffd4cb1$var$clonesHidden && clonesHiddenBefore) $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: $da1f6dc1cffd4cb1$var$clonesFromRect\n });\n clone.fromRect = $da1f6dc1cffd4cb1$var$clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n } else activeSortable._showClone(sortable);\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect, isOwner = _ref11.isOwner, activeSortable = _ref11.activeSortable;\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n $da1f6dc1cffd4cb1$var$clonesFromRect = $da1f6dc1cffd4cb1$var$_extends({}, dragRect);\n var dragMatrix = $da1f6dc1cffd4cb1$var$matrix($da1f6dc1cffd4cb1$var$dragEl$1, true);\n $da1f6dc1cffd4cb1$var$clonesFromRect.top -= dragMatrix.f;\n $da1f6dc1cffd4cb1$var$clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if ($da1f6dc1cffd4cb1$var$folding) {\n $da1f6dc1cffd4cb1$var$folding = false;\n $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent, rootEl = _ref12.rootEl, parentEl = _ref12.parentEl, sortable = _ref12.sortable, dispatchSortableEvent = _ref12.dispatchSortableEvent, oldIndex = _ref12.oldIndex, putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options, children = parentEl.children;\n // Multi-drag selection\n if (!$da1f6dc1cffd4cb1$var$dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) this._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$toggleClass($da1f6dc1cffd4cb1$var$dragEl$1, options.selectedClass, !~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1));\n if (!~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1)) {\n $da1f6dc1cffd4cb1$var$multiDragElements.push($da1f6dc1cffd4cb1$var$dragEl$1);\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: $da1f6dc1cffd4cb1$var$dragEl$1,\n originalEvent: evt\n });\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && $da1f6dc1cffd4cb1$var$lastMultiDragSelect && sortable.el.contains($da1f6dc1cffd4cb1$var$lastMultiDragSelect)) {\n var lastIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$lastMultiDragSelect), currentIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for(; i < n; i++){\n if (~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf(children[i])) continue;\n $da1f6dc1cffd4cb1$var$toggleClass(children[i], options.selectedClass, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.push(children[i]);\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"select\",\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else $da1f6dc1cffd4cb1$var$lastMultiDragSelect = $da1f6dc1cffd4cb1$var$dragEl$1;\n $da1f6dc1cffd4cb1$var$multiDragSortable = toSortable;\n } else {\n $da1f6dc1cffd4cb1$var$multiDragElements.splice($da1f6dc1cffd4cb1$var$multiDragElements.indexOf($da1f6dc1cffd4cb1$var$dragEl$1), 1);\n $da1f6dc1cffd4cb1$var$lastMultiDragSelect = null;\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: \"deselect\",\n targetEl: $da1f6dc1cffd4cb1$var$dragEl$1,\n originalEvent: evt\n });\n }\n }\n // Multi-drag drop\n if ($da1f6dc1cffd4cb1$var$dragStarted && this.isMultiDrag) {\n $da1f6dc1cffd4cb1$var$folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[$da1f6dc1cffd4cb1$var$expando].options.sort || parentEl !== rootEl) && $da1f6dc1cffd4cb1$var$multiDragElements.length > 1) {\n var dragRect = $da1f6dc1cffd4cb1$var$getRect($da1f6dc1cffd4cb1$var$dragEl$1), multiDragIndex = $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl$1, \":not(.\" + this.options.selectedClass + \")\");\n if (!$da1f6dc1cffd4cb1$var$initialFolding && options.animation) $da1f6dc1cffd4cb1$var$dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!$da1f6dc1cffd4cb1$var$initialFolding) {\n if (options.animation) {\n $da1f6dc1cffd4cb1$var$dragEl$1.fromRect = dragRect;\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== $da1f6dc1cffd4cb1$var$dragEl$1) {\n var rect = $da1f6dc1cffd4cb1$var$folding ? $da1f6dc1cffd4cb1$var$getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n $da1f6dc1cffd4cb1$var$removeMultiDragElements();\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (children[multiDragIndex]) parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n else parentEl.appendChild(multiDragElement);\n multiDragIndex++;\n });\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === $da1f6dc1cffd4cb1$var$index($da1f6dc1cffd4cb1$var$dragEl$1)) {\n var update = false;\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement.sortableIndex !== $da1f6dc1cffd4cb1$var$index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent(\"update\");\n dispatchSortableEvent(\"sort\");\n }\n }\n }\n // Must be done after capturing individual rects (scroll bar)\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n $da1f6dc1cffd4cb1$var$unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n $da1f6dc1cffd4cb1$var$multiDragSortable = toSortable;\n }\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== \"clone\") $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = $da1f6dc1cffd4cb1$var$dragStarted = false;\n $da1f6dc1cffd4cb1$var$multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$off(document, \"pointerup\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$off(document, \"mouseup\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$off(document, \"touchend\", this._deselectMultiDrag);\n $da1f6dc1cffd4cb1$var$off(document, \"keydown\", this._checkKeyDown);\n $da1f6dc1cffd4cb1$var$off(document, \"keyup\", this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof $da1f6dc1cffd4cb1$var$dragStarted !== \"undefined\" && $da1f6dc1cffd4cb1$var$dragStarted) return;\n // Only deselect if selection is in this sortable\n if ($da1f6dc1cffd4cb1$var$multiDragSortable !== this.sortable) return;\n // Only deselect if target is not item in this sortable\n if (evt && $da1f6dc1cffd4cb1$var$closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while($da1f6dc1cffd4cb1$var$multiDragElements.length){\n var el = $da1f6dc1cffd4cb1$var$multiDragElements[0];\n $da1f6dc1cffd4cb1$var$toggleClass(el, this.options.selectedClass, false);\n $da1f6dc1cffd4cb1$var$multiDragElements.shift();\n $da1f6dc1cffd4cb1$var$dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: \"deselect\",\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = true;\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) this.multiDragKeyDown = false;\n }\n };\n return $da1f6dc1cffd4cb1$var$_extends(MultiDrag, {\n // Static methods & properties\n pluginName: \"multiDrag\",\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */ select: function select(el) {\n var sortable = el.parentNode[$da1f6dc1cffd4cb1$var$expando];\n if (!sortable || !sortable.options.multiDrag || ~$da1f6dc1cffd4cb1$var$multiDragElements.indexOf(el)) return;\n if ($da1f6dc1cffd4cb1$var$multiDragSortable && $da1f6dc1cffd4cb1$var$multiDragSortable !== sortable) {\n $da1f6dc1cffd4cb1$var$multiDragSortable.multiDrag._deselectMultiDrag();\n $da1f6dc1cffd4cb1$var$multiDragSortable = sortable;\n }\n $da1f6dc1cffd4cb1$var$toggleClass(el, sortable.options.selectedClass, true);\n $da1f6dc1cffd4cb1$var$multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */ deselect: function deselect(el) {\n var sortable = el.parentNode[$da1f6dc1cffd4cb1$var$expando], index = $da1f6dc1cffd4cb1$var$multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n $da1f6dc1cffd4cb1$var$toggleClass(el, sortable.options.selectedClass, false);\n $da1f6dc1cffd4cb1$var$multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [], newIndicies = [];\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n // multiDragElements will already be sorted if folding\n var newIndex;\n if ($da1f6dc1cffd4cb1$var$folding && multiDragElement !== $da1f6dc1cffd4cb1$var$dragEl$1) newIndex = -1;\n else if ($da1f6dc1cffd4cb1$var$folding) newIndex = $da1f6dc1cffd4cb1$var$index(multiDragElement, \":not(.\" + _this3.options.selectedClass + \")\");\n else newIndex = $da1f6dc1cffd4cb1$var$index(multiDragElement);\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: $da1f6dc1cffd4cb1$var$_toConsumableArray($da1f6dc1cffd4cb1$var$multiDragElements),\n clones: [].concat($da1f6dc1cffd4cb1$var$multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === \"ctrl\") key = \"Control\";\n else if (key.length > 1) key = key.charAt(0).toUpperCase() + key.substr(1);\n return key;\n }\n }\n });\n}\nfunction $da1f6dc1cffd4cb1$var$insertMultiDragElements(clonesInserted, rootEl) {\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(multiDragElement, target);\n else rootEl.appendChild(multiDragElement);\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */ function $da1f6dc1cffd4cb1$var$insertMultiDragClones(elementsInserted, rootEl) {\n $da1f6dc1cffd4cb1$var$multiDragClones.forEach(function(clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) rootEl.insertBefore(clone, target);\n else rootEl.appendChild(clone);\n });\n}\nfunction $da1f6dc1cffd4cb1$var$removeMultiDragElements() {\n $da1f6dc1cffd4cb1$var$multiDragElements.forEach(function(multiDragElement) {\n if (multiDragElement === $da1f6dc1cffd4cb1$var$dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\nvar $da1f6dc1cffd4cb1$export$2e2bcd8739ae039 = $da1f6dc1cffd4cb1$export$31b3ca70d8f57423;\n\n\n\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */ const $f7942db15ba0cc81$export$61fc7d43ac8f84b0 = (fn, wait = 0, immediate = false)=>{\n let timerId = null;\n if (typeof fn !== \"function\") throw new TypeError(\"Expected a function for first argument\");\n return (...args)=>{\n clearTimeout(timerId);\n if (immediate && !timerId) fn(...args);\n timerId = setTimeout(()=>{\n timerId = null;\n if (!immediate) fn(...args);\n }, wait);\n };\n};\n\n\n\n\n\nconst $038088370be83852$var$template = document.createElement(\"template\");\n$038088370be83852$var$template.innerHTML = /* html */ `\n \n\n \n From file\n \n
              \n \n Drag 'n' drop a file, or click to select file to import\n
              \n (Only JSON files are allowed)\n
              \n
              \n
              \n\n From text\n \n
              \n \n \n
              \n
              \n
              \n`;\nclass $038088370be83852$var$ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($038088370be83852$var$template.content.cloneNode(true));\n }\n this.#dropzoneEl = this.shadowRoot.querySelector(\"files-dropzone\");\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n }\n connectedCallback() {\n this.#dropzoneEl.addEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener(\"files-dropzone-drop-accepted\", this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener(\"submit\", this.#handleImportFormSubmit);\n }\n #handleFilesDropzoneDropAccepted = (evt)=>{\n const { acceptedFiles: acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n if (!file) return;\n const reader = new FileReader();\n reader.readAsText(file, \"utf-8\");\n reader.onload = this.#handleFileReaderLoad;\n };\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) return alert(\"Invalid file or no feeds found.\");\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n for (const feed of feedsToImport){\n const feedExists = Boolean(feeds.find((f)=>f.url === feed.url));\n const { url: url, title: title } = feed;\n const isValidURL = (0, $8ca5c59aef5015ba$export$981c5d1bd3894713)(url);\n if (!feedExists && isValidURL) await (0, $b36f6cb20f27a9a6$export$4b77448646caf424)({\n url: url,\n title: title\n });\n }\n this.dispatchEvent(new Event(\"feeds-imported\", {\n bubbles: true,\n composed: true\n }));\n }\n #handleFileReaderLoad = async (evt)=>{\n try {\n const { result: result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert(\"The file is not valid.\");\n }\n };\n #handleImportFormSubmit = async (evt)=>{\n evt.preventDefault();\n const formData = new FormData(evt.target);\n const data = formData.get(\"import-data\");\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert(\"The data is not valid.\");\n }\n };\n}\nif (!window.customElements.get(\"import-feeds\")) window.customElements.define(\"import-feeds\", $038088370be83852$var$ImportFeeds);\n\n\nfunction $94933cc6427541bd$export$c37129e465f64ef0(a) {\n return null !== a && \"object\" == typeof a ? \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(a) : \"share\" in navigator;\n}\n\n\n\n\nconst $4724280f8ebb5bb4$var$template = document.createElement(\"template\");\n$4724280f8ebb5bb4$var$template.innerHTML = /* html */ `\n \n\n
              \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
              \n\n
              \n
              \n
              \n
              \n
              \n\n \n`;\nclass $4724280f8ebb5bb4$var$ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($4724280f8ebb5bb4$var$template.content.cloneNode(true));\n }\n this.#exportCodeEl = this.shadowRoot.getElementById(\"exportCode\");\n this.#clipboardCopyEl = this.shadowRoot.querySelector(\"clipboard-copy\");\n this.#webShareEl = this.shadowRoot.querySelector(\"web-share\");\n this.#downloadButton = this.shadowRoot.getElementById(\"downloadButton\");\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feeds\"\n ];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"feeds\" && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n connectedCallback() {\n this.#downloadButton.addEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n disconnectedCallback() {\n this.#downloadButton.removeEventListener(\"click\", this.#handleDownloadButtonClick);\n }\n get feeds() {\n return this.getAttribute(\"feeds\");\n }\n set feeds(value) {\n this.setAttribute(\"feeds\", value);\n }\n #getFeedsToExportString() {\n let feedsToExport = \"\";\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n return feedsToExport;\n }\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([\n data\n ], {\n type: \"application/json\"\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n #handleDownloadButtonClick = async ()=>{\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n this.#exportFeeds(feeds);\n };\n}\nif (!window.customElements.get(\"export-feeds\")) window.customElements.define(\"export-feeds\", $4724280f8ebb5bb4$var$ExportFeeds);\n\n\nconst $d02789f57ae99481$var$template = document.createElement(\"template\");\n$d02789f57ae99481$var$template.innerHTML = /* html */ `\n \n\n
              \n
              \n
              \n \n \n \n \n \n\n \n\n \n
              \n\n
              \n \n\n \n\n \n
              \n
              \n\n
                \n
                \n\n
                \n

                \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

                \n\n

                \n \n

                \n
                \n\n \n

                Import feeds

                \n \n
                \n\n \n

                Export feeds

                \n \n
                \n`;\nclass $d02789f57ae99481$var$FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($d02789f57ae99481$var$template.content.cloneNode(true));\n }\n this.#isEditable = false;\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n this.#feedsContainerEl = this.shadowRoot.getElementById(\"feedsContainer\");\n this.#feedsListEl = this.shadowRoot.getElementById(\"feedsList\");\n this.#editBtn = this.shadowRoot.getElementById(\"editBtn\");\n this.#importBtn = this.shadowRoot.getElementById(\"importBtn\");\n this.#importAltBtn = this.shadowRoot.getElementById(\"importAltBtn\");\n this.#exportBtn = this.shadowRoot.getElementById(\"exportBtn\");\n this.#searchInput = this.shadowRoot.getElementById(\"searchInput\");\n this.#searchClearBtn = this.shadowRoot.getElementById(\"searchClearBtn\");\n this.#importDialog = this.shadowRoot.getElementById(\"importDialog\");\n this.#exportDialog = this.shadowRoot.getElementById(\"exportDialog\");\n this.#importFeedsEl = this.shadowRoot.querySelector(\"import-feeds\");\n this.#exportFeedsEl = this.shadowRoot.querySelector(\"export-feeds\");\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById(\"noFeedsDisclaimer\");\n }\n async connectedCallback() {\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n feeds.forEach((feed)=>this.#addFeed(feed));\n this.#toggleFeedsVisibility();\n this.#feedsListEl.addEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.addEventListener(\"click\", this.#handleEditRequest);\n this.#importAltBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#importBtn.addEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.addEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.addEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.addEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener(\"me-close\", this.#handleExportDialogClose);\n this.addEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.addEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n new (0, $da1f6dc1cffd4cb1$export$2e2bcd8739ae039)(this.#feedsListEl, {\n animation: 150,\n handle: \".sort-handler\",\n onEnd: async (evt)=>{\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll(\"li\"), (el)=>{\n return {\n url: el.getAttribute(\"data-url\"),\n title: el.getAttribute(\"data-title\") || \"\"\n };\n });\n await (0, $b36f6cb20f27a9a6$export$a8ce8a4ec117f05e)(feeds, false);\n }\n });\n }\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener(\"click\", this.#handleActionsClick);\n this.#editBtn.removeEventListener(\"click\", this.#handleEditRequest);\n this.#importBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#importAltBtn.removeEventListener(\"click\", this.#handleImportRequest);\n this.#exportBtn.removeEventListener(\"click\", this.#handleExportRequest);\n this.#searchInput.removeEventListener(\"input\", this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener(\"click\", this.#handleSearchClear);\n this.#importDialog.removeEventListener(\"me-open\", this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-open\", this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener(\"me-close\", this.#handleExportDialogClose);\n this.removeEventListener(\"feeds-imported\", this.#handleFeedsImported);\n document.removeEventListener(\"feeds-updated\", this.#handleFeedsUpdateSuccess);\n }\n #searchFeeds = (searchValue = \"\")=>{\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n if (feedEls.length === 0) return;\n feedEls.forEach((el)=>{\n const url = (el.getAttribute(\"data-url\") || \"\").toLowerCase();\n const title = (el.getAttribute(\"data-title\") || \"\").toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n #debounceSearchFeeds = (0, $f7942db15ba0cc81$export$61fc7d43ac8f84b0)(this.#searchFeeds, 250);\n #handleSearchInputDebounced = (evt)=>{\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle(\"d-none\", !value);\n return this.#debounceSearchFeeds(value);\n };\n #handleSearchClear = ()=>{\n this.#searchInput.value = \"\";\n this.#searchInput.dispatchEvent(new Event(\"input\"));\n };\n #handleEditRequest = (evt)=>{\n this.#isEditable = !this.#isEditable;\n evt.currentTarget.classList.toggle(\"active\");\n this.shadowRoot.querySelectorAll(\".sort-handler, .delete-button\").forEach((el)=>{\n el.hidden = !el.hidden;\n });\n };\n #handleImportRequest = ()=>{\n this.#importDialog.open = true;\n };\n #handleExportRequest = ()=>{\n this.#exportDialog.open = true;\n };\n #handleImportDialogOpen = ()=>{\n try {\n this.#importFeedsEl.shadowRoot.querySelector(\"a-tab-group\").selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector(\"textarea\").value = \"\";\n } catch {\n // Fail silently\n }\n };\n #handleExportDialogOpen = async ()=>{\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n this.#exportFeedsEl.setAttribute(\"feeds\", JSON.stringify(feeds));\n };\n #handleExportDialogClose = ()=>{\n this.#exportFeedsEl.removeAttribute(\"feeds\");\n };\n #handleFeedsImported = ()=>{\n this.#importDialog.open = false;\n };\n #handleFeedsUpdateSuccess = (evt)=>{\n if (evt.detail.action === \"delete\") this.#removeFeed(evt.detail.feed);\n if (evt.detail.action === \"create\") {\n this.#addFeed(evt.detail.feed);\n if (this.#searchInput.value) {\n this.#searchInput.value = \"\";\n this.#searchFeeds(\"\");\n }\n }\n if (evt.detail.action === \"update\") {\n const { url: url, title: title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n if (feedEl) {\n const linkContent = feedEl.querySelector(\".link-content\");\n feedEl.setAttribute(\"data-title\", title || \"\");\n if (linkContent) linkContent.innerHTML = title ? `${title}
                ${url}` : url;\n }\n }\n };\n #handleActionsClick = (evt)=>{\n const target = evt.target;\n const deleteBtn = target.closest(\"button.delete-button\");\n const linkEl = target.closest(\"a.link\");\n if (!linkEl && !deleteBtn) return;\n const feedItem = target.closest(\"li\");\n const feedUrl = feedItem.getAttribute(\"data-url\");\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) (0, $b36f6cb20f27a9a6$export$4e54c6fd9fa8b09b)(feedUrl);\n }\n if (linkEl) {\n evt.preventDefault();\n document.querySelector(\"feed-reader\").feedUrl = feedUrl;\n }\n };\n #addFeed(feed) {\n const { url: url, title: title } = feed;\n const link = document.createElement(\"a\");\n link.className = \"link text-decoration-none d-flex align-items-center h-100\";\n link.style.flex = \"1\";\n link.style.minWidth = 0;\n link.style.color = \"inherit\";\n link.href = url;\n const linkContent = document.createElement(\"div\");\n linkContent.className = \"text-truncate link-content\";\n linkContent.innerHTML = title ? `${title}
                ${url}` : url;\n const deleteButton = document.createElement(\"button\");\n deleteButton.type = \"button\";\n deleteButton.title = \"Delete feed\";\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = \"delete-button btn btn-default text-danger p-0\";\n deleteButton.style.lineHeight = \"1\";\n deleteButton.innerHTML = /* html */ `\n \n \n \n Delete\n `;\n const listItem = document.createElement(\"li\");\n listItem.className = \"list-group-item p-0 d-flex justify-content-between align-items-center\";\n listItem.style.height = \"var(--list-item-height)\";\n listItem.setAttribute(\"data-url\", url || \"\");\n listItem.setAttribute(\"data-title\", title || \"\");\n const sortHandler = document.createElement(\"div\");\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = \"sort-handler text-primary\";\n sortHandler.innerHTML = /* html */ `\n \n \n \n Reorder\n `;\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n this.#feedsListEl.appendChild(listItem);\n this.#toggleFeedsVisibility();\n }\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n this.#feedsContainerEl.classList.toggle(\"d-none\", feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle(\"d-none\", feeds.length > 0);\n }\n}\nif (!window.customElements.get(\"feeds-list\")) window.customElements.define(\"feeds-list\", $d02789f57ae99481$var$FeedsList);\n\n\n\nconst $0acd7cf489ccbd45$var$cache = new Map();\nconst $0acd7cf489ccbd45$export$5b107dfb127cada8 = async (url, requestOptions = {})=>{\n const cachedFeed = $0acd7cf489ccbd45$var$cache.get(url);\n if (cachedFeed) return cachedFeed;\n const res = await fetch(\"https://api.rss2json.com/v1/api.json?rss_url=\" + url, requestOptions);\n if (!res.ok) throw new Error(\"Error fetching data\");\n const json = await res.json();\n $0acd7cf489ccbd45$var$cache.set(url, json);\n return json;\n};\n\n\n\nlet $9af02a843127b0d7$var$controller;\nconst $9af02a843127b0d7$var$template = document.createElement(\"template\");\n$9af02a843127b0d7$var$template.innerHTML = /* html */ `\n \n\n \n

                \n\n

                \n\n
                \n
                \n \n Please wait...\n
                \n\n
                \n \n \n \n There was an error while fetching the feed.\n
                \n\n
                \n
                \n
                \n`;\nclass $9af02a843127b0d7$var$FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($9af02a843127b0d7$var$template.content.cloneNode(true));\n }\n this.#spinnerEl = this.shadowRoot.getElementById(\"spinner\");\n this.#dialogEl = this.shadowRoot.querySelector(\"modal-element\");\n this.#modalTitle = this.#dialogEl.querySelector(\"#feedTitle\");\n this.#feedsViewer = this.shadowRoot.getElementById(\"feedsViewer\");\n this.#errorEl = this.shadowRoot.getElementById(\"error\");\n this.shadowRoot.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\n }\n static get observedAttributes() {\n return [\n \"feed-url\"\n ];\n }\n attributeChangedCallback(name) {\n if (name === \"feed-url\") this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n connectedCallback() {\n this.#dialogEl.addEventListener(\"me-close\", this.#handleFeedClose);\n }\n disconnectedCallback() {\n this.#dialogEl.removeEventListener(\"me-close\", this.#handleFeedClose);\n }\n get feedUrl() {\n return this.getAttribute(\"feed-url\");\n }\n set feedUrl(value) {\n if (value) this.setAttribute(\"feed-url\", value);\n else this.removeAttribute(\"feed-url\");\n }\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n #handleFeedClose = ()=>{\n $9af02a843127b0d7$var$controller && $9af02a843127b0d7$var$controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll(\".card\").forEach((el)=>el.remove());\n this.#modalTitle.innerHTML = \"\";\n this.#spinnerEl.classList.add(\"d-none\");\n this.#errorEl.classList.add(\"d-none\");\n }\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove(\"d-none\");\n $9af02a843127b0d7$var$controller = new AbortController();\n try {\n const data = await (0, $0acd7cf489ccbd45$export$5b107dfb127cada8)(feedUrl, {\n signal: $9af02a843127b0d7$var$controller.signal\n });\n const { value: feeds = [] } = await (0, $b36f6cb20f27a9a6$export$4890c08c4ffbd57b)();\n const currentFeed = feeds.find((feed)=>feed.url === feedUrl);\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) await (0, $b36f6cb20f27a9a6$export$4b77448646caf424)({\n url: feedUrl,\n title: data.feed.title || \"\"\n });\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n data.items.forEach((item)=>{\n this.#feedsViewer.insertAdjacentHTML(\"beforeend\", this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n this.#modalTitle.textContent = \"\";\n this.#errorEl.classList.remove(\"d-none\");\n }\n } finally{\n this.#spinnerEl.classList.add(\"d-none\");\n }\n }\n #feedsReaderTemplate(item) {\n const { link: link, title: title, description: description, author: author, pubDate: pubDate, thumbnail: thumbnail } = item;\n let formattedDate = \"\";\n try {\n formattedDate = new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\"\n }).format(new Date(pubDate));\n } catch {\n formattedDate = \"-\";\n }\n return /* html */ `\n
                \n \n
                \n `;\n }\n}\nif (!window.customElements.get(\"feed-reader\")) window.customElements.define(\"feed-reader\", $9af02a843127b0d7$var$FeedReader);\n\n\ndocument.adoptedStyleSheets = (0, $053c683f8862b85c$export$4b9cd30c41328fdd);\ndocument.addEventListener(\"me-open\", ()=>document.body.classList.add(\"overflow-hidden\"));\ndocument.addEventListener(\"me-close\", ()=>document.body.classList.remove(\"overflow-hidden\"));\n\n})();\n//# sourceMappingURL=index.fdee3dc7.js.map\n","import '@georapbox/clipboard-copy-element/dist/clipboard-copy-defined.js';\nimport '@georapbox/web-share-element/dist/web-share-defined.js';\nimport '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';\nimport '@georapbox/a-tab-group/dist/a-tab-group.js';\nimport '@georapbox/modal-element/dist/modal-element-defined.js';\nimport 'construct-style-sheets-polyfill/dist/adoptedStyleSheets.js';\nimport { styleSheets } from './helpers/styles.js';\nimport './components/add-feed.js';\nimport './components/feeds-list.js';\nimport './components/feed-reader.js';\n\ndocument.adoptedStyleSheets = styleSheets;\ndocument.addEventListener('me-open', () => document.body.classList.add('overflow-hidden'));\ndocument.addEventListener('me-close', () => document.body.classList.remove('overflow-hidden'));\n","Object.defineProperty({},\"ClipboardCopy\",{get:function(){return i},set:void 0,enumerable:!0,configurable:!0});let t=\"clipboard-copy\",e=\"success\",o=\"error\",s=document.createElement(\"template\");s.innerHTML=`\n \n\n \n`;class i extends HTMLElement{#t=null;#e;#o;#s;#i;constructor(){super(),this.shadowRoot||(this.attachShadow({mode:\"open\"}),this.shadowRoot.appendChild(s.content.cloneNode(!0))),this.#e=this.shadowRoot.querySelector(\"button\"),this.#o=this.shadowRoot.querySelector('slot[name=\"copy\"]'),this.#s=this.shadowRoot.querySelector('slot[name=\"success\"]'),this.#i=this.shadowRoot.querySelector('slot[name=\"error\"]')}static get observedAttributes(){return[\"disabled\"]}connectedCallback(){this.#r(\"value\"),this.#r(\"from\"),this.#r(\"disabled\"),this.#r(\"feedbackDuration\"),this.#e.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#e.removeEventListener(\"click\",this.#n),this.#a()}attributeChangedCallback(t){\"disabled\"===t&&(this.#e.disabled=this.disabled,this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}get value(){return this.getAttribute(\"value\")}set value(t){this.setAttribute(\"value\",t)}get from(){return this.getAttribute(\"from\")}set from(t){this.setAttribute(\"from\",t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){t?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}get feedbackDuration(){return Number(this.getAttribute(\"feedback-duration\"))||1e3}set feedbackDuration(t){this.setAttribute(\"feedback-duration\",t)}async #l(){if(this.value||this.from)try{let o=\"\";if(this.value)o=this.value;else if(this.from){let t=\"getRootNode\"in Element.prototype?this.#e.getRootNode({composed:!0}):this.#e.ownerDocument;if(!t||!(t instanceof Document||t instanceof ShadowRoot))return;let e=t.querySelector(this.from);if(!e)return;o=e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement?e.value:e instanceof HTMLAnchorElement&&e.hasAttribute(\"href\")?e.href:e.textContent}await navigator.clipboard.writeText(o),this.#d(e),this.dispatchEvent(new CustomEvent(`${t}-success`,{bubbles:!0,composed:!0,detail:{value:o}}))}catch(e){this.#d(o),this.dispatchEvent(new CustomEvent(`${t}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}#n=t=>{t.preventDefault(),this.disabled||this.#t||this.#l()};#d(t){this.#o.hidden=!0,this.#s.hidden=t!==e,this.#i.hidden=t!==o,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\"),this.#e.part.add(`button--${t}`),this.#t&&clearTimeout(this.#t),this.#t=setTimeout(()=>{this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(`button--${t}`),this.#t=null},this.feedbackDuration)}#a(){this.#t&&clearTimeout(this.#t),this.#t=null,this.#o.hidden=!1,this.#s.hidden=!0,this.#i.hidden=!0,this.#e.part.remove(\"button--success\"),this.#e.part.remove(\"button--error\")}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(e=t){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,i)}}i.defineCustomElement();export{i as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $a4c1285108bf4a9d$exports = {};\n\n$parcel$export($a4c1285108bf4a9d$exports, \"ClipboardCopy\", function () { return $a4c1285108bf4a9d$export$ea3b71af1761ff40; });\nconst $a4c1285108bf4a9d$var$COMPONENT_NAME = \"clipboard-copy\";\nconst $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION = 1000;\nconst $a4c1285108bf4a9d$var$SUCCESS_STATUS = \"success\";\nconst $a4c1285108bf4a9d$var$ERROR_STATUS = \"error\";\nconst $a4c1285108bf4a9d$var$template = document.createElement(\"template\");\n$a4c1285108bf4a9d$var$template.innerHTML = /* html */ `\n \n\n \n`;\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */ class $a4c1285108bf4a9d$export$ea3b71af1761ff40 extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n constructor(){\n super();\n if (!this.shadowRoot) {\n this.attachShadow({\n mode: \"open\"\n });\n this.shadowRoot.appendChild($a4c1285108bf4a9d$var$template.content.cloneNode(true));\n }\n this.#buttonEl = this.shadowRoot.querySelector(\"button\");\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n static get observedAttributes() {\n return [\n \"disabled\"\n ];\n }\n connectedCallback() {\n this.#upgradeProperty(\"value\");\n this.#upgradeProperty(\"from\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"feedbackDuration\");\n this.#buttonEl.addEventListener(\"click\", this.#handleClick);\n }\n disconnectedCallback() {\n this.#buttonEl.removeEventListener(\"click\", this.#handleClick);\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n attributeChangedCallback(name) {\n if (name === \"disabled\") {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute(\"aria-disabled\", this.disabled.toString());\n if (this.#buttonEl.part.contains(\"button\")) this.#buttonEl.part.toggle(\"button--disabled\", this.disabled);\n }\n }\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */ get value() {\n return this.getAttribute(\"value\");\n }\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */ set value(value) {\n this.setAttribute(\"value\", value);\n }\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */ get from() {\n return this.getAttribute(\"from\");\n }\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */ set from(value) {\n this.setAttribute(\"from\", value);\n }\n /**\n * Getter for the disabled state.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */ set disabled(value) {\n if (value) this.setAttribute(\"disabled\", \"\");\n else this.removeAttribute(\"disabled\");\n }\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */ get feedbackDuration() {\n return Number(this.getAttribute(\"feedback-duration\")) || $a4c1285108bf4a9d$var$DEFAULT_FEEDBACK_DURATION;\n }\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */ set feedbackDuration(value) {\n this.setAttribute(\"feedback-duration\", value);\n }\n /**\n * Copies the value to the clipboard and handles success or error states.\n */ async #copy() {\n if (!this.value && !this.from) return;\n try {\n let copyValue = \"\";\n if (this.value) copyValue = this.value;\n else if (this.from) {\n const root = \"getRootNode\" in Element.prototype ? this.#buttonEl.getRootNode({\n composed: true\n }) : this.#buttonEl.ownerDocument;\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) return;\n const element = root.querySelector(this.from);\n if (!element) return;\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) copyValue = element.value;\n else if (element instanceof HTMLAnchorElement && element.hasAttribute(\"href\")) copyValue = element.href;\n else copyValue = element.textContent;\n }\n await navigator.clipboard.writeText(copyValue);\n this.#showStatus($a4c1285108bf4a9d$var$SUCCESS_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: {\n value: copyValue\n }\n }));\n } catch (error) {\n this.#showStatus($a4c1285108bf4a9d$var$ERROR_STATUS);\n this.dispatchEvent(new CustomEvent(`${$a4c1285108bf4a9d$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n }\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */ #handleClick = (evt)=>{\n evt.preventDefault();\n if (this.disabled || this.#timeout) return;\n this.#copy();\n };\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */ #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== $a4c1285108bf4a9d$var$SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== $a4c1285108bf4a9d$var$ERROR_STATUS;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n this.#buttonEl.part.add(`button--${status}`);\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = setTimeout(()=>{\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(`button--${status}`);\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */ #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n this.#buttonEl.part.remove(\"button--success\");\n this.#buttonEl.part.remove(\"button--error\");\n }\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */ #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */ static defineCustomElement(elementName = $a4c1285108bf4a9d$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $a4c1285108bf4a9d$export$ea3b71af1761ff40);\n }\n}\n\n\n(0, $a4c1285108bf4a9d$export$ea3b71af1761ff40).defineCustomElement();\n\n\nexport {$a4c1285108bf4a9d$export$ea3b71af1761ff40 as ClipboardCopy};\n//# sourceMappingURL=clipboard-copy-defined.js.map\n","import { ClipboardCopy } from './clipboard-copy.js';\n\nClipboardCopy.defineCustomElement();\n\nexport { ClipboardCopy };\n","const COMPONENT_NAME = 'clipboard-copy';\nconst DEFAULT_FEEDBACK_DURATION = 1000;\nconst SUCCESS_STATUS = 'success';\nconst ERROR_STATUS = 'error';\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n`;\n\n/**\n * A custom element for copying text to the clipboard.\n * @extends HTMLElement\n */\nclass ClipboardCopy extends HTMLElement {\n #timeout = null;\n #buttonEl;\n #copySlot;\n #successSlot;\n #errorSlot;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonEl = this.shadowRoot.querySelector('button');\n this.#copySlot = this.shadowRoot.querySelector('slot[name=\"copy\"]');\n this.#successSlot = this.shadowRoot.querySelector('slot[name=\"success\"]');\n this.#errorSlot = this.shadowRoot.querySelector('slot[name=\"error\"]');\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n connectedCallback() {\n this.#upgradeProperty('value');\n this.#upgradeProperty('from');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('feedbackDuration');\n\n this.#buttonEl.addEventListener('click', this.#handleClick);\n }\n\n disconnectedCallback() {\n this.#buttonEl.removeEventListener('click', this.#handleClick);\n\n // `disconnectedCallback` is also called when the element is moved to a different document,\n // via `Document: adoptNode()` method, therefore we reset the component to its initial state.\n this.#forceResetStatus();\n }\n\n attributeChangedCallback(name) {\n if (name === 'disabled') {\n this.#buttonEl.disabled = this.disabled;\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Getter for the value to copy.\n * @returns {string | null}\n */\n get value() {\n return this.getAttribute('value');\n }\n\n /**\n * Setter for the value to copy.\n * @param {string} value - The value to copy.\n */\n set value(value) {\n this.setAttribute('value', value);\n }\n\n /**\n * Getter for the CSS selector of the element to copy from.\n * @returns {string | null}\n */\n get from() {\n return this.getAttribute('from');\n }\n\n /**\n * Setter for the CSS selector of the element to copy from.\n * @param {string} value - The value of the CSS selector.\n */\n set from(value) {\n this.setAttribute('from', value);\n }\n\n /**\n * Getter for the disabled state.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Setter for the disabled state.\n * @param {boolean} value - The value of the disabled state.\n */\n set disabled(value) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Getter for the duration for displaying the success or error status.\n * If the value is not a number, the default value is used.\n * @returns {number}\n */\n get feedbackDuration() {\n return Number(this.getAttribute('feedback-duration')) || DEFAULT_FEEDBACK_DURATION;\n }\n\n /**\n * Setter for the duration for displaying the success or error status.\n * @param {number} value - The value of the duration.\n */\n set feedbackDuration(value) {\n this.setAttribute('feedback-duration', value);\n }\n\n /**\n * Copies the value to the clipboard and handles success or error states.\n */\n async #copy() {\n if (!this.value && !this.from) {\n return;\n }\n\n try {\n let copyValue = '';\n\n if (this.value) {\n copyValue = this.value;\n } else if (this.from) {\n const root = 'getRootNode' in Element.prototype\n ? this.#buttonEl.getRootNode({ composed: true })\n : this.#buttonEl.ownerDocument;\n\n if (!root || !(root instanceof Document || root instanceof ShadowRoot)) {\n return;\n }\n\n const element = root.querySelector(this.from);\n\n if (!element) {\n return;\n }\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n copyValue = element.value;\n } else if (element instanceof HTMLAnchorElement && element.hasAttribute('href')) {\n copyValue = element.href;\n } else {\n copyValue = element.textContent;\n }\n }\n\n await navigator.clipboard.writeText(copyValue);\n\n this.#showStatus(SUCCESS_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-success`, {\n bubbles: true,\n composed: true,\n detail: { value: copyValue }\n }));\n } catch (error) {\n this.#showStatus(ERROR_STATUS);\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the button click event.\n * @param {MouseEvent} evt - The click event.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled || this.#timeout) {\n return;\n }\n\n this.#copy();\n };\n\n /**\n * Displays the success or error status.\n * @param {string} status - The status to display.\n */\n #showStatus(status) {\n this.#copySlot.hidden = true;\n this.#successSlot.hidden = status !== SUCCESS_STATUS;\n this.#errorSlot.hidden = status !== ERROR_STATUS;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n this.#buttonEl.part.add(`button--${status}`);\n\n this.#timeout && clearTimeout(this.#timeout);\n\n this.#timeout = setTimeout(() => {\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove(`button--${status}`);\n\n this.#timeout = null;\n }, this.feedbackDuration);\n }\n\n /**\n * Resets the status to the initial state.\n * Clears the feedback timeout, hides the success or error slots and shows the copy slot.\n */\n #forceResetStatus() {\n this.#timeout && clearTimeout(this.#timeout);\n this.#timeout = null;\n\n this.#copySlot.hidden = false;\n this.#successSlot.hidden = true;\n this.#errorSlot.hidden = true;\n\n this.#buttonEl.part.remove('button--success');\n this.#buttonEl.part.remove('button--error');\n }\n\n /**\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n * This is to safe guard against cases where, for instance, a framework may have added the element\n * to the page and set a value on one of its properties, but lazy loaded its definition.\n * Without this guard, the upgraded element would miss that property and the instance property\n * would prevent the class property setter from ever being called.\n * @param {string} prop - The property name.\n */\n #upgradeProperty(prop) {\n if (Object.prototype.hasOwnProperty.call(this, prop)) {\n const value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * Registers the custom element to custom elements registry.\n * @param {string} [elementName] - The name of the custom element.\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ClipboardCopy);\n }\n }\n}\n\nexport { ClipboardCopy };\n","Object.defineProperty({},\"WebShare\",{get:function(){return s},set:void 0,enumerable:!0,configurable:!0});let t=`\n :host {\n display: inline-block;\n }\n`,e=document.createElement(\"template\");e.innerHTML=`\n \n \n`;class s extends HTMLElement{#t;#e;#s=[];constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(e.content.cloneNode(!0)),this.#t=this.shadowRoot?.querySelector('slot[name=\"button\"]')||null,this.#e=this.#i()}static get observedAttributes(){return[\"disabled\"]}attributeChangedCallback(t,e,s){\"disabled\"===t&&e!==s&&this.#e&&(this.#e.toggleAttribute(\"disabled\",this.disabled),this.#e.setAttribute(\"aria-disabled\",this.disabled.toString()),this.#e.part&&this.#e.part.contains(\"button\")&&this.#e.part.toggle(\"button--disabled\",this.disabled))}connectedCallback(){this.#r(\"shareUrl\"),this.#r(\"shareTitle\"),this.#r(\"shareText\"),this.#r(\"shareFiles\"),this.#r(\"disabled\"),this.#t?.addEventListener(\"slotchange\",this.#a),this.#e?.addEventListener(\"click\",this.#n)}disconnectedCallback(){this.#t?.removeEventListener(\"slotchange\",this.#a),this.#e?.removeEventListener(\"click\",this.#n)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get shareUrl(){return this.getAttribute(\"share-url\")||\"\"}set shareUrl(t){this.setAttribute(\"share-url\",t)}get shareTitle(){return this.getAttribute(\"share-title\")||\"\"}set shareTitle(t){this.setAttribute(\"share-title\",t)}get shareText(){return this.getAttribute(\"share-text\")||\"\"}set shareText(t){this.setAttribute(\"share-text\",t)}get shareFiles(){return this.#s}set shareFiles(t){Array.isArray(t)&&t.length>0&&(this.#s=t)}async share(){if(!this.disabled)try{let t={};this.shareUrl&&(t.url=this.shareUrl),this.shareTitle&&(t.title=this.shareTitle),this.shareText&&(t.text=this.shareText),Array.isArray(this.shareFiles)&&this.shareFiles.length>0&&navigator.canShare&&navigator.canShare({files:this.shareFiles})&&(t.files=this.shareFiles),await navigator.share(t),this.dispatchEvent(new CustomEvent(\"web-share:success\",{bubbles:!0,composed:!0,detail:{shareData:t}}))}catch(t){if(t instanceof Error&&\"AbortError\"===t.name){this.dispatchEvent(new CustomEvent(\"web-share:abort\",{bubbles:!0,composed:!0,detail:{error:t}}));return}this.dispatchEvent(new CustomEvent(\"web-share:error\",{bubbles:!0,composed:!0,detail:{error:t}}))}}#n=t=>{t.preventDefault(),this.disabled||this.share()};#a=t=>{t.target&&\"button\"===t.target.name&&(this.#e?.removeEventListener(\"click\",this.#n),this.#e=this.#i(),this.#e&&(this.#e.addEventListener(\"click\",this.#n),\"BUTTON\"===this.#e.nodeName||this.#e.hasAttribute(\"role\")||this.#e.setAttribute(\"role\",\"button\")))};#i(){return this.#t&&this.#t.assignedElements({flatten:!0}).find(t=>\"BUTTON\"===t.nodeName||\"button\"===t.getAttribute(\"slot\"))||null}#r(t){if(Object.prototype.hasOwnProperty.call(this,t)){let e=this[t];delete this[t],this[t]=e}}static defineCustomElement(t=\"web-share\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,s)}}s.defineCustomElement();export{s as WebShare};\n//# sourceMappingURL=web-share-defined.js.map\n","// @ts-check\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */ function $442be162a818aed4$export$c37129e465f64ef0(options) {\n if (options !== null && typeof options === \"object\") return \"share\" in navigator && \"canShare\" in navigator && navigator.canShare(options);\n return \"share\" in navigator;\n}\n\n\nexport {$442be162a818aed4$export$c37129e465f64ef0 as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","import { WebShare } from './web-share.js';\n\nWebShare.defineCustomElement();\n\nexport { WebShare };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/**\n * Represents the data to share.\n *\n * @typedef {Object} ShareData\n * @property {string} [url] - The URL to share.\n * @property {string} [title] - The title to share.\n * @property {string} [text] - The text to share.\n * @property {File[]} [files] - The files to share.\n */\n\nconst styles = /* css */`\n :host {\n display: inline-block;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */ `\n \n \n`;\n\n/**\n * @summary A custom element that provides a button to share content.\n * @documentation https://github.com/georapbox/web-share-element\n *\n * @tagname web-share - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {boolean} disabled - Indicates whether the button is disabled.\n * @property {string} shareUrl - The URL to share.\n * @property {string} shareTitle - The title to share.\n * @property {string} shareText - The text to share.\n * @property {File[]} shareFiles - The files to share.\n *\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {string} share-url - Reflects the shareUrl property.\n * @attribute {string} share-title - Reflects the shareTitle property.\n * @attribute {string} share-text - Reflects the shareText property.\n *\n * @slot button - The button to share content.\n * @slot button-content - The content of the button to share content.\n *\n * @csspart button - The button to share content.\n * @csspart button--disabled - The button to share content when disabled.\n *\n * @event web-share:success - Fired when the share operation is successful.\n * @event web-share:abort - Fired when the share operation is aborted.\n * @event web-share:error - Fired when the share operation fails.\n *\n * @method defineCustomElement - Static method. Defines the custom element with the given name.\n * @method share - Instance method. Shares the shareable data taken from the element's properties.\n */\nclass WebShare extends HTMLElement {\n /** @type {Nullable} */\n #buttonSlot;\n\n /** @type {Nullable} */\n #buttonEl;\n\n /** @type {File[]} */\n #files = [];\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#buttonSlot = this.shadowRoot?.querySelector('slot[name=\"button\"]') || null;\n this.#buttonEl = this.#getButton();\n }\n\n static get observedAttributes() {\n return ['disabled'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'disabled' && oldValue !== newValue && this.#buttonEl) {\n this.#buttonEl.toggleAttribute('disabled', this.disabled);\n this.#buttonEl.setAttribute('aria-disabled', this.disabled.toString());\n\n if (this.#buttonEl.part && this.#buttonEl.part.contains('button')) {\n this.#buttonEl.part.toggle('button--disabled', this.disabled);\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('shareUrl');\n this.#upgradeProperty('shareTitle');\n this.#upgradeProperty('shareText');\n this.#upgradeProperty('shareFiles');\n this.#upgradeProperty('disabled');\n\n this.#buttonSlot?.addEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.addEventListener('click', this.#handleClick);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#buttonSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n }\n\n /**\n * @type {boolean} - Indicates whether the button is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {string} - The URL to share.\n * @attribute share-url - Reflects the shareUrl property.\n */\n get shareUrl() {\n return this.getAttribute('share-url') || '';\n }\n\n set shareUrl(value) {\n this.setAttribute('share-url', value);\n }\n\n /**\n * @type {string} - The title to share.\n * @attribute share-title - Reflects the shareTitle property.\n */\n get shareTitle() {\n return this.getAttribute('share-title') || '';\n }\n\n set shareTitle(value) {\n this.setAttribute('share-title', value);\n }\n\n /**\n * @type {string} - The text to share.\n * @attribute share-text - Reflects the shareText property.\n */\n get shareText() {\n return this.getAttribute('share-text') || '';\n }\n\n set shareText(value) {\n this.setAttribute('share-text', value);\n }\n\n /**\n * @type {File[]} - The files to share.\n */\n get shareFiles() {\n return this.#files;\n }\n\n set shareFiles(value) {\n if (Array.isArray(value) && value.length > 0) {\n this.#files = value;\n }\n }\n\n /**\n * Shares the shareable data taken from the element's properties.\n *\n * @returns {Promise} - A promise that resolves when the share operation is complete.\n */\n async share() {\n if (this.disabled) {\n return;\n }\n\n try {\n /** @type {ShareData} */\n const shareData = {};\n\n if (this.shareUrl) {\n shareData.url = this.shareUrl;\n }\n\n if (this.shareTitle) {\n shareData.title = this.shareTitle;\n }\n\n if (this.shareText) {\n shareData.text = this.shareText;\n }\n\n if (\n Array.isArray(this.shareFiles)\n && this.shareFiles.length > 0\n && navigator.canShare\n && navigator.canShare({ files: this.shareFiles })\n ) {\n shareData.files = this.shareFiles;\n }\n\n await navigator.share(shareData);\n\n this.dispatchEvent(new CustomEvent('web-share:success', {\n bubbles: true,\n composed: true,\n detail: { shareData }\n }));\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('web-share:abort', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n\n return;\n }\n\n this.dispatchEvent(new CustomEvent('web-share:error', {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n }\n\n /**\n * Handles the click event on the button.\n *\n * @param {any} evt - The event object.\n */\n #handleClick = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n this.share();\n };\n\n /**\n * Handles the slotchange event on the button slot.\n *\n * @param {any} evt - The event object.\n */\n #handleSlotChange = evt => {\n if (evt.target && evt.target.name === 'button') {\n this.#buttonEl?.removeEventListener('click', this.#handleClick);\n this.#buttonEl = this.#getButton();\n\n if (this.#buttonEl) {\n this.#buttonEl.addEventListener('click', this.#handleClick);\n\n if (this.#buttonEl.nodeName !== 'BUTTON' && !this.#buttonEl.hasAttribute('role')) {\n this.#buttonEl.setAttribute('role', 'button');\n }\n }\n }\n };\n\n /**\n * Returns the button element from the button slot.\n *\n * @returns {Nullable} - The button element.\n */\n #getButton() {\n if (!this.#buttonSlot) {\n return null;\n }\n\n return this.#buttonSlot.assignedElements({ flatten: true }).find(el => {\n return el.nodeName === 'BUTTON' || el.getAttribute('slot') === 'button';\n }) || null;\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'shareUrl' | 'shareTitle' | 'shareText' | 'shareFiles' | 'disabled'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n static defineCustomElement(elementName = 'web-share') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, WebShare);\n }\n }\n}\n\nexport { WebShare };\n","Object.defineProperty({},\"FilesDropzone\",{get:function(){return m},set:void 0,enumerable:!0,configurable:!0});let e=new Map([[\"aac\",\"audio/aac\"],[\"abw\",\"application/x-abiword\"],[\"arc\",\"application/x-freearc\"],[\"avif\",\"image/avif\"],[\"avi\",\"video/x-msvideo\"],[\"azw\",\"application/vnd.amazon.ebook\"],[\"bin\",\"application/octet-stream\"],[\"bmp\",\"image/bmp\"],[\"bz\",\"application/x-bzip\"],[\"bz2\",\"application/x-bzip2\"],[\"cda\",\"application/x-cdf\"],[\"csh\",\"application/x-csh\"],[\"css\",\"text/css\"],[\"csv\",\"text/csv\"],[\"doc\",\"application/msword\"],[\"docx\",\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],[\"eot\",\"application/vnd.ms-fontobject\"],[\"epub\",\"application/epub+zip\"],[\"gz\",\"application/gzip\"],[\"gif\",\"image/gif\"],[\"heic\",\"image/heic\"],[\"heif\",\"image/heif\"],[\"htm\",\"text/html\"],[\"html\",\"text/html\"],[\"ico\",\"image/vnd.microsoft.icon\"],[\"ics\",\"text/calendar\"],[\"jar\",\"application/java-archive\"],[\"jpeg\",\"image/jpeg\"],[\"jpg\",\"image/jpeg\"],[\"jxl\",\"image/jxl\"],[\"js\",\"text/javascript\"],[\"json\",\"application/json\"],[\"jsonld\",\"application/ld+json\"],[\"markdown\",\"text/markdown\"],[\"md\",\"text/markdown\"],[\"mid\",\"audio/midi\"],[\"midi\",\"audio/midi\"],[\"mjs\",\"text/javascript\"],[\"mp3\",\"audio/mpeg\"],[\"mp4\",\"video/mp4\"],[\"mpeg\",\"video/mpeg\"],[\"mpkg\",\"application/vnd.apple.installer+xml\"],[\"odp\",\"application/vnd.oasis.opendocument.presentation\"],[\"ods\",\"application/vnd.oasis.opendocument.spreadsheet\"],[\"odt\",\"application/vnd.oasis.opendocument.text\"],[\"oga\",\"audio/ogg\"],[\"ogv\",\"video/ogg\"],[\"ogx\",\"application/ogg\"],[\"opus\",\"audio/opus\"],[\"otf\",\"font/otf\"],[\"png\",\"image/png\"],[\"pdf\",\"application/pdf\"],[\"php\",\"application/x-httpd-php\"],[\"ppt\",\"application/vnd.ms-powerpoint\"],[\"pptx\",\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"],[\"rar\",\"application/vnd.rar\"],[\"rtf\",\"application/rtf\"],[\"sh\",\"application/x-sh\"],[\"svg\",\"image/svg+xml\"],[\"swf\",\"application/x-shockwave-flash\"],[\"tar\",\"application/x-tar\"],[\"tif\",\"image/tiff\"],[\"tiff\",\"image/tiff\"],[\"ts\",\"video/mp2t\"],[\"ttf\",\"font/ttf\"],[\"txt\",\"text/plain\"],[\"vsd\",\"application/vnd.visio\"],[\"wav\",\"audio/wav\"],[\"weba\",\"audio/webm\"],[\"webm\",\"video/webm\"],[\"webp\",\"image/webp\"],[\"woff\",\"font/woff\"],[\"woff2\",\"font/woff2\"],[\"xhtml\",\"application/xhtml+xml\"],[\"xls\",\"application/vnd.ms-excel\"],[\"xlsx\",\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],[\"xml\",\"application/xml\"],[\"xul\",\"application/vnd.mozilla.xul+xml\"],[\"zip\",\"application/zip\"],[\"7z\",\"application/x-7z-compressed\"],[\"mkv\",\"video/x-matroska\"],[\"mov\",\"video/quicktime\"],[\"msg\",\"application/vnd.ms-outlook\"]]),t=[\".DS_Store\",\"Thumbs.db\"],o=t=>{let{name:o}=t;if(o&&-1!==o.lastIndexOf(\".\")&&!t.type){let i=(o.split(\".\").pop()||\"\").toLowerCase(),r=e.get(i);r&&Object.defineProperty(t,\"type\",{value:r,writable:!1,configurable:!1,enumerable:!0})}return t},i=(e,t)=>{let i=o(e);if(\"string\"!=typeof i.path){let{webkitRelativePath:o}=e;Object.defineProperty(i,\"path\",{value:\"string\"==typeof t?t:o||e.name,writable:!1,configurable:!1,enumerable:!0})}return i},r=async e=>await new Promise((t,o)=>{e.readEntries(t,o)}),a=async e=>{let t=[],o=await r(e);for(;o.length>0;)t.push(...o),o=await r(e);return t},n=e=>new Promise((t,o)=>{e.file(o=>t(i(o,e.fullPath)),o)}),s=async e=>{let o=[],i=[];for(let t of e){if(\"file\"!==t.kind)continue;let e=t.getAsEntry?t.getAsEntry():t.webkitGetAsEntry();i.push(e)}for(;i.length>0;){let e=i.shift();if(e){if(e.isFile){let i=await n(e);-1===t.indexOf(i.name)&&o.push(i)}else e.isDirectory&&i.push(...await a(e.createReader()))}}return o},d=async e=>{let o=[];for(let r of e)-1===t.indexOf(r.name)&&o.push(i(r));return o},l=async e=>e.dataTransfer?e.dataTransfer.items?await s(e.dataTransfer.items):await d(e.dataTransfer.files):await d(e.target.files),p=\"files-dropzone\",c=\"TOO_MANY_FILES\",h=document.createElement(\"template\"),u=`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;h.innerHTML=`\n \n\n \n\n
                \n Drag 'n' drop files here, or click to select files\n
                \n`;class m extends HTMLElement{#e=null;#t=null;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\",delegatesFocus:!0}).appendChild(h.content.cloneNode(!0)),this.shadowRoot&&(this.#e=this.shadowRoot.getElementById(\"file-input\"),this.#t=this.shadowRoot.getElementById(\"dropzone\"))}static get observedAttributes(){return[\"accept\",\"disabled\",\"multiple\"]}attributeChangedCallback(e,t,o){\"accept\"===e&&t!==o&&this.#e&&(this.#e.accept=this.accept),\"disabled\"===e&&t!==o&&this.#e&&(this.#e.disabled=this.disabled,this.disabled?(this.#t?.removeAttribute(\"tabindex\"),this.#t?.setAttribute(\"aria-disabled\",\"true\")):(this.#t?.setAttribute(\"tabindex\",\"0\"),this.#t?.setAttribute(\"aria-disabled\",\"false\"))),\"multiple\"===e&&t!==o&&this.#e&&(this.#e.multiple=this.multiple)}connectedCallback(){this.#o(\"accept\"),this.#o(\"disabled\"),this.#o(\"maxFiles\"),this.#o(\"maxSize\"),this.#o(\"minSize\"),this.#o(\"multiple\"),this.#o(\"autoFocus\"),this.#o(\"noStyle\"),this.#e?.addEventListener(\"change\",this.#i),this.#t?.addEventListener(\"dragenter\",this.#r),this.#t?.addEventListener(\"dragover\",this.#a),this.#t?.addEventListener(\"dragleave\",this.#n),this.#t?.addEventListener(\"drop\",this.#s),this.#t?.addEventListener(\"click\",this.#d),this.#t?.addEventListener(\"keyup\",this.#l),this.autoFocus&&this.#t?.focus()}disconnectedCallback(){this.#e?.removeEventListener(\"change\",this.#i),this.#t?.removeEventListener(\"dragenter\",this.#r),this.#t?.removeEventListener(\"dragover\",this.#a),this.#t?.removeEventListener(\"dragleave\",this.#n),this.#t?.removeEventListener(\"drop\",this.#s),this.#t?.removeEventListener(\"click\",this.#d),this.#t?.removeEventListener(\"keyup\",this.#l)}get accept(){return this.getAttribute(\"accept\")||\"\"}set accept(e){this.setAttribute(\"accept\",null!=e?e.toString():e)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(e){this.toggleAttribute(\"disabled\",!!e)}get maxFiles(){let e=Number(this.getAttribute(\"max-files\"))||0;return e<=0?1/0:Math.floor(Math.abs(e))}set maxFiles(e){this.setAttribute(\"max-files\",null!=e?e.toString():e)}get maxSize(){let e=this.getAttribute(\"max-size\");if(null===e)return 1/0;let t=Number(e);return Number.isNaN(t)?1/0:t}set maxSize(e){this.setAttribute(\"max-size\",null!=e?e.toString():e)}get minSize(){let e=this.getAttribute(\"min-size\");if(null===e)return 0;let t=Number(e);return Number.isNaN(t)?0:t}set minSize(e){this.setAttribute(\"min-size\",null!=e?e.toString():e)}get multiple(){return this.hasAttribute(\"multiple\")}set multiple(e){this.toggleAttribute(\"multiple\",!!e)}get autoFocus(){return this.hasAttribute(\"auto-focus\")}set autoFocus(e){this.toggleAttribute(\"auto-focus\",!!e)}get noStyle(){return this.hasAttribute(\"no-style\")}set noStyle(e){this.toggleAttribute(\"no-style\",!!e)}#i=async e=>{try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}};#r=()=>{this.disabled||this.dispatchEvent(new Event(`${p}-dragenter`,{bubbles:!0,composed:!0}))};#a=e=>{if(e.preventDefault(),this.disabled){e.dataTransfer.dropEffect=\"none\";return}e.dataTransfer.dropEffect=\"copy\",this.#t&&(this.#t.classList.add(\"dropzone--dragover\"),this.#t.part.add(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragover`,{bubbles:!0,composed:!0}))};#n=()=>{this.disabled||(this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\")),this.dispatchEvent(new Event(`${p}-dragleave`,{bubbles:!0,composed:!0})))};#s=async e=>{if(!this.disabled){e.preventDefault(),this.#t&&(this.#t.classList.remove(\"dropzone--dragover\"),this.#t.part.remove(\"dropzone--dragover\"));try{this.#p(await l(e))}catch(e){this.dispatchEvent(new CustomEvent(`${p}-error`,{bubbles:!0,composed:!0,detail:{error:e}}))}}};#d=()=>{this.disabled||this.#e?.click()};#l=e=>{this.disabled||\" \"!==e.key&&\"Enter\"!==e.key||this.#e?.click()};#p(e){if(!Array.isArray(e)||!e.length)return;let t=[],o=[],i=e.length;if(!this.multiple&&i>1)for(let t of e)o.push({file:t,errors:[{code:c,message:\"Too many files selected. Only 1 file is allowed.\"}]});else if(this.multiple&&i>this.maxFiles)for(let t of e)o.push({file:t,errors:[{code:c,message:`Too many files selected. Only ${this.maxFiles} ${this.maxFiles>1?\"files are\":\"file is\"} allowed.`}]});else for(let i of e){let e=function(e,t=\"\"){if(!t)return!0;let o=[...new Set(t.split(\",\").map(e=>e.trim()).filter(Boolean))],i=e.type,r=i.replace(/\\/.*$/,\"\");for(let t of o)if(\".\"===t.charAt(0)){if(-1!==e.name.toLowerCase().indexOf(t.toLowerCase(),e.name.length-t.length))return!0}else if(/\\/\\*$/.test(t)){if(r===t.replace(/\\/.*$/,\"\"))return!0}else if(i===t)return!0;return!1}(i,this.accept),r=i.size>this.maxSize,a=i.size0&&this.dispatchEvent(new CustomEvent(`${p}-drop-accepted`,{bubbles:!0,composed:!0,detail:{acceptedFiles:t}})),o.length>0&&this.dispatchEvent(new CustomEvent(`${p}-drop-rejected`,{bubbles:!0,composed:!0,detail:{rejectedFiles:o}})),this.#e&&(this.#e.value=this.#e.defaultValue)}openFileDialog(){this.disabled||this.#e?.click()}#o(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}static defineCustomElement(e=p){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,m)}}m.defineCustomElement();export{m as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $862aa3736b0514bc$exports = {};\n\n$parcel$export($862aa3736b0514bc$exports, \"FilesDropzone\", function () { return $862aa3736b0514bc$export$6ccd1735166caad9; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ // @ts-check\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */ function $38f222170fd4d21a$export$7c47054fed488f80(file, acceptedTypeSpecifiers = \"\") {\n if (!acceptedTypeSpecifiers) return true;\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(\",\").map((v)=>v.trim()).filter(Boolean))\n ];\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, \"\");\n for (const validType of acceptedMimeTypesList){\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) return true;\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) return true;\n } else {\n if (fileMimeType === validType) return true;\n }\n }\n return false;\n}\n\n\n// @ts-check\n/**\n * A map of common file extensions and their associated MIME types.\n */ const $f31161edf38949e9$var$COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n [\n \"aac\",\n \"audio/aac\"\n ],\n [\n \"abw\",\n \"application/x-abiword\"\n ],\n [\n \"arc\",\n \"application/x-freearc\"\n ],\n [\n \"avif\",\n \"image/avif\"\n ],\n [\n \"avi\",\n \"video/x-msvideo\"\n ],\n [\n \"azw\",\n \"application/vnd.amazon.ebook\"\n ],\n [\n \"bin\",\n \"application/octet-stream\"\n ],\n [\n \"bmp\",\n \"image/bmp\"\n ],\n [\n \"bz\",\n \"application/x-bzip\"\n ],\n [\n \"bz2\",\n \"application/x-bzip2\"\n ],\n [\n \"cda\",\n \"application/x-cdf\"\n ],\n [\n \"csh\",\n \"application/x-csh\"\n ],\n [\n \"css\",\n \"text/css\"\n ],\n [\n \"csv\",\n \"text/csv\"\n ],\n [\n \"doc\",\n \"application/msword\"\n ],\n [\n \"docx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ],\n [\n \"eot\",\n \"application/vnd.ms-fontobject\"\n ],\n [\n \"epub\",\n \"application/epub+zip\"\n ],\n [\n \"gz\",\n \"application/gzip\"\n ],\n [\n \"gif\",\n \"image/gif\"\n ],\n [\n \"heic\",\n \"image/heic\"\n ],\n [\n \"heif\",\n \"image/heif\"\n ],\n [\n \"htm\",\n \"text/html\"\n ],\n [\n \"html\",\n \"text/html\"\n ],\n [\n \"ico\",\n \"image/vnd.microsoft.icon\"\n ],\n [\n \"ics\",\n \"text/calendar\"\n ],\n [\n \"jar\",\n \"application/java-archive\"\n ],\n [\n \"jpeg\",\n \"image/jpeg\"\n ],\n [\n \"jpg\",\n \"image/jpeg\"\n ],\n [\n \"jxl\",\n \"image/jxl\"\n ],\n [\n \"js\",\n \"text/javascript\"\n ],\n [\n \"json\",\n \"application/json\"\n ],\n [\n \"jsonld\",\n \"application/ld+json\"\n ],\n [\n \"markdown\",\n \"text/markdown\"\n ],\n [\n \"md\",\n \"text/markdown\"\n ],\n [\n \"mid\",\n \"audio/midi\"\n ],\n [\n \"midi\",\n \"audio/midi\"\n ],\n [\n \"mjs\",\n \"text/javascript\"\n ],\n [\n \"mp3\",\n \"audio/mpeg\"\n ],\n [\n \"mp4\",\n \"video/mp4\"\n ],\n [\n \"mpeg\",\n \"video/mpeg\"\n ],\n [\n \"mpkg\",\n \"application/vnd.apple.installer+xml\"\n ],\n [\n \"odp\",\n \"application/vnd.oasis.opendocument.presentation\"\n ],\n [\n \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet\"\n ],\n [\n \"odt\",\n \"application/vnd.oasis.opendocument.text\"\n ],\n [\n \"oga\",\n \"audio/ogg\"\n ],\n [\n \"ogv\",\n \"video/ogg\"\n ],\n [\n \"ogx\",\n \"application/ogg\"\n ],\n [\n \"opus\",\n \"audio/opus\"\n ],\n [\n \"otf\",\n \"font/otf\"\n ],\n [\n \"png\",\n \"image/png\"\n ],\n [\n \"pdf\",\n \"application/pdf\"\n ],\n [\n \"php\",\n \"application/x-httpd-php\"\n ],\n [\n \"ppt\",\n \"application/vnd.ms-powerpoint\"\n ],\n [\n \"pptx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n ],\n [\n \"rar\",\n \"application/vnd.rar\"\n ],\n [\n \"rtf\",\n \"application/rtf\"\n ],\n [\n \"sh\",\n \"application/x-sh\"\n ],\n [\n \"svg\",\n \"image/svg+xml\"\n ],\n [\n \"swf\",\n \"application/x-shockwave-flash\"\n ],\n [\n \"tar\",\n \"application/x-tar\"\n ],\n [\n \"tif\",\n \"image/tiff\"\n ],\n [\n \"tiff\",\n \"image/tiff\"\n ],\n [\n \"ts\",\n \"video/mp2t\"\n ],\n [\n \"ttf\",\n \"font/ttf\"\n ],\n [\n \"txt\",\n \"text/plain\"\n ],\n [\n \"vsd\",\n \"application/vnd.visio\"\n ],\n [\n \"wav\",\n \"audio/wav\"\n ],\n [\n \"weba\",\n \"audio/webm\"\n ],\n [\n \"webm\",\n \"video/webm\"\n ],\n [\n \"webp\",\n \"image/webp\"\n ],\n [\n \"woff\",\n \"font/woff\"\n ],\n [\n \"woff2\",\n \"font/woff2\"\n ],\n [\n \"xhtml\",\n \"application/xhtml+xml\"\n ],\n [\n \"xls\",\n \"application/vnd.ms-excel\"\n ],\n [\n \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n ],\n [\n \"xml\",\n \"application/xml\"\n ],\n [\n \"xul\",\n \"application/vnd.mozilla.xul+xml\"\n ],\n [\n \"zip\",\n \"application/zip\"\n ],\n [\n \"7z\",\n \"application/x-7z-compressed\"\n ],\n // Others\n [\n \"mkv\",\n \"video/x-matroska\"\n ],\n [\n \"mov\",\n \"video/quicktime\"\n ],\n [\n \"msg\",\n \"application/vnd.ms-outlook\"\n ]\n]);\nconst $f31161edf38949e9$var$FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n \".DS_Store\",\n \"Thumbs.db\" // Windows\n];\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */ const $f31161edf38949e9$var$toFileWithMimeType = (file)=>{\n const { name: name } = file;\n const hasExtension = name && name.lastIndexOf(\".\") !== -1;\n if (hasExtension && !file.type) {\n const extension = (name.split(\".\").pop() || \"\").toLowerCase();\n const type = $f31161edf38949e9$var$COMMON_MIME_TYPES.get(extension);\n if (type) Object.defineProperty(file, \"type\", {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return file;\n};\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */ const $f31161edf38949e9$var$toFileWithPath = (file, path)=>{\n const fileWithMimeType = $f31161edf38949e9$var$toFileWithMimeType(file);\n // @ts-ignore\n if (typeof fileWithMimeType.path !== \"string\") {\n const { webkitRelativePath: webkitRelativePath } = file;\n Object.defineProperty(fileWithMimeType, \"path\", {\n value: typeof path === \"string\" ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n return fileWithMimeType;\n};\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readEntriesPromise = async (directoryReader)=>{\n return await new Promise((resolve, reject)=>{\n directoryReader.readEntries(resolve, reject);\n });\n};\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */ const $f31161edf38949e9$var$readAllDirectoryEntries = async (directoryReader)=>{\n const entries = [];\n let readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n while(readEntries.length > 0){\n entries.push(...readEntries);\n readEntries = await $f31161edf38949e9$var$readEntriesPromise(directoryReader);\n }\n return entries;\n};\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */ const $f31161edf38949e9$var$getFileFromFileEntry = (fileEntry)=>{\n return new Promise((resolve, reject)=>{\n fileEntry.file((file)=>resolve($f31161edf38949e9$var$toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromDataTransferItemList = async (dataTransferItemList)=>{\n const files = [];\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n for (const item of dataTransferItemList){\n if (item.kind !== \"file\") continue;\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n queue.push(entry);\n }\n while(queue.length > 0){\n const entry = queue.shift();\n if (!entry) continue;\n else if (entry.isFile) {\n const file = await $f31161edf38949e9$var$getFileFromFileEntry(entry);\n if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push(file);\n } else if (entry.isDirectory) queue.push(...await $f31161edf38949e9$var$readAllDirectoryEntries(entry.createReader()));\n }\n return files;\n};\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */ const $f31161edf38949e9$var$getFilesFromFileList = async (fileList)=>{\n const files = [];\n for (const file of fileList)if ($f31161edf38949e9$var$FILES_TO_IGNORE.indexOf(file.name) === -1) files.push($f31161edf38949e9$var$toFileWithPath(file));\n return files;\n};\nconst $f31161edf38949e9$export$6d52664cd15c442 = async (evt)=>{\n if (evt.dataTransfer) return evt.dataTransfer.items ? await $f31161edf38949e9$var$getFilesFromDataTransferItemList(evt.dataTransfer.items) : await $f31161edf38949e9$var$getFilesFromFileList(evt.dataTransfer.files);\n return await $f31161edf38949e9$var$getFilesFromFileList(evt.target.files);\n};\n\n\nconst $862aa3736b0514bc$var$COMPONENT_NAME = \"files-dropzone\";\nconst $862aa3736b0514bc$var$TOO_MANY_FILES = \"TOO_MANY_FILES\";\nconst $862aa3736b0514bc$var$FILE_TOO_LARGE = \"FILE_TOO_LARGE\";\nconst $862aa3736b0514bc$var$FILE_TOO_SMALL = \"FILE_TOO_SMALL\";\nconst $862aa3736b0514bc$var$INVALID_MIME_TYPE = \"INVALID_MIME_TYPE\";\nconst $862aa3736b0514bc$var$template = document.createElement(\"template\");\nconst $862aa3736b0514bc$var$styles = /* css */ `\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n$862aa3736b0514bc$var$template.innerHTML = /* html */ `\n \n\n \n\n
                \n Drag 'n' drop files here, or click to select files\n
                \n`;\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */ class $862aa3736b0514bc$export$6ccd1735166caad9 extends HTMLElement {\n /** @type {Nullable} */ #fileInput = null;\n /** @type {Nullable} */ #dropzoneEl = null;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\",\n delegatesFocus: true\n });\n shadowRoot.appendChild($862aa3736b0514bc$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */ this.shadowRoot.getElementById(\"file-input\");\n this.#dropzoneEl = this.shadowRoot.getElementById(\"dropzone\");\n }\n }\n static get observedAttributes() {\n return [\n \"accept\",\n \"disabled\",\n \"multiple\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"accept\" && oldValue !== newValue && this.#fileInput) this.#fileInput.accept = this.accept;\n if (name === \"disabled\" && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute(\"tabindex\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"true\");\n } else {\n this.#dropzoneEl?.setAttribute(\"tabindex\", \"0\");\n this.#dropzoneEl?.setAttribute(\"aria-disabled\", \"false\");\n }\n }\n if (name === \"multiple\" && oldValue !== newValue && this.#fileInput) this.#fileInput.multiple = this.multiple;\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"accept\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"maxFiles\");\n this.#upgradeProperty(\"maxSize\");\n this.#upgradeProperty(\"minSize\");\n this.#upgradeProperty(\"multiple\");\n this.#upgradeProperty(\"autoFocus\");\n this.#upgradeProperty(\"noStyle\");\n this.#fileInput?.addEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.addEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.addEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.addEventListener(\"keyup\", this.#handleKeyUp);\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#fileInput?.removeEventListener(\"change\", this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener(\"dragenter\", this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener(\"dragover\", this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener(\"dragleave\", this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener(\"drop\", this.#handleDrop);\n this.#dropzoneEl?.removeEventListener(\"click\", this.#handleClick);\n this.#dropzoneEl?.removeEventListener(\"keyup\", this.#handleKeyUp);\n }\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */ get accept() {\n return this.getAttribute(\"accept\") || \"\";\n }\n set accept(value) {\n this.setAttribute(\"accept\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */ get maxFiles() {\n const num = Number(this.getAttribute(\"max-files\")) || 0;\n if (num <= 0) return Infinity;\n return Math.floor(Math.abs(num));\n }\n set maxFiles(value) {\n this.setAttribute(\"max-files\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */ get maxSize() {\n const value = this.getAttribute(\"max-size\");\n if (value === null) return Infinity;\n const num = Number(value);\n return Number.isNaN(num) ? Infinity : num;\n }\n set maxSize(value) {\n this.setAttribute(\"max-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */ get minSize() {\n const value = this.getAttribute(\"min-size\");\n if (value === null) return 0;\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n set minSize(value) {\n this.setAttribute(\"min-size\", value != null ? value.toString() : value);\n }\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */ get multiple() {\n return this.hasAttribute(\"multiple\");\n }\n set multiple(value) {\n this.toggleAttribute(\"multiple\", !!value);\n }\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */ get autoFocus() {\n return this.hasAttribute(\"auto-focus\");\n }\n set autoFocus(value) {\n this.toggleAttribute(\"auto-focus\", !!value);\n }\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */ get noStyle() {\n return this.hasAttribute(\"no-style\");\n }\n set noStyle(value) {\n this.toggleAttribute(\"no-style\", !!value);\n }\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */ #handleFileInputChange = async (evt)=>{\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the dragenter event of the dropzone.\n */ #handleDragEnter = ()=>{\n if (this.disabled) return;\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDragOver = (evt)=>{\n evt.preventDefault();\n if (this.disabled) {\n evt.dataTransfer.dropEffect = \"none\";\n return;\n }\n evt.dataTransfer.dropEffect = \"copy\";\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add(\"dropzone--dragover\");\n this.#dropzoneEl.part.add(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the dragleave event of the dropzone.\n */ #handleDragLeave = ()=>{\n if (this.disabled) return;\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n this.dispatchEvent(new Event(`${$862aa3736b0514bc$var$COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleDrop = async (evt)=>{\n if (this.disabled) return;\n evt.preventDefault();\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove(\"dropzone--dragover\");\n this.#dropzoneEl.part.remove(\"dropzone--dragover\");\n }\n try {\n this.#handleFilesSelect(await (0, $f31161edf38949e9$export$6d52664cd15c442)(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: {\n error: error\n }\n }));\n }\n };\n /**\n * Handles the click event of the dropzone.\n */ #handleClick = ()=>{\n if (this.disabled) return;\n this.#fileInput?.click();\n };\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */ #handleKeyUp = (evt)=>{\n if (this.disabled) return;\n if (evt.key === \" \" || evt.key === \"Enter\") this.#fileInput?.click();\n };\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */ #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) return;\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }\n ]\n });\n else if (this.multiple && filesLength > this.maxFiles) // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files)rejectedFiles.push({\n file: file,\n errors: [\n {\n code: $862aa3736b0514bc$var$TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? \"files are\" : \"file is\"} allowed.`\n }\n ]\n });\n else // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files){\n const fileHasValidType = (0, $38f222170fd4d21a$export$7c47054fed488f80)(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) acceptedFiles.push(file);\n else {\n const errors = [];\n if (!fileHasValidType) errors.push({\n code: $862aa3736b0514bc$var$INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n if (fileExceedsMaxSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n if (fileIsSmallerThanMinSize) errors.push({\n code: $862aa3736b0514bc$var$FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n rejectedFiles.push({\n file: file,\n errors: errors\n });\n }\n }\n this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles,\n rejectedFiles: rejectedFiles\n }\n }));\n if (acceptedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles: acceptedFiles\n }\n }));\n if (rejectedFiles.length > 0) this.dispatchEvent(new CustomEvent(`${$862aa3736b0514bc$var$COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles: rejectedFiles\n }\n }));\n if (this.#fileInput) this.#fileInput.value = this.#fileInput.defaultValue;\n }\n /**\n * Opens the file dialog programmatically.\n */ openFileDialog() {\n if (this.disabled) return;\n this.#fileInput?.click();\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */ static defineCustomElement(elementName = $862aa3736b0514bc$var$COMPONENT_NAME) {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $862aa3736b0514bc$export$6ccd1735166caad9);\n }\n}\n\n\n(0, $862aa3736b0514bc$export$6ccd1735166caad9).defineCustomElement();\n\n\nexport {$862aa3736b0514bc$export$6ccd1735166caad9 as FilesDropzone};\n//# sourceMappingURL=files-dropzone-defined.js.map\n","import { FilesDropzone } from './files-dropzone.js';\n\nFilesDropzone.defineCustomElement();\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nimport { isValidFile } from './utils/is-valid-file.js';\nimport { getFilesFromEvent } from './utils/files-selector.js';\n\nconst COMPONENT_NAME = 'files-dropzone';\nconst TOO_MANY_FILES = 'TOO_MANY_FILES';\nconst FILE_TOO_LARGE = 'FILE_TOO_LARGE';\nconst FILE_TOO_SMALL = 'FILE_TOO_SMALL';\nconst INVALID_MIME_TYPE = 'INVALID_MIME_TYPE';\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host {\n --dropzone-border-width: 2px;\n --dropzone-border-style: dashed;\n --dropzone-border-radius: 0.25rem;\n --dropzone-border-color: #6c757d;\n --dropzone-border-color-dragover: #0d6efd;\n --dropzone-border-color-hover: var(--dropzone-border-color-dragover);\n --dropzone-background-color: #ffffff;\n --dropzone-background-color-dragover: #f4f4f5;\n --dropzone-background-color-hover: var(--dropzone-background-color-dragover);\n --dropzone-body-color: #3f3f46;\n --dropzone-body-color-dragover: var(--dropzone-body-color);\n --dropzone-body-color-hover: var(--dropzone-body-color-dragover);\n --dropzone-focus-shadow-rgb: 49,132,253;\n --dropzone-focus-box-shadow: 0 0 0 0.25rem rgba(var(--dropzone-focus-shadow-rgb), 0.5);\n --transition-duration: 0.2s; /* for backwards compatibility */\n --dropzone-transition-duration: var(--transition-duration);\n\n display: block;\n }\n\n :host(:not([no-style])) .dropzone {\n border: var(--dropzone-border-width) var(--dropzone-border-style) var(--dropzone-border-color);\n border-radius: var(--dropzone-border-radius);\n padding: 3rem 1rem;\n overflow: hidden;\n background-color: var(--dropzone-background-color);\n color: var(--dropzone-body-color);\n text-align: center;\n cursor: pointer;\n transition: border var(--dropzone-transition-duration) ease-in-out, background-color var(--dropzone-transition-duration) ease-in-out, color var(--dropzone-transition-duration) ease-in-out, box-shadow var(--dropzone-transition-duration) ease-in-out;\n }\n\n :host(:not([no-style])[disabled]) .dropzone {\n opacity: 0.8;\n cursor: not-allowed;\n user-select: none;\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone--dragover {\n border-color: var(--dropzone-border-color-dragover);\n background-color: var(--dropzone-background-color-dragover);\n color: var(--dropzone-body-color-dragover);\n }\n\n :host(:not([no-style]):not([disabled])) .dropzone:focus-visible {\n outline: none;\n box-shadow: var(--dropzone-focus-box-shadow);\n }\n\n @media (hover: hover) {\n :host(:not([no-style]):not([disabled])) .dropzone:not(.dropzone--dragover):hover {\n border-color: var(--dropzone-border-color-hover);\n background-color: var(--dropzone-background-color-hover);\n color: var(--dropzone-body-color-hover);\n }\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n\n
                \n Drag 'n' drop files here, or click to select files\n
                \n`;\n\n/**\n * @summary A custom element that allows users to drag and drop files into it.\n * @documentation https://github.com/georapbox/files-dropzone-element\n *\n * @tagname files-dropzone - This is the default tag name, unless overridden by the `defineCustomElement` method.\n *\n * @property {string} accept - A comma-separated list of unique file type specifiers describing file types to allow.\n * @property {boolean} disabled - Determines whether the dropzone is disabled.\n * @property {number} maxFiles - The maximum number of files allowed to be dropped.\n * @property {number} maxSize - The maximum file size allowed in bytes.\n * @property {number} minSize - The minimum file size allowed in bytes.\n * @property {boolean} multiple - Allows multiple files to be dropped.\n * @property {boolean} autoFocus - Automatically focuses the dropzone when it's connected to the DOM.\n * @property {boolean} noStyle - Prevents the dropzone from applying any styling.\n *\n * @attribute {string} accept - Reflects the accept property.\n * @attribute {boolean} disabled - Reflects the disabled property.\n * @attribute {number} max-files - Reflects the maxFiles property.\n * @attribute {number} max-size - Reflects the maxSize property.\n * @attribute {number} min-size - Reflects the minSize property.\n * @attribute {boolean} multiple - Reflects the multiple property.\n * @attribute {boolean} auto-focus - Reflects the autoFocus property.\n * @attribute {boolean} no-style - Reflects the noStyle property.\n *\n * @slot - The default slot content of the dropzone.\n *\n * @csspart dropzone - The dropzone element.\n * @csspart dropzone--dragover - The state of the dropzone when dragging over it.\n *\n * @cssproperty --dropzone-border-width - The border width of the dropzone.\n * @cssproperty --dropzone-border-style - The border style of the dropzone.\n * @cssproperty --dropzone-border-radius - The border radius of the dropzone.\n * @cssproperty --dropzone-border-color - The border color of the dropzone.\n * @cssproperty --dropzone-border-color-dragover - The border color of the dropzone when dragging over it.\n * @cssproperty --dropzone-border-color-hover - The border color of the dropzone when hovering over it.\n * @cssproperty --dropzone-background-color - The background color of the dropzone.\n * @cssproperty --dropzone-background-color-dragover - The background color of the dropzone when dragging over it.\n * @cssproperty --dropzone-background-color-hover - The background color of the dropzone when hovering over it.\n * @cssproperty --dropzone-body-color - The text color of the dropzone.\n * @cssproperty --dropzone-body-color-dragover - The text color of the dropzone when dragging over it.\n * @cssproperty --dropzone-body-color-hover - The text color of the dropzone when hovering over it.\n * @cssproperty --dropzone-focus-shadow-rgb - The RGB value of the dropzone's focus shadow.\n * @cssproperty --dropzone-focus-box-shadow - The box shadow of the dropzone when focused.\n * @cssproperty --dropzone-transition-duration - The transition's duration for the dropzone area.\n *\n * @event files-dropzone-drop - Fired when files are dropped.\n * @event files-dropzone-drop-accepted - Fired when files dropped files are accepted.\n * @event files-dropzone-drop-rejected - Fired when files dropped files are rejected.\n * @event files-dropzone-dragenter - Fired when files are dragged into the dropzone.\n * @event files-dropzone-dragover - Fired when files are dragged over the dropzone.\n * @event files-dropzone-dragleave - Fired when files are dragged out of the dropzone.\n * @event files-dropzone-error - Fired when there is any error in the process of reading dropped files or directories.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method openFileDialog - Instance method. Opens the file dialog programmatically.\n */\nclass FilesDropzone extends HTMLElement {\n /** @type {Nullable} */\n #fileInput = null;\n\n /** @type {Nullable} */\n #dropzoneEl = null;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#fileInput = /** @type {Nullable} */(this.shadowRoot.getElementById('file-input'));\n this.#dropzoneEl = this.shadowRoot.getElementById('dropzone');\n }\n }\n\n static get observedAttributes() {\n return ['accept', 'disabled', 'multiple'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'accept' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.accept = this.accept;\n }\n\n if (name === 'disabled' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.disabled = this.disabled;\n\n if (this.disabled) {\n this.#dropzoneEl?.removeAttribute('tabindex');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'true');\n } else {\n this.#dropzoneEl?.setAttribute('tabindex', '0');\n this.#dropzoneEl?.setAttribute('aria-disabled', 'false');\n }\n }\n\n if (name === 'multiple' && oldValue !== newValue && this.#fileInput) {\n this.#fileInput.multiple = this.multiple;\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('accept');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('maxFiles');\n this.#upgradeProperty('maxSize');\n this.#upgradeProperty('minSize');\n this.#upgradeProperty('multiple');\n this.#upgradeProperty('autoFocus');\n this.#upgradeProperty('noStyle');\n\n this.#fileInput?.addEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.addEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.addEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.addEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.addEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.addEventListener('click', this.#handleClick);\n this.#dropzoneEl?.addEventListener('keyup', this.#handleKeyUp);\n\n this.autoFocus && this.#dropzoneEl?.focus();\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#fileInput?.removeEventListener('change', this.#handleFileInputChange);\n this.#dropzoneEl?.removeEventListener('dragenter', this.#handleDragEnter);\n this.#dropzoneEl?.removeEventListener('dragover', this.#handleDragOver);\n this.#dropzoneEl?.removeEventListener('dragleave', this.#handleDragLeave);\n this.#dropzoneEl?.removeEventListener('drop', this.#handleDrop);\n this.#dropzoneEl?.removeEventListener('click', this.#handleClick);\n this.#dropzoneEl?.removeEventListener('keyup', this.#handleKeyUp);\n }\n\n /**\n * @type {string} - A comma-separated list of unique file type specifiers describing file types to allow.\n * @attribute accept - Reflects the accept property.\n */\n get accept() {\n return this.getAttribute('accept') || '';\n }\n\n set accept(value) {\n this.setAttribute('accept', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Determines whether the dropzone is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {number} - The maximum number of files allowed to be dropped.\n * @default Infinity\n * @attribute max-files - Reflects the maxFiles property.\n */\n get maxFiles() {\n const num = Number(this.getAttribute('max-files')) || 0;\n\n if (num <= 0) {\n return Infinity;\n }\n\n return Math.floor(Math.abs(num));\n }\n\n set maxFiles(value) {\n this.setAttribute('max-files', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The maximum file size allowed in bytes.\n * @default Infinity\n * @attribute max-size - Reflects the maxSize property.\n */\n get maxSize() {\n const value = this.getAttribute('max-size');\n\n if (value === null) {\n return Infinity;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? Infinity : num;\n }\n\n set maxSize(value) {\n this.setAttribute('max-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {number} - The minimum file size allowed in bytes.\n * @default 0\n * @attribute min-size - Reflects the minSize property.\n */\n get minSize() {\n const value = this.getAttribute('min-size');\n\n if (value === null) {\n return 0;\n }\n\n const num = Number(value);\n\n return Number.isNaN(num) ? 0 : num;\n }\n\n set minSize(value) {\n this.setAttribute('min-size', value != null ? value.toString() : value);\n }\n\n /**\n * @type {boolean} - Allows multiple files to be dropped.\n * @default false\n * @attribute multiple - Reflects the multiple property.\n */\n get multiple() {\n return this.hasAttribute('multiple');\n }\n\n set multiple(value) {\n this.toggleAttribute('multiple', !!value);\n }\n\n /**\n * @type {boolean} - Automatically focuses the dropzone when it's connected to the DOM.\n * @default false\n * @attribute auto-focus - Reflects the autoFocus property.\n */\n get autoFocus() {\n return this.hasAttribute('auto-focus');\n }\n\n set autoFocus(value) {\n this.toggleAttribute('auto-focus', !!value);\n }\n\n /**\n * @type {boolean} - Prevents the dropzone from applying any styling.\n * @default false\n * @attribute no-style - Reflects the noStyle property.\n */\n get noStyle() {\n return this.hasAttribute('no-style');\n }\n\n set noStyle(value) {\n this.toggleAttribute('no-style', !!value);\n }\n\n /**\n * Handles the change event of the file input.\n *\n * @param {*} evt - The event object.\n */\n #handleFileInputChange = async evt => {\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the dragenter event of the dropzone.\n */\n #handleDragEnter = () => {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragenter`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragover event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDragOver = evt => {\n evt.preventDefault();\n\n if (this.disabled) {\n evt.dataTransfer.dropEffect = 'none';\n return;\n }\n\n evt.dataTransfer.dropEffect = 'copy';\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.add('dropzone--dragover');\n this.#dropzoneEl.part.add('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragover`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the dragleave event of the dropzone.\n */\n #handleDragLeave = () => {\n if (this.disabled) {\n return;\n }\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n this.dispatchEvent(new Event(`${COMPONENT_NAME}-dragleave`, {\n bubbles: true,\n composed: true\n }));\n };\n\n /**\n * Handles the drop event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleDrop = async evt => {\n if (this.disabled) {\n return;\n }\n\n evt.preventDefault();\n\n if (this.#dropzoneEl) {\n this.#dropzoneEl.classList.remove('dropzone--dragover');\n this.#dropzoneEl.part.remove('dropzone--dragover');\n }\n\n try {\n this.#handleFilesSelect(await getFilesFromEvent(evt));\n } catch (error) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-error`, {\n bubbles: true,\n composed: true,\n detail: { error }\n }));\n }\n };\n\n /**\n * Handles the click event of the dropzone.\n */\n #handleClick = () => {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n };\n\n /**\n * Handles the keyup event of the dropzone.\n *\n * @param {*} evt - The event object.\n */\n #handleKeyUp = evt => {\n if (this.disabled) {\n return;\n }\n\n if (evt.key === ' ' || evt.key === 'Enter') {\n this.#fileInput?.click();\n }\n };\n\n /**\n * Handles the selection of files.\n *\n * @param {File[]} files - The files to handle.\n */\n #handleFilesSelect(files) {\n if (!Array.isArray(files) || !files.length) {\n return;\n }\n\n const acceptedFiles = [];\n const rejectedFiles = [];\n const filesLength = files.length;\n\n // If the component is not in multiple mode, reject all files.\n if (!this.multiple && filesLength > 1) {\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only 1 file is allowed.`\n }]\n });\n }\n } else if (this.multiple && filesLength > this.maxFiles) {\n // If the component is in multiple mode, but the number of files exceeds\n // the maxFiles attribute, reject all files.\n for (const file of files) {\n rejectedFiles.push({\n file,\n errors: [{\n code: TOO_MANY_FILES,\n message: `Too many files selected. Only ${this.maxFiles} ${this.maxFiles > 1 ? 'files are' : 'file is'} allowed.`\n }]\n });\n }\n } else {\n // Validate each file. If it's valid, add it to the accepted files array,\n // otherwise add it to the rejected files array.\n for (const file of files) {\n const fileHasValidType = isValidFile(file, this.accept);\n const fileExceedsMaxSize = file.size > this.maxSize;\n const fileIsSmallerThanMinSize = file.size < this.minSize;\n\n if (fileHasValidType && !fileExceedsMaxSize && !fileIsSmallerThanMinSize) {\n acceptedFiles.push(file);\n } else {\n const errors = [];\n\n if (!fileHasValidType) {\n errors.push({\n code: INVALID_MIME_TYPE,\n message: `File type \"${file.type}\" is not accepted.`\n });\n }\n\n if (fileExceedsMaxSize) {\n errors.push({\n code: FILE_TOO_LARGE,\n message: `File size ${file.size} exceeds the maximum size of ${this.maxSize}.`\n });\n }\n\n if (fileIsSmallerThanMinSize) {\n errors.push({\n code: FILE_TOO_SMALL,\n message: `File size ${file.size} is smaller than the minimum size of ${this.minSize}.`\n });\n }\n\n rejectedFiles.push({ file, errors });\n }\n }\n }\n\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles,\n rejectedFiles\n }\n }));\n\n if (acceptedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-accepted`, {\n bubbles: true,\n composed: true,\n detail: {\n acceptedFiles\n }\n }));\n }\n\n if (rejectedFiles.length > 0) {\n this.dispatchEvent(new CustomEvent(`${COMPONENT_NAME}-drop-rejected`, {\n bubbles: true,\n composed: true,\n detail: {\n rejectedFiles\n }\n }));\n }\n\n if (this.#fileInput) {\n this.#fileInput.value = this.#fileInput.defaultValue;\n }\n }\n\n /**\n * Opens the file dialog programmatically.\n */\n openFileDialog() {\n if (this.disabled) {\n return;\n }\n\n this.#fileInput?.click();\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'accept' | 'disabled' | 'maxFiles' | 'maxSize' | 'minSize' | 'multiple' | 'autoFocus' | 'noStyle'} prop - The property name to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='files-dropzone'] - The name of the custom element.\n * @example\n *\n * FilesDropzone.defineCustomElement('my-dropzone');\n */\n static defineCustomElement(elementName = COMPONENT_NAME) {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, FilesDropzone);\n }\n }\n}\n\nexport { FilesDropzone };\n","// @ts-check\n\n/**\n * Checks if a file is valid based on the accepted file type specifiers.\n *\n * @param {File} file - The File object to validate.\n * @param {string} [acceptedTypeSpecifiers=''] - The accepted file type specifiers.\n * @returns {boolean} - True if the file is valid, false otherwise.\n */\nexport function isValidFile(file, acceptedTypeSpecifiers = '') {\n if (!acceptedTypeSpecifiers) {\n return true;\n }\n\n const acceptedMimeTypesList = [\n ...new Set(acceptedTypeSpecifiers.split(',').map(v => v.trim()).filter(Boolean))\n ];\n\n const fileMimeType = file.type;\n const baseMimeType = fileMimeType.replace(/\\/.*$/, '');\n\n for (const validType of acceptedMimeTypesList) {\n if (validType.charAt(0) === '.') {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // Check for mime type that looks like \"image/*\" or similar.\n if (baseMimeType === validType.replace(/\\/.*$/, '')) {\n return true;\n }\n } else {\n if (fileMimeType === validType) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// @ts-check\n\n/**\n * A map of common file extensions and their associated MIME types.\n */\nconst COMMON_MIME_TYPES = new Map([\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n ['aac', 'audio/aac'],\n ['abw', 'application/x-abiword'],\n ['arc', 'application/x-freearc'],\n ['avif', 'image/avif'],\n ['avi', 'video/x-msvideo'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bin', 'application/octet-stream'],\n ['bmp', 'image/bmp'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['cda', 'application/x-cdf'],\n ['csh', 'application/x-csh'],\n ['css', 'text/css'],\n ['csv', 'text/csv'],\n ['doc', 'application/msword'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['epub', 'application/epub+zip'],\n ['gz', 'application/gzip'],\n ['gif', 'image/gif'],\n ['heic', 'image/heic'],\n ['heif', 'image/heif'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['ico', 'image/vnd.microsoft.icon'],\n ['ics', 'text/calendar'],\n ['jar', 'application/java-archive'],\n ['jpeg', 'image/jpeg'],\n ['jpg', 'image/jpeg'],\n ['jxl', 'image/jxl'],\n ['js', 'text/javascript'],\n ['json', 'application/json'],\n ['jsonld', 'application/ld+json'],\n ['markdown', 'text/markdown'],\n ['md', 'text/markdown'],\n ['mid', 'audio/midi'],\n ['midi', 'audio/midi'],\n ['mjs', 'text/javascript'],\n ['mp3', 'audio/mpeg'],\n ['mp4', 'video/mp4'],\n ['mpeg', 'video/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['opus', 'audio/opus'],\n ['otf', 'font/otf'],\n ['png', 'image/png'],\n ['pdf', 'application/pdf'],\n ['php', 'application/x-httpd-php'],\n ['ppt', 'application/vnd.ms-powerpoint'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['rar', 'application/vnd.rar'],\n ['rtf', 'application/rtf'],\n ['sh', 'application/x-sh'],\n ['svg', 'image/svg+xml'],\n ['swf', 'application/x-shockwave-flash'],\n ['tar', 'application/x-tar'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['ts', 'video/mp2t'],\n ['ttf', 'font/ttf'],\n ['txt', 'text/plain'],\n ['vsd', 'application/vnd.visio'],\n ['wav', 'audio/wav'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['woff', 'font/woff'],\n ['woff2', 'font/woff2'],\n ['xhtml', 'application/xhtml+xml'],\n ['xls', 'application/vnd.ms-excel'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xml', 'application/xml'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['zip', 'application/zip'],\n ['7z', 'application/x-7z-compressed'],\n\n // Others\n ['mkv', 'video/x-matroska'],\n ['mov', 'video/quicktime'],\n ['msg', 'application/vnd.ms-outlook']\n]);\n\nconst FILES_TO_IGNORE = [\n // Thumbnail cache files for macOS and Windows\n '.DS_Store', // macOs\n 'Thumbs.db' // Windows\n];\n\n/**\n * Adds a `type` property to the file object if it doesn't have one and the file has an extension.\n * This is needed because Firefox doesn't add a type property to files dragged from the desktop.\n * @bug https://bugzilla.mozilla.org/show_bug.cgi?id=1424689\n *\n * @param {File} file - The file object to add the type property to.\n * @returns {File} - The file object with the type property added.\n */\nconst toFileWithMimeType = file => {\n const { name } = file;\n const hasExtension = name && name.lastIndexOf('.') !== -1;\n\n if (hasExtension && !file.type) {\n const extension = (name.split('.').pop() || '').toLowerCase();\n const type = COMMON_MIME_TYPES.get(extension);\n\n if (type) {\n Object.defineProperty(file, 'type', {\n value: type,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n }\n\n return file;\n};\n\n/**\n * Adds a `path` property to the file object if it doesn't have one.\n * If `path` is not provided, the `webkitRelativePath` property of the file will be used\n * or the file's name if `webkitRelativePath` is not available.\n *\n * @param {File} file - The file object to add the path property to.\n * @param {string} [path] - The path to set on the file object.\n * @returns {File} - The file object with the path property added.\n */\nconst toFileWithPath = (file, path) => {\n const fileWithMimeType = toFileWithMimeType(file);\n\n // @ts-ignore\n if (typeof fileWithMimeType.path !== 'string') {\n const { webkitRelativePath } = file;\n\n Object.defineProperty(fileWithMimeType, 'path', {\n value: typeof path === 'string' ? path : webkitRelativePath || file.name,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n return fileWithMimeType;\n};\n\n/**\n * Wrap `FileSystemDirectoryReader.readEntries` in a promise to make working with read entries easier.\n * https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryReader/readEntries\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readEntriesPromise = async directoryReader => {\n return await new Promise((resolve, reject) => {\n directoryReader.readEntries(resolve, reject);\n });\n};\n\n/**\n * Read all entries in a directory or sub-directory\n * by calling `readEntries` until it returns an empty array.\n *\n * @param {FileSystemDirectoryReader} directoryReader - The directory reader to read entries from.\n * @returns {Promise} - A promise that resolves with an array of `FileSystemEntry` objects.\n */\nconst readAllDirectoryEntries = async directoryReader => {\n const entries = [];\n let readEntries = await readEntriesPromise(directoryReader);\n\n while (readEntries.length > 0) {\n entries.push(...readEntries);\n readEntries = await readEntriesPromise(directoryReader);\n }\n\n return entries;\n};\n\n/**\n * Get a `File` object from a `FileSystemFileEntry` object.\n *\n * @param {FileSystemFileEntry} fileEntry - The file entry to get a `File` object from.\n * @returns {Promise} - A promise that resolves with a `File` object.\n */\nconst getFileFromFileEntry = fileEntry => {\n return new Promise((resolve, reject) => {\n fileEntry.file(file => resolve(toFileWithPath(file, fileEntry.fullPath)), reject);\n });\n};\n\n/**\n * Get an array of `File` objects from a `DataTransferItemList` object.\n *\n * @param {DataTransferItemList} dataTransferItemList - The item list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromDataTransferItemList = async dataTransferItemList => {\n const files = [];\n\n // Chromium browsers read only 100 files at a time as per the spec, so we need to use\n // BFS (Breadth-first search) to traverse the entire directory/file structure.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/webkitGetAsEntry#javascript_content\n const queue = [];\n\n for (const item of dataTransferItemList) {\n if (item.kind !== 'file') {\n // Ignore non-file items, such as links.\n continue;\n }\n\n // https://developer.mozilla.org/docs/Web/API/DataTransferItem/webkitGetAsEntry\n // This function is implemented as `webkitGetAsEntry()` in non-WebKit browsers\n // including Firefox at this time but it may be renamed to `getAsEntry()` in the future.\n // @ts-ignore\n const entry = item.getAsEntry ? item.getAsEntry() : item.webkitGetAsEntry();\n\n queue.push(entry);\n }\n\n while (queue.length > 0) {\n const entry = queue.shift();\n\n if (!entry) {\n continue;\n } else if (entry.isFile) {\n const file = await getFileFromFileEntry(entry);\n\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(file);\n }\n } else if (entry.isDirectory) {\n queue.push(...await readAllDirectoryEntries(entry.createReader()));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from a `FileList` object.\n *\n * @param {FileList} fileList - The file list to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nconst getFilesFromFileList = async fileList => {\n const files = [];\n\n for (const file of fileList) {\n if (FILES_TO_IGNORE.indexOf(file.name) === -1) {\n files.push(toFileWithPath(file));\n }\n }\n\n return files;\n};\n\n/**\n * Get an array of `File` objects from an event.\n * This function supports both `drop` and `change` events.\n *\n * @param {*} evt - The event to get an array of `File` objects from.\n * @returns {Promise} - A promise that resolves with an array of `File` objects.\n */\nexport const getFilesFromEvent = async evt => {\n if (evt.dataTransfer) {\n return evt.dataTransfer.items\n ? await getFilesFromDataTransferItemList(evt.dataTransfer.items)\n : await getFilesFromFileList(evt.dataTransfer.files);\n }\n\n return await getFilesFromFileList(evt.target.files);\n};\n","let t=(t=\"\",e=\"\")=>{let s=Math.random().toString(36).substring(2,8);return`${\"string\"==typeof t&&\"\"!==t?t+\"-\":\"\"}${s}${\"string\"==typeof e&&\"\"!==e?\"-\"+e:\"\"}`},e=(t,e)=>{if(Object.prototype.hasOwnProperty.call(e,t)){let s=e[t];delete e[t],e[t]=s}},s=0,o=`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`,a=document.createElement(\"template\");a.innerHTML=`\n \n\n
                \n \n
                \n`;class l extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(a.content.cloneNode(!0))}static get observedAttributes(){return[\"selected\",\"disabled\",\"closable\"]}attributeChangedCallback(t,e,s){if(\"selected\"===t&&e!==s&&this.setAttribute(\"aria-selected\",this.selected.toString()),\"disabled\"===t&&e!==s&&(this.setAttribute(\"aria-disabled\",this.disabled.toString()),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")),\"closable\"===t&&e!==s){if(this.closable){let t=document.createElement(\"span\");t.className=\"tab__close\",t.setAttribute(\"part\",\"close-tab\"),t.innerHTML='',this.shadowRoot?.querySelector(\".tab\")?.appendChild(t),t.addEventListener(\"click\",this.#t)}else{let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t),t?.remove()}}}connectedCallback(){this.#e(\"selected\"),this.#e(\"disabled\"),this.#e(\"closable\"),this.id||(this.id=t(\"tab\",(++s).toString())),this.setAttribute(\"slot\",\"tab\"),this.setAttribute(\"role\",\"tab\"),this.setAttribute(\"aria-selected\",\"false\"),this.setAttribute(\"tabindex\",this.disabled?\"-1\":\"0\")}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\".tab__close\");t?.removeEventListener(\"click\",this.#t)}get selected(){return this.hasAttribute(\"selected\")}set selected(t){this.toggleAttribute(\"selected\",!!t)}get disabled(){return this.hasAttribute(\"disabled\")}set disabled(t){this.toggleAttribute(\"disabled\",!!t)}get closable(){return this.hasAttribute(\"closable\")}set closable(t){this.toggleAttribute(\"closable\",!!t)}#t=t=>{t.stopPropagation(),this.dispatchEvent(new CustomEvent(\"a-tab-close\",{bubbles:!0,composed:!0,detail:{tabId:this.id}}))};#e(t){return e(t,this)}static defineCustomElement(t=\"a-tab\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,l)}}l.defineCustomElement();let i=0,r=`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`,n=document.createElement(\"template\");n.innerHTML=`\n \n\n
                \n \n
                \n`;class c extends HTMLElement{constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(n.content.cloneNode(!0))}connectedCallback(){this.setAttribute(\"slot\",\"panel\"),this.setAttribute(\"role\",\"tabpanel\"),this.setAttribute(\"hidden\",\"\"),this.id||(this.id=t(\"panel\",(++i).toString()))}static defineCustomElement(t=\"a-tab-panel\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,c)}}c.defineCustomElement();let d={TOP:\"top\",BOTTOM:\"bottom\",START:\"start\",END:\"end\"},h=Object.entries(d).map(([,t])=>t),b={AUTO:\"auto\",MANUAL:\"manual\"},u={DOWN:\"ArrowDown\",LEFT:\"ArrowLeft\",RIGHT:\"ArrowRight\",UP:\"ArrowUp\",HOME:\"Home\",END:\"End\",ENTER:\"Enter\",SPACE:\" \"},p=`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${d.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${d.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${d.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${d.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${d.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${d.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`,g=document.createElement(\"template\");g.innerHTML=`\n \n\n
                \n
                \n \n\n
                \n \n
                \n\n \n
                \n\n
                \n \n
                \n
                \n`;class m extends HTMLElement{#s=null;#o=null;#a=!1;constructor(){super(),this.shadowRoot||this.attachShadow({mode:\"open\"}).appendChild(g.content.cloneNode(!0))}static get observedAttributes(){return[\"placement\",\"no-scroll-controls\"]}attributeChangedCallback(t,e,s){\"placement\"===t&&e!==s&&this.#l(),\"no-scroll-controls\"===t&&e!==s&&this.#l()}get placement(){return this.getAttribute(\"placement\")||d.TOP}set placement(t){null!=t&&this.setAttribute(\"placement\",t)}get noScrollControls(){return this.hasAttribute(\"no-scroll-controls\")}set noScrollControls(t){this.toggleAttribute(\"no-scroll-controls\",!!t)}get scrollDistance(){return Math.abs(Number(this.getAttribute(\"scroll-distance\")))||200}set scrollDistance(t){this.setAttribute(\"scroll-distance\",Math.abs(t).toString()||\"200\")}get activation(){return this.getAttribute(\"activation\")||b.AUTO}set activation(t){this.setAttribute(\"activation\",t||b.AUTO)}get noTabCycling(){return this.hasAttribute(\"no-tab-cycling\")}set noTabCycling(t){this.toggleAttribute(\"no-tab-cycling\",!!t)}connectedCallback(){this.#e(\"placement\"),this.#e(\"noScrollControls\"),this.#e(\"scrollDistance\"),this.#e(\"activation\"),this.#e(\"noTabCycling\");let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=this.shadowRoot?.querySelector(\".tab-group__nav\"),a=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.addEventListener(\"slotchange\",this.#i),e?.addEventListener(\"slotchange\",this.#i),s?.addEventListener(\"click\",this.#r),s?.addEventListener(\"keydown\",this.#n),a.forEach(t=>t.addEventListener(\"click\",this.#c)),this.addEventListener(\"a-tab-close\",this.#d),\"ResizeObserver\"in window&&(this.#s=new ResizeObserver(t=>{this.#o=window.requestAnimationFrame(()=>{let e=t?.[0],s=e?.target,l=s?.scrollWidth>s?.clientWidth;a.forEach(t=>t.toggleAttribute(\"hidden\",!l)),o?.part.toggle(\"nav--has-scroll-controls\",l),o?.classList.toggle(\"tab-group__nav--has-scroll-controls\",l)})})),this.#h(),this.#l()}disconnectedCallback(){let t=this.shadowRoot?.querySelector(\"slot[name=tab]\"),e=this.shadowRoot?.querySelector(\"slot[name=panel]\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\"),o=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);t?.removeEventListener(\"slotchange\",this.#i),e?.removeEventListener(\"slotchange\",this.#i),s?.removeEventListener(\"click\",this.#r),s?.removeEventListener(\"keydown\",this.#n),o.forEach(t=>t.removeEventListener(\"click\",this.#c)),this.removeEventListener(\"a-tab-close\",this.#d),this.#b()}#u(){if(!this.#s)return;let t=this.shadowRoot?.querySelector(\".tab-group__tabs\");t&&(this.#s.unobserve(t),this.#s.observe(t))}#b(){this.#s&&(this.#s.disconnect(),null!==this.#o&&(window.cancelAnimationFrame(this.#o),this.#o=null))}#p(){return getComputedStyle(this).direction||\"ltr\"}#h(){this.hidden=0===this.#g().length}#m(){let t=this.#g();this.#h(),t.forEach(t=>{let e=t.nextElementSibling;if(!e||\"a-tab-panel\"!==e.tagName.toLowerCase())return console.error(`Tab #${t.id} is not a sibling of a `);t.setAttribute(\"aria-controls\",e.id),e.setAttribute(\"aria-labelledby\",t.id)})}#v(){return Array.from(this.querySelectorAll(\"a-tab-panel\"))}#g(){return Array.from(this.querySelectorAll(\"a-tab\"))}#f(t){let e=t.getAttribute(\"aria-controls\");return this.querySelector(`#${e}`)}#w(){return this.#g().find(t=>!t.disabled)||null}#T(){let t=this.#g();for(let e=t.length-1;e>=0;e--)if(!t[e].disabled)return t[e];return null}#y(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))-1:t.findIndex(t=>t.selected)-1;for(;t[(e+t.length)%t.length].disabled;)e--;return this.noTabCycling&&e<0?null:t[(e+t.length)%t.length]}#A(){let t=this.#g(),e=this.activation===b.MANUAL?t.findIndex(t=>t.matches(\":focus\"))+1:t.findIndex(t=>t.selected)+1;for(;t[e%t.length].disabled;)e++;return this.noTabCycling&&e>=t.length?null:t[e%t.length]}#_(){let t=this.#g(),e=this.#v();t.forEach(t=>t.selected=!1),e.forEach(t=>t.hidden=!0)}#l(){let t=this.shadowRoot?.querySelector(\".tab-group__nav\"),e=Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\")||[]);this.noScrollControls||this.placement===d.START||this.placement===d.END?(this.#b(),e.forEach(t=>t.hidden=!0),t?.part.remove(\"nav--has-scroll-controls\"),t?.classList.remove(\"tab-group__nav--has-scroll-controls\")):(this.#u(),e.forEach(t=>t.hidden=!1))}#E(){let t=this.#g(),e=t.find(t=>t.selected&&!t.disabled)||t.find(t=>!t.disabled);e&&(this.#a&&!e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.#C(e))}#C(t){this.#_(),t&&(t.selected=!0);let e=this.#f(t);e&&(e.hidden=!1)}#i=t=>{this.#m(),this.#l(),this.#E(),\"tab\"===t.target.name&&(this.#a=!0)};#n=t=>{if(\"a-tab\"!==t.target.tagName.toLowerCase()||t.altKey)return;let e=h.includes(this.placement||\"\")?this.placement:d.TOP,s=[d.TOP,d.BOTTOM].includes(e||\"\")?\"horizontal\":\"vertical\",o=this.#p(),a=null;switch(t.key){case u.LEFT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#y():this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.RIGHT:\"horizontal\"===s&&(a=\"ltr\"===o?this.#A():this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.UP:\"vertical\"===s&&(a=this.#y())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.DOWN:\"vertical\"===s&&(a=this.#A())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.HOME:(a=this.#w())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.END:(a=this.#T())&&(this.activation===b.MANUAL?a.focus():this.selectTab(a));break;case u.ENTER:case u.SPACE:(a=t.target)&&this.selectTab(a);break;default:return}t.preventDefault()};#r=t=>{let e=t.target.closest(\"a-tab\");e&&this.selectTab(e)};#c=t=>{let e=t.target.closest(\".tab-group__scroll-button\"),s=this.shadowRoot?.querySelector(\".tab-group__tabs\");if(!e||!s)return;let o=e.classList.contains(\"tab-group__scroll-button--start\")?-1:1,a=s.scrollLeft;s.scrollTo({left:a+o*this.scrollDistance})};#d=t=>{let e=t.target,s=this.#f(e);e&&(e.remove(),e.selected&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}}))),s&&\"a-tab-panel\"===s.tagName.toLowerCase()&&s.remove()};#e(t){return e(t,this)}selectTabByIndex(t){let e=this.#g()[t];e&&this.selectTab(e)}selectTabById(t){let e=this.#g().find(e=>e.id===t);e&&this.selectTab(e)}selectTab(t){let e=this.#g().find(t=>t.selected);!t||t.disabled||t.selected||\"a-tab\"!==t.tagName.toLowerCase()||(this.#C(t),window.requestAnimationFrame(()=>{t.scrollIntoView({inline:\"nearest\",block:\"nearest\"}),t.focus()}),e&&this.dispatchEvent(new CustomEvent(\"a-tab-hide\",{bubbles:!0,composed:!0,detail:{tabId:e.id}})),this.dispatchEvent(new CustomEvent(\"a-tab-show\",{bubbles:!0,composed:!0,detail:{tabId:t.id}})))}static defineCustomElement(t=\"a-tab-group\"){\"undefined\"==typeof window||window.customElements.get(t)||window.customElements.define(t,m)}}m.defineCustomElement();export{m as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ /** @typedef {import('./a-tab').Tab} Tab */ /** @typedef {import('./a-tab-panel').TabPanel} TabPanel */ // @ts-check\n// @ts-check\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */ const $aa07eeb3067ea186$export$e2a22331486dcca0 = (prefix = \"\", suffix = \"\")=>{\n const prefixString = typeof prefix === \"string\" && prefix !== \"\" ? prefix + \"-\" : \"\";\n const suffixString = typeof suffix === \"string\" && suffix !== \"\" ? \"-\" + suffix : \"\";\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n return `${prefixString}${randomString}${suffixString}`;\n};\n\n\n// @ts-check\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */ const $2b7397b7d9d03d51$export$f7b23927dede22b3 = (prop, instance)=>{\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\n\nlet $4b127c96b8d62b28$var$tabCounter = 0;\nconst $4b127c96b8d62b28$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\nconst $4b127c96b8d62b28$var$template = document.createElement(\"template\");\n$4b127c96b8d62b28$var$template.innerHTML = /* html */ `\n \n\n
                \n \n
                \n`;\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */ class $4b127c96b8d62b28$export$3e41faf802a29e71 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($4b127c96b8d62b28$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"selected\",\n \"disabled\",\n \"closable\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"selected\" && oldValue !== newValue) this.setAttribute(\"aria-selected\", this.selected.toString());\n if (name === \"disabled\" && oldValue !== newValue) {\n this.setAttribute(\"aria-disabled\", this.disabled.toString());\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n if (name === \"closable\" && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement(\"span\");\n closeButton.className = \"tab__close\";\n closeButton.setAttribute(\"part\", \"close-tab\");\n closeButton.innerHTML = /* html */ ``;\n this.shadowRoot?.querySelector(\".tab\")?.appendChild(closeButton);\n closeButton.addEventListener(\"click\", this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"selected\");\n this.#upgradeProperty(\"disabled\");\n this.#upgradeProperty(\"closable\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"tab\", (++$4b127c96b8d62b28$var$tabCounter).toString());\n this.setAttribute(\"slot\", \"tab\");\n this.setAttribute(\"role\", \"tab\");\n this.setAttribute(\"aria-selected\", \"false\");\n this.setAttribute(\"tabindex\", this.disabled ? \"-1\" : \"0\");\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector(\".tab__close\");\n closeButton?.removeEventListener(\"click\", this.#handleCloseButtonClick);\n }\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */ get selected() {\n return this.hasAttribute(\"selected\");\n }\n set selected(value) {\n this.toggleAttribute(\"selected\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */ get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n this.toggleAttribute(\"disabled\", !!value);\n }\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */ get closable() {\n return this.hasAttribute(\"closable\");\n }\n set closable(value) {\n this.toggleAttribute(\"closable\", !!value);\n }\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n evt.stopPropagation();\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: {\n tabId: this.id\n }\n }));\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n static defineCustomElement(elementName = \"a-tab\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $4b127c96b8d62b28$export$3e41faf802a29e71);\n }\n}\n$4b127c96b8d62b28$export$3e41faf802a29e71.defineCustomElement();\n\n\n// @ts-check\n\nlet $17a63ddf0f11756d$var$panelCounter = 0;\nconst $17a63ddf0f11756d$var$styles = /* css */ `\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\nconst $17a63ddf0f11756d$var$template = document.createElement(\"template\");\n$17a63ddf0f11756d$var$template.innerHTML = /* html */ `\n \n\n
                \n \n
                \n`;\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */ class $17a63ddf0f11756d$export$3d96ec278d3efce4 extends HTMLElement {\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($17a63ddf0f11756d$var$template.content.cloneNode(true));\n }\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.setAttribute(\"slot\", \"panel\");\n this.setAttribute(\"role\", \"tabpanel\");\n this.setAttribute(\"hidden\", \"\");\n if (!this.id) this.id = (0, $aa07eeb3067ea186$export$e2a22331486dcca0)(\"panel\", (++$17a63ddf0f11756d$var$panelCounter).toString());\n }\n static defineCustomElement(elementName = \"a-tab-panel\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $17a63ddf0f11756d$export$3d96ec278d3efce4);\n }\n}\n$17a63ddf0f11756d$export$3d96ec278d3efce4.defineCustomElement();\n\n\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */ const $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE = 200;\n/**\n * The available placements for the tabs.\n */ const $6ed9897cfe6c2018$var$PLACEMENT = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n START: \"start\",\n END: \"end\"\n};\n/**\n * The valid placements for the tabs.\n */ const $6ed9897cfe6c2018$var$validPlacements = Object.entries($6ed9897cfe6c2018$var$PLACEMENT).map(([, value])=>value);\n/**\n * The available activation modes for the tabs.\n */ const $6ed9897cfe6c2018$var$ACTIVATION = {\n AUTO: \"auto\",\n MANUAL: \"manual\"\n};\n/**\n * Defines key codes to help with handling keyboard events.\n */ const $6ed9897cfe6c2018$var$KEYCODE = {\n DOWN: \"ArrowDown\",\n LEFT: \"ArrowLeft\",\n RIGHT: \"ArrowRight\",\n UP: \"ArrowUp\",\n HOME: \"Home\",\n END: \"End\",\n ENTER: \"Enter\",\n SPACE: \" \"\n};\nconst $6ed9897cfe6c2018$var$styles = /* css */ `\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${$6ed9897cfe6c2018$var$PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\nconst $6ed9897cfe6c2018$var$template = document.createElement(\"template\");\n$6ed9897cfe6c2018$var$template.innerHTML = /* html */ `\n \n\n
                \n
                \n \n\n
                \n \n
                \n\n \n
                \n\n
                \n \n
                \n
                \n`;\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */ class $6ed9897cfe6c2018$export$85fd4ed3b8ca1010 extends HTMLElement {\n /** @type {Nullable} */ #resizeObserver = null;\n /** @type {Nullable} */ #rafId = null;\n /** @type {boolean} */ #hasTabSlotChangedOnce = false;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($6ed9897cfe6c2018$var$template.content.cloneNode(true));\n }\n }\n static get observedAttributes() {\n return [\n \"placement\",\n \"no-scroll-controls\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"placement\" && oldValue !== newValue) this.#syncNav();\n if (name === \"no-scroll-controls\" && oldValue !== newValue) this.#syncNav();\n }\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */ get placement() {\n return this.getAttribute(\"placement\") || $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n }\n set placement(value) {\n if (value != null) this.setAttribute(\"placement\", value);\n }\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */ get noScrollControls() {\n return this.hasAttribute(\"no-scroll-controls\");\n }\n set noScrollControls(value) {\n this.toggleAttribute(\"no-scroll-controls\", !!value);\n }\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */ get scrollDistance() {\n const value = Number(this.getAttribute(\"scroll-distance\"));\n return Math.abs(value) || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE;\n }\n set scrollDistance(value) {\n this.setAttribute(\"scroll-distance\", Math.abs(value).toString() || $6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE.toString());\n }\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */ get activation() {\n return this.getAttribute(\"activation\") || $6ed9897cfe6c2018$var$ACTIVATION.AUTO;\n }\n set activation(value) {\n this.setAttribute(\"activation\", value || $6ed9897cfe6c2018$var$ACTIVATION.AUTO);\n }\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */ get noTabCycling() {\n return this.hasAttribute(\"no-tab-cycling\");\n }\n set noTabCycling(value) {\n this.toggleAttribute(\"no-tab-cycling\", !!value);\n }\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"placement\");\n this.#upgradeProperty(\"noScrollControls\");\n this.#upgradeProperty(\"scrollDistance\");\n this.#upgradeProperty(\"activation\");\n this.#upgradeProperty(\"noTabCycling\");\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.addEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.addEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.addEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.addEventListener(\"click\", this.#handleScrollButtonClick));\n this.addEventListener(\"a-tab-close\", this.#handleTabClose);\n if (\"ResizeObserver\" in window) this.#resizeObserver = new ResizeObserver((entries)=>{\n this.#rafId = window.requestAnimationFrame(()=>{\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach((el)=>el.toggleAttribute(\"hidden\", !isElementScrollable));\n navContainer?.part.toggle(\"nav--has-scroll-controls\", isElementScrollable);\n navContainer?.classList.toggle(\"tab-group__nav--has-scroll-controls\", isElementScrollable);\n });\n });\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */ disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector(\"slot[name=tab]\");\n const panelSlot = this.shadowRoot?.querySelector(\"slot[name=panel]\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n tabSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n panelSlot?.removeEventListener(\"slotchange\", this.#handleSlotChange);\n tabsContainer?.removeEventListener(\"click\", this.#handleTabClick);\n tabsContainer?.removeEventListener(\"keydown\", this.#handleKeyDown);\n scrollButtons.forEach((el)=>el.removeEventListener(\"click\", this.#handleScrollButtonClick));\n this.removeEventListener(\"a-tab-close\", this.#handleTabClose);\n this.#stopResizeObserver();\n }\n /**\n * Starts observing the tabs container for resize events.\n */ #startResizeObserver() {\n if (!this.#resizeObserver) return;\n const scrollElement = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n /**\n * Stops observing the tabs container for resize events.\n */ #stopResizeObserver() {\n if (!this.#resizeObserver) return;\n this.#resizeObserver.disconnect();\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */ #getDirection() {\n return getComputedStyle(this).direction || \"ltr\";\n }\n /**\n * Hides the tab group if there are no tabs.\n */ #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */ #linkPanels() {\n const tabs = this.#allTabs();\n this.#hideEmptyTabGroup();\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach((tab)=>{\n const panel = tab.nextElementSibling;\n if (!panel || panel.tagName.toLowerCase() !== \"a-tab-panel\") return console.error(`Tab #${tab.id} is not a sibling of a `);\n tab.setAttribute(\"aria-controls\", panel.id);\n panel.setAttribute(\"aria-labelledby\", tab.id);\n });\n }\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */ #allPanels() {\n return Array.from(this.querySelectorAll(\"a-tab-panel\"));\n }\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */ #allTabs() {\n return Array.from(this.querySelectorAll(\"a-tab\"));\n }\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */ #panelForTab(tab) {\n const panelId = tab.getAttribute(\"aria-controls\");\n return this.querySelector(`#${panelId}`);\n }\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */ #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find((tab)=>!tab.disabled) || null;\n }\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */ #lastTab() {\n const tabs = this.#allTabs();\n for(let i = tabs.length - 1; i >= 0; i--){\n if (!tabs[i].disabled) return tabs[i];\n }\n return null;\n }\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */ #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) - 1 : tabs.findIndex((tab)=>tab.selected) - 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[(newIdx + tabs.length) % tabs.length].disabled)newIdx--;\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) return null;\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */ #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tabs.findIndex((tab)=>tab.matches(\":focus\")) + 1 : tabs.findIndex((tab)=>tab.selected) + 1;\n // Keep looping until we find a non-disabled tab.\n while(tabs[newIdx % tabs.length].disabled)newIdx++;\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) return null;\n return tabs[newIdx % tabs.length];\n }\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */ #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n tabs.forEach((tab)=>tab.selected = false);\n panels.forEach((panel)=>panel.hidden = true);\n }\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */ #syncNav() {\n const navContainer = this.shadowRoot?.querySelector(\".tab-group__nav\");\n /** @type {HTMLButtonElement[]} */ const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll(\".tab-group__scroll-button\") || []);\n if (this.noScrollControls || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.START || this.placement === $6ed9897cfe6c2018$var$PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = true);\n navContainer?.part.remove(\"nav--has-scroll-controls\");\n navContainer?.classList.remove(\"tab-group__nav--has-scroll-controls\");\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach((el)=>el.hidden = false);\n }\n }\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */ #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find((tab)=>tab.selected && !tab.disabled) || tabs.find((tab)=>!tab.disabled);\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n this.#setSelectedTab(tab);\n }\n }\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */ #setSelectedTab(tab) {\n this.#reset();\n if (tab) tab.selected = true;\n const panel = this.#panelForTab(tab);\n if (panel) panel.hidden = false;\n }\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */ #handleSlotChange = (evt)=>{\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n if (evt.target.name === \"tab\") this.#hasTabSlotChangedOnce = true;\n };\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */ #handleKeyDown = (evt)=>{\n if (evt.target.tagName.toLowerCase() !== \"a-tab\" // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) return;\n const placement = $6ed9897cfe6c2018$var$validPlacements.includes(this.placement || \"\") ? this.placement : $6ed9897cfe6c2018$var$PLACEMENT.TOP;\n const orientation = [\n $6ed9897cfe6c2018$var$PLACEMENT.TOP,\n $6ed9897cfe6c2018$var$PLACEMENT.BOTTOM\n ].includes(placement || \"\") ? \"horizontal\" : \"vertical\";\n const direction = this.#getDirection();\n let tab = null;\n switch(evt.key){\n case $6ed9897cfe6c2018$var$KEYCODE.LEFT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#prevTab() : this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.RIGHT:\n if (orientation === \"horizontal\") {\n tab = direction === \"ltr\" ? this.#nextTab() : this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.UP:\n if (orientation === \"vertical\") {\n tab = this.#prevTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.DOWN:\n if (orientation === \"vertical\") {\n tab = this.#nextTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.END:\n tab = this.#lastTab();\n if (tab) this.activation === $6ed9897cfe6c2018$var$ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n break;\n case $6ed9897cfe6c2018$var$KEYCODE.ENTER:\n case $6ed9897cfe6c2018$var$KEYCODE.SPACE:\n tab = evt.target;\n if (tab) this.selectTab(tab);\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */ #handleTabClick = (evt)=>{\n const tab = evt.target.closest(\"a-tab\");\n if (tab) this.selectTab(tab);\n };\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */ #handleScrollButtonClick = (evt)=>{\n const scrollButton = evt.target.closest(\".tab-group__scroll-button\");\n const tabsContainer = this.shadowRoot?.querySelector(\".tab-group__tabs\");\n if (!scrollButton || !tabsContainer) return;\n const sign = scrollButton.classList.contains(\"tab-group__scroll-button--start\") ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */ #handleTabClose = (evt)=>{\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n if (tab) {\n tab.remove();\n tab.selected && this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n if (panel && panel.tagName.toLowerCase() === \"a-tab-panel\") panel.remove();\n };\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n return (0, $2b7397b7d9d03d51$export$f7b23927dede22b3)(prop, this);\n }\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */ selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */ selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find((tab)=>tab.id === id);\n if (tab) this.selectTab(tab);\n }\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */ selectTab(tab) {\n const oldTab = this.#allTabs().find((t)=>t.selected);\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== \"a-tab\") return;\n this.#setSelectedTab(tab);\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(()=>{\n tab.scrollIntoView({\n inline: \"nearest\",\n block: \"nearest\"\n });\n tab.focus();\n });\n if (oldTab) this.dispatchEvent(new CustomEvent(\"a-tab-hide\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: oldTab.id\n }\n }));\n this.dispatchEvent(new CustomEvent(\"a-tab-show\", {\n bubbles: true,\n composed: true,\n detail: {\n tabId: tab.id\n }\n }));\n }\n static defineCustomElement(elementName = \"a-tab-group\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $6ed9897cfe6c2018$export$85fd4ed3b8ca1010);\n }\n}\n$6ed9897cfe6c2018$export$85fd4ed3b8ca1010.defineCustomElement();\n\n\nexport {$6ed9897cfe6c2018$export$85fd4ed3b8ca1010 as TabGroup};\n//# sourceMappingURL=a-tab-group.js.map\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\n/** @typedef {import('./a-tab').Tab} Tab */\n/** @typedef {import('./a-tab-panel').TabPanel} TabPanel */\n\nimport './a-tab.js';\nimport './a-tab-panel.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\n/**\n * The default scroll distance in pixels that the\n * tabs will scroll when the scroll buttons are clicked.\n */\nconst DEFAULT_SCROLL_DISTANCE = 200;\n\n/**\n * The available placements for the tabs.\n */\nconst PLACEMENT = {\n TOP: 'top',\n BOTTOM: 'bottom',\n START: 'start',\n END: 'end'\n};\n\n/**\n * The valid placements for the tabs.\n */\nconst validPlacements = Object.entries(PLACEMENT).map(([, value]) => value);\n\n/**\n * The available activation modes for the tabs.\n */\nconst ACTIVATION = {\n AUTO: 'auto',\n MANUAL: 'manual'\n};\n\n/**\n * Defines key codes to help with handling keyboard events.\n */\nconst KEYCODE = {\n DOWN: 'ArrowDown',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n HOME: 'Home',\n END: 'End',\n ENTER: 'Enter',\n SPACE: ' '\n};\n\nconst styles = /* css */`\n :host {\n --selected-tab-color: #005fcc;\n --selected-tab-bg-color: transparent;\n --tabs-scroll-behavior: smooth;\n --scroll-button-width: 2.125em;\n --scroll-button-height: 2.125em;\n --scroll-button-inline-offset: 0rem;\n\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n --tabs-scroll-behavior: auto;\n }\n }\n\n :host([hidden]),\n [hidden],\n ::slotted([hidden]) {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab-group {\n display: flex;\n width: 100%;\n }\n\n .tab-group__nav {\n position: relative;\n }\n\n .tab-group__nav--has-scroll-controls {\n padding: 0 calc(var(--scroll-button-width) + var(--scroll-button-inline-offset));\n }\n\n .tab-group__scroll-button {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: var(--scroll-button-width);\n height: var(--scroll-button-height);\n padding: 0; /* Required for iOS, otherwise the svg is not visible: https://stackoverflow.com/questions/66532071/flex-svg-behaving-strange-in-ios-safari-14-0-3 */\n border: 0;\n z-index: 1;\n background-color: transparent;\n font-size: inherit;\n cursor: pointer;\n color: currentColor;\n }\n\n .tab-group__scroll-button--start {\n left: var(--scroll-button-inline-offset);\n }\n\n .tab-group__scroll-button--end {\n right: var(--scroll-button-inline-offset);\n }\n\n .tab-group__tabs {\n display: flex;\n padding: 0.25rem;\n overflow-x: auto;\n scroll-behavior: var(--tabs-scroll-behavior);\n scrollbar-width: none;\n }\n\n .tab-group__tabs::-webkit-scrollbar {\n display: none;\n }\n\n .tab-group__panels {\n padding: 1rem 0;\n }\n\n /* placement=\"top\" */\n .tab-group,\n :host([placement=\"${PLACEMENT.TOP}\"]) .tab-group {\n flex-direction: column;\n }\n\n /* placement=\"bottom\" */\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group {\n flex-direction: column;\n }\n\n :host([placement=\"${PLACEMENT.BOTTOM}\"]) .tab-group__nav {\n order: 1;\n }\n\n /* placement=\"start\" */\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.START}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n\n /* placement=\"end\" */\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group {\n flex-direction: row;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__nav {\n order: 1;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__tabs {\n flex-direction: column;\n align-items: flex-start;\n }\n\n :host([placement=\"${PLACEMENT.END}\"]) .tab-group__panels {\n flex: 1;\n padding: 0 1rem;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
                \n
                \n \n\n
                \n \n
                \n\n \n
                \n\n
                \n \n
                \n
                \n`;\n\n/**\n * @summary Container element for tabs and panels. All children of should be either `` or ``.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-group\n * @extends HTMLElement\n *\n * @property {string} placement - The placement of the tabs.\n * @property {boolean} noScrollControls - Whether or not the scroll controls are enabled.\n * @property {number} scrollDistance - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @property {string} activation - The activation mode of the tabs.\n * @property {boolean} noTabCycling - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n *\n * @attribute placement - Reflects the placement property.\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n * @attribute scroll-distance - Reflects the scrollDistance property.\n * @attribute activation - Reflects the activation property.\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n *\n * @slot tab - Used for groupping tabs in the tab group. Must be elements.\n * @slot panel - Used for groupping tab panels in the tab group. Must be elements.\n *\n * @csspart base - The component's base wrapper.\n * @csspart nav - The nav container.\n * @csspart nav--has-scroll-controls - The nav container when the scroll controls are enabled and visible.\n * @csspart scroll-button - The scroll button.\n * @csspart scroll-button--start - The scroll button for scrolling towards the start.\n * @csspart scroll-button--end - The scroll button for scrolling towards the end.\n * @csspart scroll-button-icon - The scroll button icon.\n * @csspart tabs - The tabs container.\n * @csspart panels - The panels container.\n *\n * @cssproperty --selected-tab-color - The color of the selected tab.\n * @cssproperty --selected-tab-bg-color - The background color of the selected tab.\n * @cssproperty --tabs-scroll-behavior - The scroll behavior of the tabs container.\n * @cssproperty --scroll-button-width - The width of the scroll buttons.\n * @cssproperty --scroll-button-height - The height of the scroll buttons.\n * @cssproperty --scroll-button-inline-offset - The inline offset of the scroll buttons.\n *\n * @event a-tab-show - Fired when a tab is shown.\n * @event a-tab-hide - Fired when a tab is shown.\n *\n * @method selectTabByIndex - Selects the tab at the given index.\n * @method selectTabById - Selects the tab with the given id.\n * @method selectTab - Selects the given tab.\n */\nclass TabGroup extends HTMLElement {\n /** @type {Nullable} */\n #resizeObserver = null;\n\n /** @type {Nullable} */\n #rafId = null;\n\n /** @type {boolean} */\n #hasTabSlotChangedOnce = false;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['placement', 'no-scroll-controls'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'placement' && oldValue !== newValue) {\n this.#syncNav();\n }\n\n if (name === 'no-scroll-controls' && oldValue !== newValue) {\n this.#syncNav();\n }\n }\n\n /**\n * @type {Nullable} - The placement of the tabs.\n * @default 'top'\n * @attribute placement - Reflects the placement property.\n */\n get placement() {\n return this.getAttribute('placement') || PLACEMENT.TOP;\n }\n\n set placement(value) {\n if (value != null) {\n this.setAttribute('placement', value);\n }\n }\n\n /**\n * @type {boolean} - Whether or not the scroll controls are enabled.\n * @default false\n * @attribute no-scroll-controls - Reflects the noScrollControls property.\n */\n get noScrollControls() {\n return this.hasAttribute('no-scroll-controls');\n }\n\n set noScrollControls(value) {\n this.toggleAttribute('no-scroll-controls', !!value);\n }\n\n /**\n * @type {number} - The distance in pixels that the tabs will scroll when the scroll buttons are clicked.\n * @default 200\n * @attribute scroll-distance - Reflects the scrollDistance property.\n */\n get scrollDistance() {\n const value = Number(this.getAttribute('scroll-distance'));\n return Math.abs(value) || DEFAULT_SCROLL_DISTANCE;\n }\n\n set scrollDistance(value) {\n this.setAttribute('scroll-distance', Math.abs(value).toString() || DEFAULT_SCROLL_DISTANCE.toString());\n }\n\n /**\n * @type {string} - The activation mode of the tabs.\n * @default 'auto'\n * @attribute activation - Reflects the activation property.\n */\n get activation() {\n return this.getAttribute('activation') || ACTIVATION.AUTO;\n }\n\n set activation(value) {\n this.setAttribute('activation', value || ACTIVATION.AUTO);\n }\n\n /**\n * @type {boolean} - Whether or not the tabs should cycle when reaching the first or last tab using the keyboard.\n * @default false\n * @attribute no-tab-cycling - Reflects the noTabCycling property.\n */\n get noTabCycling() {\n return this.hasAttribute('no-tab-cycling');\n }\n\n set noTabCycling(value) {\n this.toggleAttribute('no-tab-cycling', !!value);\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('placement');\n this.#upgradeProperty('noScrollControls');\n this.#upgradeProperty('scrollDistance');\n this.#upgradeProperty('activation');\n this.#upgradeProperty('noTabCycling');\n\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.addEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.addEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.addEventListener('click', this.#handleTabClick);\n tabsContainer?.addEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.addEventListener('click', this.#handleScrollButtonClick));\n this.addEventListener('a-tab-close', this.#handleTabClose);\n\n if ('ResizeObserver' in window) {\n this.#resizeObserver = new ResizeObserver(entries => {\n this.#rafId = window.requestAnimationFrame(() => {\n const entry = entries?.[0];\n const targetElement = entry?.target;\n const isElementScrollable = targetElement?.scrollWidth > targetElement?.clientWidth;\n scrollButtons.forEach(el => el.toggleAttribute('hidden', !isElementScrollable));\n navContainer?.part.toggle('nav--has-scroll-controls', isElementScrollable);\n navContainer?.classList.toggle('tab-group__nav--has-scroll-controls', isElementScrollable);\n });\n });\n }\n\n this.#hideEmptyTabGroup();\n this.#syncNav();\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const tabSlot = this.shadowRoot?.querySelector('slot[name=tab]');\n const panelSlot = this.shadowRoot?.querySelector('slot[name=panel]');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n tabSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n panelSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n tabsContainer?.removeEventListener('click', this.#handleTabClick);\n tabsContainer?.removeEventListener('keydown', this.#handleKeyDown);\n scrollButtons.forEach(el => el.removeEventListener('click', this.#handleScrollButtonClick));\n this.removeEventListener('a-tab-close', this.#handleTabClose);\n this.#stopResizeObserver();\n }\n\n /**\n * Starts observing the tabs container for resize events.\n */\n #startResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n const scrollElement = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (scrollElement) {\n this.#resizeObserver.unobserve(scrollElement);\n this.#resizeObserver.observe(scrollElement);\n }\n }\n\n /**\n * Stops observing the tabs container for resize events.\n */\n #stopResizeObserver() {\n if (!this.#resizeObserver) {\n return;\n }\n\n this.#resizeObserver.disconnect();\n\n if (this.#rafId !== null) {\n window.cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n\n /**\n * Gets the direction of the tab group.\n *\n * @returns {string} The direction of the tab group.\n */\n #getDirection() {\n return getComputedStyle(this).direction || 'ltr';\n }\n\n /**\n * Hides the tab group if there are no tabs.\n */\n #hideEmptyTabGroup() {\n this.hidden = this.#allTabs().length === 0;\n }\n\n /**\n * Links up tabs with their adjacent panels using `aria-controls` and `aria-labelledby`.\n * This method makes sure only one tab is selected at a time.\n */\n #linkPanels() {\n const tabs = this.#allTabs();\n\n this.#hideEmptyTabGroup();\n\n // Give each panel a `aria-labelledby` attribute that refers to the tab that controls it.\n tabs.forEach(tab => {\n const panel = tab.nextElementSibling;\n\n if (!panel || panel.tagName.toLowerCase() !== 'a-tab-panel') {\n return console.error(`Tab #${tab.id} is not a sibling of a `);\n }\n\n tab.setAttribute('aria-controls', panel.id);\n panel.setAttribute('aria-labelledby', tab.id);\n });\n }\n\n /**\n * Get all panels in the tab group.\n *\n * @returns {TabPanel[]} All the panels in the tab group.\n */\n #allPanels() {\n return Array.from(this.querySelectorAll('a-tab-panel'));\n }\n\n /**\n * Get all tabs in the tab group.\n *\n * @returns {Tab[]} All the tabs in the tab group.\n */\n #allTabs() {\n return Array.from(this.querySelectorAll('a-tab'));\n }\n\n /**\n * Get the panel for the given tab.\n *\n * @param {Tab} tab - The tab whose panel is to be returned.\n * @returns {Nullable} - The panel controlled by the given tab.\n */\n #panelForTab(tab) {\n const panelId = tab.getAttribute('aria-controls');\n return this.querySelector(`#${panelId}`);\n }\n\n /**\n * Get the first non-disabled tab in the tab group.\n *\n * @returns {Nullable} The first tab in the tab group.\n */\n #firstTab() {\n const tabs = this.#allTabs();\n return tabs.find(tab => !tab.disabled) || null;\n }\n\n /**\n * Get the last non-disabled tab in the tab group.\n *\n * @returns {Nullable} The last tab in the tab group.\n */\n #lastTab() {\n const tabs = this.#allTabs();\n\n for (let i = tabs.length - 1; i >= 0; i--) {\n if (!tabs[i].disabled) {\n return tabs[i];\n }\n }\n\n return null;\n }\n\n /**\n * Get the tab that comes before the currently selected one, wrapping around when reaching the first tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The previous tab.\n */\n #prevTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) - 1\n : tabs.findIndex(tab => tab.selected) - 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[(newIdx + tabs.length) % tabs.length].disabled) {\n newIdx--;\n }\n\n // Stop cycling through tabs if we reach the beginning and tab cycling is disabled.\n if (this.noTabCycling && newIdx < 0) {\n return null;\n }\n\n // Add `tabs.length` to make sure the index is a positive number and get the modulus to wrap around if necessary.\n return tabs[(newIdx + tabs.length) % tabs.length];\n }\n\n /**\n * Get the tab that comes after the currently selected one, wrapping around when reaching the last tab.\n * If the currently selected tab is disabled, the method will skip it.\n *\n * @returns {Nullable} The next tab.\n */\n #nextTab() {\n const tabs = this.#allTabs();\n let newIdx = this.activation === ACTIVATION.MANUAL\n ? tabs.findIndex(tab => tab.matches(':focus')) + 1\n : tabs.findIndex(tab => tab.selected) + 1;\n\n // Keep looping until we find a non-disabled tab.\n while (tabs[newIdx % tabs.length].disabled) {\n newIdx++;\n }\n\n // Stop cycling through tabs if we reach the end and tab cycling is disabled.\n if (this.noTabCycling && newIdx >= tabs.length) {\n return null;\n }\n\n return tabs[newIdx % tabs.length];\n }\n\n /**\n * Marks all tabs as unselected and hides all the panels.\n * This is called every time the user selects a new tab.\n */\n #reset() {\n const tabs = this.#allTabs();\n const panels = this.#allPanels();\n\n tabs.forEach(tab => tab.selected = false);\n panels.forEach(panel => panel.hidden = true);\n }\n\n /**\n * Syncs the tab group navigation with the current state of the tab group.\n *\n * This is called every time the user:\n * - adds or removes a tab or panel\n * - changes the placement of the tabs\n * - enables or disables the scroll controls\n *\n * If the tabs container is scrollable and the scroll controls are enabled,\n * the scroll buttons are displayed and the resize observer is started,\n * otherwise they are hidden and the resize observer is stopped.\n */\n #syncNav() {\n const navContainer = this.shadowRoot?.querySelector('.tab-group__nav');\n\n /** @type {HTMLButtonElement[]} */\n const scrollButtons = Array.from(this.shadowRoot?.querySelectorAll('.tab-group__scroll-button') || []);\n\n if (this.noScrollControls || this.placement === PLACEMENT.START || this.placement === PLACEMENT.END) {\n this.#stopResizeObserver();\n scrollButtons.forEach(el => el.hidden = true);\n navContainer?.part.remove('nav--has-scroll-controls');\n navContainer?.classList.remove('tab-group__nav--has-scroll-controls');\n } else {\n this.#startResizeObserver();\n scrollButtons.forEach(el => el.hidden = false);\n }\n }\n\n /**\n * Sets the selected tab when the slot changes.\n * This is called every time the user adds or removes a tab or panel.\n * This is useful when the user closes the selected tab and we need to select a new one.\n */\n #setSelectedTabOnSlotChange() {\n const tabs = this.#allTabs();\n\n // Get the selected non-disabled tab, or the first non-disabled tab.\n const tab = tabs.find(tab => tab.selected && !tab.disabled) || tabs.find(tab => !tab.disabled);\n\n if (tab) {\n if (this.#hasTabSlotChangedOnce && !tab.selected) {\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n this.#setSelectedTab(tab);\n }\n }\n\n /**\n * Sets the given tab as selected and shows the panel corresponding to the given tab.\n * Differentiates from `selectTab()` in that it does not emit any events or focus the tab.\n * Used internally to set the selected tab when a tab is selected by a side effect,\n * eg. when a tabs and panels are added or removeda and there is a need to select a new tab.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n #setSelectedTab(tab) {\n this.#reset();\n\n if (tab) {\n tab.selected = true;\n }\n\n const panel = this.#panelForTab(tab);\n\n if (panel) {\n panel.hidden = false;\n }\n }\n\n /**\n * Handles the slotchange event on the tab group.\n * This is called every time the user adds or removes a tab or panel.\n *\n * @param {any} evt - The slotchange event.\n */\n #handleSlotChange = evt => {\n this.#linkPanels();\n this.#syncNav();\n this.#setSelectedTabOnSlotChange();\n\n if (evt.target.name === 'tab') {\n this.#hasTabSlotChangedOnce = true;\n }\n };\n\n /**\n * Handles key events on the tab group.\n *\n * @param {any} evt - The keydown event.\n */\n #handleKeyDown = evt => {\n if (\n evt.target.tagName.toLowerCase() !== 'a-tab' // Ignore any key presses that have a modifier.\n || evt.altKey // Don’t handle modifier shortcuts typically used by assistive technology.\n ) {\n return;\n }\n\n const placement = validPlacements.includes(this.placement || '') ? this.placement : PLACEMENT.TOP;\n const orientation = [PLACEMENT.TOP, PLACEMENT.BOTTOM].includes(placement || '') ? 'horizontal' : 'vertical';\n const direction = this.#getDirection();\n let tab = null;\n\n switch (evt.key) {\n case KEYCODE.LEFT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#prevTab() : this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.RIGHT:\n if (orientation === 'horizontal') {\n tab = direction === 'ltr' ? this.#nextTab() : this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.UP:\n if (orientation === 'vertical') {\n tab = this.#prevTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.DOWN:\n if (orientation === 'vertical') {\n tab = this.#nextTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n }\n break;\n case KEYCODE.HOME:\n tab = this.#firstTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.END:\n tab = this.#lastTab();\n if (tab) {\n this.activation === ACTIVATION.MANUAL ? tab.focus() : this.selectTab(tab);\n }\n break;\n case KEYCODE.ENTER:\n case KEYCODE.SPACE:\n tab = evt.target;\n if (tab) {\n this.selectTab(tab);\n }\n break;\n default:\n // Any other key press is ignored and passed back to the browser.\n return;\n }\n\n // The browser might have some native functionality bound to the arrow keys, home or end.\n // `preventDefault()` is called to prevent the browser from taking any actions.\n evt.preventDefault();\n };\n\n /**\n * Handles click events on the tab group.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClick = evt => {\n const tab = evt.target.closest('a-tab');\n\n if (tab) {\n this.selectTab(tab);\n }\n };\n\n /**\n * Handles the scroll button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleScrollButtonClick = evt => {\n const scrollButton = evt.target.closest('.tab-group__scroll-button');\n const tabsContainer = this.shadowRoot?.querySelector('.tab-group__tabs');\n\n if (!scrollButton || !tabsContainer) {\n return;\n }\n\n const sign = scrollButton.classList.contains('tab-group__scroll-button--start') ? -1 : 1;\n const offsetLeft = tabsContainer.scrollLeft;\n\n tabsContainer.scrollTo({\n left: offsetLeft + sign * this.scrollDistance\n });\n };\n\n /**\n * Handles the tab close button click event.\n *\n * @param {any} evt - The click event.\n */\n #handleTabClose = evt => {\n const tab = evt.target;\n const panel = this.#panelForTab(tab);\n\n if (tab) {\n tab.remove();\n\n tab.selected && this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n if (panel && panel.tagName.toLowerCase() === 'a-tab-panel') {\n panel.remove();\n }\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'placement' | 'noScrollControls' | 'scrollDistance' | 'activation' | 'noTabCycling'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n /**\n * Selects the tab at the given index.\n * If the tab at the given index is disabled or already selected, this method does nothing.\n *\n * @param {number} index - The index of the tab to be selected.\n */\n selectTabByIndex(index) {\n const tabs = this.#allTabs();\n const tab = tabs[index];\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the tab with the given id.\n * If the tab with the given id is disabled or already selected, this method does nothing.\n *\n * @param {string} id - The id of the tab to be selected.\n */\n selectTabById(id) {\n const tabs = this.#allTabs();\n const tab = tabs.find(tab => tab.id === id);\n\n if (tab) {\n this.selectTab(tab);\n }\n }\n\n /**\n * Selects the given tab.\n * If the given tab is disabled or already selected, this method does nothing.\n *\n * @param {Tab} tab - The tab to be selected.\n */\n selectTab(tab) {\n const oldTab = this.#allTabs().find(t => t.selected);\n\n if (!tab || tab.disabled || tab.selected || tab.tagName.toLowerCase() !== 'a-tab') {\n return;\n }\n\n this.#setSelectedTab(tab);\n\n // Queue a microtask to ensure that the tab is focused on the next tick.\n window.requestAnimationFrame(() => {\n tab.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n tab.focus();\n });\n\n if (oldTab) {\n this.dispatchEvent(new CustomEvent('a-tab-hide', {\n bubbles: true,\n composed: true,\n detail: { tabId: oldTab.id }\n }));\n }\n\n this.dispatchEvent(new CustomEvent('a-tab-show', {\n bubbles: true,\n composed: true,\n detail: { tabId: tab.id }\n }));\n }\n\n static defineCustomElement(elementName = 'a-tab-group') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabGroup);\n }\n }\n}\n\nTabGroup.defineCustomElement();\n\nexport { TabGroup };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\nimport { upgradeProperty } from './utils/upgrade-property.js';\n\nlet tabCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: inline-block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n .tab {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.75rem;\n white-space: nowrap;\n cursor: pointer;\n }\n\n :host([disabled]) .tab {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n :host([selected]) .tab {\n color: var(--selected-tab-color);\n background-color: var(--selected-tab-bg-color);\n }\n\n .tab__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n font-size: inherit;\n cursor: pointer;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
                \n \n
                \n`;\n\n/**\n * @summary\n * This is a tab for a tab panel.\n * `` should always be used with `role=heading` in the markup so that the semantics remain useable when JavaScript is failing.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab\n * @extends HTMLElement\n *\n * @property {boolean} selected - Whether the tab is selected.\n * @property {boolean} disabled - Whether the tab is disabled.\n * @property {boolean} closable - Whether the tab is closable.\n *\n * @attribute selected - Reflects the selected property.\n * @attribute disabled - Reflects the disabled property.\n * @attribute closable - Reflects the closable property.\n *\n * @csspart base - The component's base wrapper.\n * @csspart close-tab - The close button.\n * @csspart close-tab-icon - The close button icon.\n *\n * @slot - The tab's content.\n *\n * @event a-tab-close - Fires when the tab's close button is clicked.\n */\nclass Tab extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n static get observedAttributes() {\n return ['selected', 'disabled', 'closable'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'selected' && oldValue !== newValue) {\n this.setAttribute('aria-selected', this.selected.toString());\n }\n\n if (name === 'disabled' && oldValue !== newValue) {\n this.setAttribute('aria-disabled', this.disabled.toString());\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n if (name === 'closable' && oldValue !== newValue) {\n if (this.closable) {\n const closeButton = document.createElement('span');\n closeButton.className = 'tab__close';\n closeButton.setAttribute('part', 'close-tab');\n closeButton.innerHTML = /* html */``;\n this.shadowRoot?.querySelector('.tab')?.appendChild(closeButton);\n closeButton.addEventListener('click', this.#handleCloseButtonClick);\n } else {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n closeButton?.remove();\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('selected');\n this.#upgradeProperty('disabled');\n this.#upgradeProperty('closable');\n\n if (!this.id) {\n this.id = uid('tab', (++tabCounter).toString());\n }\n\n this.setAttribute('slot', 'tab');\n this.setAttribute('role', 'tab');\n this.setAttribute('aria-selected', 'false');\n this.setAttribute('tabindex', this.disabled ? '-1' : '0');\n }\n\n /**\n * Lifecycle method that is called when the element is disconnected from the DOM.\n */\n disconnectedCallback() {\n const closeButton = this.shadowRoot?.querySelector('.tab__close');\n closeButton?.removeEventListener('click', this.#handleCloseButtonClick);\n }\n\n /**\n * @type {boolean} - Whether the tab is selected.\n * @default false\n * @attribute selected - Reflects the selected property.\n */\n get selected() {\n return this.hasAttribute('selected');\n }\n\n set selected(value) {\n this.toggleAttribute('selected', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is disabled.\n * @default false\n * @attribute disabled - Reflects the disabled property.\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value) {\n this.toggleAttribute('disabled', !!value);\n }\n\n /**\n * @type {boolean} - Whether the tab is closable.\n * @default false\n * @attribute closable - Reflects the closable property.\n */\n get closable() {\n return this.hasAttribute('closable');\n }\n\n set closable(value) {\n this.toggleAttribute('closable', !!value);\n }\n\n /**\n * Handles the click event on the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n evt.stopPropagation();\n\n this.dispatchEvent(new CustomEvent(`a-tab-close`, {\n bubbles: true,\n composed: true,\n detail: { tabId: this.id }\n }));\n };\n\n /**\n * Wrapper for the `upgradeProperty` function.\n *\n * @param {'selected' | 'disabled' | 'closable'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n return upgradeProperty(prop, this);\n }\n\n static defineCustomElement(elementName = 'a-tab') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, Tab);\n }\n }\n}\n\nTab.defineCustomElement();\n\nexport { Tab };\n","// @ts-check\n\n/**\n * Generates a unique id of the form `${prefix}-${randomString}-${suffix}`.\n *\n * @param {string} [prefix=''] - The prefix to use for the id.\n * @param {string} [suffix=''] - The suffix to use for the id.\n * @returns {string} - The unique id.\n */\nconst uid = (prefix = '', suffix = '') => {\n const prefixString = typeof prefix === 'string' && prefix !== '' ? prefix + '-' : '';\n const suffixString = typeof suffix === 'string' && suffix !== '' ? '-' + suffix : '';\n const randomString = Math.random().toString(36).substring(2, 8); // Pseudo-random string of six alphanumeric characters.\n\n return `${prefixString}${randomString}${suffixString}`;\n};\n\nexport { uid };\n","// @ts-check\n\n/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {string} prop - The property to upgrade.\n * @param {any} instance - The instance of the tab.\n */\nconst upgradeProperty = (prop, instance) => {\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n};\n\nexport { upgradeProperty };\n","// @ts-check\n\nimport { uid } from './utils/uid.js';\n\nlet panelCounter = 0;\n\nconst styles = /* css */`\n :host {\n box-sizing: border-box;\n display: block;\n contain: content;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n`;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
                \n \n
                \n`;\n\n/**\n * @summary This is a panel for a `` tab panel.\n * @documentation https://github.com/georapbox/a-tab-group\n *\n * @tagname a-tab-panel\n * @extends HTMLElement\n *\n * @csspart base - The component's base wrapper.\n *\n * @slot - The content of the tab panel.\n */\nclass TabPanel extends HTMLElement {\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n }\n\n /**\n * Lifecycle method that is called when the element is first connected to the DOM.\n */\n connectedCallback() {\n this.setAttribute('slot', 'panel');\n this.setAttribute('role', 'tabpanel');\n this.setAttribute('hidden', '');\n\n if (!this.id) {\n this.id = uid('panel', (++panelCounter).toString());\n }\n }\n\n static defineCustomElement(elementName = 'a-tab-panel') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, TabPanel);\n }\n }\n}\n\nTabPanel.defineCustomElement();\n\nexport { TabPanel };\n","Object.defineProperty({},\"ModalElement\",{get:function(){return o},set:void 0,enumerable:!0,configurable:!0});let e=document.createElement(\"template\"),t=/* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: 300ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;e.innerHTML=/* html */`\n \n\n \n
                \n
                \n \n\n
                \n \n
                \n
                \n\n \n\n
                \n \n
                \n
                \n
                \n`;/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */class o extends HTMLElement{/** @type {Nullable} */#e=null;/** @type {Nullable} */#t=null;/** @type {ReturnType | undefined} */#o=void 0;constructor(){if(super(),!this.shadowRoot){let t=this.attachShadow({mode:\"open\"});t.appendChild(e.content.cloneNode(!0))}this.shadowRoot&&(this.#e=this.shadowRoot.querySelector(\"dialog\"),this.#t=this.shadowRoot.querySelector('slot[name=\"footer\"]'))}static get observedAttributes(){return[\"open\",\"no-header\",\"no-animations\",\"no-close-button\"]}/**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */attributeChangedCallback(e,t,o){if(null!==this.#e){if(\"open\"===e&&t!==o&&(this.open?(this.#e.showModal(),this.dispatchEvent(new CustomEvent(\"me-open\",{bubbles:!0,composed:!0,detail:{element:this}}))):this.#e.close()),\"no-header\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__header\");null!==e&&(e.hidden=this.noHeader)}if(\"no-animations\"===e&&t!==o&&this.#e.classList.toggle(\"dialog--no-animations\",this.noAnimations),\"no-close-button\"===e&&t!==o){/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__close\");null!==e&&(e.hidden=this.noCloseButton)}}}/**\n * Lifecycle method that is called when the element is added to the DOM.\n */connectedCallback(){this.#i(\"open\"),this.#i(\"staticBackdrop\"),this.#i(\"noHeader\"),this.#i(\"noAnimations\"),this.#i(\"noCloseButton\"),this.#i(\"fullscreen\"),this.#e?.addEventListener(\"click\",this.#a),this.#e?.addEventListener(\"close\",this.#l),this.#e?.addEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\",this.#n),this.#t?.addEventListener(\"slotchange\",this.#r)}/**\n * Lifecycle method that is called when the element is removed from the DOM.\n */disconnectedCallback(){this.#o&&clearTimeout(this.#o),this.#e?.addEventListener(\"click\",this.#a),this.#e?.removeEventListener(\"close\",this.#l),this.#e?.removeEventListener(\"cancel\",this.#s),this.#e?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\",this.#n),this.#t?.removeEventListener(\"slotchange\",this.#r)}/**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */get open(){return this.hasAttribute(\"open\")}set open(e){e?this.setAttribute(\"open\",\"\"):this.removeAttribute(\"open\")}/**\n * Determines if the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */get staticBackdrop(){return this.hasAttribute(\"static-backdrop\")}set staticBackdrop(e){e?this.setAttribute(\"static-backdrop\",\"\"):this.removeAttribute(\"static-backdrop\")}/**\n * Determines if the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */get noHeader(){return this.hasAttribute(\"no-header\")}set noHeader(e){e?this.setAttribute(\"no-header\",\"\"):this.removeAttribute(\"no-header\")}/**\n * Determines if the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */get noAnimations(){return this.hasAttribute(\"no-animations\")}set noAnimations(e){e?this.setAttribute(\"no-animations\",\"\"):this.removeAttribute(\"no-animations\")}/**\n * Determines if the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */get noCloseButton(){return this.hasAttribute(\"no-close-button\")}set noCloseButton(e){e?this.setAttribute(\"no-close-button\",\"\"):this.removeAttribute(\"no-close-button\")}/**\n * Determines if the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */get fullscreen(){return this.hasAttribute(\"fullscreen\")}set fullscreen(e){e?this.setAttribute(\"fullscreen\",\"\"):this.removeAttribute(\"fullscreen\")}/**\n * Applies a pulse effect on the dialog.\n */#d(){this.#o||(this.#e?.classList.add(\"dialog--pulse\"),this.#o=setTimeout(()=>{this.#e?.classList.remove(\"dialog--pulse\"),clearTimeout(this.#o),this.#o=void 0},300))}/**\n * Handles the close event of the dialog.\n */#l=()=>{// This is needed because the dialog element does not reset\n// the open property when the dialog is closed by the user.\nthis.open=!1,this.dispatchEvent(new CustomEvent(\"me-close\",{bubbles:!0,composed:!0,detail:{element:this}}))};/**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */#s=e=>{let t=this.#c(\"escape-key\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */#n=e=>{let t=this.#c(\"close-button\");this.dispatchEvent(t),t.defaultPrevented&&(e.preventDefault(),this.noAnimations||this.#d())};/**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */#a=e=>{if(e.target!==e.currentTarget)return;let t=this.#c(\"backdrop-click\");if(this.dispatchEvent(t),t.defaultPrevented||this.staticBackdrop){this.noAnimations||this.#d();return}this.#e?.close()};/**\n * Handles the slotchange event of the footer slot.\n */#r=()=>{if(null===this.#e)return;/** @type {Nullable} */let e=this.#e.querySelector(\".dialog__footer\");if(null===e)return;let t=this.#t?.assignedNodes(),o=!!t&&t.length>0;e.hidden=!o};/**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */#c(e){return new CustomEvent(\"me-request-close\",{bubbles:!0,composed:!0,cancelable:!0,detail:{reason:e,element:this}})}/**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen'} prop - The property to upgrade.\n */#i(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}/**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */show(){this.open||(this.open=!0)}/**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */hide(){this.open&&(this.open=!1)}/**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */static defineCustomElement(e=\"modal-element\"){\"undefined\"==typeof window||window.customElements.get(e)||window.customElements.define(e,o)}}o.defineCustomElement();export{o as ModalElement};//# sourceMappingURL=modal-element-defined.js.map\n\n//# sourceMappingURL=modal-element-defined.js.map\n","function $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $180b6dcf923bafc7$exports = {};\n\n$parcel$export($180b6dcf923bafc7$exports, \"ModalElement\", function () { return $180b6dcf923bafc7$export$32589115725b904b; });\n// @ts-check\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */ const $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION = 300;\nconst $180b6dcf923bafc7$var$template = document.createElement(\"template\");\nconst $180b6dcf923bafc7$var$styles = /* css */ `\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${$180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n$180b6dcf923bafc7$var$template.innerHTML = /* html */ `\n \n\n \n
                \n
                \n \n\n
                \n \n
                \n
                \n\n \n\n
                \n \n
                \n
                \n
                \n`;\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */ class $180b6dcf923bafc7$export$32589115725b904b extends HTMLElement {\n /** @type {Nullable} */ #dialogEl = null;\n /** @type {Nullable} */ #footerSlotEl = null;\n /** @type {ReturnType | undefined} */ #pulseAnimationTimeout = void 0;\n constructor(){\n super();\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({\n mode: \"open\"\n });\n shadowRoot.appendChild($180b6dcf923bafc7$var$template.content.cloneNode(true));\n }\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector(\"dialog\");\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n static get observedAttributes() {\n return [\n \"open\",\n \"no-header\",\n \"no-animations\",\n \"no-close-button\"\n ];\n }\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */ attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) return;\n if (name === \"open\" && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n this.dispatchEvent(new CustomEvent(\"me-open\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n } else this.#dialogEl.close();\n }\n if (name === \"no-header\" && oldValue !== newValue) {\n /** @type {Nullable} */ const headerEl = this.#dialogEl.querySelector(\".dialog__header\");\n if (headerEl !== null) headerEl.hidden = this.noHeader;\n }\n if (name === \"no-animations\" && oldValue !== newValue) this.#dialogEl.classList.toggle(\"dialog--no-animations\", this.noAnimations);\n if (name === \"no-close-button\" && oldValue !== newValue) {\n /** @type {Nullable} */ const closeBtnEl = this.#dialogEl.querySelector(\".dialog__close\");\n if (closeBtnEl !== null) closeBtnEl.hidden = this.noCloseButton;\n }\n }\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */ connectedCallback() {\n this.#upgradeProperty(\"open\");\n this.#upgradeProperty(\"staticBackdrop\");\n this.#upgradeProperty(\"noHeader\");\n this.#upgradeProperty(\"noAnimations\");\n this.#upgradeProperty(\"noCloseButton\");\n this.#upgradeProperty(\"fullscreen\");\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.addEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.addEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */ disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener(\"click\", this.#handleDialogClick);\n this.#dialogEl?.removeEventListener(\"close\", this.#handleDialogClose);\n this.#dialogEl?.removeEventListener(\"cancel\", this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener(\"submit\", this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener(\"slotchange\", this.#handleFooterSlotChange);\n }\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */ get open() {\n return this.hasAttribute(\"open\");\n }\n set open(value) {\n if (value) this.setAttribute(\"open\", \"\");\n else this.removeAttribute(\"open\");\n }\n /**\n * Determines if the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */ get staticBackdrop() {\n return this.hasAttribute(\"static-backdrop\");\n }\n set staticBackdrop(value) {\n if (value) this.setAttribute(\"static-backdrop\", \"\");\n else this.removeAttribute(\"static-backdrop\");\n }\n /**\n * Determines if the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */ get noHeader() {\n return this.hasAttribute(\"no-header\");\n }\n set noHeader(value) {\n if (value) this.setAttribute(\"no-header\", \"\");\n else this.removeAttribute(\"no-header\");\n }\n /**\n * Determines if the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */ get noAnimations() {\n return this.hasAttribute(\"no-animations\");\n }\n set noAnimations(value) {\n if (value) this.setAttribute(\"no-animations\", \"\");\n else this.removeAttribute(\"no-animations\");\n }\n /**\n * Determines if the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */ get noCloseButton() {\n return this.hasAttribute(\"no-close-button\");\n }\n set noCloseButton(value) {\n if (value) this.setAttribute(\"no-close-button\", \"\");\n else this.removeAttribute(\"no-close-button\");\n }\n /**\n * Determines if the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */ get fullscreen() {\n return this.hasAttribute(\"fullscreen\");\n }\n set fullscreen(value) {\n if (value) this.setAttribute(\"fullscreen\", \"\");\n else this.removeAttribute(\"fullscreen\");\n }\n /**\n * Applies a pulse effect on the dialog.\n */ #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) return;\n this.#dialogEl?.classList.add(\"dialog--pulse\");\n this.#pulseAnimationTimeout = setTimeout(()=>{\n this.#dialogEl?.classList.remove(\"dialog--pulse\");\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, $180b6dcf923bafc7$var$PULSE_ANIMATION_DURATION);\n }\n /**\n * Handles the close event of the dialog.\n */ #handleDialogClose = ()=>{\n // This is needed because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n this.dispatchEvent(new CustomEvent(\"me-close\", {\n bubbles: true,\n composed: true,\n detail: {\n element: this\n }\n }));\n };\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */ #handleDialogCancel = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"escape-key\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */ #handleCloseButtonClick = (evt)=>{\n const requestCloseEvent = this.#createRequestCloseEvent(\"close-button\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */ #handleDialogClick = (evt)=>{\n if (evt.target !== evt.currentTarget) return;\n const requestCloseEvent = this.#createRequestCloseEvent(\"backdrop-click\");\n this.dispatchEvent(requestCloseEvent);\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n this.#dialogEl?.close();\n };\n /**\n * Handles the slotchange event of the footer slot.\n */ #handleFooterSlotChange = ()=>{\n if (this.#dialogEl === null) return;\n /** @type {Nullable} */ const footerEl = this.#dialogEl.querySelector(\".dialog__footer\");\n if (footerEl === null) return;\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n footerEl.hidden = !hasFooterSlotNodes;\n };\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */ #createRequestCloseEvent(reason) {\n return new CustomEvent(\"me-request-close\", {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason: reason,\n element: this\n }\n });\n }\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen'} prop - The property to upgrade.\n */ #upgradeProperty(prop) {\n /** @type {any} */ const instance = this;\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */ show() {\n if (this.open) return;\n this.open = true;\n }\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */ hide() {\n if (!this.open) return;\n this.open = false;\n }\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */ static defineCustomElement(elementName = \"modal-element\") {\n if (typeof window !== \"undefined\" && !window.customElements.get(elementName)) window.customElements.define(elementName, $180b6dcf923bafc7$export$32589115725b904b);\n }\n}\n\n\n(0, $180b6dcf923bafc7$export$32589115725b904b).defineCustomElement();\n\n\nexport {$180b6dcf923bafc7$export$32589115725b904b as ModalElement};\n//# sourceMappingURL=modal-element-defined.js.map\n","import { ModalElement } from './modal-element.js';\n\nModalElement.defineCustomElement();\n\nexport { ModalElement };\n","// @ts-check\n\n/**\n * Represents a value that may be of type T, or null.\n *\n * @template T\n * @typedef {T | null} Nullable\n */\n\nconst PULSE_ANIMATION_DURATION = 300;\nconst template = document.createElement('template');\n\nconst styles = /* css */`\n :host {\n --me-width: 32rem;\n --me-height: fit-content;\n --me-border-color: initial;\n --me-border-style: solid;\n --me-border-width: initial;\n --me-border-radius: 0;\n --me-box-shadow: none;\n --me-background-color: canvas;\n --me-header-spacing: 1rem;\n --me-body-spacing: 1rem;\n --me-footer-spacing: 1rem;\n --me-header-background-color: transparent;\n --me-body-background-color: transparent;\n --me-footer-background-color: transparent;\n --me-close-border-radius: 0;\n --me-close-background-color: transparent;\n --me-backdrop-background: rgba(0, 0, 0, 0.5);\n --me-backdrop-filter: none;\n\n display: contents;\n box-sizing: border-box;\n }\n\n :host *,\n :host *:after,\n :host *:before {\n box-sizing: inherit;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n /* Dialog */\n .dialog {\n width: var(--me-width);\n height: var(--me-height);\n padding: 0;\n border-color: var(--me-border-color);\n border-style: var(--me-border-style);\n border-width: var(--me-border-width);\n border-radius: var(--me-border-radius);\n box-shadow: var(--me-box-shadow);\n background-color: var(--me-background-color);\n }\n\n .dialog[open] {\n display: flex;\n }\n\n :host([fullscreen]) .dialog {\n max-width: 100%;\n max-height: 100%;\n width: 100%;\n height: 100%;\n }\n\n .dialog::backdrop {\n background: var(--me-backdrop-background, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--me-backdrop-filter, none);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .dialog:not(.dialog--no-animations),\n .dialog:not(.dialog--no-animations)::backdrop {\n transition: transform 0.3s, opacity 0.3s, display 0.3s allow-discrete, overlay 0.3s allow-discrete;\n }\n\n /* 1. IS-OPEN STATE */\n .dialog[open] {\n transform: scale(1);\n opacity: 1;\n }\n\n /* 2. EXIT STATE */\n .dialog {\n transform: scale(0.95);\n opacity: 0;\n }\n\n /* 0. BEFORE-OPEN STATE */\n @starting-style {\n .dialog[open] {\n transform: scale(0.95);\n opacity: 0;\n }\n\n .dialog[open]::backdrop {\n opacity: 0;\n }\n }\n\n .dialog--pulse:not(.dialog--no-animations) {\n animation-name: pulse;\n animation-duration: ${PULSE_ANIMATION_DURATION}ms;\n animation-timing-function: cubic-bezier(0.2, 0, 0.38, 0.9);\n }\n\n @keyframes pulse {\n 0% { transform: scale(1); }\n 50% { transform: scale(1.02); }\n 100% { transform: scale(1); }\n }\n }\n\n /* Dialog panel, header, body, footer */\n .dialog__panel {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n }\n\n .dialog__header {\n display: flex;\n align-items: center;\n padding: var(--me-header-spacing);\n column-gap: 0.5rem;\n background-color: var(--me-header-background-color);\n }\n\n :host([no-close-button]) .dialog__header {\n column-gap: 0;\n }\n\n .dialog__title {\n display: block;\n flex: 1 1 auto;\n padding: 0;\n margin: 0;\n }\n\n .dialog__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--me-body-spacing);\n overflow: auto;\n background-color: var(--me-body-background-color);\n overscroll-behavior: contain;\n }\n\n .dialog__footer {\n flex: 0 0 auto;\n text-align: right;\n\n padding: var(--me-footer-spacing);\n background-color: var(--me-footer-background-color);\n }\n\n .dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.4375rem;\n border: none;\n background-color: transparent;\n }\n\n .dialog__close:not(:disabled) {\n cursor: pointer;\n }\n\n .dialog__close:disabled {\n cursor: not-allowed;\n }\n`;\n\ntemplate.innerHTML = /* html */`\n \n\n \n
                \n
                \n \n\n
                \n \n
                \n
                \n\n \n\n
                \n \n
                \n
                \n
                \n`;\n\n/**\n * @summary A custom element that renders a modal dialog.\n * @extends HTMLElement\n *\n * @property {boolean} open - Determines if the modal is open or not.\n * @property {boolean} staticBackdrop - Determines if the modal should close when the backdrop is clicked.\n * @property {boolean} noHeader - Determines if the modal should have a header or not.\n * @property {boolean} noAnimations - Determines if the modal should have animations or not when opening and closing.\n * @property {boolean} noCloseButton - Determines if the modal should have a default close button or not.\n * @property {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @attribute {boolean} open - Determines if the modal is open or not.\n * @attribute {boolean} static-backdrop - Determines if the modal should close when the backdrop is clicked.\n * @attribute {boolean} no-header - Determines if the modal should have a header or not.\n * @attribute {boolean} no-animations - Determines if the modal should have animations or not when opening and closing.\n * @attribute {boolean} no-close-button - Determines if the modal should have a default close button or not.\n * @attribute {boolean} fullscreen - Determines if the modal should be fullscreen or not.\n *\n * @slot - The modal's main content (default/unnamed slot).\n * @slot header - The modal's header content, usually a title.\n * @slot footer - The modals' footer content. Usually used for buttons or other actions.\n * @slot close - The content of the close button that appears in the modal's header.\n *\n * @cssproperty --me-width - The width of the modal. Default is 32rem.\n * @cssproperty --me-height - The height of the modal. Default is fit-content.\n * @cssproperty --me-border-color - The border color of the modal. Default is initial.\n * @cssproperty --me-border-style - The border style of the modal. Default is solid.\n * @cssproperty --me-border-width - The border width of the modal. Default is initial.\n * @cssproperty --me-border-radius - The border radius of the modal. Default is 0.\n * @cssproperty --me-box-shadow - The box shadow of the modal. Default is none.\n * @cssproperty --me-background-color - The background color of the modal. Default is canvas.\n * @cssproperty --me-header-spacing - The spacing of the header. Default is 1rem.\n * @cssproperty --me-body-spacing - The spacing of the body. Default is 1rem.\n * @cssproperty --me-footer-spacing - The spacing of the footer. Default is 1rem.\n * @cssproperty --me-header-background-color - The background color of the header. Default is transparent.\n * @cssproperty --me-body-background-color - The background color of the body. Default is transparent.\n * @cssproperty --me-footer-background-color - The background color of the footer. Default is transparent.\n * @cssproperty --me-close-border-radius - The border radius of the close button. Default is 0.\n * @cssproperty --me-close-background-color - The background color of the close button. Default is transparent.\n * @cssproperty --me-backdrop-background - The background shorthand property of the backdrop. Default is rgba(0, 0, 0, 0.5).\n * @cssproperty --me-backdrop-filter - The backdrop filter property of the backdrop. Default is none.\n *\n * @csspart base - The base wrapper of the modal.\n * @csspart panel - The panel wrapper of the modal.\n * @csspart header - The header wrapper of the modal.\n * @csspart title - The title wrapper of the modal.\n * @csspart body - The body wrapper of the modal.\n * @csspart footer - The footer wrapper of the modal.\n * @csspart close - The close button of the modal.\n *\n * @fires me-open - Dispatched when the modal is opened.\n * @fires me-close - Dispatched when the modal is closed.\n * @fires me-request-close - Dispatched when the modal is about to close.\n *\n * @method defineCustomElement - Static method. Defines a custom element with the given name.\n * @method show - Instance method. Opens the modal if it is closed, otherwise does nothing.\n * @method hide - Instance method. Closes the modal if it is open, otherwise does nothing.\n *\n * @tagname modal-element - This is the default tag name, unless overridden by the `defineCustomElement` method.\n */\nclass ModalElement extends HTMLElement {\n /** @type {Nullable} */\n #dialogEl = null;\n\n /** @type {Nullable} */\n #footerSlotEl = null;\n\n /** @type {ReturnType | undefined} */\n #pulseAnimationTimeout = void 0;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n if (this.shadowRoot) {\n this.#dialogEl = this.shadowRoot.querySelector('dialog');\n this.#footerSlotEl = this.shadowRoot.querySelector('slot[name=\"footer\"]');\n }\n }\n\n static get observedAttributes() {\n return ['open', 'no-header', 'no-animations', 'no-close-button'];\n }\n\n /**\n * Lifecycle method that is called when attributes are changed, added, removed, or replaced.\n *\n * @param {string} name - The name of the attribute.\n * @param {string} oldValue - The old value of the attribute.\n * @param {string} newValue - The new value of the attribute.\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.#dialogEl === null) {\n return;\n }\n\n if (name === 'open' && oldValue !== newValue) {\n if (this.open) {\n this.#dialogEl.showModal();\n\n this.dispatchEvent(new CustomEvent('me-open', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n } else {\n this.#dialogEl.close();\n }\n }\n\n if (name === 'no-header' && oldValue !== newValue) {\n /** @type {Nullable} */\n const headerEl = this.#dialogEl.querySelector('.dialog__header');\n\n if (headerEl !== null) {\n headerEl.hidden = this.noHeader;\n }\n }\n\n if (name === 'no-animations' && oldValue !== newValue) {\n this.#dialogEl.classList.toggle('dialog--no-animations', this.noAnimations);\n }\n\n if (name === 'no-close-button' && oldValue !== newValue) {\n /** @type {Nullable} */\n const closeBtnEl = this.#dialogEl.querySelector('.dialog__close');\n\n if (closeBtnEl !== null) {\n closeBtnEl.hidden = this.noCloseButton;\n }\n }\n }\n\n /**\n * Lifecycle method that is called when the element is added to the DOM.\n */\n connectedCallback() {\n this.#upgradeProperty('open');\n this.#upgradeProperty('staticBackdrop');\n this.#upgradeProperty('noHeader');\n this.#upgradeProperty('noAnimations');\n this.#upgradeProperty('noCloseButton');\n this.#upgradeProperty('fullscreen');\n\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.addEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.addEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.addEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.addEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Lifecycle method that is called when the element is removed from the DOM.\n */\n disconnectedCallback() {\n this.#pulseAnimationTimeout && clearTimeout(this.#pulseAnimationTimeout);\n this.#dialogEl?.addEventListener('click', this.#handleDialogClick);\n this.#dialogEl?.removeEventListener('close', this.#handleDialogClose);\n this.#dialogEl?.removeEventListener('cancel', this.#handleDialogCancel);\n this.#dialogEl?.querySelector('form[method=\"dialog\"]')?.removeEventListener('submit', this.#handleCloseButtonClick);\n this.#footerSlotEl?.removeEventListener('slotchange', this.#handleFooterSlotChange);\n }\n\n /**\n * Deternimes if the modal is open or not.\n *\n * @type {boolean} - True if the modal is open, otherwise false.\n * @default false\n * @attribute open - Reflects the open property.\n */\n get open() {\n return this.hasAttribute('open');\n }\n\n set open(value) {\n if (value) {\n this.setAttribute('open', '');\n } else {\n this.removeAttribute('open');\n }\n }\n\n /**\n * Determines if the modal should close when the backdrop is clicked.\n *\n * @type {boolean} - True if the modal should close when the backdrop is clicked, otherwise false.\n * @default false\n * @attribute static-backdrop - Reflects the staticBackdrop property.\n */\n get staticBackdrop() {\n return this.hasAttribute('static-backdrop');\n }\n\n set staticBackdrop(value) {\n if (value) {\n this.setAttribute('static-backdrop', '');\n } else {\n this.removeAttribute('static-backdrop');\n }\n }\n\n /**\n * Determines if the modal should have a header or not.\n *\n * @type {boolean} - True if the modal should have a header, otherwise false.\n * @default false\n * @attribute no-header - Reflects the noHeader property.\n */\n get noHeader() {\n return this.hasAttribute('no-header');\n }\n\n set noHeader(value) {\n if (value) {\n this.setAttribute('no-header', '');\n } else {\n this.removeAttribute('no-header');\n }\n }\n\n /**\n * Determines if the modal should have animations or not when opening and closing.\n *\n * @type {boolean} - True if the modal should have animations, otherwise false.\n * @default false\n * @attribute no-animations - Reflects the noAnimations property.\n */\n get noAnimations() {\n return this.hasAttribute('no-animations');\n }\n\n set noAnimations(value) {\n if (value) {\n this.setAttribute('no-animations', '');\n } else {\n this.removeAttribute('no-animations');\n }\n }\n\n /**\n * Determines if the modal should have a default close button or not.\n *\n * @type {boolean} - True if the modal should have a close button, otherwise false.\n * @default false\n * @attribute no-close-button - Reflects the noCloseButton property.\n */\n get noCloseButton() {\n return this.hasAttribute('no-close-button');\n }\n\n set noCloseButton(value) {\n if (value) {\n this.setAttribute('no-close-button', '');\n } else {\n this.removeAttribute('no-close-button');\n }\n }\n\n /**\n * Determines if the modal should be fullscreen or not.\n *\n * @type {boolean} - True if the modal should be fullscreen, otherwise false.\n * @default false\n * @attribute fullscreen - Reflects the fullscreen property.\n */\n get fullscreen() {\n return this.hasAttribute('fullscreen');\n }\n\n set fullscreen(value) {\n if (value) {\n this.setAttribute('fullscreen', '');\n } else {\n this.removeAttribute('fullscreen');\n }\n }\n\n /**\n * Applies a pulse effect on the dialog.\n */\n #applyPulseEffectOnDialog() {\n if (this.#pulseAnimationTimeout) {\n return;\n }\n\n this.#dialogEl?.classList.add('dialog--pulse');\n\n this.#pulseAnimationTimeout = setTimeout(() => {\n this.#dialogEl?.classList.remove('dialog--pulse');\n clearTimeout(this.#pulseAnimationTimeout);\n this.#pulseAnimationTimeout = void 0;\n }, PULSE_ANIMATION_DURATION);\n }\n\n /**\n * Handles the close event of the dialog.\n */\n #handleDialogClose = () => {\n // This is needed because the dialog element does not reset\n // the open property when the dialog is closed by the user.\n this.open = false;\n\n this.dispatchEvent(new CustomEvent('me-close', {\n bubbles: true,\n composed: true,\n detail: { element: this }\n }));\n };\n\n /**\n * Handles the cancel event of the dialog.\n * This event is fired when the user presses the escape key.\n *\n * @param {Event} evt - The cancel event.\n */\n #handleDialogCancel = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('escape-key');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the close button.\n *\n * @param {Event} evt - The click event.\n */\n #handleCloseButtonClick = evt => {\n const requestCloseEvent = this.#createRequestCloseEvent('close-button');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented) {\n evt.preventDefault();\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n }\n };\n\n /**\n * Handles the click event of the dialog.\n *\n * @param {MouseEvent} evt - The click event.\n */\n #handleDialogClick = evt => {\n if (evt.target !== evt.currentTarget) {\n return;\n }\n\n const requestCloseEvent = this.#createRequestCloseEvent('backdrop-click');\n\n this.dispatchEvent(requestCloseEvent);\n\n if (requestCloseEvent.defaultPrevented || this.staticBackdrop) {\n !this.noAnimations && this.#applyPulseEffectOnDialog();\n return;\n }\n\n this.#dialogEl?.close();\n };\n\n /**\n * Handles the slotchange event of the footer slot.\n */\n #handleFooterSlotChange = () => {\n if (this.#dialogEl === null) {\n return;\n }\n\n /** @type {Nullable} */\n const footerEl = this.#dialogEl.querySelector('.dialog__footer');\n\n if (footerEl === null) {\n return;\n }\n\n const footerSlotNodes = this.#footerSlotEl?.assignedNodes();\n const hasFooterSlotNodes = footerSlotNodes ? footerSlotNodes.length > 0 : false;\n\n footerEl.hidden = !hasFooterSlotNodes;\n };\n\n /**\n * Creates a request close event.\n *\n * @param {'close-button' | 'escape-key' | 'backdrop-click'} reason - The reason that the modal is about to close.\n */\n #createRequestCloseEvent(reason) {\n return new CustomEvent('me-request-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: {\n reason,\n element: this\n }\n });\n }\n\n /**\n * This is to safe guard against cases where, for instance, a framework may have added the element to the page and set a\n * value on one of its properties, but lazy loaded its definition. Without this guard, the upgraded element would miss that\n * property and the instance property would prevent the class property setter from ever being called.\n *\n * https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties\n *\n * @param {'open' | 'staticBackdrop' | 'noHeader' | 'noAnimations' | 'noCloseButton' | 'fullscreen'} prop - The property to upgrade.\n */\n #upgradeProperty(prop) {\n /** @type {any} */\n const instance = this;\n\n if (Object.prototype.hasOwnProperty.call(instance, prop)) {\n const value = instance[prop];\n delete instance[prop];\n instance[prop] = value;\n }\n }\n\n /**\n * Opens the modal if it is closed, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.show();\n */\n show() {\n if (this.open) {\n return;\n }\n\n this.open = true;\n }\n\n /**\n * Closes the modal if it is open, otherwise does nothing.\n * Make sure that the custom element is defined before calling this method.\n *\n * @example\n * const modal = document.querySelector('modal-element');\n * modal.hide();\n */\n hide() {\n if (!this.open) {\n return;\n }\n\n this.open = false;\n }\n\n /**\n * Defines a custom element with the given name.\n * The name must contain a dash (-).\n *\n * @param {string} [elementName='modal-element']\n * @example\n * ModalElement.defineCustomElement('my-modal');\n */\n static defineCustomElement(elementName = 'modal-element') {\n if (typeof window !== 'undefined' && !window.customElements.get(elementName)) {\n window.customElements.define(elementName, ModalElement);\n }\n }\n}\n\nexport { ModalElement };\n","(function () {\n 'use strict';\n\n if (typeof document === 'undefined' || 'adoptedStyleSheets' in document) { return; }\n\n var hasShadyCss = 'ShadyCSS' in window && !ShadyCSS.nativeShadow;\n var bootstrapper = document.implementation.createHTMLDocument('');\n var closedShadowRootRegistry = new WeakMap();\n var _DOMException = typeof DOMException === 'object' ? Error : DOMException;\n var defineProperty = Object.defineProperty;\n var forEach = Array.prototype.forEach;\n\n var importPattern = /@import.+?;?$/gm;\n function rejectImports(contents) {\n var _contents = contents.replace(importPattern, '');\n if (_contents !== contents) {\n console.warn('@import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418');\n }\n return _contents.trim();\n }\n function isElementConnected(element) {\n return 'isConnected' in element\n ? element.isConnected\n : document.contains(element);\n }\n function unique(arr) {\n return arr.filter(function (value, index) { return arr.indexOf(value) === index; });\n }\n function diff(arr1, arr2) {\n return arr1.filter(function (value) { return arr2.indexOf(value) === -1; });\n }\n function removeNode(node) {\n node.parentNode.removeChild(node);\n }\n function getShadowRoot(element) {\n return element.shadowRoot || closedShadowRootRegistry.get(element);\n }\n\n var cssStyleSheetMethods = [\n 'addRule',\n 'deleteRule',\n 'insertRule',\n 'removeRule',\n ];\n var NonConstructedStyleSheet = CSSStyleSheet;\n var nonConstructedProto = NonConstructedStyleSheet.prototype;\n nonConstructedProto.replace = function () {\n return Promise.reject(new _DOMException(\"Can't call replace on non-constructed CSSStyleSheets.\"));\n };\n nonConstructedProto.replaceSync = function () {\n throw new _DOMException(\"Failed to execute 'replaceSync' on 'CSSStyleSheet': Can't call replaceSync on non-constructed CSSStyleSheets.\");\n };\n function isCSSStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? proto$1.isPrototypeOf(instance) ||\n nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n function isNonConstructedStyleSheetInstance(instance) {\n return typeof instance === 'object'\n ? nonConstructedProto.isPrototypeOf(instance)\n : false;\n }\n var $basicStyleElement = new WeakMap();\n var $locations = new WeakMap();\n var $adoptersByLocation = new WeakMap();\n var $appliedMethods = new WeakMap();\n function addAdopterLocation(sheet, location) {\n var adopter = document.createElement('style');\n $adoptersByLocation.get(sheet).set(location, adopter);\n $locations.get(sheet).push(location);\n return adopter;\n }\n function getAdopterByLocation(sheet, location) {\n return $adoptersByLocation.get(sheet).get(location);\n }\n function removeAdopterLocation(sheet, location) {\n $adoptersByLocation.get(sheet).delete(location);\n $locations.set(sheet, $locations.get(sheet).filter(function (_location) { return _location !== location; }));\n }\n function restyleAdopter(sheet, adopter) {\n requestAnimationFrame(function () {\n adopter.textContent = $basicStyleElement.get(sheet).textContent;\n $appliedMethods\n .get(sheet)\n .forEach(function (command) {\n return adopter.sheet[command.method].apply(adopter.sheet, command.args);\n });\n });\n }\n function checkInvocationCorrectness(self) {\n if (!$basicStyleElement.has(self)) {\n throw new TypeError('Illegal invocation');\n }\n }\n function ConstructedStyleSheet() {\n var self = this;\n var style = document.createElement('style');\n bootstrapper.body.appendChild(style);\n $basicStyleElement.set(self, style);\n $locations.set(self, []);\n $adoptersByLocation.set(self, new WeakMap());\n $appliedMethods.set(self, []);\n }\n var proto$1 = ConstructedStyleSheet.prototype;\n proto$1.replace = function replace(contents) {\n try {\n this.replaceSync(contents);\n return Promise.resolve(this);\n }\n catch (e) {\n return Promise.reject(e);\n }\n };\n proto$1.replaceSync = function replaceSync(contents) {\n checkInvocationCorrectness(this);\n if (typeof contents === 'string') {\n var self_1 = this;\n $basicStyleElement.get(self_1).textContent = rejectImports(contents);\n $appliedMethods.set(self_1, []);\n $locations.get(self_1).forEach(function (location) {\n if (location.isConnected()) {\n restyleAdopter(self_1, getAdopterByLocation(self_1, location));\n }\n });\n }\n };\n defineProperty(proto$1, 'cssRules', {\n configurable: true,\n enumerable: true,\n get: function cssRules() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.cssRules;\n },\n });\n defineProperty(proto$1, 'media', {\n configurable: true,\n enumerable: true,\n get: function media() {\n checkInvocationCorrectness(this);\n return $basicStyleElement.get(this).sheet.media;\n },\n });\n cssStyleSheetMethods.forEach(function (method) {\n proto$1[method] = function () {\n var self = this;\n checkInvocationCorrectness(self);\n var args = arguments;\n $appliedMethods.get(self).push({ method: method, args: args });\n $locations.get(self).forEach(function (location) {\n if (location.isConnected()) {\n var sheet = getAdopterByLocation(self, location).sheet;\n sheet[method].apply(sheet, args);\n }\n });\n var basicSheet = $basicStyleElement.get(self).sheet;\n return basicSheet[method].apply(basicSheet, args);\n };\n });\n defineProperty(ConstructedStyleSheet, Symbol.hasInstance, {\n configurable: true,\n value: isCSSStyleSheetInstance,\n });\n\n var defaultObserverOptions = {\n childList: true,\n subtree: true,\n };\n var locations = new WeakMap();\n function getAssociatedLocation(element) {\n var location = locations.get(element);\n if (!location) {\n location = new Location(element);\n locations.set(element, location);\n }\n return location;\n }\n function attachAdoptedStyleSheetProperty(constructor) {\n defineProperty(constructor.prototype, 'adoptedStyleSheets', {\n configurable: true,\n enumerable: true,\n get: function () {\n return getAssociatedLocation(this).sheets;\n },\n set: function (sheets) {\n getAssociatedLocation(this).update(sheets);\n },\n });\n }\n function traverseWebComponents(node, callback) {\n var iter = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function (foundNode) {\n return getShadowRoot(foundNode)\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_REJECT;\n },\n null, false);\n for (var next = void 0; (next = iter.nextNode());) {\n callback(getShadowRoot(next));\n }\n }\n var $element = new WeakMap();\n var $uniqueSheets = new WeakMap();\n var $observer = new WeakMap();\n function isExistingAdopter(self, element) {\n return (element instanceof HTMLStyleElement &&\n $uniqueSheets.get(self).some(function (sheet) { return getAdopterByLocation(sheet, self); }));\n }\n function getAdopterContainer(self) {\n var element = $element.get(self);\n return element instanceof Document ? element.body : element;\n }\n function adopt(self) {\n var styleList = document.createDocumentFragment();\n var sheets = $uniqueSheets.get(self);\n var observer = $observer.get(self);\n var container = getAdopterContainer(self);\n observer.disconnect();\n sheets.forEach(function (sheet) {\n styleList.appendChild(getAdopterByLocation(sheet, self) || addAdopterLocation(sheet, self));\n });\n container.insertBefore(styleList, null);\n observer.observe(container, defaultObserverOptions);\n sheets.forEach(function (sheet) {\n restyleAdopter(sheet, getAdopterByLocation(sheet, self));\n });\n }\n function Location(element) {\n var self = this;\n self.sheets = [];\n $element.set(self, element);\n $uniqueSheets.set(self, []);\n $observer.set(self, new MutationObserver(function (mutations, observer) {\n if (!document) {\n observer.disconnect();\n return;\n }\n mutations.forEach(function (mutation) {\n if (!hasShadyCss) {\n forEach.call(mutation.addedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).connect();\n });\n });\n }\n forEach.call(mutation.removedNodes, function (node) {\n if (!(node instanceof Element)) {\n return;\n }\n if (isExistingAdopter(self, node)) {\n adopt(self);\n }\n if (!hasShadyCss) {\n traverseWebComponents(node, function (root) {\n getAssociatedLocation(root).disconnect();\n });\n }\n });\n });\n }));\n }\n Location.prototype = {\n isConnected: function () {\n var element = $element.get(this);\n return element instanceof Document\n ? element.readyState !== 'loading'\n : isElementConnected(element.host);\n },\n connect: function () {\n var container = getAdopterContainer(this);\n $observer.get(this).observe(container, defaultObserverOptions);\n if ($uniqueSheets.get(this).length > 0) {\n adopt(this);\n }\n traverseWebComponents(container, function (root) {\n getAssociatedLocation(root).connect();\n });\n },\n disconnect: function () {\n $observer.get(this).disconnect();\n },\n update: function (sheets) {\n var self = this;\n var locationType = $element.get(self) === document ? 'Document' : 'ShadowRoot';\n if (!Array.isArray(sheets)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Iterator getter is not callable.\");\n }\n if (!sheets.every(isCSSStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Failed to convert value to 'CSSStyleSheet'\");\n }\n if (sheets.some(isNonConstructedStyleSheetInstance)) {\n throw new TypeError(\"Failed to set the 'adoptedStyleSheets' property on \" + locationType + \": Can't adopt non-constructed stylesheets\");\n }\n self.sheets = sheets;\n var oldUniqueSheets = $uniqueSheets.get(self);\n var uniqueSheets = unique(sheets);\n var removedSheets = diff(oldUniqueSheets, uniqueSheets);\n removedSheets.forEach(function (sheet) {\n removeNode(getAdopterByLocation(sheet, self));\n removeAdopterLocation(sheet, self);\n });\n $uniqueSheets.set(self, uniqueSheets);\n if (self.isConnected() && uniqueSheets.length > 0) {\n adopt(self);\n }\n },\n };\n\n window.CSSStyleSheet = ConstructedStyleSheet;\n attachAdoptedStyleSheetProperty(Document);\n if ('ShadowRoot' in window) {\n attachAdoptedStyleSheetProperty(ShadowRoot);\n var proto = Element.prototype;\n var attach_1 = proto.attachShadow;\n proto.attachShadow = function attachShadow(init) {\n var root = attach_1.call(this, init);\n if (init.mode === 'closed') {\n closedShadowRootRegistry.set(this, root);\n }\n return root;\n };\n }\n var documentLocation = getAssociatedLocation(document);\n if (documentLocation.isConnected()) {\n documentLocation.connect();\n }\n else {\n document.addEventListener('DOMContentLoaded', documentLocation.connect.bind(documentLocation));\n }\n\n}());\n","import * as bootstrapStyleSheet from 'url:bootstrap/dist/css/bootstrap.css';\nimport * as mainStyleSheet from 'url:../../../src/css/main.css';\n\nconst styleURLs = [bootstrapStyleSheet, mainStyleSheet];\n\nconst styleSheets = [];\n\nfor (let i = 0; i < styleURLs.length; i += 1) {\n styleSheets.push(new CSSStyleSheet());\n}\n\n(async function () {\n const styles = await Promise.all(styleURLs.map(async styleURL => {\n const res = await fetch(styleURL);\n return res.text();\n }));\n\n for (let i = 0; i < styles.length; i += 1) {\n await styleSheets[i].replace(styles[i]);\n }\n\n document.body.style.visibility = 'visible';\n}());\n\nexport { styleSheets };\n","module.exports = require('./helpers/bundle-url').getBundleURL('jBxQq') + \"bootstrap.33ff2998.css\";","module.exports = require('./helpers/bundle-url').getBundleURL('jBxQq') + \"main.2238cf96.css\";","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
                \n
                \n \n
                \n
                \n \n
                \n
                \n`;\n\nclass AddFeed extends HTMLElement {\n #formEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#formEl = this.shadowRoot.querySelector('form[name=\"addFeedForm\"]');\n }\n\n connectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n disconnectedCallback() {\n this.#formEl.addEventListener('submit', this.#handleFormSubmission);\n }\n\n async #handleFormSubmission(evt) {\n evt.preventDefault();\n\n const input = evt.target['feed-url'];\n const url = input.value.trim();\n const { value: feeds = [] } = await getFeeds();\n const urlExists = Boolean(feeds.find(feed => feed.url === url));\n const isValidURL = canParseURL(url);\n\n if (!urlExists && isValidURL) {\n await saveFeed({\n url,\n title: '' // Title is not available at this point; it will be fetched later.\n });\n }\n\n input.value = '';\n }\n}\n\nif (!window.customElements.get('add-feed')) {\n window.customElements.define('add-feed', AddFeed);\n}\n","import { set, get, del } from 'idb-keyval';\n\nconst STORAGE_PREFIX = 'rss-reader/';\nconst STORAGE_FEEDS_KEY = STORAGE_PREFIX + 'feeds';\n\nconst getItem = async key => {\n try {\n return {\n value: await get(key),\n error: void 0\n };\n } catch (error) {\n return {\n value: void 0,\n error\n };\n }\n};\n\nconst setItem = async (key, data) => {\n try {\n await set(key, data);\n\n return {\n error: void 0\n };\n } catch (error) {\n return { error };\n }\n};\n\nexport const getFeeds = async () => {\n return getItem(STORAGE_FEEDS_KEY);\n};\n\nexport const setFeeds = async (feeds, shouldDispatchEvent = true) => {\n if (!Array.isArray(feeds)) {\n return;\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'set',\n feeds\n }\n }));\n }\n\n return { error };\n};\n\nexport const saveFeed = async (feed, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const foundFeed = feeds.find(f => f.url === feed.url);\n let action = '';\n\n if (foundFeed) {\n foundFeed.url = feed.url;\n foundFeed.title = feed.title;\n action = 'update';\n } else {\n feeds.push(feed);\n action = 'create';\n }\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, feeds);\n\n if (!error && shouldDispatchEvent) {\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action,\n feed\n }\n }));\n }\n\n return { error };\n};\n\nexport const deleteFeed = async (feedUrl, shouldDispatchEvent = true) => {\n const { value: feeds = [] } = await getFeeds();\n const filteredFeeds = feeds.filter(f => f.url !== feedUrl);\n\n const { error } = await setItem(STORAGE_FEEDS_KEY, filteredFeeds);\n\n if (!error && shouldDispatchEvent) {\n if (filteredFeeds.length === 0) {\n await del(STORAGE_FEEDS_KEY);\n }\n\n document.dispatchEvent(new CustomEvent('feeds-updated', {\n bubbles: true,\n detail: {\n action: 'delete',\n feed: {\n url: feedUrl\n }\n }\n }));\n }\n\n return { error };\n};\n","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction promisifyRequest(request) {\n return new Promise(function (resolve, reject) {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = function () {\n return resolve(request.result);\n }; // @ts-ignore - file size hacks\n\n\n request.onabort = request.onerror = function () {\n return reject(request.error);\n };\n });\n}\n\nfunction createStore(dbName, storeName) {\n var request = indexedDB.open(dbName);\n\n request.onupgradeneeded = function () {\n return request.result.createObjectStore(storeName);\n };\n\n var dbp = promisifyRequest(request);\n return function (txMode, callback) {\n return dbp.then(function (db) {\n return callback(db.transaction(storeName, txMode).objectStore(storeName));\n });\n };\n}\n\nvar defaultGetStoreFunc;\n\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction get(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return promisifyRequest(store.get(key));\n });\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction set(key, value) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction setMany(entries) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n entries.forEach(function (entry) {\n return store.put(entry[1], entry[0]);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction getMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readonly', function (store) {\n return Promise.all(keys.map(function (key) {\n return promisifyRequest(store.get(key));\n }));\n });\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction update(key, updater) {\n var customStore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGetStore();\n return customStore('readwrite', function (store) {\n return (// Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise(function (resolve, reject) {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n } catch (err) {\n reject(err);\n }\n };\n })\n );\n });\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction del(key) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction delMany(keys) {\n var customStore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetStore();\n return customStore('readwrite', function (store) {\n keys.forEach(function (key) {\n return store.delete(key);\n });\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction clear() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readwrite', function (store) {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\n\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result) return;\n callback(this.result);\n this.result.continue();\n };\n\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction keys() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.key);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction values() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n\n var items = [];\n return eachCursor(store, function (cursor) {\n return items.push(cursor.value);\n }).then(function () {\n return items;\n });\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\n\n\nfunction entries() {\n var customStore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultGetStore();\n return customStore('readonly', function (store) {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([promisifyRequest(store.getAllKeys()), promisifyRequest(store.getAll())]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n keys = _ref2[0],\n values = _ref2[1];\n\n return keys.map(function (key, i) {\n return [key, values[i]];\n });\n });\n }\n\n var items = [];\n return customStore('readonly', function (store) {\n return eachCursor(store, function (cursor) {\n return items.push([cursor.key, cursor.value]);\n }).then(function () {\n return items;\n });\n });\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Checks if a URL can be parsed.\n *\n * @param {string} url The URL to be parsed.\n * @returns {boolean} True if the URL can be parsed, false otherwise.\n */\nexport const canParseURL = url => {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n","import Sortable from 'sortablejs/modular/sortable.core.esm.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, setFeeds, deleteFeed } from '../helpers/storage.js';\nimport { debounce } from '../utils/debounce.js';\nimport './import-feeds.js';\nimport './export-feeds.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
                \n
                \n
                \n \n \n \n \n \n\n \n\n \n
                \n\n
                \n \n\n \n\n \n
                \n
                \n\n
                  \n
                  \n\n
                  \n

                  \n There are no feeds to display. Add a feed by entering a feed URL in the input above or by importing feeds using the button below.\n

                  \n\n

                  \n \n

                  \n
                  \n\n \n

                  Import feeds

                  \n \n
                  \n\n \n

                  Export feeds

                  \n \n
                  \n`;\n\nclass FeedsList extends HTMLElement {\n #isEditable;\n #feedsContainerEl;\n #feedsListEl;\n #editBtn;\n #importBtn;\n #importAltBtn;\n #exportBtn;\n #searchInput;\n #searchClearBtn;\n #importDialog;\n #exportDialog;\n #importFeedsEl;\n #exportFeedsEl;\n #noFeedsDisclaimerEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#isEditable = false;\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n\n this.#feedsContainerEl = this.shadowRoot.getElementById('feedsContainer');\n this.#feedsListEl = this.shadowRoot.getElementById('feedsList');\n this.#editBtn = this.shadowRoot.getElementById('editBtn');\n this.#importBtn = this.shadowRoot.getElementById('importBtn');\n this.#importAltBtn = this.shadowRoot.getElementById('importAltBtn');\n this.#exportBtn = this.shadowRoot.getElementById('exportBtn');\n this.#searchInput = this.shadowRoot.getElementById('searchInput');\n this.#searchClearBtn = this.shadowRoot.getElementById('searchClearBtn');\n this.#importDialog = this.shadowRoot.getElementById('importDialog');\n this.#exportDialog = this.shadowRoot.getElementById('exportDialog');\n this.#importFeedsEl = this.shadowRoot.querySelector('import-feeds');\n this.#exportFeedsEl = this.shadowRoot.querySelector('export-feeds');\n this.#noFeedsDisclaimerEl = this.shadowRoot.getElementById('noFeedsDisclaimer');\n }\n\n async connectedCallback() {\n const { value: feeds = [] } = await getFeeds();\n\n feeds.forEach((feed => this.#addFeed(feed)));\n\n this.#toggleFeedsVisibility();\n\n this.#feedsListEl.addEventListener('click', this.#handleActionsClick);\n this.#editBtn.addEventListener('click', this.#handleEditRequest);\n this.#importAltBtn.addEventListener('click', this.#handleImportRequest);\n this.#importBtn.addEventListener('click', this.#handleImportRequest);\n this.#exportBtn.addEventListener('click', this.#handleExportRequest);\n this.#searchInput.addEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.addEventListener('click', this.#handleSearchClear);\n this.#importDialog.addEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.addEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.addEventListener('me-close', this.#handleExportDialogClose);\n this.addEventListener('feeds-imported', this.#handleFeedsImported);\n document.addEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n\n new Sortable(this.#feedsListEl, {\n animation: 150,\n handle: '.sort-handler',\n onEnd: async evt => {\n const feeds = Array.prototype.map.call(evt.to.querySelectorAll('li'), (el) => {\n return {\n url: el.getAttribute('data-url'),\n title: el.getAttribute('data-title') || ''\n };\n });\n\n await setFeeds(feeds, false);\n }\n });\n }\n\n disconnectedCallback() {\n this.#feedsListEl.removeEventListener('click', this.#handleActionsClick);\n this.#editBtn.removeEventListener('click', this.#handleEditRequest);\n this.#importBtn.removeEventListener('click', this.#handleImportRequest);\n this.#importAltBtn.removeEventListener('click', this.#handleImportRequest);\n this.#exportBtn.removeEventListener('click', this.#handleExportRequest);\n this.#searchInput.removeEventListener('input', this.#handleSearchInputDebounced);\n this.#searchClearBtn.removeEventListener('click', this.#handleSearchClear);\n this.#importDialog.removeEventListener('me-open', this.#handleImportDialogOpen);\n this.#exportDialog.removeEventListener('me-open', this.#handleExportDialogOpen);\n this.#exportDialog.removeEventListener('me-close', this.#handleExportDialogClose);\n this.removeEventListener('feeds-imported', this.#handleFeedsImported);\n document.removeEventListener('feeds-updated', this.#handleFeedsUpdateSuccess);\n }\n\n #searchFeeds = (searchValue = '') => {\n const feedEls = this.#feedsListEl.querySelectorAll(`[data-url]`);\n\n if (feedEls.length === 0) {\n return;\n }\n\n feedEls.forEach(el => {\n const url = (el.getAttribute('data-url') || '').toLowerCase();\n const title = (el.getAttribute('data-title') || '').toLowerCase();\n const searchQuery = searchValue.trim().toLowerCase();\n el.hidden = !(url.includes(searchQuery) || title.includes(searchQuery));\n });\n };\n\n #debounceSearchFeeds = debounce(this.#searchFeeds, 250);\n\n #handleSearchInputDebounced = evt => {\n const value = evt.target.value;\n this.#searchClearBtn.classList.toggle('d-none', !value);\n return this.#debounceSearchFeeds(value);\n };\n\n #handleSearchClear = () => {\n this.#searchInput.value = '';\n this.#searchInput.dispatchEvent(new Event('input'));\n };\n\n #handleEditRequest = evt => {\n this.#isEditable = !this.#isEditable;\n\n evt.currentTarget.classList.toggle('active');\n\n this.shadowRoot.querySelectorAll('.sort-handler, .delete-button').forEach(el => {\n el.hidden = !el.hidden;\n });\n };\n\n #handleImportRequest = () => {\n this.#importDialog.open = true;\n };\n\n #handleExportRequest = () => {\n this.#exportDialog.open = true;\n };\n\n #handleImportDialogOpen = () => {\n try {\n this.#importFeedsEl.shadowRoot.querySelector('a-tab-group').selectTabByIndex(0);\n this.#importFeedsEl.shadowRoot.querySelector('textarea').value = '';\n } catch {\n // Fail silently\n }\n };\n\n #handleExportDialogOpen = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeedsEl.setAttribute('feeds', JSON.stringify(feeds));\n };\n\n #handleExportDialogClose = () => {\n this.#exportFeedsEl.removeAttribute('feeds');\n };\n\n #handleFeedsImported = () => {\n this.#importDialog.open = false;\n };\n\n #handleFeedsUpdateSuccess = evt => {\n if (evt.detail.action === 'delete') {\n this.#removeFeed(evt.detail.feed);\n }\n\n if (evt.detail.action === 'create') {\n this.#addFeed(evt.detail.feed);\n\n if (this.#searchInput.value) {\n this.#searchInput.value = '';\n this.#searchFeeds('');\n }\n }\n\n if (evt.detail.action === 'update') {\n const { url, title } = evt.detail.feed;\n const feedEl = this.#feedsListEl.querySelector(`[data-url=\"${url}\"]`);\n\n if (feedEl) {\n const linkContent = feedEl.querySelector('.link-content');\n\n feedEl.setAttribute('data-title', title || '');\n\n if (linkContent) {\n linkContent.innerHTML = title ? `${title}
                  ${url}` : url;\n }\n }\n }\n };\n\n #handleActionsClick = evt => {\n const target = evt.target;\n const deleteBtn = target.closest('button.delete-button');\n const linkEl = target.closest('a.link');\n\n if (!linkEl && !deleteBtn) {\n return;\n }\n\n const feedItem = target.closest('li');\n const feedUrl = feedItem.getAttribute('data-url');\n\n if (deleteBtn) {\n if (window.confirm(`Are you sure you want to delete feed \"${feedUrl}\"?`)) {\n deleteFeed(feedUrl);\n }\n }\n\n if (linkEl) {\n evt.preventDefault();\n document.querySelector('feed-reader').feedUrl = feedUrl;\n }\n };\n\n #addFeed(feed) {\n const { url, title } = feed;\n\n const link = document.createElement('a');\n link.className = 'link text-decoration-none d-flex align-items-center h-100';\n link.style.flex = '1';\n link.style.minWidth = 0;\n link.style.color = 'inherit';\n link.href = url;\n\n const linkContent = document.createElement('div');\n linkContent.className = 'text-truncate link-content';\n linkContent.innerHTML = title ? `${title}
                  ${url}` : url;\n\n const deleteButton = document.createElement('button');\n deleteButton.type = 'button';\n deleteButton.title = 'Delete feed';\n deleteButton.hidden = !this.#isEditable;\n deleteButton.className = 'delete-button btn btn-default text-danger p-0';\n deleteButton.style.lineHeight = '1';\n deleteButton.innerHTML = /* html */`\n \n \n \n Delete\n `;\n\n const listItem = document.createElement('li');\n listItem.className = 'list-group-item p-0 d-flex justify-content-between align-items-center';\n listItem.style.height = 'var(--list-item-height)';\n listItem.setAttribute('data-url', url || '');\n listItem.setAttribute('data-title', title || '');\n\n const sortHandler = document.createElement('div');\n sortHandler.hidden = !this.#isEditable;\n sortHandler.className = 'sort-handler text-primary';\n sortHandler.innerHTML = /* html */`\n \n \n \n Reorder\n `;\n\n link.appendChild(linkContent);\n listItem.appendChild(sortHandler);\n listItem.appendChild(link);\n listItem.appendChild(deleteButton);\n\n this.#feedsListEl.appendChild(listItem);\n\n this.#toggleFeedsVisibility();\n }\n\n #removeFeed(feed) {\n const listItem = this.#feedsListEl.querySelector(`[data-url=\"${feed.url}\"]`);\n listItem && listItem.remove();\n this.#toggleFeedsVisibility();\n }\n\n async #toggleFeedsVisibility() {\n const { value: feeds = [] } = await getFeeds();\n this.#feedsContainerEl.classList.toggle('d-none', feeds.length === 0);\n this.#noFeedsDisclaimerEl.classList.toggle('d-none', feeds.length > 0);\n }\n}\n\nif (!window.customElements.get('feeds-list')) {\n window.customElements.define('feeds-list', FeedsList);\n}\n","/**!\n * Sortable 1.15.2\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = parent.parentNode);\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\nvar OnSpill = [Remove, Revert];\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nexport default Sortable;\nexport { AutoScrollPlugin as AutoScroll, MultiDragPlugin as MultiDrag, OnSpill, Sortable, SwapPlugin as Swap };\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * 'n' milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @param {function} fn The function to be executed.\n * @param {Number} [wait=0] Time of delay in milliseconds. It is required if `immediate` is used.\n * @param {Boolean} [immediate=false] If true or any truthy value, triggers the function on the leading edge.\n * @throws {TypeError} If `fn` is not function.\n * @returns {function} A new debounced function.\n * @example\n *\n * const debouncedHandler = debounce(() => {\n * // Do your thing here...\n * }, 250);\n *\n * window.addEventListener('resize', debouncedHandler, false);\n */\nexport const debounce = (fn, wait = 0, immediate = false) => {\n let timerId = null;\n\n if (typeof fn !== 'function') {\n throw new TypeError('Expected a function for first argument');\n }\n\n return (...args) => {\n clearTimeout(timerId);\n\n if (immediate && !timerId) {\n fn(...args);\n }\n\n timerId = setTimeout(() => {\n timerId = null;\n if (!immediate) {\n fn(...args);\n }\n }, wait);\n };\n};\n","import { styleSheets } from '../helpers/styles.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\nimport { canParseURL } from '../utils/canParseURL.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n From file\n \n
                  \n \n Drag 'n' drop a file, or click to select file to import\n
                  \n (Only JSON files are allowed)\n
                  \n
                  \n
                  \n\n From text\n \n
                  \n \n \n
                  \n
                  \n
                  \n`;\n\nclass ImportFeeds extends HTMLElement {\n #dropzoneEl;\n #importForm;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#dropzoneEl = this.shadowRoot.querySelector('files-dropzone');\n this.#importForm = this.shadowRoot.querySelector('form[name=\"import-form\"]');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n connectedCallback() {\n this.#dropzoneEl.addEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.addEventListener('submit', this.#handleImportFormSubmit);\n }\n\n disconnectedCallback() {\n this.#dropzoneEl.removeEventListener('files-dropzone-drop-accepted', this.#handleFilesDropzoneDropAccepted);\n this.#importForm.removeEventListener('submit', this.#handleImportFormSubmit);\n }\n\n #handleFilesDropzoneDropAccepted = evt => {\n const { acceptedFiles = [] } = evt.detail;\n const file = acceptedFiles[0];\n\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.readAsText(file, 'utf-8');\n reader.onload = this.#handleFileReaderLoad;\n };\n\n async #importFeeds(feedsToImport) {\n if (!Array.isArray(feedsToImport) || feedsToImport.length === 0) {\n return alert('Invalid file or no feeds found.');\n }\n\n const { value: feeds = [] } = await getFeeds();\n\n for (const feed of feedsToImport) {\n const feedExists = Boolean(feeds.find(f => f.url === feed.url));\n const { url, title } = feed;\n const isValidURL = canParseURL(url);\n\n if (!feedExists && isValidURL) {\n await saveFeed({ url, title });\n }\n }\n\n this.dispatchEvent(new Event('feeds-imported', {\n bubbles: true,\n composed: true\n }));\n }\n\n #handleFileReaderLoad = async (evt) => {\n try {\n const { result } = evt.target;\n this.#importFeeds(JSON.parse(result));\n } catch (err) {\n alert('The file is not valid.');\n }\n };\n\n #handleImportFormSubmit = async (evt) => {\n evt.preventDefault();\n\n const formData = new FormData(evt.target);\n const data = formData.get('import-data');\n\n try {\n this.#importFeeds(JSON.parse(data));\n } catch (err) {\n alert('The data is not valid.');\n }\n };\n}\n\nif (!window.customElements.get('import-feeds')) {\n window.customElements.define('import-feeds', ImportFeeds);\n}\n","import { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';\nimport { styleSheets } from '../helpers/styles.js';\nimport { getFeeds } from '../helpers/storage.js';\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n
                  \n \n \n \n \n \n \n Copy\n \n \n \n \n \n \n \n Copied\n \n \n\n \n \n \n
                  \n\n
                  \n
                  \n
                  \n
                  \n
                  \n\n \n`;\n\nclass ExportFeeds extends HTMLElement {\n #feeds;\n #exportCodeEl;\n #clipboardCopyEl;\n #webShareEl;\n #downloadButton;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#exportCodeEl = this.shadowRoot.getElementById('exportCode');\n this.#clipboardCopyEl = this.shadowRoot.querySelector('clipboard-copy');\n this.#webShareEl = this.shadowRoot.querySelector('web-share');\n this.#downloadButton = this.shadowRoot.getElementById('downloadButton');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feeds'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === 'feeds' && oldValue !== newValue && this.feeds) {\n const feedsToExport = this.#getFeedsToExportString();\n this.#exportCodeEl.innerHTML = feedsToExport;\n this.#clipboardCopyEl.value = feedsToExport;\n this.#webShareEl.shareText = feedsToExport;\n }\n }\n\n connectedCallback() {\n this.#downloadButton.addEventListener('click', this.#handleDownloadButtonClick);\n }\n\n disconnectedCallback() {\n this.#downloadButton.removeEventListener('click', this.#handleDownloadButtonClick);\n }\n\n get feeds() {\n return this.getAttribute('feeds');\n }\n\n set feeds(value) {\n this.setAttribute('feeds', value);\n }\n\n #getFeedsToExportString() {\n let feedsToExport = '';\n\n try {\n feedsToExport = JSON.stringify(JSON.parse(this.feeds), null, 2);\n } catch (err) {\n console.error(err);\n }\n\n return feedsToExport;\n }\n\n #exportFeeds(feeds) {\n const data = JSON.stringify(feeds, null, 2);\n const blob = new Blob([data], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = `rss-feeds-export.json`;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n #handleDownloadButtonClick = async () => {\n const { value: feeds = [] } = await getFeeds();\n this.#exportFeeds(feeds);\n };\n}\n\nif (!window.customElements.get('export-feeds')) {\n window.customElements.define('export-feeds', ExportFeeds);\n}\n","function a(a){return null!==a&&\"object\"==typeof a?\"share\"in navigator&&\"canShare\"in navigator&&navigator.canShare(a):\"share\"in navigator}export{a as isWebShareSupported};\n//# sourceMappingURL=is-web-share-supported.js.map\n","// @ts-check\n\n/**\n * Check if Web Share API is supported by the platform.\n *\n * @param {import('./web-share').ShareData} [options]\n * @returns {boolean} Returns `true` if Web Share API is supported; otherwise `false`.\n */\nfunction isWebShareSupported(options) {\n if (options !== null && typeof options === 'object') {\n return 'share' in navigator && 'canShare' in navigator && navigator.canShare(options);\n }\n\n return 'share' in navigator;\n}\n\nexport { isWebShareSupported };\n","import { styleSheets } from '../helpers/styles.js';\nimport { fetchFeed } from '../helpers/fetch-feeds.js';\nimport { getFeeds, saveFeed } from '../helpers/storage.js';\n\nlet controller;\n\nconst template = document.createElement('template');\n\ntemplate.innerHTML = /* html */`\n \n\n \n

                  \n\n

                  \n\n
                  \n
                  \n \n Please wait...\n
                  \n\n
                  \n \n \n \n There was an error while fetching the feed.\n
                  \n\n
                  \n
                  \n
                  \n`;\n\nclass FeedReader extends HTMLElement {\n #spinnerEl;\n #dialogEl;\n #modalTitle;\n #feedsViewer;\n #errorEl;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n }\n\n this.#spinnerEl = this.shadowRoot.getElementById('spinner');\n this.#dialogEl = this.shadowRoot.querySelector('modal-element');\n this.#modalTitle = this.#dialogEl.querySelector('#feedTitle');\n this.#feedsViewer = this.shadowRoot.getElementById('feedsViewer');\n this.#errorEl = this.shadowRoot.getElementById('error');\n\n this.shadowRoot.adoptedStyleSheets = styleSheets;\n }\n\n static get observedAttributes() {\n return ['feed-url'];\n }\n\n attributeChangedCallback(name) {\n if (name === 'feed-url') {\n this.feedUrl ? this.#openFeed(this.feedUrl) : this.#closeFeed();\n }\n }\n\n connectedCallback() {\n this.#dialogEl.addEventListener('me-close', this.#handleFeedClose);\n }\n\n disconnectedCallback() {\n this.#dialogEl.removeEventListener('me-close', this.#handleFeedClose);\n }\n\n get feedUrl() {\n return this.getAttribute('feed-url');\n }\n\n set feedUrl(value) {\n if (value) {\n this.setAttribute('feed-url', value);\n } else {\n this.removeAttribute('feed-url');\n }\n }\n\n #openFeed(feedUrl) {\n this.#dialogEl.open = true;\n this.#renderFeed(feedUrl);\n }\n\n #closeFeed() {\n this.#dialogEl.open = false;\n }\n\n #handleFeedClose = () => {\n controller && controller.abort();\n this.#resetDialogContent();\n this.feedUrl = null;\n };\n\n #resetDialogContent() {\n this.#feedsViewer.querySelectorAll('.card').forEach(el => el.remove());\n this.#modalTitle.innerHTML = '';\n this.#spinnerEl.classList.add('d-none');\n this.#errorEl.classList.add('d-none');\n }\n\n async #renderFeed(feedUrl) {\n this.#spinnerEl.classList.remove('d-none');\n\n controller = new AbortController();\n\n try {\n const data = await fetchFeed(feedUrl, {\n signal: controller.signal\n });\n\n const { value: feeds = [] } = await getFeeds();\n const currentFeed = feeds.find(feed => feed.url === feedUrl);\n\n // Now that feed's title is available, save it to storage.\n if (currentFeed && !currentFeed.title) {\n await saveFeed({\n url: feedUrl,\n title: data.feed.title || ''\n });\n }\n\n this.#modalTitle.textContent = data.feed.title || feedUrl;\n\n data.items.forEach(item => {\n this.#feedsViewer.insertAdjacentHTML('beforeend', this.#feedsReaderTemplate(item));\n });\n } catch (error) {\n if (error.name !== 'AbortError') {\n console.error(error);\n this.#modalTitle.textContent = '';\n this.#errorEl.classList.remove('d-none');\n }\n } finally {\n this.#spinnerEl.classList.add('d-none');\n }\n }\n\n #feedsReaderTemplate(item) {\n const { link, title, description, author, pubDate, thumbnail } = item;\n let formattedDate = '';\n\n try {\n formattedDate = new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium'\n }).format(new Date(pubDate));\n } catch {\n formattedDate = '-';\n }\n\n return /* html */`\n
                  \n
                  \n \n
                  \n
                  ${title}
                  \n

                  ${formattedDate} ${author ? `• ${author}` : ''}

                  \n
                  \n\n \"${title}\"\n
                  \n\n
                  \n Read more...\n
                  \n ${description}\n
                  \n
                  \n
                  \n
                  \n `;\n }\n}\n\nif (!window.customElements.get('feed-reader')) {\n window.customElements.define('feed-reader', FeedReader);\n}\n","const cache = new Map();\n\nexport const fetchFeed = async (url, requestOptions = {}) => {\n const cachedFeed = cache.get(url);\n\n if (cachedFeed) {\n return cachedFeed;\n }\n\n const res = await fetch('https://api.rss2json.com/v1/api.json?rss_url=' + url, requestOptions);\n\n if (!res.ok) {\n throw new Error('Error fetching data');\n }\n\n const json = await res.json();\n\n cache.set(url, json);\n\n return json;\n};\n"],"names":["$9af02a843127b0d7$var$controller","a","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","Object","defineProperty","get","$0da3d504155236c3$export$ea3b71af1761ff40","set","enumerable","configurable","$0da3d504155236c3$var$t","$0da3d504155236c3$var$e","$0da3d504155236c3$var$o","$0da3d504155236c3$var$s","document","createElement","innerHTML","HTMLElement","t","e","o","s","i","constructor","shadowRoot","attachShadow","mode","appendChild","content","cloneNode","querySelector","observedAttributes","connectedCallback","r","addEventListener","n","disconnectedCallback","removeEventListener","attributeChangedCallback","disabled","setAttribute","toString","part","contains","toggle","value","getAttribute","from","hasAttribute","removeAttribute","feedbackDuration","Number","l","Element","prototype","getRootNode","composed","ownerDocument","Document","ShadowRoot","HTMLInputElement","HTMLTextAreaElement","HTMLAnchorElement","href","textContent","navigator","clipboard","writeText","d","dispatchEvent","CustomEvent","bubbles","detail","error","preventDefault","hidden","remove","add","clearTimeout","setTimeout","hasOwnProperty","defineCustomElement","customElements","define","$4f74a8126e204146$export$30b344bef3e55b67","$4f74a8126e204146$var$t","$4f74a8126e204146$var$e","delegatesFocus","toggleAttribute","shareUrl","shareTitle","shareText","shareFiles","Array","isArray","length","share","url","title","text","canShare","files","shareData","name","target","nodeName","assignedElements","flatten","find","$7aad62ebc3d6fae8$export$6ccd1735166caad9","$7aad62ebc3d6fae8$var$e","Map","$7aad62ebc3d6fae8$var$t","$7aad62ebc3d6fae8$var$o","lastIndexOf","type","split","pop","toLowerCase","writable","$7aad62ebc3d6fae8$var$i","path","webkitRelativePath","$7aad62ebc3d6fae8$var$r","Promise","readEntries","$7aad62ebc3d6fae8$var$a","push","$7aad62ebc3d6fae8$var$n","file","fullPath","$7aad62ebc3d6fae8$var$s","kind","getAsEntry","webkitGetAsEntry","shift","isFile","indexOf","isDirectory","createReader","$7aad62ebc3d6fae8$var$d","$7aad62ebc3d6fae8$var$l","dataTransfer","items","$7aad62ebc3d6fae8$var$p","$7aad62ebc3d6fae8$var$c","$7aad62ebc3d6fae8$var$h","$7aad62ebc3d6fae8$var$u","getElementById","accept","multiple","autoFocus","focus","maxFiles","Math","floor","abs","maxSize","isNaN","minSize","noStyle","p","Event","dropEffect","classList","click","key","errors","message","Set","map","trim","filter","Boolean","replace","charAt","test","size","acceptedFiles","rejectedFiles","defaultValue","openFileDialog","$c172d40c323f9126$var$t","random","substring","$c172d40c323f9126$var$e","$c172d40c323f9126$var$s","$c172d40c323f9126$var$o","$c172d40c323f9126$var$a","$c172d40c323f9126$var$l","selected","closable","className","stopPropagation","tabId","$c172d40c323f9126$var$i","$c172d40c323f9126$var$r","$c172d40c323f9126$var$n","$c172d40c323f9126$var$c","$c172d40c323f9126$var$d","TOP","BOTTOM","START","END","$c172d40c323f9126$var$h","entries","$c172d40c323f9126$var$b","AUTO","MANUAL","$c172d40c323f9126$var$u","DOWN","LEFT","RIGHT","UP","HOME","ENTER","SPACE","$c172d40c323f9126$var$p","$c172d40c323f9126$var$g","$c172d40c323f9126$export$85fd4ed3b8ca1010","placement","noScrollControls","scrollDistance","activation","noTabCycling","querySelectorAll","forEach","c","ResizeObserver","requestAnimationFrame","scrollWidth","clientWidth","h","b","u","unobserve","observe","disconnect","cancelAnimationFrame","getComputedStyle","direction","g","m","nextElementSibling","tagName","console","v","f","w","T","y","findIndex","matches","A","_","E","C","altKey","includes","selectTab","closest","scrollLeft","scrollTo","left","selectTabByIndex","selectTabById","scrollIntoView","inline","block","$4da30046ce6d9325$export$32589115725b904b","$4da30046ce6d9325$var$e","$4da30046ce6d9325$var$t","open","showModal","element","close","noHeader","noAnimations","noCloseButton","staticBackdrop","fullscreen","defaultPrevented","currentTarget","assignedNodes","cancelable","reason","show","hide","hasShadyCss","ShadyCSS","nativeShadow","bootstrapper","implementation","createHTMLDocument","closedShadowRootRegistry","WeakMap","_DOMException","DOMException","importPattern","nonConstructedProto","NonConstructedStyleSheet","CSSStyleSheet","reject","replaceSync","$basicStyleElement","$locations","$adoptersByLocation","$appliedMethods","proto$1","ConstructedStyleSheet","contents","resolve","checkInvocationCorrectness","_contents","self_1","warn","location","isConnected","restyleAdopter","getAdopterByLocation","sheet","cssRules","media","cssStyleSheetMethods","method","args","arguments","apply","basicSheet","Symbol","hasInstance","isCSSStyleSheetInstance","defaultObserverOptions","childList","subtree","locations","$element","$uniqueSheets","$observer","Location","readyState","host","connect","container","getAdopterContainer","adopt","traverseWebComponents","root","getAssociatedLocation","update","sheets","locationType","TypeError","every","some","isNonConstructedStyleSheetInstance","oldUniqueSheets","uniqueSheets","arr","index","removedSheets","arr1","arr2","removeNode","node","parentNode","removeChild","delete","_location","attachAdoptedStyleSheetProperty","proto","attach_1","documentLocation","bind","getShadowRoot","instance","isPrototypeOf","adopter","command","has","style","body","callback","iter","createNodeIterator","NodeFilter","SHOW_ELEMENT","foundNode","FILTER_ACCEPT","FILTER_REJECT","next","nextNode","styleList","createDocumentFragment","observer","insertBefore","MutationObserver","mutations","mutation","addedNodes","removedNodes","HTMLStyleElement","$821acccc985d5f51$exports","getBundleURL","$053c683f8862b85c$var$styleURLs","$053c683f8862b85c$export$4b9cd30c41328fdd","$e92a13782f6c06ba$export$b327150396135fe7","request","oncomplete","onsuccess","result","onabort","onerror","$e92a13782f6c06ba$var$defaultGetStore","$e92a13782f6c06ba$var$defaultGetStoreFunc","dbName","storeName","dbp","indexedDB","onupgradeneeded","createObjectStore","txMode","then","db","transaction","objectStore","styles","all","styleURL","res","fetch","visibility","$b36f6cb20f27a9a6$var$STORAGE_FEEDS_KEY","$b36f6cb20f27a9a6$var$STORAGE_PREFIX","$b36f6cb20f27a9a6$var$getItem","customStore","undefined","store","$b36f6cb20f27a9a6$var$setItem","data","put","$b36f6cb20f27a9a6$export$4890c08c4ffbd57b","$b36f6cb20f27a9a6$export$a8ce8a4ec117f05e","feeds","shouldDispatchEvent","action","$b36f6cb20f27a9a6$export$4b77448646caf424","feed","foundFeed","$b36f6cb20f27a9a6$export$4e54c6fd9fa8b09b","feedUrl","filteredFeeds","$8ca5c59aef5015ba$export$981c5d1bd3894713","URL","$0c951fb6e39d40f6$var$template","$0c951fb6e39d40f6$var$AddFeed","formEl","adoptedStyleSheets","handleFormSubmission","evt","input","urlExists","isValidURL","$da1f6dc1cffd4cb1$var$ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","$da1f6dc1cffd4cb1$var$_objectSpread2","source","obj","getOwnPropertyDescriptors","defineProperties","$da1f6dc1cffd4cb1$var$_typeof","iterator","$da1f6dc1cffd4cb1$var$_extends","assign","$da1f6dc1cffd4cb1$var$userAgent","pattern","userAgent","match","$da1f6dc1cffd4cb1$var$IE11OrLess","$da1f6dc1cffd4cb1$var$Edge","$da1f6dc1cffd4cb1$var$FireFox","$da1f6dc1cffd4cb1$var$Safari","$da1f6dc1cffd4cb1$var$IOS","$da1f6dc1cffd4cb1$var$ChromeForAndroid","$da1f6dc1cffd4cb1$var$captureMode","capture","passive","$da1f6dc1cffd4cb1$var$on","el","event","fn","$da1f6dc1cffd4cb1$var$off","$da1f6dc1cffd4cb1$var$matches","selector","msMatchesSelector","webkitMatchesSelector","$da1f6dc1cffd4cb1$var$closest","ctx","includeCTX","nodeType","$da1f6dc1cffd4cb1$var$R_SPACE","$da1f6dc1cffd4cb1$var$toggleClass","state","$da1f6dc1cffd4cb1$var$css","prop","val","defaultView","currentStyle","$da1f6dc1cffd4cb1$var$matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","$da1f6dc1cffd4cb1$var$find","list","getElementsByTagName","$da1f6dc1cffd4cb1$var$getWindowScrollingElement","scrollingElement","documentElement","$da1f6dc1cffd4cb1$var$getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","getBoundingClientRect","top","elRect","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","scaleY","$da1f6dc1cffd4cb1$var$isScrolledPast","elSide","parentSide","parent","$da1f6dc1cffd4cb1$var$getParentAutoScrollElement","elSideVal","parentSideVal","$da1f6dc1cffd4cb1$var$getChild","childNum","options","includeDragEl","currentChild","children","display","$da1f6dc1cffd4cb1$export$31b3ca70d8f57423","ghost","dragged","draggable","$da1f6dc1cffd4cb1$var$lastChild","last","lastElementChild","previousElementSibling","$da1f6dc1cffd4cb1$var$index","toUpperCase","clone","$da1f6dc1cffd4cb1$var$getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollTop","includeSelf","elem","gotSelf","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","$da1f6dc1cffd4cb1$var$isRectEqual","rect1","rect2","round","$da1f6dc1cffd4cb1$var$throttle","ms","$da1f6dc1cffd4cb1$var$_throttleTimeout","$da1f6dc1cffd4cb1$var$scrollBy","x","$da1f6dc1cffd4cb1$var$clone","Polymer","$","jQuery","Zepto","dom","$da1f6dc1cffd4cb1$var$getChildContainingRectFromElement","ghostEl","rect","child","animated","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","min","Infinity","max","$da1f6dc1cffd4cb1$var$expando","Date","getTime","$da1f6dc1cffd4cb1$var$plugins","$da1f6dc1cffd4cb1$var$defaults","initializeByDefault","$da1f6dc1cffd4cb1$var$PluginManager","mount","plugin","option","pluginName","concat","pluginEvent","eventName","sortable","_this","eventCanceled","cancel","eventNameGlobal","initializePlugins","defaults","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","$da1f6dc1cffd4cb1$var$_excluded","$da1f6dc1cffd4cb1$var$pluginEvent","_ref","originalEvent","$da1f6dc1cffd4cb1$var$_objectWithoutProperties","excluded","$da1f6dc1cffd4cb1$var$_objectWithoutPropertiesLoose","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","dragEl","$da1f6dc1cffd4cb1$var$dragEl","parentEl","$da1f6dc1cffd4cb1$var$parentEl","$da1f6dc1cffd4cb1$var$ghostEl","rootEl","$da1f6dc1cffd4cb1$var$rootEl","nextEl","$da1f6dc1cffd4cb1$var$nextEl","lastDownEl","$da1f6dc1cffd4cb1$var$lastDownEl","cloneEl","$da1f6dc1cffd4cb1$var$cloneEl","cloneHidden","$da1f6dc1cffd4cb1$var$cloneHidden","dragStarted","$da1f6dc1cffd4cb1$var$moved","putSortable","$da1f6dc1cffd4cb1$var$putSortable","activeSortable","active","oldIndex","$da1f6dc1cffd4cb1$var$oldIndex","oldDraggableIndex","$da1f6dc1cffd4cb1$var$oldDraggableIndex","newIndex","$da1f6dc1cffd4cb1$var$newIndex","newDraggableIndex","$da1f6dc1cffd4cb1$var$newDraggableIndex","hideGhostForTarget","$da1f6dc1cffd4cb1$var$_hideGhostForTarget","unhideGhostForTarget","$da1f6dc1cffd4cb1$var$_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","$da1f6dc1cffd4cb1$var$_dispatchEvent","info","$da1f6dc1cffd4cb1$var$dispatchEvent","targetEl","toEl","fromEl","extraEventProperties","onName","substr","createEvent","initEvent","to","item","pullMode","lastPutMode","allEventProperties","$da1f6dc1cffd4cb1$var$activeGroup","$da1f6dc1cffd4cb1$var$tapEvt","$da1f6dc1cffd4cb1$var$touchEvt","$da1f6dc1cffd4cb1$var$lastDx","$da1f6dc1cffd4cb1$var$lastDy","$da1f6dc1cffd4cb1$var$tapDistanceLeft","$da1f6dc1cffd4cb1$var$tapDistanceTop","$da1f6dc1cffd4cb1$var$lastTarget","$da1f6dc1cffd4cb1$var$lastDirection","$da1f6dc1cffd4cb1$var$targetMoveDistance","$da1f6dc1cffd4cb1$var$ghostRelativeParent","$da1f6dc1cffd4cb1$var$awaitingDragStarted","$da1f6dc1cffd4cb1$var$ignoreNextClick","$da1f6dc1cffd4cb1$var$sortables","$da1f6dc1cffd4cb1$var$pastFirstInvertThresh","$da1f6dc1cffd4cb1$var$isCircumstantialInvert","$da1f6dc1cffd4cb1$var$ghostRelativeParentInitialScroll","$da1f6dc1cffd4cb1$var$_silent","$da1f6dc1cffd4cb1$var$savedInputChecked","$da1f6dc1cffd4cb1$var$documentExists","$da1f6dc1cffd4cb1$var$CSSFloatProperty","$da1f6dc1cffd4cb1$var$supportDraggable","$da1f6dc1cffd4cb1$var$supportCssPointerEvents","cssText","pointerEvents","$da1f6dc1cffd4cb1$var$_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","clear","$da1f6dc1cffd4cb1$var$_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","$da1f6dc1cffd4cb1$var$_detectNearestEmptySortable","ret","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","$da1f6dc1cffd4cb1$var$_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","revertClone","stopImmediatePropagation","$da1f6dc1cffd4cb1$var$nearestEmptyInsertDetectEvent","nearest","touches","clientX","clientY","_onDragOver","$da1f6dc1cffd4cb1$var$_checkOutsideTargetEl","_isOutsideThisEl","animationCallbackId","animationStates","sort","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","animation","easing","setData","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","captureAnimationState","slice","fromRect","thisAnimationDuration","childMatrix","addAnimationState","removeAnimationState","splice","$da1f6dc1cffd4cb1$var$indexOfObject","animateAll","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","sqrt","pow","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","offsetWidth","$da1f6dc1cffd4cb1$var$_onMove","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","$da1f6dc1cffd4cb1$var$_disableDraggable","$da1f6dc1cffd4cb1$var$_unsilent","$da1f6dc1cffd4cb1$var$_nextTick","$da1f6dc1cffd4cb1$var$_cancelNextTick","_getDirection","touch","pointerType","originalTarget","composedPath","$da1f6dc1cffd4cb1$var$_saveInputCheckedState","inputs","idx","checked","button","isContentEditable","criteria","_prepareDragStart","dragStartFn","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","inserted","ghostMatrix","relativeScrollOffset","$da1f6dc1cffd4cb1$var$PositionGhostAbsolutely","dx","dy","cssMatrix","_hideClone","cloneId","_loopId","setInterval","effectAllowed","_dragStartId","revert","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","$da1f6dc1cffd4cb1$var$_ghostIsLast","lastElRect","childContainingRect","changed","firstElRect","firstChild","sibling","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","$da1f6dc1cffd4cb1$var$_getSwapDirection","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","dragIndex","after","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","save","handleEvent","toArray","order","$da1f6dc1cffd4cb1$var$_generateId","str","src","sum","charCodeAt","useAnimation","destroy","utils","on","off","css","is","extend","dst","throttle","toggleClass","nextTick","cancelNextTick","detectDirection","getChild","_len","plugins","_key","create","version","$da1f6dc1cffd4cb1$var$scrollEl","$da1f6dc1cffd4cb1$var$scrollRootEl","$da1f6dc1cffd4cb1$var$touchEvt$1","$da1f6dc1cffd4cb1$var$autoScrolls","isFallback","scroll","scrollCustomFn","sens","scrollSensitivity","speed","scrollSpeed","autoScroll","pid","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","$da1f6dc1cffd4cb1$var$drop","toSortable","changedTouches","onSpill","$da1f6dc1cffd4cb1$var$Revert","$da1f6dc1cffd4cb1$var$Remove","startIndex","dragStart","_ref2","_ref3","drop","_ref4","parentSortable","$f7942db15ba0cc81$export$61fc7d43ac8f84b0","wait","immediate","timerId","$038088370be83852$var$template","$038088370be83852$var$ImportFeeds","dropzoneEl","importForm","handleFilesDropzoneDropAccepted","handleImportFormSubmit","reader","FileReader","readAsText","onload","handleFileReaderLoad","importFeeds","feedsToImport","alert","feedExists","JSON","parse","formData","FormData","$4724280f8ebb5bb4$var$template","$4724280f8ebb5bb4$var$ExportFeeds","exportCodeEl","clipboardCopyEl","webShareEl","downloadButton","oldValue","newValue","feedsToExport","getFeedsToExportString","handleDownloadButtonClick","stringify","exportFeeds","blob","Blob","createObjectURL","link","download","revokeObjectURL","$d02789f57ae99481$var$template","$d02789f57ae99481$var$FeedsList","isEditable","feedsContainerEl","feedsListEl","editBtn","importBtn","importAltBtn","exportBtn","searchInput","searchClearBtn","importDialog","exportDialog","importFeedsEl","exportFeedsEl","noFeedsDisclaimerEl","addFeed","toggleFeedsVisibility","handleActionsClick","handleEditRequest","handleImportRequest","handleExportRequest","handleSearchInputDebounced","handleSearchClear","handleImportDialogOpen","handleExportDialogOpen","handleExportDialogClose","handleFeedsImported","handleFeedsUpdateSuccess","onEnd","searchFeeds","searchValue","feedEls","searchQuery","debounceSearchFeeds","removeFeed","feedEl","linkContent","deleteBtn","linkEl","feedItem","confirm","flex","minWidth","color","deleteButton","lineHeight","listItem","sortHandler","$0acd7cf489ccbd45$var$cache","$0acd7cf489ccbd45$export$5b107dfb127cada8","requestOptions","cachedFeed","ok","json","$9af02a843127b0d7$var$template","$9af02a843127b0d7$var$FeedReader","spinnerEl","dialogEl","modalTitle","feedsViewer","errorEl","openFeed","closeFeed","handleFeedClose","renderFeed","abort","resetDialogContent","AbortController","signal","currentFeed","insertAdjacentHTML","feedsReaderTemplate","description","author","pubDate","thumbnail","formattedDate","Intl","DateTimeFormat","dateStyle","format","$a4c1285108bf4a9d$export$ea3b71af1761ff40","$a4c1285108bf4a9d$var$COMPONENT_NAME","$a4c1285108bf4a9d$var$SUCCESS_STATUS","$a4c1285108bf4a9d$var$ERROR_STATUS","$a4c1285108bf4a9d$var$template","timeout","buttonEl","copySlot","successSlot","errorSlot","upgradeProperty","handleClick","forceResetStatus","copy","copyValue","showStatus","status","elementName","ClipboardCopy","$e179325634270afd$export$30b344bef3e55b67","$e179325634270afd$var$styles","$e179325634270afd$var$template","buttonSlot","getButton","handleSlotChange","WebShare","$862aa3736b0514bc$export$6ccd1735166caad9","$f31161edf38949e9$var$COMMON_MIME_TYPES","$f31161edf38949e9$var$FILES_TO_IGNORE","$f31161edf38949e9$var$toFileWithMimeType","hasExtension","extension","$f31161edf38949e9$var$toFileWithPath","fileWithMimeType","$f31161edf38949e9$var$readEntriesPromise","directoryReader","$f31161edf38949e9$var$readAllDirectoryEntries","$f31161edf38949e9$var$getFileFromFileEntry","fileEntry","$f31161edf38949e9$var$getFilesFromDataTransferItemList","dataTransferItemList","queue","entry","$f31161edf38949e9$var$getFilesFromFileList","fileList","$f31161edf38949e9$export$6d52664cd15c442","$862aa3736b0514bc$var$COMPONENT_NAME","$862aa3736b0514bc$var$TOO_MANY_FILES","$862aa3736b0514bc$var$template","$862aa3736b0514bc$var$styles","fileInput","handleFileInputChange","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","handleKeyUp","num","handleFilesSelect","filesLength","fileHasValidType","acceptedTypeSpecifiers","acceptedMimeTypesList","fileMimeType","baseMimeType","validType","fileExceedsMaxSize","fileIsSmallerThanMinSize","FilesDropzone","$aa07eeb3067ea186$export$e2a22331486dcca0","prefix","suffix","randomString","$2b7397b7d9d03d51$export$f7b23927dede22b3","$4b127c96b8d62b28$var$tabCounter","$4b127c96b8d62b28$var$styles","$4b127c96b8d62b28$var$template","$4b127c96b8d62b28$export$3e41faf802a29e71","closeButton","handleCloseButtonClick","$17a63ddf0f11756d$var$panelCounter","$17a63ddf0f11756d$var$styles","$17a63ddf0f11756d$var$template","$17a63ddf0f11756d$export$3d96ec278d3efce4","$6ed9897cfe6c2018$var$PLACEMENT","$6ed9897cfe6c2018$var$validPlacements","$6ed9897cfe6c2018$var$ACTIVATION","$6ed9897cfe6c2018$var$KEYCODE","$6ed9897cfe6c2018$var$styles","$6ed9897cfe6c2018$var$template","$6ed9897cfe6c2018$export$85fd4ed3b8ca1010","resizeObserver","rafId","hasTabSlotChangedOnce","syncNav","$6ed9897cfe6c2018$var$DEFAULT_SCROLL_DISTANCE","tabSlot","panelSlot","tabsContainer","navContainer","scrollButtons","handleTabClick","handleKeyDown","handleScrollButtonClick","handleTabClose","targetElement","isElementScrollable","hideEmptyTabGroup","stopResizeObserver","startResizeObserver","scrollElement","getDirection","allTabs","linkPanels","tabs","tab","panel","allPanels","panelForTab","panelId","firstTab","lastTab","prevTab","newIdx","nextTab","reset","panels","setSelectedTabOnSlotChange","setSelectedTab","orientation","scrollButton","sign","oldTab","TabGroup","$180b6dcf923bafc7$export$32589115725b904b","$180b6dcf923bafc7$var$template","$180b6dcf923bafc7$var$styles","footerSlotEl","pulseAnimationTimeout","headerEl","closeBtnEl","handleDialogClick","handleDialogClose","handleDialogCancel","handleFooterSlotChange","applyPulseEffectOnDialog","requestCloseEvent","createRequestCloseEvent","footerEl","footerSlotNodes","hasFooterSlotNodes","ModalElement","$442be162a818aed4$export$c37129e465f64ef0","isWebShareSupported"],"version":3,"file":"index.fdee3dc7.js.map"} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index c6a121a..1a83479 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ -RSS Feed Reader
                  RSS

                  RSS Feed Reader

                  Fork me on Github
                  \ No newline at end of file +RSS Feed Reader
                  RSS

                  RSS Feed Reader

                  Fork me on Github
                  \ No newline at end of file diff --git a/docs/index.runtime.f12b0505.js b/docs/index.runtime.14ff93db.js similarity index 91% rename from docs/index.runtime.f12b0505.js rename to docs/index.runtime.14ff93db.js index 5f1a876..a59d6e4 100644 --- a/docs/index.runtime.f12b0505.js +++ b/docs/index.runtime.14ff93db.js @@ -1,2 +1,2 @@ -!function(){function e(e,r,n,t){Object.defineProperty(e,r,{get:n,set:t,enumerable:!0,configurable:!0})}var r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},t={},i=r.parcelRequire3ec4;null==i&&((i=function(e){if(e in n)return n[e].exports;if(e in t){var r=t[e];delete t[e];var i={id:e,exports:{}};return n[e]=i,r.call(i.exports,i,i.exports),i.exports}var o=Error("Cannot find module '"+e+"'");throw o.code="MODULE_NOT_FOUND",o}).register=function(e,r){t[e]=r},r.parcelRequire3ec4=i);var o=i.register;o("iE7OH",function(r,n){e(r.exports,"register",function(){return t},function(e){return t=e});var t,i=new Map;t=function(e,r){for(var n=0;n","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/helpers/bundle-url.js","node_modules/@parcel/runtime-js/lib/runtime-058342d62488c914.js"],"sourcesContent":["(function () {\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire3ec4\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire3ec4\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"iE7OH\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf; }, function (v) { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf = v; });\nvar $0380ce8f1f064ccc$export$6503ec6e8aabbaf;\nvar $0380ce8f1f064ccc$export$f7ad0328861e2f03;\n\"use strict\";\nvar $0380ce8f1f064ccc$var$mapping = new Map();\nfunction $0380ce8f1f064ccc$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$0380ce8f1f064ccc$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $0380ce8f1f064ccc$var$resolve(id) {\n var resolved = $0380ce8f1f064ccc$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$0380ce8f1f064ccc$export$6503ec6e8aabbaf = $0380ce8f1f064ccc$var$register;\n$0380ce8f1f064ccc$export$f7ad0328861e2f03 = $0380ce8f1f064ccc$var$resolve;\n\n});\n\nparcelRegister(\"aNJCr\", function(module, exports) {\n\n$parcel$export(module.exports, \"getBundleURL\", function () { return $7dd1ddf6834435ca$export$bdfd709ae4826697; }, function (v) { return $7dd1ddf6834435ca$export$bdfd709ae4826697 = v; });\nvar $7dd1ddf6834435ca$export$bdfd709ae4826697;\nvar $7dd1ddf6834435ca$export$c9e73fbda7da57b6;\nvar $7dd1ddf6834435ca$export$5a759dc7a1cfb72a;\n\"use strict\";\nvar $7dd1ddf6834435ca$var$bundleURL = {};\nfunction $7dd1ddf6834435ca$var$getBundleURLCached(id) {\n var value = $7dd1ddf6834435ca$var$bundleURL[id];\n if (!value) {\n value = $7dd1ddf6834435ca$var$getBundleURL();\n $7dd1ddf6834435ca$var$bundleURL[id] = value;\n }\n return value;\n}\nfunction $7dd1ddf6834435ca$var$getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = (\"\" + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return $7dd1ddf6834435ca$var$getBaseURL(matches[2]);\n }\n return \"/\";\n}\nfunction $7dd1ddf6834435ca$var$getBaseURL(url) {\n return (\"\" + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, \"$1\") + \"/\";\n}\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction $7dd1ddf6834435ca$var$getOrigin(url) {\n var matches = (\"\" + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) throw new Error(\"Origin not found\");\n return matches[0];\n}\n$7dd1ddf6834435ca$export$bdfd709ae4826697 = $7dd1ddf6834435ca$var$getBundleURLCached;\n$7dd1ddf6834435ca$export$c9e73fbda7da57b6 = $7dd1ddf6834435ca$var$getBaseURL;\n$7dd1ddf6834435ca$export$5a759dc7a1cfb72a = $7dd1ddf6834435ca$var$getOrigin;\n\n});\n\nvar $c4014d1918e0c89f$exports = {};\n\n\n(parcelRequire(\"iE7OH\")).register((parcelRequire(\"aNJCr\")).getBundleURL(\"jBxQq\"), JSON.parse('[\"jBxQq\",\"index.fdee3dc7.js\",\"4z142\",\"bootstrap.33ff2998.css\",\"iVxim\",\"main.2238cf96.css\"]'));\n\n})();\n//# sourceMappingURL=index.runtime.f12b0505.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","\"use strict\";\n\nvar bundleURL = {};\nfunction getBundleURLCached(id) {\n var value = bundleURL[id];\n if (!value) {\n value = getBundleURL();\n bundleURL[id] = value;\n }\n return value;\n}\nfunction getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) {\n // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return getBaseURL(matches[2]);\n }\n }\n return '/';\n}\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, '$1') + '/';\n}\n\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction getOrigin(url) {\n var matches = ('' + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) {\n throw new Error('Origin not found');\n }\n return matches[0];\n}\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\nexports.getOrigin = getOrigin;","require('./helpers/bundle-manifest').register(require('./helpers/bundle-url').getBundleURL('jBxQq'),JSON.parse(\"[\\\"jBxQq\\\",\\\"index.fdee3dc7.js\\\",\\\"4z142\\\",\\\"bootstrap.33ff2998.css\\\",\\\"iVxim\\\",\\\"main.2238cf96.css\\\"]\"));"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","$0380ce8f1f064ccc$export$6503ec6e8aabbaf","$0380ce8f1f064ccc$var$mapping","Map","baseUrl","manifest","i","length","path","$7dd1ddf6834435ca$export$bdfd709ae4826697","$7dd1ddf6834435ca$var$bundleURL","value","$7dd1ddf6834435ca$var$getBundleURL","matches","stack","match","replace","getBundleURL","JSON","parse"],"version":3,"file":"index.runtime.f12b0505.js.map"} \ No newline at end of file +{"mappings":"C,A,W,S,E,C,C,C,C,C,C,C,E,O,c,C,E,E,C,I,E,I,E,W,C,E,a,C,C,E,C,I,E,A,a,O,W,W,A,a,O,K,K,A,a,O,O,O,A,a,O,O,O,C,E,E,C,E,E,C,E,E,E,iB,A,O,I,A,C,E,S,C,E,G,K,E,O,C,C,E,C,O,C,G,K,E,C,I,E,C,C,E,A,Q,C,C,E,C,I,E,C,G,E,Q,C,C,E,O,C,C,E,C,E,E,I,C,E,O,C,E,E,O,E,E,O,A,C,I,E,A,M,uB,E,I,O,E,I,C,mB,C,C,E,Q,C,S,C,C,C,E,C,C,E,C,C,E,E,iB,C,G,I,E,E,Q,C,E,Q,S,C,C,C,E,E,E,O,C,W,W,O,C,E,S,C,E,O,E,C,GCEA,IAgBA,EAhBI,EAAU,IAAI,IAgBlB,EAfA,SAAkB,CAAO,CAAE,CAAQ,EACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,MAAM,CAAG,EAAG,GAAK,EAC5C,EAAQ,GAAG,CAAC,CAAQ,CAAC,EAAE,CAAE,CACvB,QAAS,EACT,KAAM,CAAQ,CAAC,EAAI,EAAE,AACvB,EAEJ,C,G,E,Q,S,C,C,C,E,E,E,O,C,e,W,O,C,E,S,C,E,O,E,C,GCRA,IAkCA,EAlCI,EAAY,CAAC,EAkCjB,EAjCA,SAA4B,CAAE,EAC5B,IAAI,EAAQ,CAAS,CAAC,EAAG,CAKzB,OAJK,IACH,EAAQ,AAKZ,WACE,GAAI,CACF,MAAM,AAAI,OACZ,CAAE,MAAO,EAAK,CACZ,IAAI,EAAW,AAAA,CAAA,GAAK,EAAI,KAAI,AAAJ,EAAO,KAAK,CAAC,oEACrC,GAAI,EAGF,MAMI,AAAA,CAAA,GANc,CAAO,CAAC,EAAE,AAMnB,EAAK,OAAO,CAAC,0EAA2E,MAAQ,GAJ7G,CACA,MAAO,GACT,IAhBI,CAAS,CAAC,EAAG,CAAG,GAEX,CACT,C,GCVA,AAAA,EAAA,SAAA,QAAA,CAA8C,AAAA,EAAA,SAAA,YAAA,CAA6C,SAAS,KAAK,KAAK,CAAC,iJ","sources":["","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/helpers/bundle-url.js","node_modules/@parcel/runtime-js/lib/runtime-058342d62488c914.js"],"sourcesContent":["(function () {\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire3ec4\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire3ec4\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"iE7OH\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf; }, function (v) { return $0380ce8f1f064ccc$export$6503ec6e8aabbaf = v; });\nvar $0380ce8f1f064ccc$export$6503ec6e8aabbaf;\nvar $0380ce8f1f064ccc$export$f7ad0328861e2f03;\n\"use strict\";\nvar $0380ce8f1f064ccc$var$mapping = new Map();\nfunction $0380ce8f1f064ccc$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$0380ce8f1f064ccc$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $0380ce8f1f064ccc$var$resolve(id) {\n var resolved = $0380ce8f1f064ccc$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$0380ce8f1f064ccc$export$6503ec6e8aabbaf = $0380ce8f1f064ccc$var$register;\n$0380ce8f1f064ccc$export$f7ad0328861e2f03 = $0380ce8f1f064ccc$var$resolve;\n\n});\n\nparcelRegister(\"aNJCr\", function(module, exports) {\n\n$parcel$export(module.exports, \"getBundleURL\", function () { return $7dd1ddf6834435ca$export$bdfd709ae4826697; }, function (v) { return $7dd1ddf6834435ca$export$bdfd709ae4826697 = v; });\nvar $7dd1ddf6834435ca$export$bdfd709ae4826697;\nvar $7dd1ddf6834435ca$export$c9e73fbda7da57b6;\nvar $7dd1ddf6834435ca$export$5a759dc7a1cfb72a;\n\"use strict\";\nvar $7dd1ddf6834435ca$var$bundleURL = {};\nfunction $7dd1ddf6834435ca$var$getBundleURLCached(id) {\n var value = $7dd1ddf6834435ca$var$bundleURL[id];\n if (!value) {\n value = $7dd1ddf6834435ca$var$getBundleURL();\n $7dd1ddf6834435ca$var$bundleURL[id] = value;\n }\n return value;\n}\nfunction $7dd1ddf6834435ca$var$getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = (\"\" + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return $7dd1ddf6834435ca$var$getBaseURL(matches[2]);\n }\n return \"/\";\n}\nfunction $7dd1ddf6834435ca$var$getBaseURL(url) {\n return (\"\" + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, \"$1\") + \"/\";\n}\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction $7dd1ddf6834435ca$var$getOrigin(url) {\n var matches = (\"\" + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) throw new Error(\"Origin not found\");\n return matches[0];\n}\n$7dd1ddf6834435ca$export$bdfd709ae4826697 = $7dd1ddf6834435ca$var$getBundleURLCached;\n$7dd1ddf6834435ca$export$c9e73fbda7da57b6 = $7dd1ddf6834435ca$var$getBaseURL;\n$7dd1ddf6834435ca$export$5a759dc7a1cfb72a = $7dd1ddf6834435ca$var$getOrigin;\n\n});\n\nvar $c4014d1918e0c89f$exports = {};\n\n\n(parcelRequire(\"iE7OH\")).register((parcelRequire(\"aNJCr\")).getBundleURL(\"jBxQq\"), JSON.parse('[\"jBxQq\",\"index.c4734e4f.js\",\"4z142\",\"bootstrap.33ff2998.css\",\"iVxim\",\"main.2238cf96.css\"]'));\n\n})();\n//# sourceMappingURL=index.runtime.14ff93db.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","\"use strict\";\n\nvar bundleURL = {};\nfunction getBundleURLCached(id) {\n var value = bundleURL[id];\n if (!value) {\n value = getBundleURL();\n bundleURL[id] = value;\n }\n return value;\n}\nfunction getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^)\\n]+/g);\n if (matches) {\n // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return getBaseURL(matches[2]);\n }\n }\n return '/';\n}\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/.+)\\/[^/]+$/, '$1') + '/';\n}\n\n// TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\nfunction getOrigin(url) {\n var matches = ('' + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\\/\\/[^/]+/);\n if (!matches) {\n throw new Error('Origin not found');\n }\n return matches[0];\n}\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\nexports.getOrigin = getOrigin;","require('./helpers/bundle-manifest').register(require('./helpers/bundle-url').getBundleURL('jBxQq'),JSON.parse(\"[\\\"jBxQq\\\",\\\"index.c4734e4f.js\\\",\\\"4z142\\\",\\\"bootstrap.33ff2998.css\\\",\\\"iVxim\\\",\\\"main.2238cf96.css\\\"]\"));"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","$0380ce8f1f064ccc$export$6503ec6e8aabbaf","$0380ce8f1f064ccc$var$mapping","Map","baseUrl","manifest","i","length","path","$7dd1ddf6834435ca$export$bdfd709ae4826697","$7dd1ddf6834435ca$var$bundleURL","value","$7dd1ddf6834435ca$var$getBundleURL","matches","stack","match","replace","getBundleURL","JSON","parse"],"version":3,"file":"index.runtime.14ff93db.js.map"} \ No newline at end of file diff --git a/docs/index.runtime.a87a54e3.js b/docs/index.runtime.af7604cc.js similarity index 88% rename from docs/index.runtime.a87a54e3.js rename to docs/index.runtime.af7604cc.js index 80bf9b4..17c6e81 100644 --- a/docs/index.runtime.a87a54e3.js +++ b/docs/index.runtime.af7604cc.js @@ -1,2 +1,2 @@ -var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},r={},n={},t=e.parcelRequire3ec4;null==t&&((t=function(e){if(e in r)return r[e].exports;if(e in n){var t=n[e];delete n[e];var i={id:e,exports:{}};return r[e]=i,t.call(i.exports,i,i.exports),i.exports}var o=Error("Cannot find module '"+e+"'");throw o.code="MODULE_NOT_FOUND",o}).register=function(e,r){n[e]=r},e.parcelRequire3ec4=t),(0,t.register)("kyEFX",function(e,r){Object.defineProperty(e.exports,"register",{get:function(){return n},set:function(e){return n=e},enumerable:!0,configurable:!0});var n,t=new Map;n=function(e,r){for(var n=0;n","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/runtime-4be907444bc3acdb.js"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire3ec4\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire3ec4\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"kyEFX\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $ef7689007096c8a0$export$6503ec6e8aabbaf; }, function (v) { return $ef7689007096c8a0$export$6503ec6e8aabbaf = v; });\nvar $ef7689007096c8a0$export$6503ec6e8aabbaf;\nvar $ef7689007096c8a0$export$f7ad0328861e2f03;\n\"use strict\";\nvar $ef7689007096c8a0$var$mapping = new Map();\nfunction $ef7689007096c8a0$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$ef7689007096c8a0$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $ef7689007096c8a0$var$resolve(id) {\n var resolved = $ef7689007096c8a0$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$ef7689007096c8a0$export$6503ec6e8aabbaf = $ef7689007096c8a0$var$register;\n$ef7689007096c8a0$export$f7ad0328861e2f03 = $ef7689007096c8a0$var$resolve;\n\n});\n\nvar $3858f450f91e3f31$exports = {};\n\n(parcelRequire(\"kyEFX\")).register(new URL(\"\", import.meta.url).toString(), JSON.parse('[\"5ZWMA\",\"index.063a0a63.js\",\"4z142\",\"bootstrap.33ff2998.css\",\"iVxim\",\"main.2238cf96.css\"]'));\n\n\n//# sourceMappingURL=index.runtime.a87a54e3.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","require('./helpers/bundle-manifest').register(new __parcel__URL__(\"\").toString(),JSON.parse(\"[\\\"5ZWMA\\\",\\\"index.063a0a63.js\\\",\\\"4z142\\\",\\\"bootstrap.33ff2998.css\\\",\\\"iVxim\\\",\\\"main.2238cf96.css\\\"]\"));"],"names":["$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","Object","defineProperty","get","$ef7689007096c8a0$export$6503ec6e8aabbaf","set","v","enumerable","configurable","$ef7689007096c8a0$var$mapping","Map","baseUrl","manifest","i","length","path","URL","url","toString","JSON","parse"],"version":3,"file":"index.runtime.a87a54e3.js.map"} \ No newline at end of file +{"mappings":"A,I,E,A,a,O,W,W,A,a,O,K,K,A,a,O,O,O,A,a,O,O,O,C,E,E,C,E,E,C,E,E,E,iB,A,O,I,A,C,E,S,C,E,G,K,E,O,C,C,E,C,O,C,G,K,E,C,I,E,C,C,E,A,Q,C,C,E,C,I,E,C,G,E,Q,C,C,E,O,C,C,E,C,E,E,I,C,E,O,C,E,E,O,E,E,O,A,C,I,E,A,M,uB,E,I,O,E,I,C,mB,C,C,E,Q,C,S,C,C,C,E,C,C,E,C,C,E,E,iB,C,G,A,C,E,E,Q,A,E,Q,S,C,C,C,E,O,c,C,E,O,C,W,C,I,W,O,C,E,I,S,C,E,O,E,C,E,W,C,E,a,C,C,GCEA,IAgBA,EAhBI,EAAU,IAAI,IAgBlB,EAfA,SAAkB,CAAO,CAAE,CAAQ,EACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,MAAM,CAAG,EAAG,GAAK,EAC5C,EAAQ,GAAG,CAAC,CAAQ,CAAC,EAAE,CAAE,CACvB,QAAS,EACT,KAAM,CAAQ,CAAC,EAAI,EAAE,AACvB,EAEJ,C,GCVA,AAAA,EAAA,SAAA,QAAA,CAA8C,IAAA,IAAoB,GAAA,YAAA,GAAA,EAAI,QAAQ,GAAG,KAAK,KAAK,CAAC","sources":["","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/@parcel/runtime-js/lib/runtime-4be907444bc3acdb.js"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire3ec4\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire3ec4\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"kyEFX\", function(module, exports) {\n\n$parcel$export(module.exports, \"register\", function () { return $ef7689007096c8a0$export$6503ec6e8aabbaf; }, function (v) { return $ef7689007096c8a0$export$6503ec6e8aabbaf = v; });\nvar $ef7689007096c8a0$export$6503ec6e8aabbaf;\nvar $ef7689007096c8a0$export$f7ad0328861e2f03;\n\"use strict\";\nvar $ef7689007096c8a0$var$mapping = new Map();\nfunction $ef7689007096c8a0$var$register(baseUrl, manifest) {\n for(var i = 0; i < manifest.length - 1; i += 2)$ef7689007096c8a0$var$mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n}\nfunction $ef7689007096c8a0$var$resolve(id) {\n var resolved = $ef7689007096c8a0$var$mapping.get(id);\n if (resolved == null) throw new Error(\"Could not resolve bundle with id \" + id);\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\n$ef7689007096c8a0$export$6503ec6e8aabbaf = $ef7689007096c8a0$var$register;\n$ef7689007096c8a0$export$f7ad0328861e2f03 = $ef7689007096c8a0$var$resolve;\n\n});\n\nvar $3858f450f91e3f31$exports = {};\n\n(parcelRequire(\"kyEFX\")).register(new URL(\"\", import.meta.url).toString(), JSON.parse('[\"5ZWMA\",\"index.2b8c09b0.js\",\"4z142\",\"bootstrap.33ff2998.css\",\"iVxim\",\"main.2238cf96.css\"]'));\n\n\n//# sourceMappingURL=index.runtime.af7604cc.js.map\n","\"use strict\";\n\nvar mapping = new Map();\nfunction register(baseUrl, manifest) {\n for (var i = 0; i < manifest.length - 1; i += 2) {\n mapping.set(manifest[i], {\n baseUrl: baseUrl,\n path: manifest[i + 1]\n });\n }\n}\nfunction resolve(id) {\n var resolved = mapping.get(id);\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n return new URL(resolved.path, resolved.baseUrl).toString();\n}\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","require('./helpers/bundle-manifest').register(new __parcel__URL__(\"\").toString(),JSON.parse(\"[\\\"5ZWMA\\\",\\\"index.2b8c09b0.js\\\",\\\"4z142\\\",\\\"bootstrap.33ff2998.css\\\",\\\"iVxim\\\",\\\"main.2238cf96.css\\\"]\"));"],"names":["$parcel$global","globalThis","self","window","global","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","parcelRegister","Object","defineProperty","get","$ef7689007096c8a0$export$6503ec6e8aabbaf","set","v","enumerable","configurable","$ef7689007096c8a0$var$mapping","Map","baseUrl","manifest","i","length","path","URL","url","toString","JSON","parse"],"version":3,"file":"index.runtime.af7604cc.js.map"} \ No newline at end of file diff --git a/docs/service-worker.js b/docs/service-worker.js index 5e77347..7d7e10f 100644 --- a/docs/service-worker.js +++ b/docs/service-worker.js @@ -1,2 +1,2 @@ -if(!self.define){let e,i={};const c=(c,d)=>(c=new URL(c+".js",d).href,i[c]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=i,document.head.appendChild(e)}else e=c,importScripts(c),i()})).then((()=>{let e=i[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e})));self.define=(d,r)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(i[n])return;let a={};const s=e=>c(e,n),f={module:{uri:n},exports:a,require:s};i[n]=Promise.all(d.map((e=>f[e]||s(e)))).then((e=>(r(...e),a)))}}define(["./workbox-0858eadd"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"180.7bf2a919.png",revision:"e0e6506e2c6d68e67b5216d2e2e9d279"},{url:"192.bb58cb51.png",revision:"d95c67511305d57484661ace299df673"},{url:"384.2497e760.png",revision:"7513f0ef31bd0a4dc90d4fc714d09581"},{url:"512.abf7862a.png",revision:"8e22b2040007c33969fea990fe5465cc"},{url:"bootstrap.33ff2998.css",revision:"75416cf388ce73317c787e7363673496"},{url:"bootstrap.33ff2998.css.map",revision:"9e4e4208c50a591ba8f929d04db42878"},{url:"favicon-192.c4da8b1a.png",revision:"234a13f4a216f2ae0b11b2771b3273c7"},{url:"index.063a0a63.js",revision:"47af40913a3d3ffa81a4cc7799bdfb27"},{url:"index.063a0a63.js.map",revision:"941c206b2f5d0e48ec142f151cac754d"},{url:"index.89efe45b.js",revision:"6814a61841cd719f59765d1ee48ea09a"},{url:"index.89efe45b.js.map",revision:"c88920bec0571a6511e504850de79c03"},{url:"index.d44e81ec.js",revision:"b90a75d7c5128c18c30bf621d43c8122"},{url:"index.d44e81ec.js.map",revision:"4f7febc735b0a98935455f8329214edd"},{url:"index.fdee3dc7.js",revision:"a24e624732c47c8501c5d8a3f9e32e02"},{url:"index.fdee3dc7.js.map",revision:"452171ca59d299d5cadb2d8ee79c95aa"},{url:"index.html",revision:"3e0c0a8ccb301270680da0c9ab796501"},{url:"index.runtime.a87a54e3.js",revision:"9858bf80743aa1ef84d6247385ae5150"},{url:"index.runtime.a87a54e3.js.map",revision:"08979cf2034e971d1499c475c52c4b4b"},{url:"index.runtime.f12b0505.js",revision:"f1ea888c45c4aa23d54e1accc9ca7dd3"},{url:"index.runtime.f12b0505.js.map",revision:"f749787d7b1dc81781f8b52100bbd902"},{url:"main.2238cf96.css",revision:"106c8f8954ba8d68bd4a38761d3ba02d"},{url:"main.2238cf96.css.map",revision:"9e36e8fb99da3d7714f63040929fe23b"},{url:"manifest.webmanifest",revision:"490b82406161245c75d5a1df136b83cc"},{url:"screenshot_dark.ef8c2713.png",revision:"4b2a0eddebdec456504268b27bbf9892"},{url:"screenshot_light.6e3c7371.png",revision:"637c4251c4d256f23dc5d70d543966bc"}],{})})); +if(!self.define){let e,i={};const c=(c,f)=>(c=new URL(c+".js",f).href,i[c]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=i,document.head.appendChild(e)}else e=c,importScripts(c),i()})).then((()=>{let e=i[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e})));self.define=(f,r)=>{const d=e||("document"in self?document.currentScript.src:"")||location.href;if(i[d])return;let n={};const s=e=>c(e,d),b={module:{uri:d},exports:n,require:s};i[d]=Promise.all(f.map((e=>b[e]||s(e)))).then((e=>(r(...e),n)))}}define(["./workbox-0858eadd"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"180.7bf2a919.png",revision:"e0e6506e2c6d68e67b5216d2e2e9d279"},{url:"192.bb58cb51.png",revision:"d95c67511305d57484661ace299df673"},{url:"384.2497e760.png",revision:"7513f0ef31bd0a4dc90d4fc714d09581"},{url:"512.abf7862a.png",revision:"8e22b2040007c33969fea990fe5465cc"},{url:"bootstrap.33ff2998.css",revision:"75416cf388ce73317c787e7363673496"},{url:"bootstrap.33ff2998.css.map",revision:"9e4e4208c50a591ba8f929d04db42878"},{url:"favicon-192.c4da8b1a.png",revision:"234a13f4a216f2ae0b11b2771b3273c7"},{url:"index.2b8c09b0.js",revision:"4d0f5621a5c07c710f752fb8173c55a6"},{url:"index.2b8c09b0.js.map",revision:"ee534df2b35c1342d9eb04112cd9f5f1"},{url:"index.89efe45b.js",revision:"6814a61841cd719f59765d1ee48ea09a"},{url:"index.89efe45b.js.map",revision:"c88920bec0571a6511e504850de79c03"},{url:"index.c4734e4f.js",revision:"f46b7a4f4ebb1c72cbed74a0bd95ed53"},{url:"index.c4734e4f.js.map",revision:"047e4969e202ce49be9c2ae1bc3bc9f4"},{url:"index.d44e81ec.js",revision:"b90a75d7c5128c18c30bf621d43c8122"},{url:"index.d44e81ec.js.map",revision:"4f7febc735b0a98935455f8329214edd"},{url:"index.html",revision:"73aae6b7f187eb994cef00b10ab1de48"},{url:"index.runtime.14ff93db.js",revision:"1c5c51650fa5ff3f070749ca1e3783f8"},{url:"index.runtime.14ff93db.js.map",revision:"38e1642e60697b3f460fb5aef4f5a506"},{url:"index.runtime.af7604cc.js",revision:"9df6bf3a0295efd00954592170272bfd"},{url:"index.runtime.af7604cc.js.map",revision:"58016a219f0d77e73a7f9ab73cf5fb0d"},{url:"main.2238cf96.css",revision:"106c8f8954ba8d68bd4a38761d3ba02d"},{url:"main.2238cf96.css.map",revision:"9e36e8fb99da3d7714f63040929fe23b"},{url:"manifest.webmanifest",revision:"490b82406161245c75d5a1df136b83cc"},{url:"screenshot_dark.ef8c2713.png",revision:"4b2a0eddebdec456504268b27bbf9892"},{url:"screenshot_light.6e3c7371.png",revision:"637c4251c4d256f23dc5d70d543966bc"}],{})})); //# sourceMappingURL=service-worker.js.map diff --git a/docs/service-worker.js.map b/docs/service-worker.js.map index fc456d5..2f29e63 100644 --- a/docs/service-worker.js.map +++ b/docs/service-worker.js.map @@ -1 +1 @@ -{"version":3,"file":"service-worker.js","sources":["../../../../../private/var/folders/vy/why3xmz53r57rfypb6dxq94c0000gp/T/12e89acf207fd83f4517966153819819/service-worker.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/Users/georgeraptis/Projects/@georapbox/rss-feed-reader/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/georgeraptis/Projects/@georapbox/rss-feed-reader/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"180.7bf2a919.png\",\n \"revision\": \"e0e6506e2c6d68e67b5216d2e2e9d279\"\n },\n {\n \"url\": \"192.bb58cb51.png\",\n \"revision\": \"d95c67511305d57484661ace299df673\"\n },\n {\n \"url\": \"384.2497e760.png\",\n \"revision\": \"7513f0ef31bd0a4dc90d4fc714d09581\"\n },\n {\n \"url\": \"512.abf7862a.png\",\n \"revision\": \"8e22b2040007c33969fea990fe5465cc\"\n },\n {\n \"url\": \"bootstrap.33ff2998.css\",\n \"revision\": \"75416cf388ce73317c787e7363673496\"\n },\n {\n \"url\": \"bootstrap.33ff2998.css.map\",\n \"revision\": \"9e4e4208c50a591ba8f929d04db42878\"\n },\n {\n \"url\": \"favicon-192.c4da8b1a.png\",\n \"revision\": \"234a13f4a216f2ae0b11b2771b3273c7\"\n },\n {\n \"url\": \"index.063a0a63.js\",\n \"revision\": \"47af40913a3d3ffa81a4cc7799bdfb27\"\n },\n {\n \"url\": \"index.063a0a63.js.map\",\n \"revision\": \"941c206b2f5d0e48ec142f151cac754d\"\n },\n {\n \"url\": \"index.89efe45b.js\",\n \"revision\": \"6814a61841cd719f59765d1ee48ea09a\"\n },\n {\n \"url\": \"index.89efe45b.js.map\",\n \"revision\": \"c88920bec0571a6511e504850de79c03\"\n },\n {\n \"url\": \"index.d44e81ec.js\",\n \"revision\": \"b90a75d7c5128c18c30bf621d43c8122\"\n },\n {\n \"url\": \"index.d44e81ec.js.map\",\n \"revision\": \"4f7febc735b0a98935455f8329214edd\"\n },\n {\n \"url\": \"index.fdee3dc7.js\",\n \"revision\": \"a24e624732c47c8501c5d8a3f9e32e02\"\n },\n {\n \"url\": \"index.fdee3dc7.js.map\",\n \"revision\": \"452171ca59d299d5cadb2d8ee79c95aa\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"3e0c0a8ccb301270680da0c9ab796501\"\n },\n {\n \"url\": \"index.runtime.a87a54e3.js\",\n \"revision\": \"9858bf80743aa1ef84d6247385ae5150\"\n },\n {\n \"url\": \"index.runtime.a87a54e3.js.map\",\n \"revision\": \"08979cf2034e971d1499c475c52c4b4b\"\n },\n {\n \"url\": \"index.runtime.f12b0505.js\",\n \"revision\": \"f1ea888c45c4aa23d54e1accc9ca7dd3\"\n },\n {\n \"url\": \"index.runtime.f12b0505.js.map\",\n \"revision\": \"f749787d7b1dc81781f8b52100bbd902\"\n },\n {\n \"url\": \"main.2238cf96.css\",\n \"revision\": \"106c8f8954ba8d68bd4a38761d3ba02d\"\n },\n {\n \"url\": \"main.2238cf96.css.map\",\n \"revision\": \"9e36e8fb99da3d7714f63040929fe23b\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"490b82406161245c75d5a1df136b83cc\"\n },\n {\n \"url\": \"screenshot_dark.ef8c2713.png\",\n \"revision\": \"4b2a0eddebdec456504268b27bbf9892\"\n },\n {\n \"url\": \"screenshot_light.6e3c7371.png\",\n \"revision\": \"637c4251c4d256f23dc5d70d543966bc\"\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision"],"mappings":"0nBAoBAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,qCAEb,CAAA"} \ No newline at end of file +{"version":3,"file":"service-worker.js","sources":["../../../../../private/var/folders/vy/why3xmz53r57rfypb6dxq94c0000gp/T/1483cbcbfd95df0517af41682dcdbfb9/service-worker.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/Users/georgeraptis/Projects/@georapbox/rss-feed-reader/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/georgeraptis/Projects/@georapbox/rss-feed-reader/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"180.7bf2a919.png\",\n \"revision\": \"e0e6506e2c6d68e67b5216d2e2e9d279\"\n },\n {\n \"url\": \"192.bb58cb51.png\",\n \"revision\": \"d95c67511305d57484661ace299df673\"\n },\n {\n \"url\": \"384.2497e760.png\",\n \"revision\": \"7513f0ef31bd0a4dc90d4fc714d09581\"\n },\n {\n \"url\": \"512.abf7862a.png\",\n \"revision\": \"8e22b2040007c33969fea990fe5465cc\"\n },\n {\n \"url\": \"bootstrap.33ff2998.css\",\n \"revision\": \"75416cf388ce73317c787e7363673496\"\n },\n {\n \"url\": \"bootstrap.33ff2998.css.map\",\n \"revision\": \"9e4e4208c50a591ba8f929d04db42878\"\n },\n {\n \"url\": \"favicon-192.c4da8b1a.png\",\n \"revision\": \"234a13f4a216f2ae0b11b2771b3273c7\"\n },\n {\n \"url\": \"index.2b8c09b0.js\",\n \"revision\": \"4d0f5621a5c07c710f752fb8173c55a6\"\n },\n {\n \"url\": \"index.2b8c09b0.js.map\",\n \"revision\": \"ee534df2b35c1342d9eb04112cd9f5f1\"\n },\n {\n \"url\": \"index.89efe45b.js\",\n \"revision\": \"6814a61841cd719f59765d1ee48ea09a\"\n },\n {\n \"url\": \"index.89efe45b.js.map\",\n \"revision\": \"c88920bec0571a6511e504850de79c03\"\n },\n {\n \"url\": \"index.c4734e4f.js\",\n \"revision\": \"f46b7a4f4ebb1c72cbed74a0bd95ed53\"\n },\n {\n \"url\": \"index.c4734e4f.js.map\",\n \"revision\": \"047e4969e202ce49be9c2ae1bc3bc9f4\"\n },\n {\n \"url\": \"index.d44e81ec.js\",\n \"revision\": \"b90a75d7c5128c18c30bf621d43c8122\"\n },\n {\n \"url\": \"index.d44e81ec.js.map\",\n \"revision\": \"4f7febc735b0a98935455f8329214edd\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"73aae6b7f187eb994cef00b10ab1de48\"\n },\n {\n \"url\": \"index.runtime.14ff93db.js\",\n \"revision\": \"1c5c51650fa5ff3f070749ca1e3783f8\"\n },\n {\n \"url\": \"index.runtime.14ff93db.js.map\",\n \"revision\": \"38e1642e60697b3f460fb5aef4f5a506\"\n },\n {\n \"url\": \"index.runtime.af7604cc.js\",\n \"revision\": \"9df6bf3a0295efd00954592170272bfd\"\n },\n {\n \"url\": \"index.runtime.af7604cc.js.map\",\n \"revision\": \"58016a219f0d77e73a7f9ab73cf5fb0d\"\n },\n {\n \"url\": \"main.2238cf96.css\",\n \"revision\": \"106c8f8954ba8d68bd4a38761d3ba02d\"\n },\n {\n \"url\": \"main.2238cf96.css.map\",\n \"revision\": \"9e36e8fb99da3d7714f63040929fe23b\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"490b82406161245c75d5a1df136b83cc\"\n },\n {\n \"url\": \"screenshot_dark.ef8c2713.png\",\n \"revision\": \"4b2a0eddebdec456504268b27bbf9892\"\n },\n {\n \"url\": \"screenshot_light.6e3c7371.png\",\n \"revision\": \"637c4251c4d256f23dc5d70d543966bc\"\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision"],"mappings":"0nBAoBAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,mBACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,oCAEd,CACED,IAAO,oBACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,gCACPC,SAAY,qCAEb,CAAA"} \ No newline at end of file