{
  "version": 3,
  "sources": ["../src/index.ts"],
  "sourcesContent": ["import { WebComponent, define } from '@substrate-system/web-component'\nimport {\n    lockBodyScrolling,\n    unlockBodyScrolling\n} from '@substrate-system/scroll-lock'\n\n// for docuement.querySelector\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'modal-window':ModalWindow\n    }\n}\n\n/**\n * Modal window web component.\n *\n * Opens/closes via the `active` attribute:\n *   modal.setAttribute('active', 'true')  // open\n *   modal.setAttribute('active', 'false') // close\n *   modal.removeAttribute('active')       // close\n *\n * Or via methods:\n *   modal.open()\n *   modal.close()\n */\n\nconst ACTIVE = 'active'\nconst ANIMATED = 'animated'\nconst ANIMATION_DURATION = 250\nconst ARIA_DESCRIBEDBY = 'aria-describedby'\nconst ARIA_LABEL = 'aria-label'\nconst CLOSE = 'close'\nconst CLOSE_TITLE = 'Close'\nconst NO_ICON = 'no-icon'\nconst CLASS_HIDE = 'modal-hide'\nconst CLASS_SHOW = 'modal-show'\nconst CLASS_VISIBLE = 'modal-visible'\nconst ESCAPE = 'escape'\nconst FALSE = 'false'\nconst FOCUSIN = 'focusin'\nconst KEYDOWN = 'keydown'\nconst MODAL_LABEL_FALLBACK = 'modal'\nconst NOCLICK = 'noclick'\nconst PREFERS_REDUCED_MOTION = '(prefers-reduced-motion: reduce)'\nconst SPACE = ' '\nconst SPACE_REGEX = /\\s+/g\nconst TAB = 'tab'\nconst TRUE = 'true'\n\nconst FOCUSABLE_SELECTORS = [\n    '[contenteditable]',\n    '[tabindex=\"0\"]:not([disabled])',\n    'a[href]',\n    'audio[controls]',\n    'button:not([disabled])',\n    'iframe',\n    \"input:not([disabled]):not([type='hidden'])\",\n    'select:not([disabled])',\n    'summary',\n    'textarea:not([disabled])',\n    'video[controls]',\n].join(',')\n\nexport class ModalWindow extends WebComponent.create('modal-window') {\n    // Element references (set during build).\n    _buttonClose:HTMLButtonElement|null = null\n    _modal:HTMLDialogElement|null = null\n    _modalOverlay:HTMLDivElement|null = null\n    _modalScroll:HTMLDivElement|null = null\n    _modalContent:HTMLDivElement|null = null\n    _focusTrap1:HTMLSpanElement|null = null\n    _focusTrap2:HTMLSpanElement|null = null\n    _heading:HTMLElement|null = null\n\n    static TAG:string = 'modal-window'\n\n    // State.\n    _activeElement:HTMLElement|null = null\n    _isActive = false\n    _isAnimated = true\n    _isBuilt = false\n    _isHideShow = false\n    _timerForHide:number|undefined\n    _timerForShow:number|undefined\n    _closable:boolean = true\n    _showIcon:boolean = true\n    _noClick:boolean = false\n\n    constructor () {\n        super()\n        this._bind()\n    }\n\n    // for TS, inheritance\n    render () {\n        const contentNodes = Array.from(this.childNodes)\n        return this._buildModal(contentNodes)\n    }\n\n    _buildModal (contentNodes:Node[]):void {\n        // Create focus trap\n        createFocusTrap()\n\n        // Create scroll container\n        const scroll = document.createElement('div')\n        scroll.classList.add('modal-scroll')\n        this._modalScroll = scroll\n\n        // Create overlay\n        const overlay = document.createElement('div')\n        overlay.classList.add('modal-overlay')\n        this._modalOverlay = overlay\n\n        // Create dialog\n        const dialog = document.createElement('dialog')\n        dialog.setAttribute('aria-modal', 'true')\n        dialog.classList.add('modal-dialog')\n        dialog.tabIndex = -1\n        this._modal = dialog\n\n        // Create close button if closable and icon should be shown\n        if (this._closable && this._showIcon) {\n            const closeBtn = document.createElement('button')\n            closeBtn.classList.add('modal-close')\n            closeBtn.type = 'button'\n            closeBtn.innerHTML = '&times;'\n            dialog.appendChild(closeBtn)\n            this._buttonClose = closeBtn\n        }\n\n        // Create content wrapper\n        const content = document.createElement('div')\n        content.classList.add('modal-content')\n        this._modalContent = content\n\n        // Move content nodes into the content wrapper\n        contentNodes.forEach(node => {\n            content.appendChild(node)\n        })\n\n        dialog.appendChild(content)\n\n        // Create focus traps\n        this._focusTrap1 = createFocusTrap()\n        this._focusTrap2 = createFocusTrap()\n\n        // Assemble structure\n        overlay.appendChild(dialog)\n        scroll.appendChild(this._focusTrap1)\n        scroll.appendChild(overlay)\n        scroll.appendChild(this._focusTrap2)\n\n        // Add to component\n        this.appendChild(scroll)\n    }\n\n    static get observedAttributes () {\n        return [ACTIVE, ANIMATED, ARIA_DESCRIBEDBY, CLOSE]\n    }\n\n    // ==============================\n    // Lifecycle: attributes changed.\n    // ==============================\n\n    async attributeChangedCallback (\n        name:string,\n        oldValue:string,\n        newValue:string\n    ) {\n        if (oldValue !== newValue) {\n            if (name === ACTIVE) {\n                this._setActiveFlag()\n            }\n\n            if (name === ANIMATED) {\n                this._setAnimationFlag()\n            }\n\n            if (name === ARIA_DESCRIBEDBY) {\n                this._setModalDescription()\n            }\n\n            if (name === CLOSE) {\n                this._setCloseTitle()\n            }\n        }\n    }\n\n    // ===========================\n    // Lifecycle: component mount.\n    // ===========================\n\n    connectedCallback () {\n        // Build modal structure once.\n        if (!this._isBuilt) {\n            this._closable = this.getAttribute('closable') !== 'false'\n            this._showIcon = !this.hasAttribute(NO_ICON)\n            this._noClick = this.hasAttribute(NOCLICK)\n\n            // Get heading for aria-label.\n            this._heading = this.querySelector('h1, h2, h3, h4, h5, h6')\n\n            // Collect all child nodes.\n            const contentNodes = Array.from(this.childNodes)\n\n            // Build the modal structure.\n            this._buildModal(contentNodes)\n\n            // Set animation flag.\n            this._setAnimationFlag()\n\n            // Set close title.\n            this._setCloseTitle()\n\n            // Set modal label.\n            this._setModalLabel()\n\n            // Set modal description.\n            this._setModalDescription()\n\n            // Set active flag.\n            this._setActiveFlag()\n\n            this._isBuilt = true\n        }\n\n        this._addEvents()\n    }\n\n    // =============================\n    // Lifecycle: component unmount.\n    // =============================\n\n    disconnectedCallback () {\n        this._removeEvents()\n    }\n\n    // ============================\n    // Helper: bind `this` context.\n    // ============================\n\n    _bind () {\n        const propertyNames = Object.getOwnPropertyNames(\n            Object.getPrototypeOf(this)\n        ) as (keyof ModalWindow)[]\n\n        propertyNames.forEach((name) => {\n            // Bind functions.\n            if (typeof this[name] === 'function') {\n                // @ts-expect-error bind\n                this[name] = this[name].bind(this)\n            }\n        })\n    }\n\n    // ===================\n    // Helper: add events.\n    // ===================\n\n    _addEvents () {\n        // Prevent doubles.\n        this._removeEvents()\n\n        document.addEventListener(FOCUSIN, this._handleFocusIn)\n        document.addEventListener(KEYDOWN, this._handleKeyDown)\n\n        if (this._buttonClose) {\n            this._buttonClose.addEventListener('click',\n                this._handleClickClose)\n        }\n        if (this._modalOverlay) {\n            this._modalOverlay.addEventListener('click',\n                this._handleClickOverlay)\n        }\n    }\n\n    // ======================\n    // Helper: remove events.\n    // ======================\n\n    _removeEvents () {\n        document.removeEventListener(FOCUSIN, this._handleFocusIn)\n        document.removeEventListener(KEYDOWN, this._handleKeyDown)\n\n        if (this._buttonClose) {\n            this._buttonClose.removeEventListener(\n                'click',\n                this._handleClickClose\n            )\n        }\n        if (this._modalOverlay) {\n            this._modalOverlay.removeEventListener(\n                'click',\n                this._handleClickOverlay\n            )\n        }\n    }\n\n    // ===========================\n    // Helper: set animation flag.\n    // ===========================\n\n    _setAnimationFlag () {\n        this._isAnimated = this.getAttribute(ANIMATED) !== FALSE\n    }\n\n    // ========================\n    // Helper: add close title.\n    // ========================\n\n    _setCloseTitle () {\n        // Get title.\n        const title = this.getAttribute(CLOSE) || CLOSE_TITLE\n\n        // Set title.\n        if (this._buttonClose) {\n            this._buttonClose.title = title\n            this._buttonClose.setAttribute(ARIA_LABEL, title)\n        }\n    }\n\n    // ========================\n    // Helper: add modal label.\n    // ========================\n\n    _setModalLabel () {\n        // Set later.\n        let label = MODAL_LABEL_FALLBACK\n\n        // Heading exists?\n        if (this._heading) {\n            // Get text.\n            label = this._heading.textContent || label\n            label = label.trim().replace(SPACE_REGEX, SPACE)\n        }\n\n        // Set label.\n        if (this._modal) {\n            this._modal.setAttribute(ARIA_LABEL, label)\n        }\n    }\n\n    // ==============================\n    // Helper: set modal description.\n    // ==============================\n\n    _setModalDescription () {\n        if (!this._modal) return\n\n        const describedBy = this.getAttribute(ARIA_DESCRIBEDBY)\n\n        if (describedBy) {\n            this._modal.setAttribute(ARIA_DESCRIBEDBY, describedBy)\n        } else {\n            this._modal.removeAttribute(ARIA_DESCRIBEDBY)\n        }\n    }\n\n    _setActiveFlag () {\n        const isActive = this.getAttribute(ACTIVE) === TRUE\n        this._isActive = isActive\n\n        // Set display.\n        this._toggleModalDisplay(() => {\n            // Focus modal?\n            if (this._isActive) {\n                this._focusModal()\n            } else {\n                unlockBodyScrolling(document.body)\n            }\n        })\n    }\n\n    _focusElement (element: HTMLElement) {\n        window.requestAnimationFrame(() => {\n            if (typeof element.focus === 'function') {\n                element.focus()\n            }\n        })\n    }\n\n    // ====================\n    // Helper: focus modal.\n    // ====================\n\n    _focusModal () {\n        window.requestAnimationFrame(() => {\n            if (this._modal) {\n                this._modal.focus()\n            }\n            if (this._modalScroll) {\n                this._modalScroll.scrollTo(0, 0)\n            }\n        })\n    }\n\n    _isOutsideModal (element?:HTMLElement):boolean {\n        if (!this._isActive || !element || !this._modal) {\n            return false\n        }\n\n        // Has element?\n        const hasElement = this.contains(element) || this._modal.contains(element)\n\n        const bool = !hasElement\n        return bool\n    }\n\n    // ===========================\n    // Helper: detect motion pref.\n    // ===========================\n    _isMotionOkay ():boolean {\n        // Get pref.\n        const { matches } = window.matchMedia(PREFERS_REDUCED_MOTION)\n\n        return this._isAnimated && !matches\n    }\n\n    _toggleModalDisplay (callback:()=>void) {\n        if (!this._modalScroll) return\n\n        this.setAttribute(ACTIVE, '' + this._isActive)\n\n        const isModalVisible = this._modalScroll.classList.contains(CLASS_VISIBLE)\n        const isMotionOkay = this._isMotionOkay()\n\n        // Get delay.\n        const delay = isMotionOkay ? ANIMATION_DURATION : 0\n\n        // Get active element.\n        const activeElement = document.activeElement as HTMLElement\n\n        // Cache active element\n        if (this._isActive && activeElement) {\n            this._activeElement = activeElement\n        }\n\n        if (this._isActive) {\n            // Show modal.\n            this._modalScroll.classList.add(CLASS_VISIBLE)\n\n            // Lock body scrolling.\n            lockBodyScrolling(document.body)\n\n            // Set flag.\n            if (isMotionOkay) {\n                this._isHideShow = true\n                this._modalScroll.classList.add(CLASS_SHOW)\n            }\n\n            // Fire callback.\n            callback()\n\n            // Await CSS animation.\n            this._timerForShow = window.setTimeout(() => {\n                // Clear.\n                clearTimeout(this._timerForShow)\n\n                // Remove flag.\n                this._isHideShow = false\n                this._modalScroll?.classList.remove(CLASS_SHOW)\n            }, delay)\n        } else if (isModalVisible) {  // not active, is visible\n            if (isMotionOkay) {\n                this._isHideShow = true\n                this._modalScroll.classList.add(CLASS_HIDE)\n            }\n\n            // Fire callback?\n            callback()\n\n            // Await CSS animation.\n            this._timerForHide = window.setTimeout(() => {\n                // Clear.\n                clearTimeout(this._timerForHide)\n\n                // Remove flag.\n                this._isHideShow = false\n                this._modalScroll?.classList.remove(CLASS_HIDE)\n\n                // Hide modal.\n                this._modalScroll?.classList.remove(CLASS_VISIBLE)\n\n                // Unlock body scrolling.\n                unlockBodyScrolling(document.body)\n\n                // Delay.\n            }, delay)\n        }\n    }\n\n    // =====================\n    // Event: overlay click.\n    // =====================\n\n    _handleClickOverlay (event:MouseEvent) {\n        if (this._isHideShow || this._noClick) return\n        if (!this._closable) return\n\n        // Get layer.\n        const target = event.target as HTMLElement\n\n        // Outside modal? (clicked directly on overlay, not dialog)\n        if (target === this._modalOverlay) {\n            this.close()\n        }\n    }\n\n    _handleClickClose () {\n        this.close()\n    }\n\n    // =========================\n    // Event: focus in document.\n    // =========================\n\n    _handleFocusIn () {\n        if (!this._isActive || !this._modal) return\n\n        const activeElement = document.activeElement as HTMLElement\n\n        // Get booleans.\n        const isFocusTrap1 = activeElement === this._focusTrap1\n        const isFocusTrap2 = activeElement === this._focusTrap2\n\n        // Get focusable elements in modal.\n        const focusList = Array.from(\n            this._modal.querySelectorAll(FOCUSABLE_SELECTORS)\n        ) as HTMLElement[]\n\n        // Get first & last items.\n        const focusItemFirst = focusList[0]\n        const focusItemLast = focusList[focusList.length - 1]\n\n        // Focus trap: above?\n        if (isFocusTrap1 && focusItemLast) {\n            this._focusElement(focusItemLast)\n\n        // Focus trap: below?\n        } else if (isFocusTrap2 && focusItemFirst) {\n            this._focusElement(focusItemFirst)\n\n        // Outside modal?\n        } else if (this._isOutsideModal(activeElement)) {\n            this._focusModal()\n        }\n    }\n\n    // =================\n    // Event: key press.\n    // =================\n\n    _handleKeyDown (event:KeyboardEvent) {\n        if (!this._isActive) return\n        // Respect inner widgets that have already handled the key\n        // (e.g. a country dropdown closing on Escape).\n        if (event.defaultPrevented) return\n\n        // Autocomplete/autofill widgets sometimes dispatch a synthetic\n        // keydown as a plain Event, which has no `key`. Ignore it.\n        if (!event.key) return\n\n        const key = event.key.toLowerCase()\n\n        // Escape key?\n        if (\n            key === ESCAPE &&\n            !this._isHideShow &&\n            this._closable\n        ) {\n            this.close()\n        }\n\n        // Tab key?\n        if (key === TAB) {\n            this._handleFocusIn()\n        }\n    }\n\n    open () {\n        this._isActive = true\n        this._toggleModalDisplay(() => {\n            this._focusModal()\n            this.emit('open')\n            this.dispatch('open')\n        })\n    }\n\n    close () {\n        this._isActive = false\n        this._toggleModalDisplay(() => {\n            if (this._activeElement) {\n                this._focusElement(this._activeElement)\n            }\n            this.emit('close')\n            this.dispatch('close')\n        })\n    }\n}\n\ndefine(ModalWindow.TAG, ModalWindow)\n\nfunction createFocusTrap () {\n    const trap = document.createElement('span')\n    trap.classList.add('modal-focus-trap')\n    trap.tabIndex = 0\n    return trap\n}\n"],
  "mappings": "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",
  "names": []
}
