{"version":3,"file":"dialog.js","names":["Dialog","#html","#loading","#closing","#opening","Dialog","Triggers","Triggering"],"sources":["../node_modules/tua-body-scroll-lock/dist/tua-bsl.mjs","../resources/javascript/src/Events.js","../resources/javascript/src/Dialog.js","../resources/javascript/src/Manager.js","../resources/javascript/src/ConfigBuilder.js","../resources/javascript/src/Triggers.js","../resources/javascript/dialog.js"],"sourcesContent":["/**\n * tua-body-scroll-lock v1.6.3\n * (c) 2026 Evinma, BuptStEve\n * @license MIT\n */\n\nvar isServer = function isServer() {\n  return typeof window === 'undefined';\n};\nvar detectOS = function detectOS(ua) {\n  ua = ua || navigator.userAgent;\n  var ipad = /(iPad).*OS\\s([\\d_]+)/.test(ua);\n  var iphone = !ipad && /(iPhone\\sOS)\\s([\\d_]+)/.test(ua);\n  var android = /(Android);?[\\s/]+([\\d.]+)?/.test(ua);\n  var ios = iphone || ipad;\n  return {\n    ios: ios,\n    android: android\n  };\n};\nfunction getEventListenerOptions(options) {\n  /* istanbul ignore if */\n  if (isServer()) return false;\n  if (!options) {\n    throw new Error('options must be provided');\n  }\n  var isSupportOptions = false;\n  var listenerOptions = {\n    get passive() {\n      isSupportOptions = true;\n      return undefined;\n    }\n  };\n  /* istanbul ignore next */\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  var noop = function noop() {};\n  var testEvent = '__TUA_BSL_TEST_PASSIVE__';\n  window.addEventListener(testEvent, noop, listenerOptions);\n  window.removeEventListener(testEvent, noop, listenerOptions);\n  var capture = options.capture;\n  /* istanbul ignore next */\n  return isSupportOptions ? options : typeof capture !== 'undefined' ? capture : false;\n}\nfunction noticeRequiredTargetElement(targetElement) {\n  if (targetElement) return false;\n  if (targetElement === null) return false;\n  /* istanbul ignore if */\n  if (process.env.NODE_ENV === 'production') return false;\n  /* istanbul ignore if */\n  if (process.env.NODE_ENV !== 'test') {\n    console.warn('If scrolling is also required in the floating layer, ' + 'the target element must be provided.');\n  }\n  return true;\n}\n/**\n * Get global function that calls preventDefault\n */\nfunction getPreventEventDefault() {\n  if ('__BSL_PREVENT_DEFAULT__' in window) {\n    return window.__BSL_PREVENT_DEFAULT__;\n  }\n  window.__BSL_PREVENT_DEFAULT__ = function (event) {\n    if (!event.cancelable) return;\n    event.preventDefault();\n  };\n  return window.__BSL_PREVENT_DEFAULT__;\n}\nfunction toArray(x) {\n  if (!x) return [];\n  return Array.isArray(x) ? x : [x];\n}\n/**\n * Check if element uses reversed flex direction\n */\nfunction isReversedFlex(element) {\n  var computedStyle = window.getComputedStyle(element);\n  var flexDirection = computedStyle.flexDirection;\n  return {\n    column: flexDirection === 'column-reverse',\n    row: flexDirection === 'row-reverse'\n  };\n}\n/**\n * Check if element is at scroll boundary\n * Supports both normal and reversed flex directions\n */\nfunction getScrollBoundaryState(element, clientX, clientY) {\n  var scrollTop = element.scrollTop,\n    scrollLeft = element.scrollLeft,\n    scrollWidth = element.scrollWidth,\n    scrollHeight = element.scrollHeight,\n    clientWidth = element.clientWidth,\n    clientHeight = element.clientHeight;\n  // Check if element uses reversed flex direction\n  var reversed = isReversedFlex(element);\n  // For column-reverse: visual top is at max scrollTop, visual bottom is at 0\n  // For normal: visual top is at 0, visual bottom is at max scrollTop\n  var isOnTop;\n  var isOnBottom;\n  if (reversed.column) {\n    // In column-reverse, scrolling down (clientY < 0) when at max scrollTop means at visual top\n    isOnTop = clientY > 0 && Math.abs(scrollTop) + clientHeight + 1 >= scrollHeight;\n    isOnBottom = clientY < 0 && Math.abs(scrollTop) <= 1;\n  } else {\n    // Normal behavior\n    isOnTop = clientY > 0 && scrollTop === 0;\n    isOnBottom = clientY < 0 && scrollTop + clientHeight + 1 >= scrollHeight;\n  }\n  // For row-reverse: visual left is at max scrollLeft, visual right is at 0\n  // For normal: visual left is at 0, visual right is at max scrollLeft\n  var isOnLeft;\n  var isOnRight;\n  if (reversed.row) {\n    // In row-reverse, scrolling right (clientX < 0) when at max scrollLeft means at visual left\n    isOnLeft = clientX > 0 && Math.abs(scrollLeft) + clientWidth + 1 >= scrollWidth;\n    isOnRight = clientX < 0 && Math.abs(scrollLeft) <= 1;\n  } else {\n    // Normal behavior\n    isOnLeft = clientX > 0 && scrollLeft === 0;\n    isOnRight = clientX < 0 && scrollLeft + clientWidth + 1 >= scrollWidth;\n  }\n  return {\n    isOnTop: isOnTop,\n    isOnBottom: isOnBottom,\n    isOnLeft: isOnLeft,\n    isOnRight: isOnRight\n  };\n}\n\nvar initialLockState = {\n  lockedNum: 0,\n  lockedElements: [],\n  unLockCallback: null,\n  documentListenerAdded: false,\n  initialClientPos: {\n    clientX: 0,\n    clientY: 0\n  }\n};\n/**\n * get current lockState\n * @param options\n * @returns lockState\n */\nfunction getLockState(options) {\n  if (isServer()) return initialLockState;\n  /** use local lockState */\n  if (!(options === null || options === void 0 ? void 0 : options.useGlobalLockState)) return getLockState.lockState;\n  /** use global lockState */\n  var lockState = '__BSL_LOCK_STATE__' in window ? Object.assign(Object.assign({}, initialLockState), window.__BSL_LOCK_STATE__) : initialLockState;\n  /** assign to global */\n  window.__BSL_LOCK_STATE__ = lockState;\n  return lockState;\n}\ngetLockState.lockState = initialLockState;\n\nfunction handleScroll(event, targetElement, initialClientPos) {\n  if (targetElement) {\n    var clientX = event.targetTouches[0].clientX - initialClientPos.clientX;\n    var clientY = event.targetTouches[0].clientY - initialClientPos.clientY;\n    var isVertical = Math.abs(clientY) > Math.abs(clientX);\n    // Get scroll boundary state\n    var _getScrollBoundarySta = getScrollBoundaryState(targetElement, clientX, clientY),\n      isOnTop = _getScrollBoundarySta.isOnTop,\n      isOnBottom = _getScrollBoundarySta.isOnBottom,\n      isOnLeft = _getScrollBoundarySta.isOnLeft,\n      isOnRight = _getScrollBoundarySta.isOnRight;\n    if (isVertical && (isOnTop || isOnBottom) || !isVertical && (isOnLeft || isOnRight)) {\n      return getPreventEventDefault()(event);\n    }\n  }\n  event.stopPropagation();\n  return true;\n}\n\nfunction setOverflowForPc(options) {\n  var _a;\n  var $html = document.documentElement;\n  var htmlStyle = Object.assign({}, $html.style);\n  var withPaddingRight = (_a = options === null || options === void 0 ? void 0 : options.withPaddingRight) !== null && _a !== void 0 ? _a : true;\n  var scrollBarWidth = window.innerWidth - $html.clientWidth;\n  var previousPaddingRight = parseInt(window.getComputedStyle($html).paddingRight, 10);\n  $html.style.overflow = 'hidden';\n  $html.style.boxSizing = 'border-box';\n  if (withPaddingRight) {\n    $html.style.paddingRight = \"\".concat(scrollBarWidth + previousPaddingRight, \"px\");\n  }\n  return function () {\n    ['overflow', 'boxSizing', 'paddingRight'].forEach(function (x) {\n      $html.style[x] = htmlStyle[x] || '';\n    });\n  };\n}\nfunction setOverflowForMobile(options) {\n  var $html = document.documentElement;\n  var $body = document.body;\n  var scrollTop = $html.scrollTop || $body.scrollTop;\n  var htmlStyle = Object.assign({}, $html.style);\n  var bodyStyle = Object.assign({}, $body.style);\n  $html.style.height = '100%';\n  $html.style.overflow = 'hidden';\n  $body.style.top = \"-\".concat(scrollTop, \"px\");\n  $body.style.width = '100%';\n  $body.style.height = 'auto';\n  $body.style.position = 'fixed';\n  $body.style.overflow = (options === null || options === void 0 ? void 0 : options.overflowType) || 'hidden';\n  return function () {\n    $html.style.height = htmlStyle.height || '';\n    $html.style.overflow = htmlStyle.overflow || '';\n    ['top', 'width', 'height', 'overflow', 'position'].forEach(function (x) {\n      $body.style[x] = bodyStyle[x] || '';\n    });\n    var supportsNativeSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n    if (supportsNativeSmoothScroll) {\n      window.scrollTo({\n        top: scrollTop,\n        behavior: 'instant'\n      });\n    } else {\n      window.scrollTo(0, scrollTop);\n    }\n  };\n}\n\n/**\n * lock body scroll\n * @param targetElement the element(s) still needs scrolling（iOS only）\n * @param options\n */\nfunction lock(targetElement, options) {\n  if (isServer()) return;\n  noticeRequiredTargetElement(targetElement);\n  var detectRes = detectOS();\n  var lockState = getLockState(options);\n  if (detectRes.ios) {\n    toArray(targetElement).filter(function (e) {\n      return e && lockState.lockedElements.indexOf(e) === -1;\n    }).forEach(function (element) {\n      element.ontouchstart = function (event) {\n        var _event$targetTouches$ = event.targetTouches[0],\n          clientX = _event$targetTouches$.clientX,\n          clientY = _event$targetTouches$.clientY;\n        lockState.initialClientPos = {\n          clientX: clientX,\n          clientY: clientY\n        };\n      };\n      element.ontouchmove = function (event) {\n        handleScroll(event, element, lockState.initialClientPos);\n      };\n      lockState.lockedElements.push(element);\n    });\n    addTouchMoveListener(lockState);\n    if (options === null || options === void 0 ? void 0 : options.setOverflowForIOS) {\n      lockState.unLockCallback = setOverflowForPc(options);\n    }\n  } else if (lockState.lockedNum <= 0) {\n    lockState.unLockCallback = detectRes.android ? setOverflowForMobile(options) : setOverflowForPc(options);\n  }\n  lockState.lockedNum += 1;\n}\n/**\n * unlock body scroll\n * @param targetElement the element(s) still needs scrolling（iOS only）\n * @param options\n */\nfunction unlock(targetElement, options) {\n  var _a;\n  if (isServer()) return;\n  noticeRequiredTargetElement(targetElement);\n  var lockState = getLockState(options);\n  lockState.lockedNum -= 1;\n  if (lockState.lockedNum > 0) return;\n  (_a = lockState.unLockCallback) === null || _a === void 0 ? void 0 : _a.call(lockState);\n  if (!detectOS().ios) return;\n  toArray(targetElement).forEach(function (element) {\n    var index = lockState.lockedElements.indexOf(element);\n    if (element && index !== -1) {\n      element.ontouchmove = null;\n      element.ontouchstart = null;\n      lockState.lockedElements.splice(index, 1);\n    }\n  });\n  removeTouchMoveListener(lockState);\n}\n/**\n * clear all body locks\n * @param options\n */\nfunction clearBodyLocks(options) {\n  var _a;\n  if (isServer()) return;\n  var lockState = getLockState(options);\n  lockState.lockedNum = 0;\n  (_a = lockState.unLockCallback) === null || _a === void 0 ? void 0 : _a.call(lockState);\n  if (!detectOS().ios) return;\n  if (lockState.lockedElements.length) {\n    var element = lockState.lockedElements.pop();\n    while (element) {\n      element.ontouchmove = null;\n      element.ontouchstart = null;\n      element = lockState.lockedElements.pop();\n    }\n  }\n  removeTouchMoveListener(lockState);\n}\nfunction addTouchMoveListener(lockState) {\n  if (!detectOS().ios) return;\n  if (lockState.documentListenerAdded) return;\n  document.addEventListener('touchmove', getPreventEventDefault(), getEventListenerOptions({\n    passive: false\n  }));\n  lockState.documentListenerAdded = true;\n}\nfunction removeTouchMoveListener(lockState) {\n  if (!lockState.documentListenerAdded) return;\n  document.removeEventListener('touchmove', getPreventEventDefault(), getEventListenerOptions({\n    passive: false\n  }));\n  lockState.documentListenerAdded = false;\n}\n\nexport { clearBodyLocks, getLockState, lock, unlock };\n","/**\n * Event types for changes\n */\nconst Events = {\n    OPEN: 'd3r.dialog.open',\n    OPENED: 'd3r.dialog.opened',\n    CLOSE: 'd3r.dialog.close',\n    CLOSED: 'd3r.dialog.closed',\n    LOADING: 'd3r.dialog.loading',\n    LOADED: 'd3r.dialog.loaded',\n    DESTROYED: 'd3r.dialog.destroyed',\n\n    delegate: (\n        element,\n        eventType,\n        selector,\n        listener,\n        options\n    ) => {\n        element.addEventListener(\n            eventType,\n            /**\n             * @param {Event} event\n             */\n            function callback(event) {\n                if (event.target instanceof HTMLElement || event.target instanceof SVGElement) {\n                    var closest = event.target.closest(selector);\n                    if (closest) {\n                        event.closest = closest;\n                        listener(event);\n                    }\n                }\n            },\n            options || null\n        );\n    }\n};\n\nexport default Events;\n","import Events from './Events';\nimport Request, { Options } from \"live-page/request\";\n\nexport default class Dialog extends EventTarget\n{\n    #html;\n    #closing = false;\n    #opening = false;\n    #loading = false;\n\n    constructor(element)\n    {\n        super();\n\n        this.modifiers = [];\n\n        this.opened = false;\n        this.target = element;\n        this.content = this.target.querySelector('.dialog__content');\n        this.closeCallback = null;\n        this.closedCallback = null;\n        this.scriptQueue = [];\n        this.scrollableElement = this.content;\n        this.locked = false;\n        this.bind();\n    }\n\n    bind() {\n        this.target.addEventListener('close', this.onClose.bind(this));\n\n        this.target.addEventListener(\"transitioncancel\", this.onTransitionEnd.bind(this));\n        this.target.addEventListener(\"transitionend\", this.onTransitionEnd.bind(this));\n\n        Events.delegate(this.target, 'click', '.d3r-hide-trigger[data-target=\"overlay\"],[dialog-close]', (e) => {\n            e.preventDefault();\n            this.close();\n        });\n    }\n\n    render(config)\n    {\n        this.open(config, {\"config\": config});\n    }\n\n    load(url, config) {\n        this.#html = '';\n\n        const options = new Options(url);\n        options.method = config.method;\n\n        if (options.method == 'POST') {\n            options.body = config.data;\n        } else if (config.data) {\n            let params = new URLSearchParams(config.data);\n            options.url += '?' + params.toString();\n        }\n\n        const request = new Request(options);\n\n        this.loading = true;\n        this.dispatchEvent(new Event(Events.LOADING, {bubbles: true}));\n\n        if (config.response_type === 'html') {\n            const fetchOptions = options.getFetchConfig();\n            fetchOptions.headers['Accept'] = 'text/html';\n            fetch(options.url, fetchOptions)\n                .then(response => {\n                    if (!response.ok) {\n                        throw response;\n                    }\n                    return response.text();\n                }).then(html => {\n                    this.response(html, config);\n                }).catch((response) => {\n                    this.error(response, config);\n                });\n        } else {\n            request.fire(async (json) => {\n                await this.response(json, config);\n            }).catch((response) => {\n                console.error('Request failed', response);\n                this.error(response, config);\n            });\n        }\n\n        this.target.classList.toggle('dialog--loading-template', config.loading_template ? true : false);\n        this.target.classList.toggle('dialog--loading-active', config.loading === 'active');\n\n        if (config.loading === 'active') {\n            this.addLoadingContent(config, {\"config\": config});\n            this.open(config, {\"config\": config});\n        }\n    }\n\n    error(response, config) {\n        this.loading = false;\n        if (response.status == 401) {\n            window.location.href = '/account/login?redirect=' + encodeURIComponent(window.location.pathname);\n            return;\n        }\n        this.html = '<p class=\"dialog__error\">An error occurred while loading. Please try again later.</p>';\n        this.addContent(config, {\"config\": config, response: response});\n        if (config.loading !== 'active') {\n            this.open(config, {\"config\": config, response: response});\n        }\n    }\n\n    /**\n     * Start opening a new dialog. This can be called if one is already open\n     *\n     * @param {object} config\n     * @param {array} eventData\n     */\n    open(config, eventData) {\n        // Safely parse the response, or default to an empty object\n        var data;\n        if (typeof eventData !== 'undefined' && eventData.response) {\n            data = eventData.response;\n        } else {\n            data = {};\n        }\n\n        var pageTitle = 'Modal'; // Default title\n        if (data.payload && typeof data.payload.page_title === 'string') {\n            pageTitle = data.payload.page_title;\n        }\n\n        this.setTitle(pageTitle);\n\n        if (config.cross_transition) {\n            this.cross = true;\n        }\n\n        this.openTransition(config, eventData);\n    }\n\n    /**\n     * This is where the content is actually replaced\n     *\n     * @param {object} config\n     * @param {string|function|Element} content\n     * @param {Array} eventData\n     */\n    openTransition(config, eventData) {\n        if (config.loading === 'background') {\n            this.addContent(config, eventData);\n        }\n\n        for (var i = 0; i < this.modifiers.length; i++) {\n            var modifier = this.modifiers[i];\n            this.target.classList.remove('dialog--' + modifier);\n        }\n\n        for (var i = 0; i < config.modifiers.length; i++) {\n            var modifier = config.modifiers[i];\n            this.modifiers.push(modifier);\n            this.target.classList.add('dialog--' + modifier);\n        }\n\n        this.removeTranstionClasses();\n\n        if (config.transition) {\n            this.target.classList.add('dialog-transition--' + config.transition);\n        }\n\n        this.closeCallback = config.close;\n        this.closedCallback = config.closed;\n\n        this.scrollableElement = 'function' === typeof config.scrollable_element\n            ? config.scrollable_element(this)\n            : (config.scrollable_element ?? this.scrollableElement);\n\n        this.opened = true;\n\n        this.dispatchEvent(new Event(Events.OPEN, {bubbles: true}));\n\n        this.target.addEventListener('transitionrun', (e) => {\n            this.target.classList.add('dialog--opening');\n            this.opening = true;\n        }, {once: true});\n\n        this.target.showModal();\n\n        if (!this.isDynamic() || config.loading === 'background') {\n            config.callback.call(this, eventData);\n        }\n\n        // No transition fallback\n        setTimeout((e) => {\n            if (!this.opening) {\n                this.closing = false;\n                this.target.classList.remove('dialog--cross');\n                this.dispatchEvent(new Event(Events.OPENED, {bubbles: true}));\n            }\n        }, 100)\n    }\n\n    /**\n     * Handle a raw ajax response that we assume is going to be a json in a specific fomat\n     *\n     *  {\n     *      \"payload\": {\n     *          \"html\": \"<div>blah</div>\",\n     *          \"scripts\": [\n     *              {\n     *                  \"url\": \"/javascript/example.js\",\n     *                  \"attributes\": {}\n     *              }\n     *          ],\n     *          \"stylesheets\": [\n     *              {\n     *                  \"url\": \"/css/example.css\",\n     *                  \"media\": \"screen\"\n     *              }\n     *          ],\n     *      }\n     *  }\n     *\n     * @param {object} raw\n     * @param {object} config\n     */\n    async response(raw, config) {\n        if (config.response_type == 'html') {\n            this.html = raw;\n            this.open(config, {\"config\": config});\n            return;\n        }\n\n        const content = raw.payload.html;\n\n        this.html = content;\n        if (config.loading === 'active') {\n            this.addContent(config, {\"config\": config, \"response\": raw});\n            await config.callback.call(this, {\"config\": config, \"response\": raw});\n        } else {\n            this.open(config, {\"config\": config, \"response\": raw});\n        }\n        this.loading = false;\n        this.dispatchEvent(new Event(Events.LOADED, {bubbles: true}));\n    }\n\n    /**\n     * Close the dialog, calling the passed method when complete\n     *\n     * @param {callable} callback\n     */\n    close(callback) {\n        this.addEventListener(Events.CLOSED, () => {\n            if (callback) {\n                callback.call(this);\n            }\n        }, {once: true});\n        this.target.close();\n    }\n\n    onClose(e) {\n        this.closing = true;\n\n        this.dispatchEvent(new Event(Events.CLOSE, {bubbles: true}));\n\n        if (this.closeCallback) {\n            this.closeCallback.call(this);\n        }\n\n        // No transition\n        if (getComputedStyle(e.target).display === 'none') {\n            this.closing = false;\n            this.opened = false;\n\n            this.html = '';\n\n            if (this.closedCallback) {\n                this.closedCallback.call(this);\n            }\n            this.dispatchEvent(new Event(Events.CLOSED, {bubbles: true}));\n        }\n    }\n\n    onTransitionEnd(e) {\n        if (e.pseudoElement || e.target.tagName !== 'DIALOG') {\n            return;\n        }\n        if (this.closing) {\n            this.closing = false;\n            this.opened = false;\n            this.opening = false;\n\n            this.html = '';\n\n            if (this.closedCallback) {\n                this.closedCallback.call(this);\n            }\n            this.dispatchEvent(new Event(Events.CLOSED, {bubbles: true}));\n        } else {\n            this.closing = false;\n            this.opening = false;\n            this.target.classList.remove('dialog--cross');\n            this.dispatchEvent(new Event(Events.OPENED, {bubbles: true}));\n        }\n    }\n\n\n    /**\n     * Add a stylesheet to the page\n     *\n     * @param {string} url\n     * @param {object} media\n     * @memberof Editables\n     */\n    addStylesheet(url, attributes, config, defer)\n    {\n        if (!document.querySelector('link[href=\"' + url + '\"]')) {\n            let link = document.createElement('link');\n            link.setAttribute('href', url);\n            for (const key in attributes) {\n                link.setAttribute(key, attributes[key]);\n            }\n\n            if (defer) {\n                link.addEventListener('load', function(e) {\n                    defer.resolve();\n                });\n            }\n\n            document.head.appendChild(link);\n        } else if (defer) {\n            defer.resolve();\n        }\n    }\n\n    /**\n     * Get the list of focusable elements\n     *\n     * @returns {Array}\n     */\n    getFocusableElements() {\n        const nodes = this.content.querySelectorAll(\n            'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n        );\n        const focusableElements = [];\n\n        for (let i = 0; i < nodes.length; i++) {\n            focusableElements.push(nodes[i]);\n        }\n\n        const dialogCloseButton = document.querySelector('button.dialog__close');\n\n        if (dialogCloseButton) {\n            focusableElements.unshift(dialogCloseButton);\n        }\n\n        return focusableElements;\n    }\n\n    addLoadingContent(config, eventData) {\n        if (config.loading_template) {\n            const selected = document.querySelector(config.loading_template);\n            if (selected) {\n                this.content.innerHTML = '';\n                this.content.appendChild(selected.content.cloneNode(true));\n            }\n        } else if (config.loading_content) {\n            this.content.innerHTML = config.loading_content;\n        }\n    }\n\n    addContent(config, eventData) {\n        if (this.html) {\n            if (this.content.querySelector('[dialog-content]')) {\n                this.content.querySelector('[dialog-content]').innerHTML = this.html;\n            } else if (window.Idiomorph !== undefined) {\n                Idiomorph.morph(this.content, this.html, {morphStyle:'innerHTML'});\n            } else {\n                this.content.innerHTML = this.html;\n            }\n        }\n\n        if (config.eval_scripts) {\n            var scripts = this.content.querySelectorAll('script');\n            scripts.forEach((script, i) => {\n                Function(script.innerHTML)();\n            });\n        }\n    }\n\n    /**\n     * Add script to the page if it isn't already on\n     *\n     * @param {string} url\n     * @param {object} attributes\n     * @memberof Editables\n     */\n    addScript(url, attributes, config, defer)\n    {\n        if (!document.querySelector('script[src=\"' + url + '\"]')) {\n            let script = document.createElement('script');\n            script.setAttribute('src', url);\n            for (const key in attributes) {\n                script.setAttribute(key, attributes[key]);\n            }\n            script.addEventListener('load', function(e) {\n                config.script_callback.call(this, url);\n                if (defer) {\n                    defer.resolve();\n                }\n            });\n            document.body.appendChild(script);\n        } else {\n            config.script_callback.call(this, url);\n            if (defer) {\n                defer.resolve();\n            }\n        }\n    }\n\n    removeTranstionClasses() {\n        for (let i = 0; i < this.target.classList.length; i++) {\n            var cssClass = this.target.classList[i];\n            if (cssClass.indexOf('dialog-transition--') === 0) {\n                this.target.classList.remove(cssClass);\n            }\n        }\n    }\n\n    set cross(bool)\n    {\n        this.target.classList.toggle('dialog--cross', bool);\n    }\n\n    get cross() {\n        return this.target.classList.contains('dialog--cross');\n    }\n\n    /**\n     * Sets the `aria-label` attribute of the target element.\n     *\n     * @param {string} title The text to be set as the value of the `aria-label` attribute.\n     */\n    setTitle(title) {\n        this.target.setAttribute('aria-label', title);\n    }\n\n    isDynamic() {\n        return this.target.hasAttribute('dynamic');\n    }\n\n    destroy() {\n        this.target.removeEventListener('close', this.onClose.bind(this));\n        this.target.removeEventListener(\"transitioncancel\", this.onTransitionEnd.bind(this));\n        this.target.removeEventListener(\"transitionend\", this.onTransitionEnd.bind(this));\n\n        if (this.target.parentNode) {\n            this.target.parentNode.removeChild(this.target);\n        }\n\n        this.dispatchEvent(new Event(Events.DESTROYED, {bubbles: true}));\n    }\n\n    set loading(value) {\n        this.#loading = value;\n        this.target.classList.toggle('dialog--loading', value);\n    }\n\n    get loading() {\n        return this.#loading;\n    }\n\n    set html(html) {\n        this.#html = html;\n    }\n\n    get html() {\n        return this.#html;\n    }\n\n    set closing(bool) {\n        this.#closing = bool;\n        this.target.classList.toggle('dialog--closing', bool);\n    }\n\n    get closing() {\n        return this.#closing;\n    }\n\n    set opening(bool) {\n        this.#opening = bool;\n        this.target.classList.toggle('dialog--opening', bool);\n    }\n\n    get opening() {\n        return this.#opening;\n    }\n}\n","import {clearBodyLocks, lock, unlock} from 'tua-body-scroll-lock';\nimport Dialog from './Dialog';\nimport Events from './Events';\n\n/**\n * Overlay class\n */\nexport default class Manager\n{\n    /**\n     * Set up details\n     */\n    constructor()\n    {\n        this.bind();\n        this.stack = [];\n        this.dialogs = [];\n        this.debug = false;\n    }\n\n\n    /**\n     * Handle global bindings\n     */\n    bind()\n    {\n        document.addEventListener('keydown', (e) => {\n            if (this.current) {\n                var focusedElements = this.current.getFocusableElements();\n                if (focusedElements.length) {\n                    var firstFocusableEl = focusedElements[0];\n                    var lastFocusableEl = focusedElements[focusedElements.length - 1];\n\n                    if (e.key === 'Tab') {\n                        if (e.shiftKey && document.activeElement === firstFocusableEl) {\n                            e.preventDefault();\n                            lastFocusableEl.focus();\n                        } else if (!e.shiftKey && document.activeElement === lastFocusableEl) {\n                            e.preventDefault();\n                            firstFocusableEl.focus();\n                        } else if (!document.activeElement.closest('.dialog')) {\n                            e.preventDefault();\n                            firstFocusableEl.focus();\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n    /**\n     * Merge config options, converts a partial config into a complete one\n     *\n     * @param {object} options\n     * @returns object\n     */\n    parseConfig(options) {\n        var config = {\n            \"method\": 'GET',\n            \"script_callback\": () => {},\n            \"wait_for_scripts\": false,\n            \"data\": null,\n            \"modifiers\": [],\n            \"response_type\": 'json',\n            \"callback\": () => {},\n            \"close\": () => {},\n            \"closed\": () => {},\n            \"cross_transition\": false,\n            \"stack\": false,\n            \"loading\": 'background',\n            \"loading_template\": null,\n            \"loading_content\": null,\n            \"transition\": 'fade',\n            \"eval_scripts\": false,\n            \"append_to\": \"#outer-wrapper\",\n            \"loader_template\": '#dialog-loader',\n            \"close_template\": '#dialog-close',\n            \"scrollable_element\": null,\n        };\n\n        if (options) {\n            for (var prop in options) {\n                if (config.hasOwnProperty(prop)) {\n                    config[prop] = options[prop];\n                }\n            }\n        }\n\n        return config;\n    }\n\n    /**\n     * Render the overlay with content from a callabale or passed as a selector\n     *\n     * @param {string|callable} selector\n     * @param {object} options\n     */\n    render(selector, options) {\n        var config = this.parseConfig(options);\n\n        const element = document.querySelector(selector);\n\n        if (element && element.tagName === 'DIALOG') {\n            const id = element.getAttribute('id');\n            if (!id) {\n                console.error('Dialog element must have an id attribute');\n                return;\n            }\n\n            let dialog = this.getExistingDialog(element);\n            this.applyTemplate(element, config);\n\n            if (dialog == null) {\n                dialog = new Dialog(element);\n                dialog.addEventListener(Events.OPEN, this.open.bind(this));\n                dialog.addEventListener(Events.CLOSED, this.closed.bind(this));\n                this.dialogs.push(dialog);\n                this.log('Creating new dialog', dialog );\n            }\n\n            if (config.stack || !this.current) {\n                this.stack.push(dialog);\n                dialog.open(config);\n            } else {\n                this.current.addEventListener(Events.CLOSED, (e) => {\n                    this.stack.push(dialog);\n                    dialog.open(config);\n                }, { once: true });\n                if (config.cross_transition) {\n                    this.current.cross = true;\n                    this.current.close();\n                } else {\n                    this.current.close();\n                }\n            }\n\n            return dialog;\n        } else {\n            console.error('Invalid selector or dialog element not found: ' + selector);\n            return null;\n        }\n    }\n\n    /**\n     * Load content via ajax\n     *\n     * @param {string} url\n     * @param {object} options\n     */\n    load(url, options) {\n        if (!this.isUrlRelative(url)) {\n            console.error('Invalid URL: ' + url);\n            return;\n        }\n\n        var config = this.parseConfig(options);\n        config.url = url;\n        const currentDialog = this.current;\n\n        /** @type {Dialog} */\n        let targetDialog = null;\n\n        // If we have a current dialog and it is dynamic, we load the content into it unless we are stacking\n        // We don't want to load into a non-dynamic dialog as we will trash it's content\n        if (!config.stack && currentDialog && currentDialog.isDynamic() && !config.cross_transition) {\n            targetDialog = currentDialog;\n            this.applyTemplate(targetDialog.target, config);\n        } else {\n            const dialogTemplate = this.createDialog(config);\n            const dialog = new Dialog(dialogTemplate);\n            dialog.addEventListener(Events.OPEN, this.open.bind(this));\n            dialog.addEventListener(Events.CLOSED, this.closed.bind(this));\n\n            targetDialog = dialog;\n        }\n\n        const pushTargetDialog = () => {\n            if (!this.stack.includes(targetDialog)) {\n                this.stack.push(targetDialog);\n            }\n        };\n\n        if (config.stack || !config.cross_transition || !currentDialog) {\n            pushTargetDialog();\n            targetDialog.load(url, config);\n        } else {\n            currentDialog.addEventListener(Events.CLOSED, (e) => {\n                pushTargetDialog();\n                targetDialog.load(url, config);\n            }, { once: true });\n\n            if (config.cross_transition) {\n                currentDialog.cross = true;\n                currentDialog.close();\n            } else {\n                currentDialog.close();\n            }\n        }\n\n        return targetDialog;\n    }\n\n    close(callback) {\n        if (this.current) {\n            this.current.addEventListener(Events.CLOSED, (e) => {\n                if (callback) {\n                    callback.call(this);\n                }\n            }, { once: true });\n            this.current.close();\n        } else {\n            console.warn('No current dialog to close');\n        }\n    }\n\n    /**\n     * See if the URL is relative for security purposes we don't want to load\n     * external URL's. Absolute urls on the same domain are also cool\n     *\n     * @param {string} url\n     * @returns {bool}\n     */\n    isUrlRelative(url)\n    {\n        if (url.indexOf(window.location.protocol + '//' + window.location.host) === 0) {\n            return true;\n        }\n\n        if (url.indexOf('//' + window.location.host) === 0) {\n            return true;\n        }\n\n        const r = new RegExp('^(?:[a-z+]+:)?//', 'i');\n\n        return !r.test(url);\n    }\n\n    open(e) {\n        if (!this.oldFocus) {\n            this.oldFocus = document.activeElement;\n        }\n\n        lock(this.current.scrollableElement);\n    }\n\n    closed(e) {\n        this.log('closed', e.target);\n        for (let index = 0; index < this.stack.length; index++) {\n            const element = this.stack[index];\n            if (element === e.target) {\n                this.stack.splice(index, 1);\n                unlock(element.scrollableElement);\n                break;\n            }\n        }\n\n        if (e.target.isDynamic()) {\n            this.log('Destroying dynamic dialog', e.target);\n            e.target.destroy();\n        }\n\n        if (this.stack.length === 0) {\n            this.log('No more dialogs in stack, unlocking body scroll');\n            clearBodyLocks();\n\n            if (this.oldFocus && document.activeElement !== this.oldFocus) {\n                this.oldFocus.focus();\n            }\n            this.oldFocus = null;\n        }\n    }\n\n    getExistingDialog(element) {\n        for (let index = 0; index < this.dialogs.length; index++) {\n            const dialog = this.dialogs[index];\n            if (dialog.target === element) {\n                return dialog;\n            }\n        }\n        return null;\n    }\n\n    createDialog(config)\n    {\n        const dialog = document.createElement('dialog');\n        dialog.classList.add('dialog');\n        dialog.setAttribute('dynamic', '');\n        dialog.setAttribute('closedby', 'any');\n        this.applyTemplate(dialog, config);\n        this.applyLoadingTemplate(dialog, config);\n        document.querySelector(config.append_to || '#outer-wrapper').appendChild(dialog);\n\n        return dialog;\n    }\n\n    applyTemplate(dialog, config)\n    {\n        if (!dialog.classList.contains('dialog')) {\n            dialog.classList.add('dialog');\n        }\n\n        let content = dialog.querySelector('.dialog__content');\n        let controls = dialog.querySelector('.dialog__controls');\n\n        if (!content) {\n            const nodes = [];\n            const children = Array.from(dialog.children);\n            for (let i = 0; i < children.length; i++) {\n                const node = children[i];\n                dialog.removeChild(node);\n                nodes.push(node);\n            }\n\n            controls = document.createElement('div');\n            controls.classList.add('dialog__controls');\n            dialog.appendChild(controls);\n\n            content = document.createElement('div');\n            content.classList.add('dialog__content');\n            dialog.appendChild(content);\n\n            for (let index = 0; index < nodes.length; index++) {\n                const element = nodes[index];\n                content.appendChild(element);\n            }\n        }\n\n        // Reset controls\n        controls.innerHTML = '';\n        this.applyCloseTemplate(dialog, config);\n    }\n\n    applyCloseTemplate(dialog, config)\n    {\n        const controls = dialog.querySelector('.dialog__controls');\n        const template = document.querySelector(\n            config && config.close_template ? config.close_template : '#dialog-close'\n        );\n\n        if (template) {\n            const templateContent = template.content.cloneNode(true);\n            controls.appendChild(templateContent);\n        } else {\n            const templateContent = document.createElement('template');\n            templateContent.innerHTML = `\n<button class=\"dialog__close\" dialog-close aria-label=\"Close\" type=\"button\">\n    <svg class=\"dialog__close-svg\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 50\" width=\"50\" height=\"50\">\n        <path d=\"m0 0 50 50M50 0 0 50\"/>\n    </svg>\n</button>\n`;\n            controls.appendChild(templateContent.content.cloneNode(true));\n        }\n    }\n\n    applyLoadingTemplate(dialog, config) {\n        const controls = dialog.querySelector('.dialog__controls');\n        const template = document.querySelector(\n            config && config.loader_template ? config.loader_template : '#dialog-loader'\n        );\n\n        if (template) {\n            controls.appendChild(template.content.cloneNode(true));\n        } else {\n            const templateContent = document.createElement('template');\n            templateContent.innerHTML = `<div class=\"dialog__loader\"></div>`;\n            controls.appendChild(templateContent.content.cloneNode(true));\n        }\n    }\n\n    log(message, ...extra) {\n        if (this.debug) {\n            console.log('Dialog Manager:', message, ...extra);\n        }\n    }\n\n    get current() {\n        if (this.stack.length) {\n            return this.stack[this.stack.length - 1];\n        }\n\n        return null;\n    }\n}\n","export default class ConfigBuilder\n{\n    constructor(element)\n    {\n        this.element = element;\n    }\n\n    get config()\n    {\n        let config = {\n            \"wait_for_scripts\": true,\n            \"escape_to_close\": true,\n            \"modifiers\": [],\n        };\n\n        if (this.crossTransition) {\n            config.cross_transition = true;\n        }\n\n        if (this.transition) {\n            config.transition = this.transition;\n        }\n\n        if (this.modifiers) {\n            config.modifiers = this.modifiers.split(',');\n        }\n        if (this.method) {\n            config.method = this.method;\n        }\n\n        if (this.callback) {\n            config.callback = this.callback;\n        }\n\n        if (this.data) {\n            config.data = this.data;\n        }\n\n        if (this.stack) {\n            config.stack = true;\n        }\n\n        if (this.loading) {\n            config.loading = this.loading;\n        }\n\n        if (this.loadingTemplate) {\n            config.loading_template = this.loadingTemplate;\n        }\n\n        if (this.closeTemplate) {\n            config.close_template = this.closeTemplate;\n        }\n\n        return config;\n    }\n\n    get crossTransition()\n    {\n        if (this.element.hasAttribute('data-cross-transition')) {\n            return true;\n        }\n\n        return false;\n    }\n\n    get modifiers()\n    {\n        if (this.element.hasAttribute('data-modifiers')) {\n            return this.element.getAttribute('data-modifiers');\n        }\n\n        return null;\n    }\n\n    get method()\n    {\n        if (this.element.tagName == 'FORM' && this.element.hasAttribute('method')) {\n            return this.element.getAttribute('method').toUpperCase();\n        }\n\n        if (this.element.hasAttribute('data-method')) {\n            return this.element.getAttribute('data-method');\n        }\n\n        return null;\n    }\n\n    get data()\n    {\n        if (this.element.hasAttribute('data-data')) {\n            return this.element.getAttribute('data-data');\n        }\n\n        return null;\n    }\n\n    get stack()\n    {\n        return this.element.hasAttribute('data-stack');\n    }\n\n    get transition()\n    {\n        if (this.element.hasAttribute('data-transition')) {\n            return this.element.getAttribute('data-transition');\n        }\n\n        return null;\n    }\n\n    get loading()\n    {\n        if (this.element.hasAttribute('data-loading')) {\n            return this.element.getAttribute('data-loading');\n        }\n\n        return null;\n    }\n\n    get loadingTemplate()\n    {\n        if (this.element.hasAttribute('data-loading-template')) {\n            return this.element.getAttribute('data-loading-template');\n        }\n\n        return null;\n    }\n\n    get closeTemplate()\n    {\n        if (this.element.hasAttribute('data-close-template')) {\n            return this.element.getAttribute('data-close-template');\n        }\n\n        return null;\n    }\n}\n","import ConfigBuilder from \"./ConfigBuilder\";\nimport Events from \"./Events\";\nimport Dialog from '../dialog';\n\nexport default class Triggers extends EventTarget\n{\n    constructor()\n    {\n        super();\n        this.bind();\n    }\n\n    bind()\n    {\n        Events.delegate(\n            document,\n            'click',\n            'button[type=submit][data-dialog]',\n            (e) => {\n                e.stopImmediatePropagation();\n                e.preventDefault();\n\n                let target = e.closest;\n                let form = target.closest('form');\n                let self = this;\n                let configBuilder = new ConfigBuilder(target);\n                configBuilder.callback = function(callbackEvent) {\n                    self.onOpen(this, e, callbackEvent);\n                };\n\n                let config = configBuilder.config;\n                // Need to add the method from the form\n                config.method = form.getAttribute('method').toUpperCase();\n\n                let action = form.getAttribute('action');\n\n                let formData = new FormData(form);\n\n                // FormData does not include the value from the submit button by default\n                formData.append(target.name, target.value);\n\n                // If the button has a formaction attribute, we need to override the formData action with that value\n                if (target.hasAttribute('formaction')) {\n                    formData.set('action', target.getAttribute('formaction'));\n                }\n\n                if (config.method == 'POST') {\n                    config.data = formData;\n                } else {\n                    let params = new URLSearchParams(formData);\n                    action += '?' + params.toString();\n                }\n\n                Dialog.load(action, config);\n            }\n        );\n\n        Events.delegate(\n            document,\n            'click',\n            'a[data-dialog],button[data-dialog]',\n            (e) => {\n                e.preventDefault();\n\n                let target = e.closest;\n                let self = this;\n                let configBuilder = new ConfigBuilder(target);\n                configBuilder.callback = function(callbackEvent) {\n                    self.onOpen(this, e, callbackEvent);\n                };\n\n                if (target.hasAttribute('data-target')) {\n                    Dialog.render(target.getAttribute('data-target'), configBuilder.config);\n                } else if (target.hasAttribute('href') && target.getAttribute('href') != '#') {\n                    Dialog.load(target.getAttribute('href'), configBuilder.config);\n                }\n            }\n        );\n\n        Events.delegate(document, 'submit', 'form[data-dialog]', (e) => {\n            e.preventDefault();\n\n            let self = this;\n            let target = e.closest;\n            let configBuilder = new ConfigBuilder(target);\n            configBuilder.callback = function(callbackEvent) {\n                self.onOpen(this, e, callbackEvent);\n            };\n\n            let config = configBuilder.config;\n            let action = target.getAttribute('action');\n\n            let formData = new FormData(target);\n\n            // FormData does not include the value from the submit button by default\n            if (e.submitter) {\n                formData.append(e.submitter.name, e.submitter.value);\n            }\n\n            if (config.method == 'POST') {\n                config.data = formData;\n            } else {\n                let params = new URLSearchParams(formData);\n                action += '?' + params.toString();\n            }\n\n            Dialog.load(action, config);\n        });\n    }\n\n    onOpen(overlay, originalEvent, callbackEvent)\n    {\n        overlay.target.querySelectorAll('form[data-reset]').forEach(form => form.reset())\n\n        var event = new CustomEvent(Events.OPEN, {\n            bubbles: true,\n            detail: {\n                originalEvent: originalEvent,\n                callbackEvent: callbackEvent,\n                overlay: overlay\n            }\n        });\n\n        this.dispatchEvent(event);\n    }\n}\n","import Manager from \"./src/Manager\";\nimport Triggering from \"./src/Triggers\";\n\nconst Dialog = new Manager();\nexport default Dialog;\nexport const Triggers = new Triggering();\nexport {default as ConfigBuilder} from \"./src/ConfigBuilder\";\n\nwindow.Dialog = Dialog;\n"],"x_google_ignoreList":[0],"mappings":"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"}