{"version":3,"sources":["webpack:///./src/js/modules/bookNow.js"],"names":["BookNow","el","disableScroll","manualHeightInit","manualheightInit","this","expanded","focusedLink","dom","body","document","querySelector","trigger","popup","links","querySelectorAll","overlay","setupExternalIcon","popupHeight","offsetHeight","addEventListener","event","toggleDropdown","handleTriggerKeyEvents","handlePopupKeyEvents","stopPropagation","window","e","scrollY","style","position","top","overflowY","scrollTo","parseInt","isTriggeredByKeyboard","detail","changeScroll","classList","toggle","setAttribute","add","anime","targets","easing","height","duration","direction","complete","remove","focus","key","preventDefault","linksLength","length","linkToFocusIndex","ArrowUp","ArrowDown","forEach","link","href","getAttribute","includes","location","host","Component"],"mappings":"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","file":"49.0b1849bcea3126128b07.js","sourcesContent":["/* eslint-disable react/prop-types*/\nimport { Component } from '@verndale/core';\nimport anime from 'animejs';\n\nclass BookNow extends Component {\n constructor(el, disableScroll = true, manualHeightInit = false) {\n super(el);\n this.disableScroll = disableScroll;\n this.manualheightInit = manualHeightInit;\n }\n setupDefaults() {\n this.expanded = false;\n this.focusedLink = 0;\n this.dom = {\n body: document.querySelector('body'),\n trigger: this.el.querySelector('.book-now__trigger'),\n popup: this.el.querySelector('.book-now__popup'),\n links: [...this.el.querySelectorAll('.book-now__link')],\n overlay: this.el.querySelector('.book-now__overlay')\n };\n this.setupExternalIcon();\n if (!this.manualheightInit) this.popupHeight = this.dom.popup.offsetHeight;\n }\n\n addListeners() {\n this.dom.trigger.addEventListener('click', event =>\n this.toggleDropdown(event)\n );\n // Handle trigger keyboard events\n this.dom.trigger.addEventListener('keydown', event =>\n this.handleTriggerKeyEvents(event)\n );\n // Handle popup keyboard events\n this.dom.popup.addEventListener('keydown', event =>\n this.handlePopupKeyEvents(event)\n );\n // Handle click outside\n this.dom.overlay.addEventListener('click', event => {\n event.stopPropagation();\n this.toggleDropdown(event);\n });\n window.addEventListener('click', e => {\n if (this.expanded) this.toggleDropdown(e);\n });\n }\n\n changeScroll() {\n if (this.expanded) {\n const scrollY = window.scrollY;\n this.dom.body.style.position = 'fixed';\n this.dom.body.style.top = `-${scrollY}px`;\n this.dom.body.style.overflowY = 'scroll';\n } else {\n const scrollY = document.body.style.top;\n this.dom.body.style.position = null;\n this.dom.body.style.top = null;\n this.dom.body.style.overflowY = null;\n window.scrollTo(0, parseInt(scrollY || '0') * -1);\n }\n }\n\n recalculatePopupHeight() {\n this.popupHeight = this.dom.popup.offsetHeight;\n }\n\n toggleDropdown(e) {\n e?.stopPropagation();\n if (!this.popupHeight) return;\n const isTriggeredByKeyboard = e?.detail === 0;\n // Update expanded state\n this.expanded = !this.expanded;\n //Toggle scroll\n if (this.disableScroll) this.changeScroll();\n // Show/hide white overlay\n this.dom.overlay.classList.toggle('active');\n // Update trigger aria-expanded attribute\n this.dom.trigger.setAttribute('aria-expanded', this.expanded);\n // Show/hide popup\n if (this.expanded) this.dom.popup.classList.add('active');\n anime({\n targets: this.dom.popup,\n easing: 'easeInOutQuad',\n height: [0, this.popupHeight], // -> '250px'\n duration: 400,\n direction: this.expanded ? 'normal' : 'reverse',\n complete: () =>\n !this.expanded && this.dom.popup.classList.remove('active')\n });\n //Focus first link if exists on open and event was trigger by keyboard\n if (\n this.expanded &&\n isTriggeredByKeyboard &&\n this.dom.links[this.focusedLink]\n ) {\n this.dom.links[this.focusedLink].focus();\n }\n // Reset focusedLink on close\n if (!this.expanded) this.focusedLink = 0;\n }\n\n handleTriggerKeyEvents(e) {\n // Open/close popup\n if (e.key === 'ArrowDown' || (this.expanded && e.key === 'Escape')) {\n this.toggleDropdown(e);\n }\n }\n\n handlePopupKeyEvents(e) {\n // Close popup\n if (e.key === 'Escape') {\n this.toggleDropdown();\n // Focus trigger\n return this.dom.trigger.focus();\n }\n // Navigate links using arrows\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const delta = {\n ArrowUp: -1,\n ArrowDown: 1\n };\n const linksLength = this.dom.links.length;\n const linkToFocusIndex = this.focusedLink + delta[e.key];\n // Circle back to last link\n if (linkToFocusIndex < 0) {\n this.dom.links[linksLength - 1].focus();\n return (this.focusedLink = linksLength - 1);\n }\n // Circle back to first link\n if (linkToFocusIndex > linksLength - 1) {\n this.dom.links[0].focus();\n return (this.focusedLink = 0);\n }\n // Natural navigation\n this.dom.links[linkToFocusIndex].focus();\n return (this.focusedLink = linkToFocusIndex);\n }\n }\n\n setupExternalIcon() {\n this.dom.links.forEach(link => {\n const href = link.getAttribute('href');\n if (!href.includes('http') || href.includes(window.location.host)) {\n link.classList.remove('external');\n }\n });\n }\n}\n\nexport default BookNow;\n"],"sourceRoot":""}