{"version":3,"file":"js/page__shared_reveal-6ab39379ff312e5d3a1a.chunk.js","mappings":"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","sources":["webpack://nodalview/./app/javascript/src/shared/reveal/index.js","webpack://nodalview/./app/javascript/src/shared/sleep/index.js"],"sourcesContent":["import { sleep } from \"../sleep\";\n\nconst DATA_REVEALED_ATTRIBUTE = 'data-revealed';\nconst KEY_TAB = 9;\nconst KEY_ESCAPE = 27;\n\nclass Reveal {\n  boot() {\n    this.revealElement = null;\n    this.revealContainer = null;\n    this.focusedElementBeforeOpen = null;\n    this.focusableElements = [];\n\n    this.createCustomEvents();\n    this.hookElements();\n    this.hookReveals();\n    this.hookObservers();\n\n    this._handleKeyDown = this._handleKeyDown.bind(this);\n    this._revealObserver = this._revealObserver.bind(this);\n    this._handleMutation = this._handleMutation.bind(this);\n  }\n\n  createCustomEvents() {\n    this.revealOpen = new CustomEvent(\"reveal:open\");\n    this.revealClose = new CustomEvent(\"reveal:close\");\n    this.revealTriggerClose = new CustomEvent(\"reveal:trigger:close\");\n  }\n\n  hookElements() {\n    document.querySelectorAll('[data-reveal-trigger]').forEach(element => {\n      element.addEventListener('click', (e) => {\n        this.revealElement = e.currentTarget.getAttribute('data-reveal-trigger');\n        this.revealContainer = document.querySelector(`[data-reveal-id=\"${this.revealElement}\"]`)\n        this._displayModal();\n        this._handleFocusableElements();\n      })\n   });\n  }\n\n  hookReveals() {\n    document.querySelectorAll('[data-reveal-close], [data-reveal-background]').forEach(element => {\n      element.addEventListener('click', (e) => {\n        this._close();\n      });\n    });\n  }\n\n  hookObservers() {\n    const list = document.querySelectorAll('[data-reveal-id]');\n    list.forEach((element) => {\n      this._revealObserver(element);\n      this._revealListener(element);\n    })\n  }\n\n  _setFocus() {\n    const focusElement = this.revealContainer.querySelector('[data-reveal-focus]');\n    focusElement && focusElement.focus();\n  }\n\n  _hookEscapeKey() {\n    this.revealContainer?.addEventListener('keydown', this._handleKeyDown, true)\n  }\n\n  _unhookEscapeKey() {\n    this.revealContainer?.removeEventListener('keydown', this._handleKeyDown, true)\n  }\n\n  _close() {\n    this._unhookEscapeKey();\n    this.revealContainer?.setAttribute(\"aria-hidden\", true);\n    this.revealContainer?.setAttribute(\"tabindex\", -1);\n    this.revealContainer?.dispatchEvent(this.revealTriggerClose);\n    this.revealElement = null;\n    document.body.removeAttribute('data-reveal-open')\n  }\n\n  _revealObserver(element) {\n    const observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => this._handleMutation(mutation, element));\n    });\n    observer.observe(element, {\n      attributeFilter: [DATA_REVEALED_ATTRIBUTE],\n    })\n  }\n\n  _handleMutation({ target, attributeName }, element) {\n    const { revealOpen, revealClose } = this;\n    if (attributeName === DATA_REVEALED_ATTRIBUTE) {\n      const isOpened = target.hasAttribute(DATA_REVEALED_ATTRIBUTE);\n      element.dispatchEvent(isOpened ? revealOpen : revealClose)\n    }\n  }\n\n  _revealListener(element) {\n    element.addEventListener('reveal:trigger:open', (e) => {\n      this.revealContainer = element;\n      this._displayModal();\n    })\n    element.addEventListener('reveal:trigger:close', async (e) => {\n      this.revealContainer = element;\n      this.revealContainer.setAttribute('data-revealed-out', true);\n      await sleep(.3);\n      element.removeAttribute('data-revealed-out');\n      element.removeAttribute(DATA_REVEALED_ATTRIBUTE);\n      element.setAttribute(\"aria-hidden\", true);\n      if (this.focusedElementBeforeOpen) {\n        this.focusedElementBeforeOpen.focus();\n        this.focusedElementBeforeOpen = null;\n      };\n    })\n  }\n\n  _displayModal() {\n    this.focusedElementBeforeOpen = document.activeElement;\n    this.revealContainer?.setAttribute(DATA_REVEALED_ATTRIBUTE, true);\n    this.revealContainer?.setAttribute(\"aria-hidden\", false);\n    this.revealContainer?.setAttribute(\"tabindex\", 0);\n    this._setFocus();\n    this._hookEscapeKey();\n    document.body.setAttribute('data-reveal-open', true)\n  }\n\n  _handleFocusableElements() {\n    const focusableElements = this.revealContainer?.querySelectorAll('a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex=\"0\"]');\n    this.focusableElements = Array.prototype.slice.call(focusableElements);\n    this.firstFocusableElement = focusableElements[0];\n    this.lastFocusableElement = focusableElements[focusableElements.length - 1];\n  }\n\n  _handleKeyDown (e) {\n    const _this = this;\n\n    const handleBackwardTab = () => {\n      if (document.activeElement == _this.firstFocusableElement) {\n        e.preventDefault();\n        _this.lastFocusableElement.focus();\n      }\n    };\n\n    const handleForwardTab = () => {\n      if (document.activeElement == _this.lastFocusableElement) {\n        e.preventDefault();\n        _this.firstFocusableElement.focus();\n      }\n    };\n\n    switch(e.keyCode) {\n      case KEY_TAB:\n        if (_this.focusableElements.length === 1) {\n          e.preventDefault();\n          break;\n        }\n\n        e.shiftKey ? handleBackwardTab() : handleForwardTab();\n\n        break;\n      case KEY_ESCAPE:\n        if(_this.revealContainer?.dataset.closeOnEscape === \"true\") { break }\n        _this._close();\n        break;\n      default:\n        break;\n    }\n  }\n\n}\n\nexport default Reveal;\n","const sleep = (time) => new Promise((resolve, reject) => setTimeout(resolve, time * 1000))\n\nexport { sleep }"],"names":["DATA_REVEALED_ATTRIBUTE","boot","this","revealElement","revealContainer","focusedElementBeforeOpen","focusableElements","createCustomEvents","hookElements","hookReveals","hookObservers","_handleKeyDown","bind","_revealObserver","_handleMutation","revealOpen","CustomEvent","revealClose","revealTriggerClose","document","querySelectorAll","forEach","element","addEventListener","e","currentTarget","getAttribute","querySelector","_displayModal","_handleFocusableElements","_close","_revealListener","_setFocus","focusElement","focus","_hookEscapeKey","_unhookEscapeKey","removeEventListener","setAttribute","dispatchEvent","body","removeAttribute","MutationObserver","mutations","mutation","observe","attributeFilter","target","attributeName","isOpened","hasAttribute","sleep","activeElement","Array","prototype","slice","call","firstFocusableElement","lastFocusableElement","length","_this","keyCode","preventDefault","shiftKey","dataset","closeOnEscape","time","Promise","resolve","reject","setTimeout"],"sourceRoot":""}