{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/scripts/modal.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","FOCUSABLE_ELEMENTS","Modal","activeModal","validateModalPresence","validateArgs","CustomModal","targetModal","triggers","onShow","onClose","openTrigger","closeTrigger","openClass","disableScroll","disableFocus","awaitCloseAnimation","awaitOpenAnimation","debugMode","this","modal","document","getElementById","config","length","registerTriggers","onClick","onKeydown","filter","Boolean","forEach","trigger","addEventListener","event","showModal","activeElement","setAttribute","classList","add","scrollBehaviour","addEventListeners","handler","removeEventListener","setFocusToFirstNode","removeEventListeners","focus","remove","preventDefault","stopPropagation","closeModal","toggle","body","querySelector","assign","style","overflow","target","hasAttribute","keyCode","retainFocus","nodes","querySelectorAll","Array","focusableNodes","getFocusableNodes","nodesWhichAreNotCloseTargets","node","offsetParent","contains","focusedItemIndex","indexOf","shiftKey","id","console","warn","triggerMap","validateTriggerPresence","init","options","triggerAttr","attributes","undefined","push","generateTriggerMap","show","close","closeModalById"],"mappings":"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","file":"modal.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","const CustomModal = (() => {\r\n \"use strict\"\r\n\r\n const FOCUSABLE_ELEMENTS = [\r\n \"a[href]\",\r\n \"area[href]\",\r\n 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\r\n \"select:not([disabled]):not([aria-hidden])\",\r\n \"textarea:not([disabled]):not([aria-hidden])\",\r\n \"button:not([disabled]):not([aria-hidden])\",\r\n \"iframe\",\r\n \"object\",\r\n \"embed\",\r\n \"[contenteditable]\",\r\n '[tabindex]:not([tabindex^=\"-\"])',\r\n ]\r\n\r\n class Modal {\r\n constructor ({\r\n targetModal,\r\n triggers = [],\r\n onShow = () => {},\r\n onClose = () => {},\r\n openTrigger = \"data-custommodal-trigger\",\r\n closeTrigger = \"data-custommodal-close\",\r\n openClass = \"is-open\",\r\n disableScroll = false,\r\n disableFocus = false,\r\n awaitCloseAnimation = false,\r\n awaitOpenAnimation = false,\r\n debugMode = false,\r\n }) {\r\n // Save a reference of the modal\r\n this.modal = document.getElementById(targetModal)\r\n\r\n // Save a reference to the passed config\r\n this.config = {\r\n debugMode,\r\n disableScroll,\r\n openTrigger,\r\n closeTrigger,\r\n openClass,\r\n onShow,\r\n onClose,\r\n awaitCloseAnimation,\r\n awaitOpenAnimation,\r\n disableFocus,\r\n }\r\n\r\n // Register click events only if pre binding eventListeners\r\n if (triggers.length > 0) this.registerTriggers(...triggers)\r\n\r\n // pre bind functions for event listeners\r\n this.onClick = this.onClick.bind(this)\r\n this.onKeydown = this.onKeydown.bind(this)\r\n }\r\n\r\n /**\r\n * Loops through all openTriggers and binds click event\r\n * @param {array} triggers [Array of node elements]\r\n * @return {void}\r\n */\r\n registerTriggers (...triggers) {\r\n triggers.filter(Boolean).forEach(trigger => {\r\n trigger.addEventListener(\"click\", event => this.showModal(event))\r\n })\r\n }\r\n\r\n showModal (event = null) {\r\n this.activeElement = document.activeElement\r\n this.modal.setAttribute(\"aria-hidden\", \"false\")\r\n this.modal.classList.add(this.config.openClass)\r\n this.scrollBehaviour(\"disable\")\r\n this.addEventListeners()\r\n\r\n if (this.config.awaitOpenAnimation) {\r\n const handler = () => {\r\n this.modal.removeEventListener(\"animationend\", handler, false)\r\n this.setFocusToFirstNode()\r\n }\r\n this.modal.addEventListener(\"animationend\", handler, false)\r\n } else {\r\n this.setFocusToFirstNode()\r\n }\r\n\r\n this.config.onShow(this.modal, this.activeElement, event)\r\n }\r\n\r\n closeModal (event = null) {\r\n const modal = this.modal\r\n this.modal.setAttribute(\"aria-hidden\", \"true\")\r\n this.removeEventListeners()\r\n this.scrollBehaviour(\"enable\")\r\n if (this.activeElement && this.activeElement.focus) {\r\n this.activeElement.focus()\r\n }\r\n this.config.onClose(this.modal, this.activeElement, event)\r\n\r\n if (this.config.awaitCloseAnimation) {\r\n let openClass = this.config.openClass // <- old school ftw\r\n this.modal.addEventListener(\r\n \"animationend\",\r\n function handler () {\r\n modal.classList.remove(openClass)\r\n modal.removeEventListener(\"animationend\", handler, false)\r\n },\r\n false\r\n )\r\n } else {\r\n modal.classList.remove(this.config.openClass)\r\n }\r\n event.preventDefault()\r\n event.stopPropagation()\r\n }\r\n\r\n closeModalById (targetModal) {\r\n this.modal = document.getElementById(targetModal)\r\n if (this.modal) this.closeModal()\r\n }\r\n\r\n scrollBehaviour (toggle) {\r\n if (!this.config.disableScroll) return\r\n const body = document.querySelector(\"body\")\r\n switch (toggle) {\r\n case \"enable\":\r\n Object.assign(body.style, { overflow: \"\" })\r\n break\r\n case \"disable\":\r\n Object.assign(body.style, { overflow: \"hidden\" })\r\n break\r\n default:\r\n }\r\n }\r\n\r\n addEventListeners () {\r\n this.modal.addEventListener(\"touchstart\", this.onClick)\r\n this.modal.addEventListener(\"click\", this.onClick)\r\n document.addEventListener(\"keydown\", this.onKeydown)\r\n }\r\n\r\n removeEventListeners () {\r\n this.modal.removeEventListener(\"touchstart\", this.onClick)\r\n this.modal.removeEventListener(\"click\", this.onClick)\r\n document.removeEventListener(\"keydown\", this.onKeydown)\r\n }\r\n\r\n onClick (event) {\r\n if (event.target.hasAttribute(this.config.closeTrigger)) {\r\n this.closeModal(event)\r\n }\r\n }\r\n\r\n onKeydown (event) {\r\n if (event.keyCode === 27) this.closeModal(event) // esc\r\n if (event.keyCode === 9) this.retainFocus(event) // tab\r\n }\r\n\r\n getFocusableNodes () {\r\n const nodes = this.modal.querySelectorAll(FOCUSABLE_ELEMENTS)\r\n return Array(...nodes)\r\n }\r\n\r\n /**\r\n * Tries to set focus on a node which is not a close trigger\r\n * if no other nodes exist then focuses on first close trigger\r\n */\r\n setFocusToFirstNode () {\r\n if (this.config.disableFocus) return\r\n\r\n const focusableNodes = this.getFocusableNodes()\r\n\r\n // no focusable nodes\r\n if (focusableNodes.length === 0) return\r\n\r\n // remove nodes on whose click, the modal closes\r\n // could not think of a better name :(\r\n const nodesWhichAreNotCloseTargets = focusableNodes.filter(node => {\r\n return !node.hasAttribute(this.config.closeTrigger)\r\n })\r\n\r\n if (nodesWhichAreNotCloseTargets.length > 0)\r\n nodesWhichAreNotCloseTargets[0].focus()\r\n if (nodesWhichAreNotCloseTargets.length === 0) focusableNodes[0].focus()\r\n }\r\n\r\n retainFocus (event) {\r\n let focusableNodes = this.getFocusableNodes()\r\n\r\n // no focusable nodes\r\n if (focusableNodes.length === 0) return\r\n\r\n /**\r\n * Filters nodes which are hidden to prevent\r\n * focus leak outside modal\r\n */\r\n focusableNodes = focusableNodes.filter(node => {\r\n return node.offsetParent !== null\r\n })\r\n\r\n // if disableFocus is true\r\n if (!this.modal.contains(document.activeElement)) {\r\n focusableNodes[0].focus()\r\n } else {\r\n const focusedItemIndex = focusableNodes.indexOf(document.activeElement)\r\n\r\n if (event.shiftKey && focusedItemIndex === 0) {\r\n focusableNodes[focusableNodes.length - 1].focus()\r\n event.preventDefault()\r\n }\r\n\r\n if (\r\n !event.shiftKey &&\r\n focusableNodes.length > 0 &&\r\n focusedItemIndex === focusableNodes.length - 1\r\n ) {\r\n focusableNodes[0].focus()\r\n event.preventDefault()\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Modal prototype ends.\r\n * Here on code is responsible for detecting and\r\n * auto binding event handlers on modal triggers\r\n */\r\n\r\n // Keep a reference to the opened modal\r\n let activeModal = null\r\n\r\n /**\r\n * Generates an associative array of modals and it's\r\n * respective triggers\r\n * @param {array} triggers An array of all triggers\r\n * @param {string} triggerAttr The data-attribute which triggers the module\r\n * @return {array}\r\n */\r\n const generateTriggerMap = (triggers, triggerAttr) => {\r\n const triggerMap = []\r\n\r\n triggers.forEach(trigger => {\r\n const targetModal = trigger.attributes[triggerAttr].value\r\n if (triggerMap[targetModal] === undefined) triggerMap[targetModal] = []\r\n triggerMap[targetModal].push(trigger)\r\n })\r\n\r\n return triggerMap\r\n }\r\n\r\n /**\r\n * Validates whether a modal of the given id exists\r\n * in the DOM\r\n * @param {number} id The id of the modal\r\n * @return {boolean}\r\n */\r\n const validateModalPresence = id => {\r\n if (!document.getElementById(id)) {\r\n console.warn(\r\n `CustomModal: \\u2757Seems like you have missed %c'${id}'`,\r\n \"background-color: #f8f9fa;color: #50596c;font-weight: bold;\",\r\n \"ID somewhere in your code. Refer example below to resolve it.\"\r\n )\r\n console.warn(\r\n `%cExample:`,\r\n \"background-color: #f8f9fa;color: #50596c;font-weight: bold;\",\r\n `
`\r\n )\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * Validates if there are modal triggers present\r\n * in the DOM\r\n * @param {array} triggers An array of data-triggers\r\n * @return {boolean}\r\n */\r\n const validateTriggerPresence = triggers => {\r\n if (triggers.length <= 0) {\r\n console.warn(\r\n `CustomModal: \\u2757Please specify at least one %c'custommodal-trigger'`,\r\n \"background-color: #f8f9fa;color: #50596c;font-weight: bold;\",\r\n \"data attribute.\"\r\n )\r\n console.warn(\r\n `%cExample:`,\r\n \"background-color: #f8f9fa;color: #50596c;font-weight: bold;\",\r\n ``\r\n )\r\n return false\r\n }\r\n }\r\n\r\n /**\r\n * Checks if triggers and their corresponding modals\r\n * are present in the DOM\r\n * @param {array} triggers Array of DOM nodes which have data-triggers\r\n * @param {array} triggerMap Associative array of modals and their triggers\r\n * @return {boolean}\r\n */\r\n const validateArgs = (triggers, triggerMap) => {\r\n validateTriggerPresence(triggers)\r\n if (!triggerMap) return true\r\n for (var id in triggerMap) validateModalPresence(id)\r\n return true\r\n }\r\n\r\n /**\r\n * Binds click handlers to all modal triggers\r\n * @param {object} config [description]\r\n * @return void\r\n */\r\n const init = config => {\r\n // Create an config object with default openTrigger\r\n const options = Object.assign(\r\n {},\r\n { openTrigger: \"data-custommodal-trigger\" },\r\n config\r\n )\r\n\r\n // Collects all the nodes with the trigger\r\n const triggers = [...document.querySelectorAll(`[${options.openTrigger}]`)]\r\n\r\n // Makes a mappings of modals with their trigger nodes\r\n const triggerMap = generateTriggerMap(triggers, options.openTrigger)\r\n\r\n // Checks if modals and triggers exist in dom\r\n if (\r\n options.debugMode === true &&\r\n validateArgs(triggers, triggerMap) === false\r\n )\r\n return\r\n\r\n // For every target modal creates a new instance\r\n for (var key in triggerMap) {\r\n let value = triggerMap[key]\r\n options.targetModal = key\r\n options.triggers = [...value]\r\n activeModal = new Modal(options) // eslint-disable-line no-new\r\n }\r\n }\r\n\r\n /**\r\n * Shows a particular modal\r\n * @param {string} targetModal [The id of the modal to display]\r\n * @param {object} config [The configuration object to pass]\r\n * @return {void}\r\n */\r\n const show = (targetModal, config) => {\r\n const options = config || {}\r\n options.targetModal = targetModal\r\n\r\n // Checks if modals and triggers exist in dom\r\n if (\r\n options.debugMode === true &&\r\n validateModalPresence(targetModal) === false\r\n )\r\n return\r\n\r\n // clear events in case previous modal wasn't close\r\n if (activeModal) activeModal.removeEventListeners()\r\n\r\n // stores reference to active modal\r\n activeModal = new Modal(options) // eslint-disable-line no-new\r\n activeModal.showModal()\r\n }\r\n\r\n /**\r\n * Closes the active modal\r\n * @param {string} targetModal [The id of the modal to close]\r\n * @return {void}\r\n */\r\n const close = targetModal => {\r\n targetModal\r\n ? activeModal.closeModalById(targetModal)\r\n : activeModal.closeModal()\r\n }\r\n\r\n return { init, show, close }\r\n})()\r\n\r\nexport default CustomModal\r\n"],"sourceRoot":""}