{ "version": 3, "sources": ["src/js/helpers/enabled.js", "src/js/helpers/isset.js", "src/js/patterns/sticky-header.js", "src/js/patterns/video.js", "src/js/patterns/site-search.js", "src/js/patterns/toast.js", "src/js/patterns/content-search.js", "src/js/patterns/inline-search.js", "src/js/patterns/field-counter.js", "node_modules/embla-carousel/src/components/utils.ts", "node_modules/embla-carousel/src/components/Alignment.ts", "node_modules/embla-carousel/src/components/EventStore.ts", "node_modules/embla-carousel/src/components/Animations.ts", "node_modules/embla-carousel/src/components/Axis.ts", "node_modules/embla-carousel/src/components/Limit.ts", "node_modules/embla-carousel/src/components/Counter.ts", "node_modules/embla-carousel/src/components/DragHandler.ts", "node_modules/embla-carousel/src/components/DragTracker.ts", "node_modules/embla-carousel/src/components/NodeRects.ts", "node_modules/embla-carousel/src/components/PercentOfView.ts", "node_modules/embla-carousel/src/components/ResizeHandler.ts", "node_modules/embla-carousel/src/components/ScrollBody.ts", "node_modules/embla-carousel/src/components/ScrollBounds.ts", "node_modules/embla-carousel/src/components/ScrollContain.ts", "node_modules/embla-carousel/src/components/ScrollLimit.ts", "node_modules/embla-carousel/src/components/ScrollLooper.ts", "node_modules/embla-carousel/src/components/ScrollProgress.ts", "node_modules/embla-carousel/src/components/ScrollSnaps.ts", "node_modules/embla-carousel/src/components/SlideRegistry.ts", "node_modules/embla-carousel/src/components/ScrollTarget.ts", "node_modules/embla-carousel/src/components/ScrollTo.ts", "node_modules/embla-carousel/src/components/SlideFocus.ts", "node_modules/embla-carousel/src/components/Vector1d.ts", "node_modules/embla-carousel/src/components/Translate.ts", "node_modules/embla-carousel/src/components/SlideLooper.ts", "node_modules/embla-carousel/src/components/SlidesHandler.ts", "node_modules/embla-carousel/src/components/SlidesInView.ts", "node_modules/embla-carousel/src/components/SlideSizes.ts", "node_modules/embla-carousel/src/components/SlidesToScroll.ts", "node_modules/embla-carousel/src/components/Engine.ts", "node_modules/embla-carousel/src/components/EventHandler.ts", "node_modules/embla-carousel/src/components/Options.ts", "node_modules/embla-carousel/src/components/OptionsHandler.ts", "node_modules/embla-carousel/src/components/PluginsHandler.ts", "node_modules/embla-carousel/src/components/EmblaCarousel.ts", "src/js/patterns/embla-carousel-nav.js", "node_modules/embla-carousel-class-names/src/components/Options.ts", "node_modules/embla-carousel-class-names/src/components/utils.ts", "node_modules/embla-carousel-class-names/src/components/ClassNames.ts", "src/js/patterns/depot-finder.js", "src/js/patterns/enquiry-link.js", "node_modules/embla-carousel-autoplay/src/components/Options.ts", "node_modules/embla-carousel-autoplay/src/components/Autoplay.ts", "src/js/patterns/embla-tween-opacity.js", "src/js/patterns/embla-thumbs-nav.js", "src/js/patterns/embla-carousel-init.js", "src/js/patterns/add-to-basket.js", "node_modules/f11y/umd/f11y.es.js", "node_modules/arrive/src/arrive.js", "src/js/app.js", "src/js/helpers/check-sticky.js"], "sourcesContent": ["/**\r\n * Adds body class to check if JS is enabled\r\n * @returns {Boolean}\r\n */\r\nfunction isJavascriptEnabled(){\r\n document.body.classList.add('js-enabled');\r\n return true;\r\n}\r\n\r\nexports.isJavascriptEnabled = isJavascriptEnabled;", "/**\r\n * Checks if a node/element exists\r\n * @param {HTMLElement|Element} node - The node/element to check\r\n * @returns {Boolean}\r\n */\r\nfunction isSet(node){\r\n if (typeof(node) != 'undefined' && node != null) {\r\n return true;\r\n }else{\r\n return false;\r\n }\r\n}\r\n\r\n\r\nexports.isSet = isSet;", "class Sticky {\r\n constructor (domNode) {\r\n this.documentElm = document.documentElement;\r\n this.window = window;\r\n this.prevScroll = this.window.scrollY || this.documentElm.scrollTop;\r\n this.currentScroll;\r\n this.headerHeight;\r\n this.direction = 0;\r\n this.prevDirection = 0;\r\n this.stickyHeader = domNode\r\n this.stickyOffset = domNode.offsetTop;\r\n this.header\r\n\r\n this.checkOffset = this.checkOffset.bind(this);\r\n window.addEventListener(\r\n 'scroll', \r\n this.checkOffset\r\n );\r\n\r\n this.checkScroll = this.checkScroll.bind(this)\r\n window.addEventListener(\r\n 'scroll', \r\n this.checkScroll\r\n );\r\n\r\n this.setMargin = this.setMargin.bind(this)\r\n document.addEventListener(\r\n 'DOMContentLoaded', \r\n this.setMargin\r\n );\r\n window.addEventListener(\r\n 'resize', \r\n this.setMargin\r\n );\r\n }\r\n\r\n checkOffset() {\r\n const headerElm = this.stickyHeader;\r\n const stickyOffset = this.stickyOffset;\r\n const pageOffset = window.scrollY;\r\n\r\n if (pageOffset > stickyOffset) {\r\n headerElm.classList.add(\"sticky\");\r\n } else {\r\n headerElm.classList.remove(\"sticky\");\r\n }\r\n }\r\n\r\n toggleHeader(direction, currentScroll) {\r\n const headerElm = this.stickyHeader;\r\n\r\n if (direction === 2 && currentScroll > this.headerHeight) { \r\n headerElm.classList.add('hide');\r\n this.prevDirection = direction;\r\n }\r\n else if (direction === 1) {\r\n headerElm.classList.remove('hide');\r\n this.prevDirection = direction;\r\n }\r\n }\r\n\r\n checkScroll() {\r\n //Find the direction of scroll: 0 = initial, 1 = up, 2 = down\r\n let currentScroll = this.window.scrollY || this.documentElm.scrollTop;\r\n let direction = this.direction;\r\n let prevScroll = this.prevScroll;\r\n let prevDirection = this.prevDirection;\r\n\r\n if (currentScroll > prevScroll) { //Scrolling Up\r\n direction = 2;\r\n }\r\n else if (currentScroll < prevScroll) { //Scrolling Down\r\n direction = 1;\r\n }\r\n\r\n if (direction !== prevDirection) {\r\n this.toggleHeader(direction, currentScroll);\r\n }\r\n\r\n this.prevScroll = currentScroll;\r\n }\r\n\r\n setMargin() {\r\n let headerHeight = this.stickyHeader.offsetHeight;\r\n this.documentElm.style.marginTop = headerHeight + 'px';\r\n this.documentElm.style.setProperty('--masthead-height', headerHeight + 'px');\r\n this.headerHeight = headerHeight;\r\n }\r\n}\r\n \r\nexports.Sticky = Sticky", "import { isSet } from \"../helpers/isset\";\r\n\r\n/**\r\n * Description: Initialise the vimeo player functionalities\r\n * \r\n * @class Search\r\n * @typedef {Search}\r\n */\r\n\r\nclass Video {\r\n constructor(domNode) {\r\n this.domNode = domNode;\r\n\r\n window.addEventListener(\r\n 'load',\r\n this.init.bind(this),\r\n true\r\n );\r\n }\r\n\r\n init(){\r\n this.domNode.classList.add('has-vimeo-video');\r\n const videoElm = document.createElement('div');\r\n videoElm.classList.add('vimeo-video__player-container');\r\n\r\n this.videoElm = videoElm;\r\n \r\n this.vimeoURL = this.domNode.getAttribute('data-vimeo-url');\r\n \r\n if(!isSet(this.vimeoURL)){\r\n console.warn(\"No Vimeo URL found on \" + this.videoElm);\r\n return;\r\n }\r\n\r\n this.posterElm = this.domNode.querySelector(\"img\");\r\n this.posterElm.classList.add('vimeo-video__poster');\r\n\r\n const actionElm = document.createElement('button');\r\n const actionIcon = document.createElement('i');\r\n actionElm.classList.add('vimeo-video__action');\r\n actionIcon.classList.add('sa-icon--play');\r\n actionElm.append(actionIcon);\r\n\r\n actionElm.addEventListener(\r\n 'click',\r\n this.loadResponse.bind(this)\r\n );\r\n\r\n this.actionElm = actionElm;\r\n\r\n this.domNode.append(this.videoElm);\r\n this.domNode.append(this.actionElm);\r\n\r\n this.requestURL = \"https://vimeo.com/api/oembed.json?url=\" + this.vimeoURL;\r\n\r\n\r\n }\r\n\r\n async loadResponse(){\r\n try {\r\n const vimeoResponse = await fetch(this.requestURL);\r\n const vimeoJSON = await vimeoResponse.json();\r\n const vimeoHTML = vimeoJSON.html;\r\n\r\n this.videoElm.insertAdjacentHTML('beforeend' , vimeoHTML);\r\n this.actionElm.remove();\r\n if(isSet(this.posterElm)){\r\n this.posterElm.remove();\r\n }\r\n \r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n}\r\n\r\nexports.Video = Video", "/**\r\n * Description: Initialise the live search for the header Site Search\r\n * \r\n * @class SiteSearch\r\n * @typedef {SiteSearch}\r\n */\r\n\r\nclass SiteSearch {\r\n constructor(domNode) {\r\n this.domNode = domNode;\r\n this.inputNode = domNode.querySelector('input[type=\"search\"]');\r\n this.resultContainer = this.domNode.querySelector('.search-results');\r\n this.innerContainer = '';\r\n this.previousSearchString = '';\r\n this.timeout = 0;\r\n this.jsonURL = '';\r\n\r\n this.inputNode.addEventListener(\r\n 'keyup',\r\n this.onInputKeyup.bind(this)\r\n );\r\n\r\n window.addEventListener(\r\n 'load',\r\n this.init.bind(this),\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Creates and builds any required initial markup for the live search to work\r\n */\r\n init() {\r\n this.jsonURL = this.domNode.getAttribute('data-fetch-url');\r\n const innerContainer = document.createElement('div');\r\n innerContainer.classList.add('inner-container');\r\n const innerContainerElm = this.resultContainer.appendChild(innerContainer);\r\n this.innerContainer = innerContainerElm;\r\n }\r\n\r\n\r\n /**\r\n * Checks if the passed string is different when compared with the previously stored search string this.previousSearchString\r\n * @param {String} value The search query string that we want to check that has changed\r\n */\r\n hasChanged(value){\r\n if(value == this.previousSearchString){\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Handles all keyup keyboard events\r\n * @param {String} string The string that is to be escaped\r\n */\r\n escape(string) {\r\n return string\r\n .replace(/&/g, \"&\")\r\n .replace(//g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\");\r\n }\r\n\r\n\r\n /**\r\n * Builds output messages\r\n * @param {String} value The value for the message content\r\n * @param {String} customClass Custom class to be added to the message element\r\n */\r\n buildMessage(value, customClass){\r\n const fragment = new DocumentFragment();\r\n const messageElm = document.createElement('div');\r\n messageElm.classList.add('sa-message');\r\n if(customClass){\r\n messageElm.classList.add(customClass);\r\n }\r\n const message = document.createElement('span');\r\n message.textContent = value;\r\n messageElm.append(message);\r\n fragment.append(messageElm);\r\n return fragment;\r\n }\r\n\r\n\r\n /**\r\n * Builds Search Result\r\n * @param {String} title The title content for the search result\r\n * @param {String} href The link url link for the search result\r\n */\r\n buildSearchResult(title, href){\r\n const listItem = document.createElement('li');\r\n listItem.classList.add('result');\r\n const link = document.createElement('a');\r\n link.href = href;\r\n link.target = '_blank';\r\n const para = document.createElement('p');\r\n para.textContent = title;\r\n const icon = document.createElement('i');\r\n icon.classList.add('sa-icon--arrow-right');\r\n link.append(para);\r\n link.append(icon);\r\n listItem.append(link);\r\n return listItem;\r\n }\r\n\r\n \r\n /**\r\n * Handles all keyup keyboard events\r\n * @param {Object} event The event that triggered this method\r\n */\r\n onInputKeyup(event) {\r\n this.innerContainer.classList.add('is-active');\r\n\r\n if(!this.hasChanged(this.inputNode.value)){\r\n return;\r\n }\r\n\r\n this.previousSearchString = this.inputNode.value;\r\n\r\n if(this.inputNode.textLength == 0){\r\n this.innerContainer.innerHTML = '';\r\n this.innerContainer.classList.remove('is-active');\r\n return;\r\n }\r\n\r\n if(this.inputNode.textLength <= 3){\r\n this.innerContainer.innerHTML = '';\r\n this.innerContainer.append(\r\n this.buildMessage('Please Keep Typing...', 'sa-message--info')\r\n );\r\n return;\r\n }\r\n\r\n clearTimeout(this.timeout);\r\n this.innerContainer.innerHTML = '';\r\n this.innerContainer.append(\r\n this.buildMessage('Searching...', 'sa-message--info')\r\n );\r\n this.timeout = setTimeout(\r\n this.fetchSearchResults.bind(this),\r\n 700\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Fetches the results from JSON query\r\n */\r\n async fetchSearchResults(){\r\n const cleanValue = this.escape(this.inputNode.value);\r\n const searchURL = this.jsonURL + cleanValue;\r\n const innerContainer = this.innerContainer;\r\n\r\n let responseJSON;\r\n\r\n try {\r\n const response = await fetch(searchURL);\r\n\r\n if (!response.ok) {\r\n this.innerContainer.innerHTML = '';\r\n innerContainer.append(\r\n this.buildMessage('Whoops something went wrong, please try again.', 'sa-message--error')\r\n );\r\n throw new Error(`${response.status} ${response.statusText}`);\r\n }\r\n\r\n responseJSON = await response.json();\r\n \r\n } catch (error) {\r\n this.innerContainer.innerHTML = '';\r\n innerContainer.append(\r\n this.buildMessage('Whoops something went wrong, please try again.', 'sa-message--error')\r\n );\r\n\r\n if (error instanceof SyntaxError) {\r\n console.warn('There was a SyntaxError when fetching the JSON', error);\r\n } else {\r\n console.warn('There was an error', error);\r\n }\r\n }\r\n\r\n if (responseJSON) {\r\n const resultsArr = responseJSON.list;\r\n innerContainer.innerHTML = '';\r\n\r\n if(!resultsArr.length){\r\n innerContainer.append(\r\n this.buildMessage('No Results Found.', 'sa-message--info')\r\n );\r\n return;\r\n }\r\n \r\n const title = `Best Matches`;\r\n const list = document.createElement('ul');\r\n\r\n for (let i = 0; i < resultsArr.length; i++) {\r\n if(i <= 2){\r\n const result = resultsArr[i];\r\n list.appendChild( this.buildSearchResult(result.title, result.url) );\r\n }\r\n }\r\n\r\n innerContainer.insertAdjacentHTML('afterbegin', title);\r\n innerContainer.append(list);\r\n\r\n const cta = `\r\n \r\n View All Search Results (` + resultsArr.length + `)\r\n \r\n \r\n `;\r\n\r\n innerContainer.insertAdjacentHTML(\r\n 'beforeend',\r\n cta\r\n );\r\n }\r\n }\r\n}\r\n\r\nexports.SiteSearch = SiteSearch;", "class Toast {\r\n /**\r\n * @param {HTMLElement | Element} domNode \r\n * @param {HTMLElement | Element} toastTemplate \r\n * @param {Object} opts \r\n */\r\n constructor(domNode, toastTemplate, opts) {\r\n\r\n this.f11ySettings = window.f11y.settings;\r\n \r\n /** @type {ToastDefault} */\r\n const DEFAULTS = {\r\n onOpen: () => { },\r\n onDismiss: () => { },\r\n onClear: () => { },\r\n openClass: this.f11ySettings.openClass,\r\n closeToastAttribute: 'f11y-toast-close',\r\n templateElementAttribute: 'f11y-toast-message',\r\n swipeTracking: false,\r\n swipeDirection: 'down',\r\n duration: -1,\r\n awaitCloseTransition: false,\r\n awaitOpenTransition: false \r\n }\r\n\r\n /** @type {ToastDefault} */\r\n this.options = Object.assign(DEFAULTS, opts);\r\n\r\n /** @type {Element | HTMLElement} */\r\n this.domNode = domNode;\r\n\r\n /** @type {Element | HTMLElement} */\r\n this.toastTemplate = toastTemplate;\r\n\r\n this.init();\r\n }\r\n\r\n /**\r\n * Initialises the class component\r\n */\r\n init() {\r\n this.timer = 0;\r\n this.activeToasts = [];\r\n this.onPointerMoveBound = this.onPointerMove.bind(this);\r\n this.swipeThreshold = 50;\r\n window.addEventListener('mousedown', this.onBackgroundMousedown.bind(this), true);\r\n this.domNode.addEventListener( 'focusin', this.#onFocusIn.bind(this) );\r\n this.domNode.addEventListener( 'focusout', this.#onFocusOut.bind(this) );\r\n //this.domNode.addEventListener('keydown', this.onKeydown.bind(this) );\r\n\r\n this.domNode.classList.add(this.f11ySettings.initialisedClass);\r\n }\r\n\r\n refresh() {\r\n this.init();\r\n }\r\n\r\n /**\r\n * Opens the toast\r\n * @param {string} templateString String that populates the templatable element templateElementAttribute\r\n * @param {Element | HTMLElement | null} customToastTemplate Custom template element to be used as a custom template for this particular toast\r\n */\r\n openToast(templateString, customToastTemplate = null) {\r\n let toastTemplate = this.toastTemplate;\r\n if(customToastTemplate != null) toastTemplate = customToastTemplate;\r\n const builtToast = this.#createToast(toastTemplate, templateString);\r\n const toast = this.domNode.insertAdjacentElement('afterbegin', builtToast.firstChild);\r\n const animatingClass = this.f11ySettings.animatingClass;\r\n const animatingOpenClass = this.f11ySettings.animatingOpenClass;\r\n\r\n toast.addEventListener( 'mouseenter', this.#onHoverIn.bind(this) );\r\n toast.addEventListener( 'mouseleave', this.#onHoverOut.bind(this) );\r\n\r\n toast.addEventListener('click', (event) => {\r\n const closeButton = event.target.closest('[f11y-toast-close]');\r\n if (closeButton) {\r\n this.dismissToast(toast.id);\r\n }\r\n });\r\n\r\n toast.style.setProperty('--f11y-toast-height', toast.offsetHeight);\r\n toast.style.setProperty('--f11y-toast-before', this.activeToasts.length);\r\n\r\n if(this.options.swipeTracking){\r\n toast.addEventListener( 'pointerdown', this.onPointerDown.bind(this) );\r\n toast.addEventListener( 'pointerup', this.onPointerUp.bind(this) );\r\n }\r\n\r\n const openClass = this.options.openClass;\r\n if (this.options.awaitOpenTransition) {\r\n toast.addEventListener('transitionend', handler);\r\n toast.classList.remove('will-animate');\r\n\r\n function handler() {\r\n toast.removeEventListener( 'transitionend', handler );\r\n toast.classList.remove(animatingClass, animatingOpenClass);\r\n toast.classList.add(openClass);\r\n }\r\n }\r\n\r\n const toastObj = { id: toast.id, toastElm: toast, height:toast.offsetHeight};\r\n this.activeToasts.push(toastObj);\r\n this.updateToasts();\r\n this.domNode.classList.add('has-toasts');\r\n\r\n this.options.onOpen(toast, this);\r\n\r\n const duration = this.options.duration;\r\n\r\n if(duration === -1) return;\r\n\r\n toastObj.timer = setTimeout(() => {\r\n this.dismissToast(toast.id);\r\n }, duration);\r\n\r\n toast.addEventListener('mouseenter', () => {\r\n clearTimeout(toastObj.timer);\r\n });\r\n\r\n toast.addEventListener('mouseleave', () => {\r\n toastObj.timer = setTimeout(() => {\r\n this.dismissToast(toast.id);\r\n }, duration);\r\n });\r\n }\r\n\r\n /**\r\n * Dismisses a specified toast\r\n * @param {string} id The id attribute of the toast to dismiss\r\n */\r\n dismissToast(id) {\r\n const toast = this.domNode.querySelector('[f11y-toast-id=\"' + id + '\"]');\r\n this.activeToasts = this.activeToasts.filter(obj => obj.id !== id);\r\n const activeToasts = this.activeToasts;\r\n this.updateToasts();\r\n const domNode = this.domNode;\r\n const openClass = this.options.openClass;\r\n const animatingClass = this.f11ySettings.animatingClass;\r\n const animatingCloseClass = this.f11ySettings.animatingCloseClass;\r\n\r\n toast.remove();\r\n\r\n if(!activeToasts.length){\r\n domNode.classList.remove('.is-hovered', 'has-toasts');\r\n }\r\n\r\n this.options.onDismiss(toast, this);\r\n }\r\n\r\n /**\r\n * Builds the toast dom element form the passed template element\r\n * @param {Element | HTMLElement} template Template element to build the toast from\r\n * @param {string} templateString String that populates the templatable element templateElementAttribute\r\n * @returns \r\n */\r\n #createToast(template, templateString) {\r\n const toastInstance = template.content.cloneNode(true);\r\n const toast = new DocumentFragment();\r\n const toastContainer = document.createElement('div');\r\n const array = new Uint32Array(10);\r\n const toastId = 'toast-' + crypto.getRandomValues(array)[0];\r\n const animatingClass = this.f11ySettings.animatingClass;\r\n const animatingOpenClass = this.f11ySettings.animatingOpenClass;\r\n\r\n if(templateString){\r\n const templatableElm = toastInstance.querySelector('[f11y-toast-message]');\r\n templatableElm.textContent = templateString;\r\n }\r\n\r\n if (template.hasAttributes()) {\r\n for (const attr of template.attributes) {\r\n if (attr.name !== 'id') {\r\n toastContainer.setAttribute(attr.name, attr.value);\r\n }\r\n }\r\n }\r\n\r\n toastContainer.setAttribute(\"f11y-toast-id\", toastId);\r\n toastContainer.id = toastId;\r\n if(this.options.swipeTracking === true) toastContainer.classList.add('has-swiping');\r\n\r\n if (this.options.awaitOpenTransition) {\r\n toastContainer.classList.add('will-animate', animatingClass, animatingOpenClass);\r\n }else{\r\n toastContainer.classList.add(this.options.openClass);\r\n }\r\n\r\n toastContainer.append(toastInstance);\r\n toast.append(toastContainer);\r\n return toast;\r\n }\r\n\r\n /**\r\n * Clears all toasts\r\n */\r\n clearToasts(){\r\n if(!this.activeToasts.length) return;\r\n this.activeToasts.slice().forEach(toast => this.dismissToast(toast.id));\r\n\r\n this.options.onClear(this);\r\n }\r\n\r\n /**\r\n * Updates toast properties and css variable values\r\n */\r\n updateToasts(){\r\n let offset = 0;\r\n for(let i = 0; i < this.activeToasts.length; i++){\r\n const toast = this.activeToasts[i];\r\n toast.toastElm.style.setProperty('--f11y-toast-index', i);\r\n toast.toastElm.style.setProperty('--f11y-toast-before', this.activeToasts.length - i - 1);\r\n\r\n this.domNode.style.setProperty('--f11y-toast-first', toast.height);\r\n }\r\n this.activeToasts.slice().reverse().forEach(function(toast) { // dumb shit\r\n toast.toastElm.style.setProperty('--f11y-toast-offset', offset);\r\n offset = offset + toast.height;\r\n });\r\n }\r\n\r\n /**\r\n * Method called when pointer down on a toast\r\n * @param {Event} e The event object that triggered the method\r\n */\r\n onPointerDown(e){\r\n this.dragStartTime = new Date();\r\n e.currentTarget.setPointerCapture(e.pointerId);\r\n if(e.target.tagName === 'BUTTON') return;\r\n this.dragStartRef = { x: e.clientX, y: e.clientY};\r\n e.currentTarget.addEventListener('pointermove', this.onPointerMoveBound);\r\n }\r\n\r\n /**\r\n * Method called when pointer up on a toast\r\n * @param {Event} e The event object that triggered the method\r\n */\r\n onPointerUp(e){\r\n const dir = this.options.swipeDirection;\r\n const prop = dir === 'left' || dir === 'right' ? '--f11y-toast-swipe-x' : '--f11y-toast-swipe-y';\r\n const swipeAmount = Number(e.currentTarget.style.getPropertyValue(prop) || 0);\r\n const timeTaken = new Date().getTime() - this.dragStartTime.getTime();\r\n const velocity = Math.abs(swipeAmount) / timeTaken;\r\n if(Math.abs(swipeAmount) >= this.swipeThreshold || velocity > 0.25){\r\n this.dismissToast(e.currentTarget.id);\r\n return;\r\n }\r\n e.currentTarget.removeEventListener('pointermove', this.onPointerMoveBound);\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-y', 0); //up-down\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-x', 0); //left-right\r\n e.currentTarget.removeAttribute('f11y-toast-swiping');\r\n }\r\n\r\n /**\r\n * Method called when pointer move happens on toast\r\n * @param {Event} e The event object that triggered the method\r\n */\r\n onPointerMove(e){\r\n e.currentTarget.setAttribute('f11y-toast-swiping', true);\r\n const yPos = e.clientY - this.dragStartRef.y;\r\n const xPos = e.clientX - this.dragStartRef.x;\r\n\r\n const isAllowedToSwipe = this.#checkSwiping(e, yPos, xPos);\r\n\r\n if (!isAllowedToSwipe) {\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-y', 0);\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-x', 0);\r\n }\r\n }\r\n\r\n /**\r\n * Compares the swiping direction with the swipeDirection option to decide if swiping is allowed\r\n * @param {Event} e The event object that triggered the method\r\n * @param {number} yPos \r\n * @param {number} xPos \r\n * @returns {boolean} Is swipipng allowed?\r\n */\r\n #checkSwiping(e, yPos, xPos){\r\n const dir = this.options.swipeDirection;\r\n\r\n let clamp, threshold;\r\n\r\n switch(dir){\r\n case 'up':\r\n clamp = Math.min(0, yPos);\r\n threshold = e.pointerType === 'touch' ? -10 : -2;\r\n if(clamp < threshold){\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-y', yPos);\r\n return true;\r\n }\r\n break;\r\n case 'down':\r\n clamp = Math.max(0, yPos);\r\n threshold = e.pointerType === 'touch' ? 10 : 2;\r\n if(clamp > threshold){\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-y', yPos);\r\n return true;\r\n }\r\n break;\r\n case 'left':\r\n clamp = Math.min(0, xPos);\r\n threshold = e.pointerType === 'touch' ? -10 : -2;\r\n if(clamp < threshold){\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-x', xPos);\r\n return true;\r\n }\r\n break;\r\n case 'right':\r\n default:\r\n clamp = Math.max(0, xPos);\r\n threshold = e.pointerType === 'touch' ? 10 : 2;\r\n if(clamp > threshold){\r\n e.currentTarget.style.setProperty('--f11y-toast-swipe-x', xPos);\r\n return true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Called when hover occurs on toast container domNode\r\n */\r\n #onHoverIn() {\r\n let timer = this.timer;\r\n clearTimeout(timer);\r\n this.domNode.classList.add('is-hovered');\r\n this.domNode.classList.add('has-attention');\r\n }\r\n\r\n /**\r\n * Called when hover leaves toast container domNode\r\n */\r\n #onHoverOut() {\r\n const domNode = this.domNode;\r\n this.timer = setTimeout(function(){\r\n domNode.classList.remove('is-hovered');\r\n domNode.classList.remove('has-attention');\r\n }, 750);\r\n }\r\n\r\n /**\r\n * Called when hover occurs on toast container domNode\r\n */\r\n #onFocusIn() {\r\n let timer = this.timer;\r\n clearTimeout(timer);\r\n this.domNode.classList.add('has-focus');\r\n this.domNode.classList.add('has-attention');\r\n }\r\n \r\n /**\r\n * Called when hover leaves toast container domNode\r\n */\r\n #onFocusOut() {\r\n const domNode = this.domNode;\r\n this.timer = setTimeout(function(){\r\n domNode.classList.remove('has-focus');\r\n domNode.classList.remove('has-attention');\r\n }, 750);\r\n }\r\n\r\n /**\r\n * Handles click events that are outside of the toast domNode remit\r\n * @param {Object} e The event that triggered this method\r\n */\r\n onBackgroundMousedown(e) {\r\n if (!this.domNode.contains(e.target)) {\r\n this.domNode.classList.remove('is-hovered');\r\n this.domNode.classList.remove('has-focus');\r\n this.domNode.classList.remove('has-attention');\r\n }\r\n }\r\n}\r\n\r\nexports.Toast = Toast", "\r\nclass ContentSearch {\r\n constructor(domNode){\r\n this.domNode = domNode;\r\n this.searchInput = this.domNode.querySelector('.search__input');\r\n this.searchSubmit = this.domNode.querySelector('.search__submit');\r\n this.searchClear = this.domNode.querySelector('.search__clear');\r\n this.resultsContainer = this.domNode.querySelector('.results-container');\r\n this.fetchUrl = this.domNode.getAttribute('data-fetch-url');\r\n this.items = [];\r\n\r\n this.loadedEvent = new Event('loaded');\r\n\r\n this.fetchItems(this.fetchUrl);\r\n\r\n this.searchInput.addEventListener(\r\n 'keyup',\r\n this.handleSearchInputKeyup.bind(this)\r\n );\r\n\r\n this.searchSubmit.addEventListener(\r\n 'click',\r\n this.handleSearchSubmitClick.bind(this)\r\n );\r\n\r\n this.searchClear.addEventListener(\r\n 'click',\r\n this.handleSearchClearClick.bind(this)\r\n );\r\n }\r\n\r\n async fetchItems(url){\r\n try {\r\n const res = await fetch(url);\r\n this.items = await res.json();\r\n this.renderItems(this.items);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n\r\n handleSearchSubmitClick(e){\r\n\r\n }\r\n\r\n handleSearchInputKeyup(e){\r\n const searchString = e.target.value.toLowerCase();\r\n let contentType;\r\n\r\n if (e.key === 'Enter') {\r\n this.resultsContainer.scrollIntoView({\r\n behavior: \"auto\"\r\n });\r\n return;\r\n }\r\n\r\n if (e.target.value) {\r\n this.searchClear.classList.remove('is-hidden');\r\n } else {\r\n this.searchClear.classList.add('is-hidden');\r\n }\r\n\r\n const filteredList = this.items.filter((item) => {\r\n let searchableContent = '';\r\n contentType = item.content_type;\r\n searchableContent += item.title.toLowerCase();\r\n searchableContent += ' ';\r\n\r\n if(item.children){\r\n for (var i = 0, l = item.children.length; i < l; i++) {\r\n searchableContent += item.children[i].title.toLowerCase();\r\n searchableContent += ' ';\r\n }\r\n }\r\n\r\n return (\r\n searchableContent.includes(searchString)\r\n );\r\n });\r\n\r\n setTimeout(() => {\r\n if (!this.resultsContainer.hasChildNodes()) {\r\n const noResults = document.createElement(\"div\");\r\n const noResultText = document.createElement(\"h4\");\r\n\r\n noResults.classList.add('no-results');\r\n \r\n if(contentType === \"depot\"){\r\n noResults.classList.add('embla__slide');\r\n noResultText.classList.add(\"sa-200\", \"x-large-body\");\r\n }\r\n\r\n noResultText.textContent = 'Sorry, no results match your search...';\r\n \r\n noResults.appendChild(noResultText);\r\n this.resultsContainer.appendChild(noResults);\r\n }\r\n }, 100);\r\n\r\n this.renderItems(filteredList);\r\n }\r\n\r\n handleSearchClearClick(e){\r\n this.searchInput.value = '';\r\n this.renderItems(this.items);\r\n this.searchClear.classList.add('is-hidden');\r\n }\r\n\r\n renderItems(json){\r\n const htmlString = json.map(\r\n (item) => {\r\n let html = ``;\r\n if(item.content_type == 'depot'){\r\n html = `\r\n
\r\n
\r\n
\r\n ${item.title}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `;\r\n }\r\n if(item.content_type == 'contact'){\r\n html = `\r\n
\r\n
\r\n

${item.title}

\r\n
\r\n
\r\n \r\n ${item.tel}\r\n
\r\n \r\n
\r\n \r\n ${item.email}\r\n
\r\n \r\n
\r\n \r\n ${item.address}\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n Mon - Fri: : ${item.opening_hours.monfri}\r\n
\r\n
\r\n Sat: : ${item.opening_hours.sat}\r\n
\r\n
\r\n Sun: : ${item.opening_hours.sun}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n `;\r\n }\r\n return html;\r\n }\r\n ).join('');\r\n\r\n this.resultsContainer.innerHTML = htmlString;\r\n\r\n this.resultsContainer.dispatchEvent(this.loadedEvent);\r\n }\r\n\r\n}\r\n\r\nexports.ContentSearch = ContentSearch;", "import { isSet } from \"../helpers/isset\";\r\n\r\n/**\r\n * Description: Initialise the inline search feilds\r\n * \r\n * @class InlineSearch\r\n * @typedef {InlineSearch}\r\n */\r\n\r\nclass InlineSearch {\r\n constructor (domNode) {\r\n this.domNode = domNode;\r\n this.previousSearchString = '';\r\n this.doesClearButtonExist = false;\r\n this.timeout = 0;\r\n\r\n window.addEventListener(\r\n 'load',\r\n this.init.bind(this),\r\n true\r\n );\r\n }\r\n\r\n init(){\r\n this.fieldContainer = this.domNode.querySelector('.field-inner');\r\n if(!isSet(this.fieldContainer)){\r\n console.warn(\"Element .field-inner does exist in the domNode\");\r\n return;\r\n }\r\n\r\n this.submitButton = this.fieldContainer.querySelector('button');\r\n if(!isSet(this.submitButton)){\r\n console.warn(\"Search submit button does exist in .field-inner\");\r\n return;\r\n }\r\n\r\n this.searchInput = this.fieldContainer.querySelector('input');\r\n if(!isSet(this.searchInput)){\r\n console.warn(\"Search input does exist in .field-inner\");\r\n return;\r\n }\r\n\r\n this.searchInput.addEventListener(\r\n 'keyup',\r\n this.onSearchInputKeyup.bind(this),\r\n false\r\n );\r\n }\r\n\r\n /**\r\n * Checks if the passed string is different when compared with the previously stored search string this.previousSearchString\r\n * @param {String} value The search query string that we want to check that has changed\r\n */\r\n hasChanged(value){\r\n if(value == this.previousSearchString){\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n buildClearButton(){\r\n const clearButton = document.createElement('button');\r\n clearButton.classList.add('clear-search', 'block-button', 'square', 'secondary');\r\n clearButton.setAttribute('type', 'button');\r\n clearButton.addEventListener(\r\n 'click',\r\n this.onClearButtonClick.bind(this),\r\n false\r\n );\r\n\r\n const span = document.createElement('span');\r\n span.textContent = \"Clear Search\";\r\n span.classList.add(\"is-visually-hidden\");\r\n\r\n const icon = document.createElement('i');\r\n icon.classList.add('sa-icon--close');\r\n\r\n clearButton.append(span);\r\n clearButton.append(icon);\r\n\r\n return clearButton;\r\n }\r\n\r\n onSearchInputKeyup(e){\r\n if(!this.hasChanged(this.searchInput.value)){\r\n return;\r\n }\r\n\r\n this.previousSearchString = this.searchInput.value;\r\n const submitButton = this.submitButton;\r\n this.clearButton = this.buildClearButton();\r\n\r\n const key = e.key;\r\n let flag = false;\r\n\r\n if(this.searchInput.value.length == 0){\r\n this.domNode.querySelector('.clear-search').remove();\r\n this.doesClearButtonExist = false;\r\n submitButton.click();\r\n }\r\n\r\n switch (key) {\r\n case 'Enter':\r\n submitButton.click();\r\n flag = true;\r\n break;\r\n case 'Tab':\r\n flag = false;\r\n break;\r\n default:\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(\r\n function(){\r\n submitButton.click();\r\n },\r\n 750\r\n );\r\n break;\r\n }\r\n\r\n if(this.searchInput.value.length >= 1){\r\n if(this.doesClearButtonExist === false){\r\n this.fieldContainer.append(this.clearButton);\r\n this.doesClearButtonExist = true;\r\n }\r\n }\r\n\r\n if (flag) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n onClearButtonClick(e){\r\n this.searchInput.value = \"\";\r\n this.submitButton.click();\r\n e.currentTarget.remove();\r\n this.doesClearButtonExist = false;\r\n }\r\n}\r\n\r\nexports.InlineSearch = InlineSearch;", "class FieldCounter {\r\n constructor(domNode){\r\n this.domNode = domNode;\r\n this.targetInput = this.domNode.querySelector('input');\r\n this.increaseBtn = this.domNode.querySelector('.counter-increase');\r\n this.decreaseBtn = this.domNode.querySelector('.counter-decrease');\r\n\r\n this.changeEvent = new Event('change');\r\n\r\n this.targetInput.addEventListener(\r\n 'change',\r\n this.handleTargetInputChange.bind(this)\r\n );\r\n\r\n this.increaseBtn.addEventListener(\r\n 'click',\r\n this.handleIncreaseBtnClick.bind(this)\r\n );\r\n\r\n this.decreaseBtn.addEventListener(\r\n 'click',\r\n this.handleDecreaseBtnClick.bind(this)\r\n );\r\n\r\n this.init();\r\n }\r\n\r\n init(){\r\n this.stockAmount = this.targetInput.getAttribute('data-stock-count');\r\n const stockAmount = this.stockAmount;\r\n\r\n this.setInputFilter(\r\n this.targetInput, \r\n function(value) {\r\n return /^\\d*$/.test(value) && (value === \"\" || (parseInt(value) >= 1 && parseInt(value) <= stockAmount));\r\n }, \r\n \"Must be a number between 1 and \" + stockAmount\r\n );\r\n\r\n let value = this.targetInput.value;\r\n\r\n if(!value || value == null) value = 0;\r\n\r\n if(this.targetInput.value <= 1 ){\r\n this.decreaseBtn.setAttribute('disabled','');\r\n }\r\n }\r\n\r\n handleTargetInputChange(e){\r\n this.stockAmount = this.targetInput.getAttribute('data-stock-count');\r\n\r\n if(e.target.value === this.stockAmount){\r\n this.increaseBtn.setAttribute('disabled','');\r\n }else{\r\n this.increaseBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(e.target.value == 1){\r\n this.decreaseBtn.setAttribute('disabled','');\r\n }else{\r\n this.decreaseBtn.removeAttribute('disabled');\r\n }\r\n }\r\n\r\n handleIncreaseBtnClick(e){\r\n this.stockAmount = this.targetInput.getAttribute('data-stock-count');\r\n\r\n let value = this.targetInput.value;\r\n\r\n if(!value || value == null)value = 0;\r\n\r\n let parsedValue = parseInt(value);\r\n\r\n if(parsedValue >= this.stockAmount) return;\r\n\r\n const newValue = parsedValue + 1;\r\n\r\n this.targetInput.value = newValue;\r\n this.targetInput.setAttribute('value', newValue);\r\n this.targetInput.dispatchEvent(this.changeEvent);\r\n }\r\n\r\n handleDecreaseBtnClick(e){\r\n this.stockAmount = this.targetInput.getAttribute('data-stock-count');\r\n\r\n let value = this.targetInput.value;\r\n\r\n if(!value || value == null)value = 0;\r\n\r\n let parsedValue = parseInt(value);\r\n\r\n if(parsedValue <= 1) return;\r\n\r\n const newValue = parsedValue - 1;\r\n\r\n this.targetInput.value = newValue;\r\n this.targetInput.setAttribute('value', newValue);\r\n this.targetInput.dispatchEvent(this.changeEvent);\r\n }\r\n\r\n setInputFilter(targetInput, inputFilter, errMsg) {\r\n const changeEvent = this.changeEvent;\r\n [ \"input\", \"keydown\", \"keyup\", \"mousedown\", \"mouseup\", \"select\", \"contextmenu\", \"drop\", \"focusout\" ].forEach(function(event) {\r\n targetInput.addEventListener(event, function(e) {\r\n \r\n if (inputFilter(this.value)) {\r\n // Accepted value.\r\n if ([ \"keydown\", \"mousedown\", \"focusout\" ].indexOf(e.type) >= 0) {\r\n this.classList.remove(\"input-error\");\r\n this.setCustomValidity(\"\");\r\n }\r\n \r\n this.oldValue = this.value;\r\n this.oldSelectionStart = this.selectionStart;\r\n this.oldSelectionEnd = this.selectionEnd;\r\n targetInput.dispatchEvent(changeEvent);\r\n }\r\n else if (this.hasOwnProperty(\"oldValue\")) {\r\n // Rejected value: restore the previous one.\r\n this.classList.add(\"input-error\");\r\n this.setCustomValidity(errMsg);\r\n this.reportValidity();\r\n this.value = this.oldValue;\r\n this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);\r\n targetInput.dispatchEvent(changeEvent);\r\n }\r\n else {\r\n // Rejected value: nothing to restore.\r\n this.value = \"1\";\r\n targetInput.dispatchEvent(changeEvent);\r\n }\r\n });\r\n });\r\n }\r\n}\r\nexports.FieldCounter = FieldCounter;", "import { PointerEventType } from './DragTracker'\n\nexport type WindowType = Window & typeof globalThis\n\nexport function isNumber(subject: unknown): subject is number {\n return typeof subject === 'number'\n}\n\nexport function isString(subject: unknown): subject is string {\n return typeof subject === 'string'\n}\n\nexport function isBoolean(subject: unknown): subject is boolean {\n return typeof subject === 'boolean'\n}\n\nexport function isObject(subject: unknown): subject is Record {\n return Object.prototype.toString.call(subject) === '[object Object]'\n}\n\nexport function mathAbs(n: number): number {\n return Math.abs(n)\n}\n\nexport function mathSign(n: number): number {\n return Math.sign(n)\n}\n\nexport function deltaAbs(valueB: number, valueA: number): number {\n return mathAbs(valueB - valueA)\n}\n\nexport function factorAbs(valueB: number, valueA: number): number {\n if (valueB === 0 || valueA === 0) return 0\n if (mathAbs(valueB) <= mathAbs(valueA)) return 0\n const diff = deltaAbs(mathAbs(valueB), mathAbs(valueA))\n return mathAbs(diff / valueB)\n}\n\nexport function arrayKeys(array: Type[]): number[] {\n return objectKeys(array).map(Number)\n}\n\nexport function arrayLast(array: Type[]): Type {\n return array[arrayLastIndex(array)]\n}\n\nexport function arrayLastIndex(array: Type[]): number {\n return Math.max(0, array.length - 1)\n}\n\nexport function arrayIsLastIndex(array: Type[], index: number): boolean {\n return index === arrayLastIndex(array)\n}\n\nexport function arrayFromNumber(n: number, startAt: number = 0): number[] {\n return Array.from(Array(n), (_, i) => startAt + i)\n}\n\nexport function objectKeys(object: Type): string[] {\n return Object.keys(object)\n}\n\nexport function objectsMergeDeep(\n objectA: Record,\n objectB: Record\n): Record {\n return [objectA, objectB].reduce((mergedObjects, currentObject) => {\n objectKeys(currentObject).forEach((key) => {\n const valueA = mergedObjects[key]\n const valueB = currentObject[key]\n const areObjects = isObject(valueA) && isObject(valueB)\n\n mergedObjects[key] = areObjects\n ? objectsMergeDeep(valueA, valueB)\n : valueB\n })\n return mergedObjects\n }, {})\n}\n\nexport function isMouseEvent(\n evt: PointerEventType,\n ownerWindow: WindowType\n): evt is MouseEvent {\n return (\n typeof ownerWindow.MouseEvent !== 'undefined' &&\n evt instanceof ownerWindow.MouseEvent\n )\n}\n", "import { isString } from './utils'\n\nexport type AlignmentOptionType =\n | 'start'\n | 'center'\n | 'end'\n | ((viewSize: number, snapSize: number, index: number) => number)\n\nexport type AlignmentType = {\n measure: (n: number, index: number) => number\n}\n\nexport function Alignment(\n align: AlignmentOptionType,\n viewSize: number\n): AlignmentType {\n const predefined = { start, center, end }\n\n function start(): number {\n return 0\n }\n\n function center(n: number): number {\n return end(n) / 2\n }\n\n function end(n: number): number {\n return viewSize - n\n }\n\n function measure(n: number, index: number): number {\n if (isString(align)) return predefined[align](n)\n return align(viewSize, n, index)\n }\n\n const self: AlignmentType = {\n measure\n }\n return self\n}\n", "type EventNameType = keyof DocumentEventMap | keyof WindowEventMap\ntype EventHandlerType = (evt: any) => void\ntype EventOptionsType = boolean | AddEventListenerOptions | undefined\ntype EventRemoverType = () => void\n\nexport type EventStoreType = {\n add: (\n node: EventTarget,\n type: EventNameType,\n handler: EventHandlerType,\n options?: EventOptionsType\n ) => EventStoreType\n clear: () => void\n}\n\nexport function EventStore(): EventStoreType {\n let listeners: EventRemoverType[] = []\n\n function add(\n node: EventTarget,\n type: EventNameType,\n handler: EventHandlerType,\n options: EventOptionsType = { passive: true }\n ): EventStoreType {\n let removeListener: EventRemoverType\n\n if ('addEventListener' in node) {\n node.addEventListener(type, handler, options)\n removeListener = () => node.removeEventListener(type, handler, options)\n } else {\n const legacyMediaQueryList = node\n legacyMediaQueryList.addListener(handler)\n removeListener = () => legacyMediaQueryList.removeListener(handler)\n }\n\n listeners.push(removeListener)\n return self\n }\n\n function clear(): void {\n listeners = listeners.filter((remove) => remove())\n }\n\n const self: EventStoreType = {\n add,\n clear\n }\n return self\n}\n", "import { EngineType } from './Engine'\nimport { EventStore } from './EventStore'\nimport { mathAbs, WindowType } from './utils'\n\nexport type AnimationsUpdateType = (engine: EngineType) => void\nexport type AnimationsRenderType = (\n engine: EngineType,\n lagOffset: number\n) => void\n\nexport type AnimationsType = {\n init: () => void\n destroy: () => void\n start: () => void\n stop: () => void\n update: () => void\n render: (lagOffset: number) => void\n}\n\nexport function Animations(\n ownerDocument: Document,\n ownerWindow: WindowType,\n update: AnimationsType['update'],\n render: AnimationsType['render']\n): AnimationsType {\n const documentVisibleHandler = EventStore()\n const timeStep = 1000 / 60\n let lastTimeStamp: number | null = null\n let lag = 0\n let animationFrame = 0\n\n function init(): void {\n documentVisibleHandler.add(ownerDocument, 'visibilitychange', () => {\n if (ownerDocument.hidden) reset()\n })\n }\n\n function destroy(): void {\n stop()\n documentVisibleHandler.clear()\n }\n\n function animate(timeStamp: DOMHighResTimeStamp): void {\n if (!animationFrame) return\n if (!lastTimeStamp) lastTimeStamp = timeStamp\n\n const elapsed = timeStamp - lastTimeStamp\n lastTimeStamp = timeStamp\n lag += elapsed\n\n while (lag >= timeStep) {\n update()\n lag -= timeStep\n }\n\n const lagOffset = mathAbs(lag / timeStep)\n render(lagOffset)\n\n if (animationFrame) ownerWindow.requestAnimationFrame(animate)\n }\n\n function start(): void {\n if (animationFrame) return\n\n animationFrame = ownerWindow.requestAnimationFrame(animate)\n }\n\n function stop(): void {\n ownerWindow.cancelAnimationFrame(animationFrame)\n lastTimeStamp = null\n lag = 0\n animationFrame = 0\n }\n\n function reset(): void {\n lastTimeStamp = null\n lag = 0\n }\n\n const self: AnimationsType = {\n init,\n destroy,\n start,\n stop,\n update,\n render\n }\n return self\n}\n", "import { NodeRectType } from './NodeRects'\n\nexport type AxisOptionType = 'x' | 'y'\nexport type AxisDirectionOptionType = 'ltr' | 'rtl'\ntype AxisEdgeType = 'top' | 'right' | 'bottom' | 'left'\n\nexport type AxisType = {\n scroll: AxisOptionType\n cross: AxisOptionType\n startEdge: AxisEdgeType\n endEdge: AxisEdgeType\n measureSize: (nodeRect: NodeRectType) => number\n direction: (n: number) => number\n}\n\nexport function Axis(\n axis: AxisOptionType,\n contentDirection: AxisDirectionOptionType\n): AxisType {\n const isRightToLeft = contentDirection === 'rtl'\n const isVertical = axis === 'y'\n const scroll = isVertical ? 'y' : 'x'\n const cross = isVertical ? 'x' : 'y'\n const sign = !isVertical && isRightToLeft ? -1 : 1\n const startEdge = getStartEdge()\n const endEdge = getEndEdge()\n\n function measureSize(nodeRect: NodeRectType): number {\n const { height, width } = nodeRect\n return isVertical ? height : width\n }\n\n function getStartEdge(): AxisEdgeType {\n if (isVertical) return 'top'\n return isRightToLeft ? 'right' : 'left'\n }\n\n function getEndEdge(): AxisEdgeType {\n if (isVertical) return 'bottom'\n return isRightToLeft ? 'left' : 'right'\n }\n\n function direction(n: number): number {\n return n * sign\n }\n\n const self: AxisType = {\n scroll,\n cross,\n startEdge,\n endEdge,\n measureSize,\n direction\n }\n return self\n}\n", "import { mathAbs } from './utils'\n\nexport type LimitType = {\n min: number\n max: number\n length: number\n constrain: (n: number) => number\n reachedAny: (n: number) => boolean\n reachedMax: (n: number) => boolean\n reachedMin: (n: number) => boolean\n removeOffset: (n: number) => number\n}\n\nexport function Limit(min: number = 0, max: number = 0): LimitType {\n const length = mathAbs(min - max)\n\n function reachedMin(n: number): boolean {\n return n < min\n }\n\n function reachedMax(n: number): boolean {\n return n > max\n }\n\n function reachedAny(n: number): boolean {\n return reachedMin(n) || reachedMax(n)\n }\n\n function constrain(n: number): number {\n if (!reachedAny(n)) return n\n return reachedMin(n) ? min : max\n }\n\n function removeOffset(n: number): number {\n if (!length) return n\n return n - length * Math.ceil((n - max) / length)\n }\n\n const self: LimitType = {\n length,\n max,\n min,\n constrain,\n reachedAny,\n reachedMax,\n reachedMin,\n removeOffset\n }\n return self\n}\n", "import { Limit } from './Limit'\nimport { mathAbs } from './utils'\n\nexport type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n}\n\nexport function Counter(\n max: number,\n start: number,\n loop: boolean\n): CounterType {\n const { constrain } = Limit(0, max)\n const loopEnd = max + 1\n let counter = withinLimit(start)\n\n function withinLimit(n: number): number {\n return !loop ? constrain(n) : mathAbs((loopEnd + n) % loopEnd)\n }\n\n function get(): number {\n return counter\n }\n\n function set(n: number): CounterType {\n counter = withinLimit(n)\n return self\n }\n\n function add(n: number): CounterType {\n return clone().set(get() + n)\n }\n\n function clone(): CounterType {\n return Counter(max, get(), loop)\n }\n\n const self: CounterType = {\n get,\n set,\n add,\n clone\n }\n return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { AnimationsType } from './Animations'\nimport { CounterType } from './Counter'\nimport { DragTrackerType, PointerEventType } from './DragTracker'\nimport { EventHandlerType } from './EventHandler'\nimport { AxisType } from './Axis'\nimport { EventStore } from './EventStore'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollTargetType } from './ScrollTarget'\nimport { ScrollToType } from './ScrollTo'\nimport { Vector1DType } from './Vector1d'\nimport { PercentOfViewType } from './PercentOfView'\nimport { Limit } from './Limit'\nimport {\n deltaAbs,\n factorAbs,\n isBoolean,\n isMouseEvent,\n mathAbs,\n mathSign,\n WindowType\n} from './utils'\n\ntype DragHandlerCallbackType = (\n emblaApi: EmblaCarouselType,\n evt: PointerEventType\n) => boolean | void\n\nexport type DragHandlerOptionType = boolean | DragHandlerCallbackType\n\nexport type DragHandlerType = {\n init: (emblaApi: EmblaCarouselType) => void\n destroy: () => void\n pointerDown: () => boolean\n}\n\nexport function DragHandler(\n axis: AxisType,\n rootNode: HTMLElement,\n ownerDocument: Document,\n ownerWindow: WindowType,\n target: Vector1DType,\n dragTracker: DragTrackerType,\n location: Vector1DType,\n animation: AnimationsType,\n scrollTo: ScrollToType,\n scrollBody: ScrollBodyType,\n scrollTarget: ScrollTargetType,\n index: CounterType,\n eventHandler: EventHandlerType,\n percentOfView: PercentOfViewType,\n dragFree: boolean,\n dragThreshold: number,\n skipSnaps: boolean,\n baseFriction: number,\n watchDrag: DragHandlerOptionType\n): DragHandlerType {\n const { cross: crossAxis, direction } = axis\n const focusNodes = ['INPUT', 'SELECT', 'TEXTAREA']\n const nonPassiveEvent = { passive: false }\n const initEvents = EventStore()\n const dragEvents = EventStore()\n const goToNextThreshold = Limit(50, 225).constrain(percentOfView.measure(20))\n const snapForceBoost = { mouse: 300, touch: 400 }\n const freeForceBoost = { mouse: 500, touch: 600 }\n const baseSpeed = dragFree ? 43 : 25\n\n let isMoving = false\n let startScroll = 0\n let startCross = 0\n let pointerIsDown = false\n let preventScroll = false\n let preventClick = false\n let isMouse = false\n\n function init(emblaApi: EmblaCarouselType): void {\n if (!watchDrag) return\n\n function downIfAllowed(evt: PointerEventType): void {\n if (isBoolean(watchDrag) || watchDrag(emblaApi, evt)) down(evt)\n }\n\n const node = rootNode\n initEvents\n .add(node, 'dragstart', (evt) => evt.preventDefault(), nonPassiveEvent)\n .add(node, 'touchmove', () => undefined, nonPassiveEvent)\n .add(node, 'touchend', () => undefined)\n .add(node, 'touchstart', downIfAllowed)\n .add(node, 'mousedown', downIfAllowed)\n .add(node, 'touchcancel', up)\n .add(node, 'contextmenu', up)\n .add(node, 'click', click, true)\n }\n\n function destroy(): void {\n initEvents.clear()\n dragEvents.clear()\n }\n\n function addDragEvents(): void {\n const node = isMouse ? ownerDocument : rootNode\n dragEvents\n .add(node, 'touchmove', move, nonPassiveEvent)\n .add(node, 'touchend', up)\n .add(node, 'mousemove', move, nonPassiveEvent)\n .add(node, 'mouseup', up)\n }\n\n function isFocusNode(node: Element): boolean {\n const nodeName = node.nodeName || ''\n return focusNodes.includes(nodeName)\n }\n\n function forceBoost(): number {\n const boost = dragFree ? freeForceBoost : snapForceBoost\n const type = isMouse ? 'mouse' : 'touch'\n return boost[type]\n }\n\n function allowedForce(force: number, targetChanged: boolean): number {\n const next = index.add(mathSign(force) * -1)\n const baseForce = scrollTarget.byDistance(force, !dragFree).distance\n\n if (dragFree || mathAbs(force) < goToNextThreshold) return baseForce\n if (skipSnaps && targetChanged) return baseForce * 0.5\n\n return scrollTarget.byIndex(next.get(), 0).distance\n }\n\n function down(evt: PointerEventType): void {\n const isMouseEvt = isMouseEvent(evt, ownerWindow)\n isMouse = isMouseEvt\n preventClick = dragFree && isMouseEvt && !evt.buttons && isMoving\n isMoving = deltaAbs(target.get(), location.get()) >= 2\n\n if (isMouseEvt && evt.button !== 0) return\n if (isFocusNode(evt.target as Element)) return\n\n pointerIsDown = true\n dragTracker.pointerDown(evt)\n scrollBody.useFriction(0).useDuration(0)\n target.set(location)\n addDragEvents()\n startScroll = dragTracker.readPoint(evt)\n startCross = dragTracker.readPoint(evt, crossAxis)\n eventHandler.emit('pointerDown')\n }\n\n function move(evt: PointerEventType): void {\n const lastScroll = dragTracker.readPoint(evt)\n const lastCross = dragTracker.readPoint(evt, crossAxis)\n const diffScroll = deltaAbs(lastScroll, startScroll)\n const diffCross = deltaAbs(lastCross, startCross)\n\n if (!preventScroll && !isMouse) {\n if (!evt.cancelable) return up(evt)\n preventScroll = diffScroll > diffCross\n if (!preventScroll) return up(evt)\n }\n const diff = dragTracker.pointerMove(evt)\n if (diffScroll > dragThreshold) preventClick = true\n\n scrollBody.useFriction(0.3).useDuration(1)\n animation.start()\n target.add(direction(diff))\n evt.preventDefault()\n }\n\n function up(evt: PointerEventType): void {\n const currentLocation = scrollTarget.byDistance(0, false)\n const targetChanged = currentLocation.index !== index.get()\n const rawForce = dragTracker.pointerUp(evt) * forceBoost()\n const force = allowedForce(direction(rawForce), targetChanged)\n const forceFactor = factorAbs(rawForce, force)\n const speed = baseSpeed - 10 * forceFactor\n const friction = baseFriction + forceFactor / 50\n\n preventScroll = false\n pointerIsDown = false\n dragEvents.clear()\n scrollBody.useDuration(speed).useFriction(friction)\n scrollTo.distance(force, !dragFree)\n isMouse = false\n eventHandler.emit('pointerUp')\n }\n\n function click(evt: MouseEvent): void {\n if (preventClick) {\n evt.stopPropagation()\n evt.preventDefault()\n preventClick = false\n }\n }\n\n function pointerDown(): boolean {\n return pointerIsDown\n }\n\n const self: DragHandlerType = {\n init,\n pointerDown,\n destroy\n }\n return self\n}\n", "import { AxisOptionType, AxisType } from './Axis'\nimport { isMouseEvent, mathAbs, WindowType } from './utils'\n\ntype PointerCoordType = keyof Touch | keyof MouseEvent\nexport type PointerEventType = TouchEvent | MouseEvent\n\nexport type DragTrackerType = {\n pointerDown: (evt: PointerEventType) => number\n pointerMove: (evt: PointerEventType) => number\n pointerUp: (evt: PointerEventType) => number\n readPoint: (evt: PointerEventType, evtAxis?: AxisOptionType) => number\n}\n\nexport function DragTracker(\n axis: AxisType,\n ownerWindow: WindowType\n): DragTrackerType {\n const logInterval = 170\n\n let startEvent: PointerEventType\n let lastEvent: PointerEventType\n\n function readTime(evt: PointerEventType): number {\n return evt.timeStamp\n }\n\n function readPoint(evt: PointerEventType, evtAxis?: AxisOptionType): number {\n const property = evtAxis || axis.scroll\n const coord: PointerCoordType = `client${property === 'x' ? 'X' : 'Y'}`\n return (isMouseEvent(evt, ownerWindow) ? evt : evt.touches[0])[coord]\n }\n\n function pointerDown(evt: PointerEventType): number {\n startEvent = evt\n lastEvent = evt\n return readPoint(evt)\n }\n\n function pointerMove(evt: PointerEventType): number {\n const diff = readPoint(evt) - readPoint(lastEvent)\n const expired = readTime(evt) - readTime(startEvent) > logInterval\n\n lastEvent = evt\n if (expired) startEvent = evt\n return diff\n }\n\n function pointerUp(evt: PointerEventType): number {\n if (!startEvent || !lastEvent) return 0\n const diffDrag = readPoint(lastEvent) - readPoint(startEvent)\n const diffTime = readTime(evt) - readTime(startEvent)\n const expired = readTime(evt) - readTime(lastEvent) > logInterval\n const force = diffDrag / diffTime\n const isFlick = diffTime && !expired && mathAbs(force) > 0.1\n\n return isFlick ? force : 0\n }\n\n const self: DragTrackerType = {\n pointerDown,\n pointerMove,\n pointerUp,\n readPoint\n }\n return self\n}\n", "export type NodeRectType = {\n top: number\n right: number\n bottom: number\n left: number\n width: number\n height: number\n}\n\nexport type NodeRectsType = {\n measure: (node: HTMLElement) => NodeRectType\n}\n\nexport function NodeRects(): NodeRectsType {\n function measure(node: HTMLElement): NodeRectType {\n const { offsetTop, offsetLeft, offsetWidth, offsetHeight } = node\n const offset: NodeRectType = {\n top: offsetTop,\n right: offsetLeft + offsetWidth,\n bottom: offsetTop + offsetHeight,\n left: offsetLeft,\n width: offsetWidth,\n height: offsetHeight\n }\n\n return offset\n }\n\n const self: NodeRectsType = {\n measure\n }\n return self\n}\n", "export type PercentOfViewType = {\n measure: (n: number) => number\n}\n\nexport function PercentOfView(viewSize: number): PercentOfViewType {\n function measure(n: number): number {\n return viewSize * (n / 100)\n }\n\n const self: PercentOfViewType = {\n measure\n }\n return self\n}\n", "import { AxisType } from './Axis'\nimport { EmblaCarouselType } from './EmblaCarousel'\nimport { EventHandlerType } from './EventHandler'\nimport { NodeRectsType } from './NodeRects'\nimport { isBoolean, mathAbs, WindowType } from './utils'\n\ntype ResizeHandlerCallbackType = (\n emblaApi: EmblaCarouselType,\n entries: ResizeObserverEntry[]\n) => boolean | void\n\nexport type ResizeHandlerOptionType = boolean | ResizeHandlerCallbackType\n\nexport type ResizeHandlerType = {\n init: (emblaApi: EmblaCarouselType) => void\n destroy: () => void\n}\n\nexport function ResizeHandler(\n container: HTMLElement,\n eventHandler: EventHandlerType,\n ownerWindow: WindowType,\n slides: HTMLElement[],\n axis: AxisType,\n watchResize: ResizeHandlerOptionType,\n nodeRects: NodeRectsType\n): ResizeHandlerType {\n let resizeObserver: ResizeObserver\n let containerSize: number\n let slideSizes: number[] = []\n let destroyed = false\n\n function readSize(node: HTMLElement): number {\n return axis.measureSize(nodeRects.measure(node))\n }\n\n function init(emblaApi: EmblaCarouselType): void {\n if (!watchResize) return\n\n containerSize = readSize(container)\n slideSizes = slides.map(readSize)\n\n function defaultCallback(entries: ResizeObserverEntry[]): void {\n for (const entry of entries) {\n const isContainer = entry.target === container\n const slideIndex = slides.indexOf(entry.target)\n const lastSize = isContainer ? containerSize : slideSizes[slideIndex]\n const newSize = readSize(isContainer ? container : slides[slideIndex])\n const diffSize = mathAbs(newSize - lastSize)\n\n if (diffSize >= 0.5) {\n ownerWindow.requestAnimationFrame(() => {\n emblaApi.reInit()\n eventHandler.emit('resize')\n })\n break\n }\n }\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n if (destroyed) return\n if (isBoolean(watchResize) || watchResize(emblaApi, entries)) {\n defaultCallback(entries)\n }\n })\n\n const observeNodes = [container].concat(slides)\n observeNodes.forEach((node) => resizeObserver.observe(node))\n }\n\n function destroy(): void {\n if (resizeObserver) resizeObserver.disconnect()\n destroyed = true\n }\n\n const self: ResizeHandlerType = {\n init,\n destroy\n }\n return self\n}\n", "import { mathSign, mathAbs } from './utils'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollBodyType = {\n direction: () => number\n duration: () => number\n velocity: () => number\n seek: () => ScrollBodyType\n settled: () => boolean\n useBaseFriction: () => ScrollBodyType\n useBaseDuration: () => ScrollBodyType\n useFriction: (n: number) => ScrollBodyType\n useDuration: (n: number) => ScrollBodyType\n}\n\nexport function ScrollBody(\n location: Vector1DType,\n offsetLocation: Vector1DType,\n target: Vector1DType,\n baseDuration: number,\n baseFriction: number\n): ScrollBodyType {\n let bodyVelocity = 0\n let scrollDirection = 0\n let scrollDuration = baseDuration\n let scrollFriction = baseFriction\n let rawLocation = location.get()\n let rawLocationPrevious = 0\n\n function seek(): ScrollBodyType {\n const diff = target.get() - location.get()\n const isInstant = !scrollDuration\n let directionDiff = 0\n\n if (isInstant) {\n bodyVelocity = 0\n location.set(target)\n\n directionDiff = diff\n } else {\n bodyVelocity += diff / scrollDuration\n bodyVelocity *= scrollFriction\n rawLocation += bodyVelocity\n location.add(bodyVelocity)\n\n directionDiff = rawLocation - rawLocationPrevious\n }\n\n scrollDirection = mathSign(directionDiff)\n rawLocationPrevious = rawLocation\n return self\n }\n\n function settled(): boolean {\n const diff = target.get() - offsetLocation.get()\n return mathAbs(diff) < 0.001\n }\n\n function duration(): number {\n return scrollDuration\n }\n\n function direction(): number {\n return scrollDirection\n }\n\n function velocity(): number {\n return bodyVelocity\n }\n\n function useBaseDuration(): ScrollBodyType {\n return useDuration(baseDuration)\n }\n\n function useBaseFriction(): ScrollBodyType {\n return useFriction(baseFriction)\n }\n\n function useDuration(n: number): ScrollBodyType {\n scrollDuration = n\n return self\n }\n\n function useFriction(n: number): ScrollBodyType {\n scrollFriction = n\n return self\n }\n\n const self: ScrollBodyType = {\n direction,\n duration,\n velocity,\n seek,\n settled,\n useBaseFriction,\n useBaseDuration,\n useFriction,\n useDuration\n }\n return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { ScrollBodyType } from './ScrollBody'\nimport { Vector1DType } from './Vector1d'\nimport { mathAbs } from './utils'\nimport { PercentOfViewType } from './PercentOfView'\n\nexport type ScrollBoundsType = {\n constrain: (pointerDown: boolean) => void\n toggleActive: (active: boolean) => void\n}\n\nexport function ScrollBounds(\n limit: LimitType,\n offsetLocation: Vector1DType,\n target: Vector1DType,\n scrollBody: ScrollBodyType,\n percentOfView: PercentOfViewType\n): ScrollBoundsType {\n const pullBackThreshold = percentOfView.measure(10)\n const edgeOffsetTolerance = percentOfView.measure(50)\n const frictionLimit = Limit(0.1, 0.99)\n let disabled = false\n\n function shouldConstrain(): boolean {\n if (disabled) return false\n if (!limit.reachedAny(target.get())) return false\n if (!limit.reachedAny(offsetLocation.get())) return false\n return true\n }\n\n function constrain(pointerDown: boolean): void {\n if (!shouldConstrain()) return\n const edge = limit.reachedMin(offsetLocation.get()) ? 'min' : 'max'\n const diffToEdge = mathAbs(limit[edge] - offsetLocation.get())\n const diffToTarget = target.get() - offsetLocation.get()\n const friction = frictionLimit.constrain(diffToEdge / edgeOffsetTolerance)\n\n target.subtract(diffToTarget * friction)\n\n if (!pointerDown && mathAbs(diffToTarget) < pullBackThreshold) {\n target.set(limit.constrain(target.get()))\n scrollBody.useDuration(25).useBaseFriction()\n }\n }\n\n function toggleActive(active: boolean): void {\n disabled = !active\n }\n\n const self: ScrollBoundsType = {\n constrain,\n toggleActive\n }\n return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { arrayIsLastIndex, arrayLast, deltaAbs } from './utils'\n\nexport type ScrollContainOptionType = false | 'trimSnaps' | 'keepSnaps'\n\nexport type ScrollContainType = {\n snapsContained: number[]\n scrollContainLimit: LimitType\n}\n\nexport function ScrollContain(\n viewSize: number,\n contentSize: number,\n snapsAligned: number[],\n containScroll: ScrollContainOptionType,\n pixelTolerance: number\n): ScrollContainType {\n const scrollBounds = Limit(-contentSize + viewSize, 0)\n const snapsBounded = measureBounded()\n const scrollContainLimit = findScrollContainLimit()\n const snapsContained = measureContained()\n\n function usePixelTolerance(bound: number, snap: number): boolean {\n return deltaAbs(bound, snap) < 1\n }\n\n function findScrollContainLimit(): LimitType {\n const startSnap = snapsBounded[0]\n const endSnap = arrayLast(snapsBounded)\n const min = snapsBounded.lastIndexOf(startSnap)\n const max = snapsBounded.indexOf(endSnap) + 1\n return Limit(min, max)\n }\n\n function measureBounded(): number[] {\n return snapsAligned\n .map((snapAligned, index) => {\n const { min, max } = scrollBounds\n const snap = scrollBounds.constrain(snapAligned)\n const isFirst = !index\n const isLast = arrayIsLastIndex(snapsAligned, index)\n if (isFirst) return max\n if (isLast) return min\n if (usePixelTolerance(min, snap)) return min\n if (usePixelTolerance(max, snap)) return max\n return snap\n })\n .map((scrollBound) => parseFloat(scrollBound.toFixed(3)))\n }\n\n function measureContained(): number[] {\n if (contentSize <= viewSize + pixelTolerance) return [scrollBounds.max]\n if (containScroll === 'keepSnaps') return snapsBounded\n const { min, max } = scrollContainLimit\n return snapsBounded.slice(min, max)\n }\n\n const self: ScrollContainType = {\n snapsContained,\n scrollContainLimit\n }\n return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { arrayLast } from './utils'\n\nexport type ScrollLimitType = {\n limit: LimitType\n}\n\nexport function ScrollLimit(\n contentSize: number,\n scrollSnaps: number[],\n loop: boolean\n): ScrollLimitType {\n const max = scrollSnaps[0]\n const min = loop ? max - contentSize : arrayLast(scrollSnaps)\n const limit = Limit(min, max)\n\n const self: ScrollLimitType = {\n limit\n }\n return self\n}\n", "import { Limit, LimitType } from './Limit'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollLooperType = {\n loop: (direction: number) => void\n}\n\nexport function ScrollLooper(\n contentSize: number,\n limit: LimitType,\n offsetLocation: Vector1DType,\n vectors: Vector1DType[]\n): ScrollLooperType {\n const jointSafety = 0.1\n const min = limit.min + jointSafety\n const max = limit.max + jointSafety\n const { reachedMin, reachedMax } = Limit(min, max)\n\n function shouldLoop(direction: number): boolean {\n if (direction === 1) return reachedMax(offsetLocation.get())\n if (direction === -1) return reachedMin(offsetLocation.get())\n return false\n }\n\n function loop(direction: number): void {\n if (!shouldLoop(direction)) return\n\n const loopDistance = contentSize * (direction * -1)\n vectors.forEach((v) => v.add(loopDistance))\n }\n\n const self: ScrollLooperType = {\n loop\n }\n return self\n}\n", "import { LimitType } from './Limit'\n\nexport type ScrollProgressType = {\n get: (n: number) => number\n}\n\nexport function ScrollProgress(limit: LimitType): ScrollProgressType {\n const { max, length } = limit\n\n function get(n: number): number {\n const currentLocation = n - max\n return length ? currentLocation / -length : 0\n }\n\n const self: ScrollProgressType = {\n get\n }\n return self\n}\n", "import { AlignmentType } from './Alignment'\nimport { AxisType } from './Axis'\nimport { NodeRectType } from './NodeRects'\nimport { SlidesToScrollType } from './SlidesToScroll'\nimport { arrayLast, mathAbs } from './utils'\n\nexport type ScrollSnapsType = {\n snaps: number[]\n snapsAligned: number[]\n}\n\nexport function ScrollSnaps(\n axis: AxisType,\n alignment: AlignmentType,\n containerRect: NodeRectType,\n slideRects: NodeRectType[],\n slidesToScroll: SlidesToScrollType\n): ScrollSnapsType {\n const { startEdge, endEdge } = axis\n const { groupSlides } = slidesToScroll\n const alignments = measureSizes().map(alignment.measure)\n const snaps = measureUnaligned()\n const snapsAligned = measureAligned()\n\n function measureSizes(): number[] {\n return groupSlides(slideRects)\n .map((rects) => arrayLast(rects)[endEdge] - rects[0][startEdge])\n .map(mathAbs)\n }\n\n function measureUnaligned(): number[] {\n return slideRects\n .map((rect) => containerRect[startEdge] - rect[startEdge])\n .map((snap) => -mathAbs(snap))\n }\n\n function measureAligned(): number[] {\n return groupSlides(snaps)\n .map((g) => g[0])\n .map((snap, index) => snap + alignments[index])\n }\n\n const self: ScrollSnapsType = {\n snaps,\n snapsAligned\n }\n return self\n}\n", "import { LimitType } from './Limit'\nimport { ScrollContainOptionType } from './ScrollContain'\nimport { SlidesToScrollType } from './SlidesToScroll'\nimport {\n arrayFromNumber,\n arrayIsLastIndex,\n arrayLast,\n arrayLastIndex\n} from './utils'\n\nexport type SlideRegistryType = {\n slideRegistry: number[][]\n}\n\nexport function SlideRegistry(\n containSnaps: boolean,\n containScroll: ScrollContainOptionType,\n scrollSnaps: number[],\n scrollContainLimit: LimitType,\n slidesToScroll: SlidesToScrollType,\n slideIndexes: number[]\n): SlideRegistryType {\n const { groupSlides } = slidesToScroll\n const { min, max } = scrollContainLimit\n const slideRegistry = createSlideRegistry()\n\n function createSlideRegistry(): number[][] {\n const groupedSlideIndexes = groupSlides(slideIndexes)\n const doNotContain = !containSnaps || containScroll === 'keepSnaps'\n\n if (scrollSnaps.length === 1) return [slideIndexes]\n if (doNotContain) return groupedSlideIndexes\n\n return groupedSlideIndexes.slice(min, max).map((group, index, groups) => {\n const isFirst = !index\n const isLast = arrayIsLastIndex(groups, index)\n\n if (isFirst) {\n const range = arrayLast(groups[0]) + 1\n return arrayFromNumber(range)\n }\n if (isLast) {\n const range = arrayLastIndex(slideIndexes) - arrayLast(groups)[0] + 1\n return arrayFromNumber(range, arrayLast(groups)[0])\n }\n return group\n })\n }\n\n const self: SlideRegistryType = {\n slideRegistry\n }\n return self\n}\n", "import { LimitType } from './Limit'\nimport { Vector1DType } from './Vector1d'\nimport { arrayLast, mathAbs, mathSign } from './utils'\n\nexport type TargetType = {\n distance: number\n index: number\n}\n\nexport type ScrollTargetType = {\n byIndex: (target: number, direction: number) => TargetType\n byDistance: (force: number, snap: boolean) => TargetType\n shortcut: (target: number, direction: number) => number\n}\n\nexport function ScrollTarget(\n loop: boolean,\n scrollSnaps: number[],\n contentSize: number,\n limit: LimitType,\n targetVector: Vector1DType\n): ScrollTargetType {\n const { reachedAny, removeOffset, constrain } = limit\n\n function minDistance(distances: number[]): number {\n return distances.concat().sort((a, b) => mathAbs(a) - mathAbs(b))[0]\n }\n\n function findTargetSnap(target: number): TargetType {\n const distance = loop ? removeOffset(target) : constrain(target)\n const ascDiffsToSnaps = scrollSnaps\n .map((snap, index) => ({ diff: shortcut(snap - distance, 0), index }))\n .sort((d1, d2) => mathAbs(d1.diff) - mathAbs(d2.diff))\n\n const { index } = ascDiffsToSnaps[0]\n return { index, distance }\n }\n\n function shortcut(target: number, direction: number): number {\n const targets = [target, target + contentSize, target - contentSize]\n\n if (!loop) return targets[0]\n if (!direction) return minDistance(targets)\n\n const matchingTargets = targets.filter((t) => mathSign(t) === direction)\n if (matchingTargets.length) return minDistance(matchingTargets)\n return arrayLast(targets) - contentSize\n }\n\n function byIndex(index: number, direction: number): TargetType {\n const diffToSnap = scrollSnaps[index] - targetVector.get()\n const distance = shortcut(diffToSnap, direction)\n return { index, distance }\n }\n\n function byDistance(distance: number, snap: boolean): TargetType {\n const target = targetVector.get() + distance\n const { index, distance: targetSnapDistance } = findTargetSnap(target)\n const reachedBound = !loop && reachedAny(target)\n\n if (!snap || reachedBound) return { index, distance }\n\n const diffToSnap = scrollSnaps[index] - targetSnapDistance\n const snapDistance = distance + shortcut(diffToSnap, 0)\n\n return { index, distance: snapDistance }\n }\n\n const self: ScrollTargetType = {\n byDistance,\n byIndex,\n shortcut\n }\n return self\n}\n", "import { AnimationsType } from './Animations'\nimport { CounterType } from './Counter'\nimport { EventHandlerType } from './EventHandler'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollTargetType, TargetType } from './ScrollTarget'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollToType = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n}\n\nexport function ScrollTo(\n animation: AnimationsType,\n indexCurrent: CounterType,\n indexPrevious: CounterType,\n scrollBody: ScrollBodyType,\n scrollTarget: ScrollTargetType,\n targetVector: Vector1DType,\n eventHandler: EventHandlerType\n): ScrollToType {\n function scrollTo(target: TargetType): void {\n const distanceDiff = target.distance\n const indexDiff = target.index !== indexCurrent.get()\n\n targetVector.add(distanceDiff)\n\n if (distanceDiff) {\n if (scrollBody.duration()) {\n animation.start()\n } else {\n animation.update()\n animation.render(1)\n animation.update()\n }\n }\n\n if (indexDiff) {\n indexPrevious.set(indexCurrent.get())\n indexCurrent.set(target.index)\n eventHandler.emit('select')\n }\n }\n\n function distance(n: number, snap: boolean): void {\n const target = scrollTarget.byDistance(n, snap)\n scrollTo(target)\n }\n\n function index(n: number, direction: number): void {\n const targetIndex = indexCurrent.clone().set(n)\n const target = scrollTarget.byIndex(targetIndex.get(), direction)\n scrollTo(target)\n }\n\n const self: ScrollToType = {\n distance,\n index\n }\n return self\n}\n", "import { EventStoreType } from './EventStore'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollToType } from './ScrollTo'\nimport { SlideRegistryType } from './SlideRegistry'\nimport { isNumber } from './utils'\n\nexport type SlideFocusType = {\n init: () => void\n}\n\nexport function SlideFocus(\n root: HTMLElement,\n slides: HTMLElement[],\n slideRegistry: SlideRegistryType['slideRegistry'],\n scrollTo: ScrollToType,\n scrollBody: ScrollBodyType,\n eventStore: EventStoreType\n): SlideFocusType {\n let lastTabPressTime = 0\n\n function init(): void {\n eventStore.add(document, 'keydown', registerTabPress, false)\n slides.forEach(addSlideFocusEvent)\n }\n\n function registerTabPress(event: KeyboardEvent): void {\n if (event.code === 'Tab') lastTabPressTime = new Date().getTime()\n }\n\n function addSlideFocusEvent(slide: HTMLElement): void {\n const focus = (): void => {\n const nowTime = new Date().getTime()\n const diffTime = nowTime - lastTabPressTime\n\n if (diffTime > 10) return\n\n root.scrollLeft = 0\n const index = slides.indexOf(slide)\n const group = slideRegistry.findIndex((group) => group.includes(index))\n\n if (!isNumber(group)) return\n\n scrollBody.useDuration(0)\n scrollTo.index(group, 0)\n }\n\n eventStore.add(slide, 'focus', focus, {\n passive: true,\n capture: true\n })\n }\n\n const self: SlideFocusType = {\n init\n }\n return self\n}\n", "import { isNumber } from './utils'\n\nexport type Vector1DType = {\n get: () => number\n set: (n: Vector1DType | number) => void\n add: (n: Vector1DType | number) => void\n subtract: (n: Vector1DType | number) => void\n}\n\nexport function Vector1D(initialValue: number): Vector1DType {\n let value = initialValue\n\n function get(): number {\n return value\n }\n\n function set(n: Vector1DType | number): void {\n value = normalizeInput(n)\n }\n\n function add(n: Vector1DType | number): void {\n value += normalizeInput(n)\n }\n\n function subtract(n: Vector1DType | number): void {\n value -= normalizeInput(n)\n }\n\n function normalizeInput(n: Vector1DType | number): number {\n return isNumber(n) ? n : n.get()\n }\n\n const self: Vector1DType = {\n get,\n set,\n add,\n subtract\n }\n return self\n}\n", "import { AxisType } from './Axis'\n\nexport type TranslateType = {\n clear: () => void\n to: (target: number) => void\n toggleActive: (active: boolean) => void\n}\n\nexport function Translate(\n axis: AxisType,\n container: HTMLElement\n): TranslateType {\n const translate = axis.scroll === 'x' ? x : y\n const containerStyle = container.style\n let disabled = false\n\n function x(n: number): string {\n return `translate3d(${n}px,0px,0px)`\n }\n\n function y(n: number): string {\n return `translate3d(0px,${n}px,0px)`\n }\n\n function to(target: number): void {\n if (disabled) return\n containerStyle.transform = translate(axis.direction(target))\n }\n\n function toggleActive(active: boolean): void {\n disabled = !active\n }\n\n function clear(): void {\n if (disabled) return\n containerStyle.transform = ''\n if (!container.getAttribute('style')) container.removeAttribute('style')\n }\n\n const self: TranslateType = {\n clear,\n to,\n toggleActive\n }\n return self\n}\n", "import { AxisType } from './Axis'\nimport { arrayKeys } from './utils'\nimport { Vector1D, Vector1DType } from './Vector1d'\nimport { Translate, TranslateType } from './Translate'\n\ntype SlideBoundType = {\n start: number\n end: number\n}\n\ntype LoopPointType = {\n loopPoint: number\n index: number\n translate: TranslateType\n slideLocation: Vector1DType\n target: () => number\n}\n\nexport type SlideLooperType = {\n canLoop: () => boolean\n clear: () => void\n loop: () => void\n loopPoints: LoopPointType[]\n}\n\nexport function SlideLooper(\n axis: AxisType,\n viewSize: number,\n contentSize: number,\n slideSizes: number[],\n slideSizesWithGaps: number[],\n snaps: number[],\n scrollSnaps: number[],\n offsetLocation: Vector1DType,\n slides: HTMLElement[]\n): SlideLooperType {\n const roundingSafety = 0.5\n const ascItems = arrayKeys(slideSizesWithGaps)\n const descItems = arrayKeys(slideSizesWithGaps).reverse()\n const loopPoints = startPoints().concat(endPoints())\n\n function removeSlideSizes(indexes: number[], from: number): number {\n return indexes.reduce((a: number, i) => {\n return a - slideSizesWithGaps[i]\n }, from)\n }\n\n function slidesInGap(indexes: number[], gap: number): number[] {\n return indexes.reduce((a: number[], i) => {\n const remainingGap = removeSlideSizes(a, gap)\n return remainingGap > 0 ? a.concat([i]) : a\n }, [])\n }\n\n function findSlideBounds(offset: number): SlideBoundType[] {\n return snaps.map((snap, index) => ({\n start: snap - slideSizes[index] + roundingSafety + offset,\n end: snap + viewSize - roundingSafety + offset\n }))\n }\n\n function findLoopPoints(\n indexes: number[],\n offset: number,\n isEndEdge: boolean\n ): LoopPointType[] {\n const slideBounds = findSlideBounds(offset)\n\n return indexes.map((index) => {\n const initial = isEndEdge ? 0 : -contentSize\n const altered = isEndEdge ? contentSize : 0\n const boundEdge = isEndEdge ? 'end' : 'start'\n const loopPoint = slideBounds[index][boundEdge]\n\n return {\n index,\n loopPoint,\n slideLocation: Vector1D(-1),\n translate: Translate(axis, slides[index]),\n target: () => (offsetLocation.get() > loopPoint ? initial : altered)\n }\n })\n }\n\n function startPoints(): LoopPointType[] {\n const gap = scrollSnaps[0]\n const indexes = slidesInGap(descItems, gap)\n return findLoopPoints(indexes, contentSize, false)\n }\n\n function endPoints(): LoopPointType[] {\n const gap = viewSize - scrollSnaps[0] - 1\n const indexes = slidesInGap(ascItems, gap)\n return findLoopPoints(indexes, -contentSize, true)\n }\n\n function canLoop(): boolean {\n return loopPoints.every(({ index }) => {\n const otherIndexes = ascItems.filter((i) => i !== index)\n return removeSlideSizes(otherIndexes, viewSize) <= 0.1\n })\n }\n\n function loop(): void {\n loopPoints.forEach((loopPoint) => {\n const { target, translate, slideLocation } = loopPoint\n const shiftLocation = target()\n if (shiftLocation === slideLocation.get()) return\n translate.to(shiftLocation)\n slideLocation.set(shiftLocation)\n })\n }\n\n function clear(): void {\n loopPoints.forEach((loopPoint) => loopPoint.translate.clear())\n }\n\n const self: SlideLooperType = {\n canLoop,\n clear,\n loop,\n loopPoints\n }\n return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { EventHandlerType } from './EventHandler'\nimport { isBoolean } from './utils'\n\ntype SlidesHandlerCallbackType = (\n emblaApi: EmblaCarouselType,\n mutations: MutationRecord[]\n) => boolean | void\n\nexport type SlidesHandlerOptionType = boolean | SlidesHandlerCallbackType\n\nexport type SlidesHandlerType = {\n init: (emblaApi: EmblaCarouselType) => void\n destroy: () => void\n}\n\nexport function SlidesHandler(\n container: HTMLElement,\n eventHandler: EventHandlerType,\n watchSlides: SlidesHandlerOptionType\n): SlidesHandlerType {\n let mutationObserver: MutationObserver\n let destroyed = false\n\n function init(emblaApi: EmblaCarouselType): void {\n if (!watchSlides) return\n\n function defaultCallback(mutations: MutationRecord[]): void {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n emblaApi.reInit()\n eventHandler.emit('slidesChanged')\n break\n }\n }\n }\n\n mutationObserver = new MutationObserver((mutations) => {\n if (destroyed) return\n if (isBoolean(watchSlides) || watchSlides(emblaApi, mutations)) {\n defaultCallback(mutations)\n }\n })\n\n mutationObserver.observe(container, { childList: true })\n }\n\n function destroy(): void {\n if (mutationObserver) mutationObserver.disconnect()\n destroyed = true\n }\n\n const self: SlidesHandlerType = {\n init,\n destroy\n }\n return self\n}\n", "import { EventHandlerType } from './EventHandler'\nimport { objectKeys } from './utils'\n\ntype IntersectionEntryMapType = {\n [key: number]: IntersectionObserverEntry\n}\n\nexport type SlidesInViewOptionsType = IntersectionObserverInit['threshold']\n\nexport type SlidesInViewType = {\n init: () => void\n destroy: () => void\n get: (inView?: boolean) => number[]\n}\n\nexport function SlidesInView(\n container: HTMLElement,\n slides: HTMLElement[],\n eventHandler: EventHandlerType,\n threshold: SlidesInViewOptionsType\n): SlidesInViewType {\n const intersectionEntryMap: IntersectionEntryMapType = {}\n let inViewCache: number[] | null = null\n let notInViewCache: number[] | null = null\n let intersectionObserver: IntersectionObserver\n let destroyed = false\n\n function init(): void {\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n if (destroyed) return\n\n entries.forEach((entry) => {\n const index = slides.indexOf(entry.target)\n intersectionEntryMap[index] = entry\n })\n\n inViewCache = null\n notInViewCache = null\n eventHandler.emit('slidesInView')\n },\n {\n root: container.parentElement,\n threshold\n }\n )\n\n slides.forEach((slide) => intersectionObserver.observe(slide))\n }\n\n function destroy(): void {\n if (intersectionObserver) intersectionObserver.disconnect()\n destroyed = true\n }\n\n function createInViewList(inView: boolean): number[] {\n return objectKeys(intersectionEntryMap).reduce(\n (list: number[], slideIndex) => {\n const index = parseInt(slideIndex)\n const { isIntersecting } = intersectionEntryMap[index]\n const inViewMatch = inView && isIntersecting\n const notInViewMatch = !inView && !isIntersecting\n\n if (inViewMatch || notInViewMatch) list.push(index)\n return list\n },\n []\n )\n }\n\n function get(inView: boolean = true): number[] {\n if (inView && inViewCache) return inViewCache\n if (!inView && notInViewCache) return notInViewCache\n\n const slideIndexes = createInViewList(inView)\n\n if (inView) inViewCache = slideIndexes\n if (!inView) notInViewCache = slideIndexes\n\n return slideIndexes\n }\n\n const self: SlidesInViewType = {\n init,\n destroy,\n get\n }\n\n return self\n}\n", "import { AxisType } from './Axis'\nimport { NodeRectType } from './NodeRects'\nimport { arrayIsLastIndex, arrayLast, mathAbs, WindowType } from './utils'\n\nexport type SlideSizesType = {\n slideSizes: number[]\n slideSizesWithGaps: number[]\n startGap: number\n endGap: number\n}\n\nexport function SlideSizes(\n axis: AxisType,\n containerRect: NodeRectType,\n slideRects: NodeRectType[],\n slides: HTMLElement[],\n readEdgeGap: boolean,\n ownerWindow: WindowType\n): SlideSizesType {\n const { measureSize, startEdge, endEdge } = axis\n const withEdgeGap = slideRects[0] && readEdgeGap\n const startGap = measureStartGap()\n const endGap = measureEndGap()\n const slideSizes = slideRects.map(measureSize)\n const slideSizesWithGaps = measureWithGaps()\n\n function measureStartGap(): number {\n if (!withEdgeGap) return 0\n const slideRect = slideRects[0]\n return mathAbs(containerRect[startEdge] - slideRect[startEdge])\n }\n\n function measureEndGap(): number {\n if (!withEdgeGap) return 0\n const style = ownerWindow.getComputedStyle(arrayLast(slides))\n return parseFloat(style.getPropertyValue(`margin-${endEdge}`))\n }\n\n function measureWithGaps(): number[] {\n return slideRects\n .map((rect, index, rects) => {\n const isFirst = !index\n const isLast = arrayIsLastIndex(rects, index)\n if (isFirst) return slideSizes[index] + startGap\n if (isLast) return slideSizes[index] + endGap\n return rects[index + 1][startEdge] - rect[startEdge]\n })\n .map(mathAbs)\n }\n\n const self: SlideSizesType = {\n slideSizes,\n slideSizesWithGaps,\n startGap,\n endGap\n }\n return self\n}\n", "import { AxisType } from './Axis'\nimport { NodeRectType } from './NodeRects'\nimport {\n arrayKeys,\n arrayLast,\n arrayLastIndex,\n isNumber,\n mathAbs\n} from './utils'\n\nexport type SlidesToScrollOptionType = 'auto' | number\n\nexport type SlidesToScrollType = {\n groupSlides: (array: Type[]) => Type[][]\n}\n\nexport function SlidesToScroll(\n axis: AxisType,\n viewSize: number,\n slidesToScroll: SlidesToScrollOptionType,\n loop: boolean,\n containerRect: NodeRectType,\n slideRects: NodeRectType[],\n startGap: number,\n endGap: number,\n pixelTolerance: number\n): SlidesToScrollType {\n const { startEdge, endEdge, direction } = axis\n const groupByNumber = isNumber(slidesToScroll)\n\n function byNumber(array: Type[], groupSize: number): Type[][] {\n return arrayKeys(array)\n .filter((i) => i % groupSize === 0)\n .map((i) => array.slice(i, i + groupSize))\n }\n\n function bySize(array: Type[]): Type[][] {\n if (!array.length) return []\n\n return arrayKeys(array)\n .reduce((groups: number[], rectB, index) => {\n const rectA = arrayLast(groups) || 0\n const isFirst = rectA === 0\n const isLast = rectB === arrayLastIndex(array)\n\n const edgeA = containerRect[startEdge] - slideRects[rectA][startEdge]\n const edgeB = containerRect[startEdge] - slideRects[rectB][endEdge]\n const gapA = !loop && isFirst ? direction(startGap) : 0\n const gapB = !loop && isLast ? direction(endGap) : 0\n const chunkSize = mathAbs(edgeB - gapB - (edgeA + gapA))\n\n if (index && chunkSize > viewSize + pixelTolerance) groups.push(rectB)\n if (isLast) groups.push(array.length)\n return groups\n }, [])\n .map((currentSize, index, groups) => {\n const previousSize = Math.max(groups[index - 1] || 0)\n return array.slice(previousSize, currentSize)\n })\n }\n\n function groupSlides(array: Type[]): Type[][] {\n return groupByNumber ? byNumber(array, slidesToScroll) : bySize(array)\n }\n\n const self: SlidesToScrollType = {\n groupSlides\n }\n return self\n}\n", "import { Alignment } from './Alignment'\nimport {\n Animations,\n AnimationsType,\n AnimationsUpdateType,\n AnimationsRenderType\n} from './Animations'\nimport { Axis, AxisType } from './Axis'\nimport { Counter, CounterType } from './Counter'\nimport { DragHandler, DragHandlerType } from './DragHandler'\nimport { DragTracker } from './DragTracker'\nimport { EventHandlerType } from './EventHandler'\nimport { EventStore, EventStoreType } from './EventStore'\nimport { LimitType } from './Limit'\nimport { NodeRectType, NodeRects } from './NodeRects'\nimport { OptionsType } from './Options'\nimport { PercentOfView, PercentOfViewType } from './PercentOfView'\nimport { ResizeHandler, ResizeHandlerType } from './ResizeHandler'\nimport { ScrollBody, ScrollBodyType } from './ScrollBody'\nimport { ScrollBounds, ScrollBoundsType } from './ScrollBounds'\nimport { ScrollContain } from './ScrollContain'\nimport { ScrollLimit } from './ScrollLimit'\nimport { ScrollLooper, ScrollLooperType } from './ScrollLooper'\nimport { ScrollProgress, ScrollProgressType } from './ScrollProgress'\nimport { ScrollSnaps } from './ScrollSnaps'\nimport { SlideRegistry, SlideRegistryType } from './SlideRegistry'\nimport { ScrollTarget, ScrollTargetType } from './ScrollTarget'\nimport { ScrollTo, ScrollToType } from './ScrollTo'\nimport { SlideFocus, SlideFocusType } from './SlideFocus'\nimport { SlideLooper, SlideLooperType } from './SlideLooper'\nimport { SlidesHandler, SlidesHandlerType } from './SlidesHandler'\nimport { SlidesInView, SlidesInViewType } from './SlidesInView'\nimport { SlideSizes } from './SlideSizes'\nimport { SlidesToScroll, SlidesToScrollType } from './SlidesToScroll'\nimport { Translate, TranslateType } from './Translate'\nimport { arrayKeys, arrayLast, arrayLastIndex, WindowType } from './utils'\nimport { Vector1D, Vector1DType } from './Vector1d'\n\nexport type EngineType = {\n ownerDocument: Document\n ownerWindow: WindowType\n eventHandler: EventHandlerType\n axis: AxisType\n animation: AnimationsType\n scrollBounds: ScrollBoundsType\n scrollLooper: ScrollLooperType\n scrollProgress: ScrollProgressType\n index: CounterType\n indexPrevious: CounterType\n limit: LimitType\n location: Vector1DType\n offsetLocation: Vector1DType\n options: OptionsType\n percentOfView: PercentOfViewType\n scrollBody: ScrollBodyType\n dragHandler: DragHandlerType\n eventStore: EventStoreType\n slideLooper: SlideLooperType\n slidesInView: SlidesInViewType\n slidesToScroll: SlidesToScrollType\n target: Vector1DType\n translate: TranslateType\n resizeHandler: ResizeHandlerType\n slidesHandler: SlidesHandlerType\n scrollTo: ScrollToType\n scrollTarget: ScrollTargetType\n scrollSnapList: number[]\n scrollSnaps: number[]\n slideIndexes: number[]\n slideFocus: SlideFocusType\n slideRegistry: SlideRegistryType['slideRegistry']\n containerRect: NodeRectType\n slideRects: NodeRectType[]\n}\n\nexport function Engine(\n root: HTMLElement,\n container: HTMLElement,\n slides: HTMLElement[],\n ownerDocument: Document,\n ownerWindow: WindowType,\n options: OptionsType,\n eventHandler: EventHandlerType\n): EngineType {\n // Options\n const {\n align,\n axis: scrollAxis,\n direction,\n startIndex,\n loop,\n duration,\n dragFree,\n dragThreshold,\n inViewThreshold,\n slidesToScroll: groupSlides,\n skipSnaps,\n containScroll,\n watchResize,\n watchSlides,\n watchDrag\n } = options\n\n // Measurements\n const pixelTolerance = 2\n const nodeRects = NodeRects()\n const containerRect = nodeRects.measure(container)\n const slideRects = slides.map(nodeRects.measure)\n const axis = Axis(scrollAxis, direction)\n const viewSize = axis.measureSize(containerRect)\n const percentOfView = PercentOfView(viewSize)\n const alignment = Alignment(align, viewSize)\n const containSnaps = !loop && !!containScroll\n const readEdgeGap = loop || !!containScroll\n const { slideSizes, slideSizesWithGaps, startGap, endGap } = SlideSizes(\n axis,\n containerRect,\n slideRects,\n slides,\n readEdgeGap,\n ownerWindow\n )\n const slidesToScroll = SlidesToScroll(\n axis,\n viewSize,\n groupSlides,\n loop,\n containerRect,\n slideRects,\n startGap,\n endGap,\n pixelTolerance\n )\n const { snaps, snapsAligned } = ScrollSnaps(\n axis,\n alignment,\n containerRect,\n slideRects,\n slidesToScroll\n )\n const contentSize = -arrayLast(snaps) + arrayLast(slideSizesWithGaps)\n const { snapsContained, scrollContainLimit } = ScrollContain(\n viewSize,\n contentSize,\n snapsAligned,\n containScroll,\n pixelTolerance\n )\n const scrollSnaps = containSnaps ? snapsContained : snapsAligned\n const { limit } = ScrollLimit(contentSize, scrollSnaps, loop)\n\n // Indexes\n const index = Counter(arrayLastIndex(scrollSnaps), startIndex, loop)\n const indexPrevious = index.clone()\n const slideIndexes = arrayKeys(slides)\n\n // Animation\n const update: AnimationsUpdateType = ({\n dragHandler,\n scrollBody,\n scrollBounds,\n options: { loop }\n }) => {\n if (!loop) scrollBounds.constrain(dragHandler.pointerDown())\n scrollBody.seek()\n }\n\n const render: AnimationsRenderType = (\n {\n scrollBody,\n translate,\n location,\n offsetLocation,\n scrollLooper,\n slideLooper,\n dragHandler,\n animation,\n eventHandler,\n options: { loop }\n },\n lagOffset\n ) => {\n const velocity = scrollBody.velocity()\n const hasSettled = scrollBody.settled()\n\n if (hasSettled && !dragHandler.pointerDown()) {\n animation.stop()\n eventHandler.emit('settle')\n }\n if (!hasSettled) eventHandler.emit('scroll')\n\n offsetLocation.set(location.get() - velocity + velocity * lagOffset)\n\n if (loop) {\n scrollLooper.loop(scrollBody.direction())\n slideLooper.loop()\n }\n\n translate.to(offsetLocation.get())\n }\n const animation = Animations(\n ownerDocument,\n ownerWindow,\n () => update(engine),\n (lagOffset: number) => render(engine, lagOffset)\n )\n\n // Shared\n const friction = 0.68\n const startLocation = scrollSnaps[index.get()]\n const location = Vector1D(startLocation)\n const offsetLocation = Vector1D(startLocation)\n const target = Vector1D(startLocation)\n const scrollBody = ScrollBody(\n location,\n offsetLocation,\n target,\n duration,\n friction\n )\n const scrollTarget = ScrollTarget(\n loop,\n scrollSnaps,\n contentSize,\n limit,\n target\n )\n const scrollTo = ScrollTo(\n animation,\n index,\n indexPrevious,\n scrollBody,\n scrollTarget,\n target,\n eventHandler\n )\n const scrollProgress = ScrollProgress(limit)\n const eventStore = EventStore()\n const slidesInView = SlidesInView(\n container,\n slides,\n eventHandler,\n inViewThreshold\n )\n const { slideRegistry } = SlideRegistry(\n containSnaps,\n containScroll,\n scrollSnaps,\n scrollContainLimit,\n slidesToScroll,\n slideIndexes\n )\n const slideFocus = SlideFocus(\n root,\n slides,\n slideRegistry,\n scrollTo,\n scrollBody,\n eventStore\n )\n\n // Engine\n const engine: EngineType = {\n ownerDocument,\n ownerWindow,\n eventHandler,\n containerRect,\n slideRects,\n animation,\n axis,\n dragHandler: DragHandler(\n axis,\n root,\n ownerDocument,\n ownerWindow,\n target,\n DragTracker(axis, ownerWindow),\n location,\n animation,\n scrollTo,\n scrollBody,\n scrollTarget,\n index,\n eventHandler,\n percentOfView,\n dragFree,\n dragThreshold,\n skipSnaps,\n friction,\n watchDrag\n ),\n eventStore,\n percentOfView,\n index,\n indexPrevious,\n limit,\n location,\n offsetLocation,\n options,\n resizeHandler: ResizeHandler(\n container,\n eventHandler,\n ownerWindow,\n slides,\n axis,\n watchResize,\n nodeRects\n ),\n scrollBody,\n scrollBounds: ScrollBounds(\n limit,\n offsetLocation,\n target,\n scrollBody,\n percentOfView\n ),\n scrollLooper: ScrollLooper(contentSize, limit, offsetLocation, [\n location,\n offsetLocation,\n target\n ]),\n scrollProgress,\n scrollSnapList: scrollSnaps.map(scrollProgress.get),\n scrollSnaps,\n scrollTarget,\n scrollTo,\n slideLooper: SlideLooper(\n axis,\n viewSize,\n contentSize,\n slideSizes,\n slideSizesWithGaps,\n snaps,\n scrollSnaps,\n offsetLocation,\n slides\n ),\n slideFocus,\n slidesHandler: SlidesHandler(container, eventHandler, watchSlides),\n slidesInView,\n slideIndexes,\n slideRegistry,\n slidesToScroll,\n target,\n translate: Translate(axis, container)\n }\n\n return engine\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\n\ntype CallbackType = (emblaApi: EmblaCarouselType, evt: EmblaEventType) => void\ntype ListenersType = Partial<{ [key in EmblaEventType]: CallbackType[] }>\n\nexport type EmblaEventType = EmblaEventListType[keyof EmblaEventListType]\n\nexport interface EmblaEventListType {\n init: 'init'\n pointerDown: 'pointerDown'\n pointerUp: 'pointerUp'\n slidesChanged: 'slidesChanged'\n slidesInView: 'slidesInView'\n scroll: 'scroll'\n select: 'select'\n settle: 'settle'\n destroy: 'destroy'\n reInit: 'reInit'\n resize: 'resize'\n}\n\nexport type EventHandlerType = {\n init: (emblaApi: EmblaCarouselType) => void\n emit: (evt: EmblaEventType) => EventHandlerType\n on: (evt: EmblaEventType, cb: CallbackType) => EventHandlerType\n off: (evt: EmblaEventType, cb: CallbackType) => EventHandlerType\n}\n\nexport function EventHandler(): EventHandlerType {\n const listeners: ListenersType = {}\n let api: EmblaCarouselType\n\n function init(emblaApi: EmblaCarouselType): void {\n api = emblaApi\n }\n\n function getListeners(evt: EmblaEventType): CallbackType[] {\n return listeners[evt] || []\n }\n\n function emit(evt: EmblaEventType): EventHandlerType {\n getListeners(evt).forEach((e) => e(api, evt))\n return self\n }\n\n function on(evt: EmblaEventType, cb: CallbackType): EventHandlerType {\n listeners[evt] = getListeners(evt).concat([cb])\n return self\n }\n\n function off(evt: EmblaEventType, cb: CallbackType): EventHandlerType {\n listeners[evt] = getListeners(evt).filter((e) => e !== cb)\n return self\n }\n\n const self: EventHandlerType = {\n init,\n emit,\n off,\n on\n }\n return self\n}\n", "import { AlignmentOptionType } from './Alignment'\nimport { AxisDirectionOptionType, AxisOptionType } from './Axis'\nimport { SlidesToScrollOptionType } from './SlidesToScroll'\nimport { ScrollContainOptionType } from './ScrollContain'\nimport { DragHandlerOptionType } from './DragHandler'\nimport { ResizeHandlerOptionType } from './ResizeHandler'\nimport { SlidesHandlerOptionType } from './SlidesHandler'\nimport { SlidesInViewOptionsType } from './SlidesInView'\n\nexport type LooseOptionsType = {\n [key: string]: unknown\n}\n\nexport type CreateOptionsType = Type & {\n active: boolean\n breakpoints: {\n [key: string]: Omit>, 'breakpoints'>\n }\n}\n\nexport type OptionsType = CreateOptionsType<{\n align: AlignmentOptionType\n axis: AxisOptionType\n container: string | HTMLElement | null\n slides: string | HTMLElement[] | NodeListOf | null\n containScroll: ScrollContainOptionType\n direction: AxisDirectionOptionType\n slidesToScroll: SlidesToScrollOptionType\n dragFree: boolean\n dragThreshold: number\n inViewThreshold: SlidesInViewOptionsType\n loop: boolean\n skipSnaps: boolean\n duration: number\n startIndex: number\n watchDrag: DragHandlerOptionType\n watchResize: ResizeHandlerOptionType\n watchSlides: SlidesHandlerOptionType\n}>\n\nexport const defaultOptions: OptionsType = {\n align: 'center',\n axis: 'x',\n container: null,\n slides: null,\n containScroll: 'trimSnaps',\n direction: 'ltr',\n slidesToScroll: 1,\n inViewThreshold: 0,\n breakpoints: {},\n dragFree: false,\n dragThreshold: 10,\n loop: false,\n skipSnaps: false,\n duration: 25,\n startIndex: 0,\n active: true,\n watchDrag: true,\n watchResize: true,\n watchSlides: true\n}\n\nexport type EmblaOptionsType = Partial\n", "import { LooseOptionsType, CreateOptionsType } from './Options'\nimport { objectKeys, objectsMergeDeep, WindowType } from './utils'\n\ntype OptionsType = Partial>\n\nexport type OptionsHandlerType = {\n mergeOptions: (\n optionsA: TypeA,\n optionsB?: TypeB\n ) => TypeA\n optionsAtMedia: (options: Type) => Type\n optionsMediaQueries: (optionsList: OptionsType[]) => MediaQueryList[]\n}\n\nexport function OptionsHandler(ownerWindow: WindowType): OptionsHandlerType {\n function mergeOptions(\n optionsA: TypeA,\n optionsB?: TypeB\n ): TypeA {\n return objectsMergeDeep(optionsA, optionsB || {})\n }\n\n function optionsAtMedia(options: Type): Type {\n const optionsAtMedia = options.breakpoints || {}\n const matchedMediaOptions = objectKeys(optionsAtMedia)\n .filter((media) => ownerWindow.matchMedia(media).matches)\n .map((media) => optionsAtMedia[media])\n .reduce((a, mediaOption) => mergeOptions(a, mediaOption), {})\n\n return mergeOptions(options, matchedMediaOptions)\n }\n\n function optionsMediaQueries(optionsList: OptionsType[]): MediaQueryList[] {\n return optionsList\n .map((options) => objectKeys(options.breakpoints || {}))\n .reduce((acc, mediaQueries) => acc.concat(mediaQueries), [])\n .map(ownerWindow.matchMedia)\n }\n\n const self: OptionsHandlerType = {\n mergeOptions,\n optionsAtMedia,\n optionsMediaQueries\n }\n return self\n}\n", "import { EmblaCarouselType } from './EmblaCarousel'\nimport { OptionsHandlerType } from './OptionsHandler'\nimport { EmblaPluginsType, EmblaPluginType } from './Plugins'\n\nexport type PluginsHandlerType = {\n init: (\n emblaApi: EmblaCarouselType,\n plugins: EmblaPluginType[]\n ) => EmblaPluginsType\n destroy: () => void\n}\n\nexport function PluginsHandler(\n optionsHandler: OptionsHandlerType\n): PluginsHandlerType {\n let activePlugins: EmblaPluginType[] = []\n\n function init(\n emblaApi: EmblaCarouselType,\n plugins: EmblaPluginType[]\n ): EmblaPluginsType {\n activePlugins = plugins.filter(\n ({ options }) => optionsHandler.optionsAtMedia(options).active !== false\n )\n activePlugins.forEach((plugin) => plugin.init(emblaApi, optionsHandler))\n\n return plugins.reduce(\n (map, plugin) => Object.assign(map, { [plugin.name]: plugin }),\n {}\n )\n }\n\n function destroy(): void {\n activePlugins = activePlugins.filter((plugin) => plugin.destroy())\n }\n\n const self: PluginsHandlerType = {\n init,\n destroy\n }\n return self\n}\n", "import { Engine, EngineType } from './Engine'\nimport { EventStore } from './EventStore'\nimport { EventHandler, EventHandlerType } from './EventHandler'\nimport { defaultOptions, EmblaOptionsType, OptionsType } from './Options'\nimport { OptionsHandler } from './OptionsHandler'\nimport { PluginsHandler } from './PluginsHandler'\nimport { EmblaPluginsType, EmblaPluginType } from './Plugins'\nimport { isString, WindowType } from './utils'\n\nexport type EmblaCarouselType = {\n canScrollNext: () => boolean\n canScrollPrev: () => boolean\n containerNode: () => HTMLElement\n internalEngine: () => EngineType\n destroy: () => void\n off: EventHandlerType['off']\n on: EventHandlerType['on']\n emit: EventHandlerType['emit']\n plugins: () => EmblaPluginsType\n previousScrollSnap: () => number\n reInit: (options?: EmblaOptionsType, plugins?: EmblaPluginType[]) => void\n rootNode: () => HTMLElement\n scrollNext: (jump?: boolean) => void\n scrollPrev: (jump?: boolean) => void\n scrollProgress: () => number\n scrollSnapList: () => number[]\n scrollTo: (index: number, jump?: boolean) => void\n selectedScrollSnap: () => number\n slideNodes: () => HTMLElement[]\n slidesInView: () => number[]\n slidesNotInView: () => number[]\n}\n\nfunction EmblaCarousel(\n root: HTMLElement,\n userOptions?: EmblaOptionsType,\n userPlugins?: EmblaPluginType[]\n): EmblaCarouselType {\n const ownerDocument = root.ownerDocument\n const ownerWindow = ownerDocument.defaultView\n const optionsHandler = OptionsHandler(ownerWindow)\n const pluginsHandler = PluginsHandler(optionsHandler)\n const mediaHandlers = EventStore()\n const eventHandler = EventHandler()\n const { mergeOptions, optionsAtMedia, optionsMediaQueries } = optionsHandler\n const { on, off, emit } = eventHandler\n const reInit = reActivate\n\n let destroyed = false\n let engine: EngineType\n let optionsBase = mergeOptions(defaultOptions, EmblaCarousel.globalOptions)\n let options = mergeOptions(optionsBase)\n let pluginList: EmblaPluginType[] = []\n let pluginApis: EmblaPluginsType\n\n let container: HTMLElement\n let slides: HTMLElement[]\n\n function storeElements(): void {\n const { container: userContainer, slides: userSlides } = options\n\n const customContainer = isString(userContainer)\n ? root.querySelector(userContainer)\n : userContainer\n container = (customContainer || root.children[0])\n\n const customSlides = isString(userSlides)\n ? container.querySelectorAll(userSlides)\n : userSlides\n slides = [].slice.call(customSlides || container.children)\n }\n\n function createEngine(options: OptionsType): EngineType {\n const engine = Engine(\n root,\n container,\n slides,\n ownerDocument,\n ownerWindow,\n options,\n eventHandler\n )\n\n if (options.loop && !engine.slideLooper.canLoop()) {\n const optionsWithoutLoop = Object.assign({}, options, { loop: false })\n return createEngine(optionsWithoutLoop)\n }\n return engine\n }\n\n function activate(\n withOptions?: EmblaOptionsType,\n withPlugins?: EmblaPluginType[]\n ): void {\n if (destroyed) return\n\n optionsBase = mergeOptions(optionsBase, withOptions)\n options = optionsAtMedia(optionsBase)\n pluginList = withPlugins || pluginList\n\n storeElements()\n\n engine = createEngine(options)\n\n optionsMediaQueries([\n optionsBase,\n ...pluginList.map(({ options }) => options)\n ]).forEach((query) => mediaHandlers.add(query, 'change', reActivate))\n\n if (!options.active) return\n\n engine.translate.to(engine.location.get())\n engine.animation.init()\n engine.slidesInView.init()\n engine.slideFocus.init()\n engine.eventHandler.init(self)\n engine.resizeHandler.init(self)\n engine.slidesHandler.init(self)\n\n if (engine.options.loop) engine.slideLooper.loop()\n if (container.offsetParent && slides.length) engine.dragHandler.init(self)\n\n pluginApis = pluginsHandler.init(self, pluginList)\n }\n\n function reActivate(\n withOptions?: EmblaOptionsType,\n withPlugins?: EmblaPluginType[]\n ): void {\n const startIndex = selectedScrollSnap()\n deActivate()\n activate(mergeOptions({ startIndex }, withOptions), withPlugins)\n eventHandler.emit('reInit')\n }\n\n function deActivate(): void {\n engine.dragHandler.destroy()\n engine.eventStore.clear()\n engine.translate.clear()\n engine.slideLooper.clear()\n engine.resizeHandler.destroy()\n engine.slidesHandler.destroy()\n engine.slidesInView.destroy()\n engine.animation.destroy()\n pluginsHandler.destroy()\n mediaHandlers.clear()\n }\n\n function destroy(): void {\n if (destroyed) return\n destroyed = true\n mediaHandlers.clear()\n deActivate()\n eventHandler.emit('destroy')\n }\n\n function scrollTo(index: number, jump?: boolean, direction?: number): void {\n if (!options.active || destroyed) return\n engine.scrollBody\n .useBaseFriction()\n .useDuration(jump === true ? 0 : options.duration)\n engine.scrollTo.index(index, direction || 0)\n }\n\n function scrollNext(jump?: boolean): void {\n const next = engine.index.add(1).get()\n scrollTo(next, jump, -1)\n }\n\n function scrollPrev(jump?: boolean): void {\n const prev = engine.index.add(-1).get()\n scrollTo(prev, jump, 1)\n }\n\n function canScrollNext(): boolean {\n const next = engine.index.add(1).get()\n return next !== selectedScrollSnap()\n }\n\n function canScrollPrev(): boolean {\n const prev = engine.index.add(-1).get()\n return prev !== selectedScrollSnap()\n }\n\n function scrollSnapList(): number[] {\n return engine.scrollSnapList\n }\n\n function scrollProgress(): number {\n return engine.scrollProgress.get(engine.location.get())\n }\n\n function selectedScrollSnap(): number {\n return engine.index.get()\n }\n\n function previousScrollSnap(): number {\n return engine.indexPrevious.get()\n }\n\n function slidesInView(): number[] {\n return engine.slidesInView.get()\n }\n\n function slidesNotInView(): number[] {\n return engine.slidesInView.get(false)\n }\n\n function plugins(): EmblaPluginsType {\n return pluginApis\n }\n\n function internalEngine(): EngineType {\n return engine\n }\n\n function rootNode(): HTMLElement {\n return root\n }\n\n function containerNode(): HTMLElement {\n return container\n }\n\n function slideNodes(): HTMLElement[] {\n return slides\n }\n\n const self: EmblaCarouselType = {\n canScrollNext,\n canScrollPrev,\n containerNode,\n internalEngine,\n destroy,\n off,\n on,\n emit,\n plugins,\n previousScrollSnap,\n reInit,\n rootNode,\n scrollNext,\n scrollPrev,\n scrollProgress,\n scrollSnapList,\n scrollTo,\n selectedScrollSnap,\n slideNodes,\n slidesInView,\n slidesNotInView\n }\n\n activate(userOptions, userPlugins)\n setTimeout(() => eventHandler.emit('init'), 0)\n return self\n}\n\nEmblaCarousel.globalOptions = undefined\n\nexport default EmblaCarousel\n", "const addTogglePrevNextBtnsActive = (emblaApi, prevBtn, nextBtn) => {\r\n\tconst togglePrevNextBtnsState = () => {\r\n\t\tif (emblaApi.canScrollPrev()) prevBtn.removeAttribute('disabled')\r\n\t\telse prevBtn.setAttribute('disabled', 'disabled')\r\n\r\n\t\tif (emblaApi.canScrollNext()) nextBtn.removeAttribute('disabled')\r\n\t\telse nextBtn.setAttribute('disabled', 'disabled')\r\n\t}\r\n\r\n\temblaApi\r\n\t\t.on('select', togglePrevNextBtnsState)\r\n\t\t.on('init', togglePrevNextBtnsState)\r\n\t\t.on('reInit', togglePrevNextBtnsState)\r\n\r\n\treturn () => {\r\n\t\tprevBtn.removeAttribute('disabled')\r\n\t\tnextBtn.removeAttribute('disabled')\r\n\t}\r\n}\r\n\r\nexport const addPrevNextBtnsClickHandlers = (emblaApi, prevBtn, nextBtn) => {\r\n\tconst scrollPrev = () => {\r\n\t\temblaApi.scrollPrev()\r\n\t}\r\n\tconst scrollNext = () => {\r\n\t\temblaApi.scrollNext()\r\n\t}\r\n\tprevBtn.addEventListener('click', scrollPrev, false)\r\n\tnextBtn.addEventListener('click', scrollNext, false)\r\n\r\n\tconst removeTogglePrevNextBtnsActive = addTogglePrevNextBtnsActive(\r\n\t\temblaApi,\r\n\t\tprevBtn,\r\n\t\tnextBtn\r\n\t)\r\n\r\n\treturn () => {\r\n\t\tremoveTogglePrevNextBtnsActive()\r\n\t\tprevBtn.removeEventListener('click', scrollPrev, false)\r\n\t\tnextBtn.removeEventListener('click', scrollNext, false)\r\n\t}\r\n}\r\n", "import { CreateOptionsType } from 'embla-carousel/components/Options'\n\nexport type OptionsType = CreateOptionsType<{\n snapped: string\n inView: string\n draggable: string\n dragging: string\n}>\n\nexport const defaultOptions: OptionsType = {\n active: true,\n breakpoints: {},\n snapped: 'is-snapped',\n inView: 'is-in-view',\n draggable: 'is-draggable',\n dragging: 'is-dragging'\n}\n", "export function removeClass(node: HTMLElement, className: string): void {\n if (!node || !className) return\n const { classList } = node\n if (classList.contains(className)) classList.remove(className)\n}\n\nexport function addClass(node: HTMLElement, className: string): void {\n if (!node || !className) return\n const { classList } = node\n if (!classList.contains(className)) classList.add(className)\n}\n\nexport function nodeListToArray(nodeList: NodeListOf): HTMLElement[] {\n return Array.from(nodeList)\n}\n", "import { defaultOptions, OptionsType } from './Options'\nimport { nodeListToArray, addClass, removeClass } from './utils'\nimport { CreatePluginType } from 'embla-carousel/components/Plugins'\nimport { EmblaCarouselType, EmblaEventType } from 'embla-carousel'\nimport { OptionsHandlerType } from 'embla-carousel/components/OptionsHandler'\n\ndeclare module 'embla-carousel/components/Plugins' {\n interface EmblaPluginsType {\n classNames?: ClassNamesType\n }\n}\n\nexport type ClassNamesType = CreatePluginType<{}, OptionsType>\n\nexport type ClassNamesOptionsType = ClassNamesType['options']\n\nfunction ClassNames(userOptions: ClassNamesOptionsType = {}): ClassNamesType {\n let options: OptionsType\n let emblaApi: EmblaCarouselType\n let root: HTMLElement\n let slides: HTMLElement[]\n const selectedEvents: EmblaEventType[] = ['select']\n const draggingEvents: EmblaEventType[] = ['pointerDown', 'pointerUp']\n const inViewEvents: EmblaEventType[] = ['slidesInView']\n\n function init(\n emblaApiInstance: EmblaCarouselType,\n optionsHandler: OptionsHandlerType\n ): void {\n emblaApi = emblaApiInstance\n\n const { mergeOptions, optionsAtMedia } = optionsHandler\n const optionsBase = mergeOptions(defaultOptions, ClassNames.globalOptions)\n const allOptions = mergeOptions(optionsBase, userOptions)\n options = optionsAtMedia(allOptions)\n\n root = emblaApi.rootNode()\n slides = emblaApi.slideNodes()\n const isDraggable = !!emblaApi.internalEngine().options.watchDrag\n\n if (isDraggable) {\n addClass(root, options.draggable)\n }\n if (options.dragging) {\n draggingEvents.forEach((evt) => emblaApi.on(evt, toggleDraggingClass))\n }\n if (options.snapped) {\n selectedEvents.forEach((evt) => emblaApi.on(evt, toggleSnappedClasses))\n toggleSnappedClasses()\n }\n if (options.inView) {\n inViewEvents.forEach((evt) => emblaApi.on(evt, toggleInViewClasses))\n toggleInViewClasses()\n }\n }\n\n function destroy(): void {\n removeClass(root, options.draggable)\n draggingEvents.forEach((evt) => emblaApi.off(evt, toggleDraggingClass))\n selectedEvents.forEach((evt) => emblaApi.off(evt, toggleSnappedClasses))\n inViewEvents.forEach((evt) => emblaApi.off(evt, toggleInViewClasses))\n slides.forEach((slide) => removeClass(slide, options.snapped))\n }\n\n function toggleDraggingClass(\n _: EmblaCarouselType,\n evt: EmblaEventType\n ): void {\n if (evt === 'pointerDown') addClass(root, options.dragging)\n else removeClass(root, options.dragging)\n }\n\n function toggleSlideClasses(slideIndexes: number[], className: string): void {\n const container = emblaApi.containerNode()\n const slideNodeList = container.querySelectorAll(`.${className}`)\n const removeClassSlides = nodeListToArray(slideNodeList)\n\n removeClassSlides.forEach((slide) => removeClass(slide, className))\n slideIndexes.forEach((index) => addClass(slides[index], className))\n }\n\n function toggleSnappedClasses(): void {\n const { slideRegistry } = emblaApi.internalEngine()\n const slideIndexes = slideRegistry[emblaApi.selectedScrollSnap()]\n toggleSlideClasses(slideIndexes, options.snapped)\n }\n\n function toggleInViewClasses(): void {\n const slideIndexes = emblaApi.slidesInView()\n toggleSlideClasses(slideIndexes, options.inView)\n }\n\n const self: ClassNamesType = {\n name: 'classNames',\n options: userOptions,\n init,\n destroy\n }\n return self\n}\n\nClassNames.globalOptions = undefined\n\nexport default ClassNames\n", "import { isSet } from \"../helpers/isset\";\r\nimport EmblaCarousel from 'embla-carousel';\r\nimport { addPrevNextBtnsClickHandlers } from './embla-carousel-nav';\r\nimport ClassNames from 'embla-carousel-class-names';\r\n/**\r\n * Description: Depot Finder Google Maps Setup\r\n * \r\n * @class DepotFinder\r\n * @typedef {DepotFinder}\r\n */\r\n\r\nclass DepotFinder {\r\n constructor (domNode, MapLib, MarkerLib, InfoWindowLib) {\r\n this.map;\r\n\r\n this.domNode = domNode;\r\n this.dataUrl = domNode.getAttribute(\"data-fetch-url\");\r\n this.mapElm = this.domNode.querySelector(\"#map\");\r\n this.primaryDepotElm = this.domNode.querySelector(\".depot-contact-box.primary\");\r\n this.searchCol = this.domNode.querySelector(\".search-depot-col\");\r\n this.zoomOutControlElm = this.domNode.querySelector(\".map-controls__zoom-out\");\r\n this.zoomInControlElm = this.domNode.querySelector(\".map-controls__zoom-in\");\r\n this.resetControlElm = this.domNode.querySelector(\".map-controls__reset\");\r\n this.locationResultsContainer = this.domNode.querySelector('.results-container');\r\n\r\n //Google Map Libraries\r\n this.MapLib = MapLib;\r\n this.MarkerLib = MarkerLib;\r\n this.InfoWindowLib = InfoWindowLib;\r\n\r\n this.mapMarkers = [];\r\n this.mapWindows = [];\r\n this.locations = [];\r\n this.primarySlug = '';\r\n this.zoom = 7;\r\n this.tilt = 30;\r\n this.lng = -4.2180701859773;\r\n this.lat = 55.86634446616404;\r\n\r\n this.iconBase = \"../assets2024/img/svg/icons/depot-finder/\";\r\n this.icons = {\r\n info: {\r\n icon: this.iconBase + \"pin-outline.svg\",\r\n },\r\n current: {\r\n icon: this.iconBase + \"pin-filled.svg\",\r\n }\r\n };\r\n\r\n const zoom = this.zoom;\r\n const tilt = this.tilt;\r\n const lat = this.lat;\r\n const lng = this.lng;\r\n this.map = new this.MapLib(this.mapElm, {\r\n center: {\r\n lat: lat,\r\n lng: lng\r\n },\r\n zoom: zoom,\r\n tilt: tilt,\r\n mapId: 'fb19892b39e2bfa9',\r\n streetViewControl: false,\r\n clickableIcons: false,\r\n mapTypeControl: false,\r\n fullscreenControl: false,\r\n disableDefaultUI: true,\r\n scrollwheel: false\r\n });\r\n\r\n this.zoomOutControlElm.addEventListener('click', this.handleMapZoomOut.bind(this), false);\r\n this.zoomInControlElm.addEventListener('click', this.handleMapZoomIn.bind(this), false);\r\n this.resetControlElm.addEventListener('click', this.handleMapReset.bind(this), false);\r\n\r\n this.locationResultsContainer.addEventListener('loaded', this.initDepotLocations.bind(this), false);\r\n\r\n this.loadMapLocations(this.dataUrl);\r\n }\r\n\r\n\r\n async loadMapLocations(url){\r\n const jsonres = await fetch(url);\r\n const jsonList = await jsonres.json();\r\n this.jsonList = jsonList;\r\n this.createMapLocations(jsonList);\r\n this.updatePrimaryDepot(jsonList, this.primarySlug);\r\n this.initDepotLocations();\r\n }\r\n\r\n createMapLocations(locations){\r\n let primarySlug;\r\n\r\n locations.map((location) => {\r\n const lat = parseFloat(location.lat);\r\n const lng = parseFloat(location.lng);\r\n\r\n const locationObj = {\r\n \"is_location\": location.location,\r\n \"location_slug\": location.slug,\r\n \"position\": new google.maps.LatLng(lat, lng),\r\n \"type\": location.type,\r\n \"content\": `\r\n
\r\n

${location.title}

\r\n
\r\n \r\n :\r\n ${location.tel}\r\n
\r\n \r\n
\r\n `\r\n };\r\n\r\n if(location.primary === \"true\"){\r\n primarySlug = location.slug;\r\n }\r\n\r\n this.locations.push(locationObj);\r\n });\r\n\r\n this.primarySlug = primarySlug;\r\n\r\n this.buildLocateButton();\r\n this.createMapMarkers();\r\n }\r\n\r\n createMapMarkers(){\r\n const locations = this.locations;\r\n const updatePrimaryDepot = this.updatePrimaryDepot.bind(this);\r\n const jsonList = this.jsonList;\r\n const primaryDepotElm = this.primaryDepotElm;\r\n let currentSlug = this.primarySlug;\r\n\r\n for (let i = 0; i < locations.length; i++) {\r\n const map = this.map;\r\n const location = locations[i];\r\n const icons = this.icons;\r\n\r\n if(!location.is_location && !location.is_location.length) return;\r\n\r\n const marker = new this.MarkerLib(\r\n {\r\n marker_slug: location.location_slug,\r\n position: location.position,\r\n icon: icons.info.icon,\r\n map: map,\r\n }\r\n );\r\n this.mapMarkers.push(marker);\r\n\r\n const window = new this.InfoWindowLib({\r\n content: location.content,\r\n window_slug: location.location_slug,\r\n });\r\n\r\n google.maps.event.addListener(\r\n window,\r\n 'domready',\r\n function(){\r\n if( isSet( primaryDepotElm.querySelector(\"[data-slug]\")) ){\r\n currentSlug = primaryDepotElm.querySelector(\"[data-slug]\").getAttribute(\"data-slug\");\r\n }\r\n\r\n const slug = this.anchor.marker_slug;\r\n const updatePrimaryDepotHandler = (e) => updatePrimaryDepot(jsonList, slug, e);\r\n const trigger = document.querySelector(\".info-window-trigger--js\");\r\n const triggerSpan = trigger.querySelector('span');\r\n\r\n if(currentSlug === slug){\r\n trigger.setAttribute(\"disabled\",\"\");\r\n triggerSpan.textContent = 'Currently Viewing';\r\n }else{\r\n trigger.removeAttribute(\"disabled\");\r\n triggerSpan.textContent = 'View Full Details';\r\n trigger.addEventListener('click', updatePrimaryDepotHandler, false);\r\n }\r\n }\r\n ); \r\n\r\n this.mapWindows.push(window);\r\n\r\n const markerHandler = (e) => this.handleMapMarkerClick(marker, window, e);\r\n\r\n marker.addListener(\"click\", markerHandler);\r\n }\r\n }\r\n \r\n initDepotLocations(){\r\n const handleDepotOptionClick = this.handleDepotOptionClick.bind(this);\r\n const depotLocations = this.domNode.querySelectorAll('.depot-action--js');\r\n\r\n const currentDepotSlug = this.primaryDepotElm.querySelector('[data-slug]').getAttribute('data-slug');\r\n\r\n depotLocations.forEach(function (location) {\r\n const depotResult = location.closest(\".depot-result\");\r\n const slug = location.getAttribute(\"data-slug\");\r\n location.addEventListener('click', handleDepotOptionClick, false);\r\n \r\n if(slug === currentDepotSlug){\r\n depotResult.classList.add(\"current\");\r\n location.textContent = \"Currently Viewing\";\r\n }\r\n });\r\n\r\n const depotResultSliderOpts = {\r\n dragFree: false,\r\n axis: \"y\",\r\n slidesToScroll: 1,\r\n skipSnaps: true\r\n };\r\n\r\n const depotResultSliderNode = this.domNode.querySelector('.embla');\r\n const depotResultSliderViewportNode = this.domNode.querySelector('.embla__viewport');\r\n\r\n const prevBtn = depotResultSliderNode.querySelector('.embla__button--prev');\r\n const nextBtn = depotResultSliderNode.querySelector('.embla__button--next');\r\n\r\n const depotResultSliderEmblaApi = EmblaCarousel(\r\n depotResultSliderViewportNode, \r\n depotResultSliderOpts, \r\n [\r\n ClassNames(\r\n {\r\n snapped: \"\",\r\n draggable: \"\",\r\n dragging: \"\"\r\n }\r\n )\r\n ]\r\n );\r\n\r\n const removePrevNextBtnsClickHandlers = addPrevNextBtnsClickHandlers(\r\n depotResultSliderEmblaApi,\r\n prevBtn,\r\n nextBtn\r\n );\r\n\r\n depotResultSliderEmblaApi.on('destroy', removePrevNextBtnsClickHandlers);\r\n }\r\n\r\n handleDepotOptionClick(e){\r\n const map = this.map;\r\n const icons = this.icons;\r\n const locations = this.domNode.querySelectorAll('.depot-result');\r\n const resultElm = e.target.closest('.depot-result');\r\n const buttonElm = e.target;\r\n const slug = buttonElm.getAttribute(\"data-slug\");\r\n\r\n locations.forEach(function (location) {\r\n location.classList.remove(\"current\");\r\n location.querySelector(\"button\").textContent = \"View\";\r\n });\r\n\r\n resultElm.classList.add(\"current\");\r\n buttonElm.textContent = \"Currently Viewing\";\r\n this.updatePrimaryDepot(this.jsonList, slug);\r\n\r\n this.mapWindows.forEach(function (window){\r\n window.close();\r\n })\r\n\r\n this.mapMarkers.forEach(function (marker){\r\n marker.setIcon(icons.info.icon);\r\n\r\n if(marker.marker_slug === slug){\r\n map.panTo(marker.position);\r\n marker.setIcon(icons.current.icon);\r\n }\r\n });\r\n\r\n this.searchCol.scrollIntoView({ behavior: \"smooth\" });\r\n }\r\n\r\n handleMapZoomIn(){\r\n const map = this.map;\r\n map.setZoom(map.getZoom() + 1);\r\n }\r\n\r\n handleMapZoomOut(){\r\n const map = this.map;\r\n map.setZoom(map.getZoom() - 1);\r\n }\r\n\r\n handleMapReset(){\r\n const position = new google.maps.LatLng(this.lat, this.lng);\r\n\r\n this.map.setZoom(this.zoom);\r\n this.map.setTilt(this.tilt);\r\n this.map.panTo(position);\r\n }\r\n\r\n handleMapMarkerClick(marker, window, e){\r\n const map = this.map;\r\n const icons = this.icons;\r\n const markers = this.mapMarkers;\r\n const windows = this.mapWindows;\r\n\r\n for (let i = 0; i < windows.length; i++) {\r\n const window = windows[i];\r\n window.close();\r\n }\r\n\r\n for (let i = 0; i < markers.length; i++) {\r\n const marker = markers[i];\r\n marker.setIcon(icons.info.icon);\r\n }\r\n\r\n marker.setIcon(icons.current.icon);\r\n\r\n map.panTo(\r\n marker.position\r\n );\r\n\r\n window.open({\r\n anchor: marker,\r\n map,\r\n shouldFocus: false,\r\n });\r\n\r\n google.maps.event.addListener(map, 'click', function() {\r\n window.close();\r\n marker.open = false;\r\n });\r\n }\r\n\r\n buildLocateButton(){\r\n if (!navigator.geolocation) return;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('map-controls__locate', 'button', 'square');\r\n\r\n const icon = document.createElement('i');\r\n icon.classList.add('sa-icon--locate');\r\n\r\n button.append(icon);\r\n const mapControlsContainer = document.querySelector('.map-controls');\r\n\r\n button.addEventListener('click', this.handleLocateButtonClick.bind(this), false);\r\n\r\n mapControlsContainer.append(button);\r\n }\r\n\r\n getDistance(userLat, userLng, depotLat, depotLng, unit) {\r\n if ((userLat == depotLat) && (userLng == depotLng)) {\r\n return 0;\r\n } else {\r\n const radUserlat = Math.PI * userLat/180;\r\n const radDepotLat = Math.PI * depotLat/180;\r\n const theta = userLng-depotLng;\r\n const radTheta = Math.PI * theta/180;\r\n let dist = Math.sin(radUserlat) * Math.sin(radDepotLat) + Math.cos(radUserlat) * Math.cos(radDepotLat) * Math.cos(radTheta);\r\n \r\n if (dist > 1) {\r\n dist = 1;\r\n }\r\n\r\n dist = Math.acos(dist);\r\n dist = dist * 180/Math.PI;\r\n dist = dist * 60 * 1.1515;\r\n\r\n if (unit==\"K\") { \r\n dist = dist * 1.609344 \r\n }\r\n\r\n if (unit==\"N\") { \r\n dist = dist * 0.8684 \r\n }\r\n\r\n return dist;\r\n }\r\n }\r\n\r\n async getUserLocation() {\r\n const pos = await new Promise((resolve, reject) => {\r\n navigator.geolocation.getCurrentPosition(resolve, reject);\r\n });\r\n \r\n return {\r\n lng: pos.coords.longitude,\r\n lat: pos.coords.latitude,\r\n };\r\n }\r\n\r\n findClosestDepotLocation(userLocation){\r\n const locations = this.locations;\r\n const user = userLocation;\r\n let closestLocation = \"\";\r\n let closestLocationDistance = \"\"\r\n\r\n for (let i = 0; i < locations.length; i++) {\r\n let location = locations[i];\r\n\r\n let userLat = user.lat;\r\n let userLng = user.lng;\r\n let locationLat = location.position.lat();\r\n let locationLng = location.position.lng();\r\n\r\n let distance = this.getDistance(userLat, userLng, locationLat, locationLng);\r\n\r\n if(!location.is_location && !location.is_location.length) continue;\r\n\r\n if(closestLocation == \"\" || closestLocationDistance == \"\"){\r\n closestLocation = location;\r\n closestLocationDistance = distance;\r\n continue;\r\n }\r\n\r\n if(distance < closestLocationDistance){\r\n closestLocation = location;\r\n closestLocationDistance = distance;\r\n }\r\n }\r\n\r\n this.closestLocation = closestLocation;\r\n }\r\n\r\n async handleLocateButtonClick(){\r\n if(!isSet(this.closestLocation)){\r\n const userLocation = await this.getUserLocation();\r\n this.findClosestDepotLocation(userLocation);\r\n }\r\n\r\n const map = this.map;\r\n const markers = this.mapMarkers;\r\n const windows = this.mapWindows;\r\n const icons = this.icons;\r\n let closestWindow;\r\n let closestMarker;\r\n\r\n for (let i = 0; i < windows.length; i++) {\r\n const infoWindow = windows[i];\r\n infoWindow.close();\r\n \r\n if(this.closestLocation.location_slug == infoWindow.window_slug){\r\n closestWindow = infoWindow;\r\n }\r\n }\r\n\r\n for (let i = 0; i < markers.length; i++) {\r\n const marker = markers[i];\r\n marker.setIcon(icons.info.icon);\r\n\r\n if(this.closestLocation.location_slug == marker.marker_slug){\r\n closestMarker = marker;\r\n }\r\n }\r\n\r\n closestMarker.setIcon(icons.current.icon);\r\n\r\n map.panTo(\r\n closestMarker.position\r\n );\r\n\r\n map.setZoom(10);\r\n\r\n closestWindow.open({\r\n anchor: closestMarker,\r\n map,\r\n shouldFocus: false,\r\n });\r\n\r\n google.maps.event.addListener(map, 'click', function() {\r\n closestWindow.close();\r\n closestMarker.open = false;\r\n });\r\n\r\n this.updatePrimaryDepot(this.jsonList, this.closestLocation.location_slug);\r\n }\r\n\r\n updatePrimaryDepot(jsonList, depotSlug, e){\r\n const primaryDepotElm = this.primaryDepotElm;\r\n\r\n jsonList.forEach(function (item) {\r\n if(item.slug !== depotSlug) return;\r\n\r\n const primaryBoxFragment = document.createDocumentFragment();\r\n\r\n const contentsElement = document.createElement(\"div\");\r\n contentsElement.classList.add(\"card__content\");\r\n\r\n const depotTitleElement = document.createElement(\"h3\");\r\n depotTitleElement.classList.add(\"depot-title\");\r\n depotTitleElement.textContent = item.title;\r\n contentsElement.appendChild(depotTitleElement);\r\n\r\n const details = [\r\n {\r\n \"key\": \"tel\",\r\n \"icon\": \"sa-icon--phone\",\r\n \"value\": item.tel\r\n },\r\n {\r\n \"key\": \"email\",\r\n \"icon\": \"sa-icon--email\",\r\n \"value\": item.email\r\n },\r\n {\r\n \"key\": \"address\",\r\n \"icon\": \"sa-icon--home\",\r\n \"value\": item.address\r\n },\r\n {\r\n \"key\": \"hours\",\r\n \"icon\": \"sa-icon--calendar\",\r\n \"value\": item.opening_hours\r\n }\r\n ];\r\n\r\n const detailsElement = document.createElement(\"div\");\r\n detailsElement.classList.add(\"card__details\", \"card--depot__details\");\r\n\r\n details.forEach((detail) => {\r\n if(!isSet(detail.value)) return;\r\n\r\n const detailElement = document.createElement(\"div\");\r\n detailElement.classList.add(\"card__detail\", \"card--depot__detail\");\r\n\r\n const iconElement = document.createElement(\"i\");\r\n iconElement.classList.add(detail.icon);\r\n detailElement.appendChild(iconElement);\r\n\r\n if(detail.key != \"hours\"){\r\n let valueElement;\r\n\r\n if(detail.key == \"tel\" || detail.key == \"email\"){\r\n valueElement = document.createElement(\"a\");\r\n }else{\r\n valueElement = document.createElement(\"span\");\r\n }\r\n\r\n if(detail.key == \"email\"){\r\n valueElement.href = \"mailto:\" + detail.value;\r\n }\r\n\r\n if(detail.key == \"tel\"){\r\n valueElement.href = \"tel:\" + detail.value;\r\n }\r\n valueElement.textContent = detail.value;\r\n detailElement.appendChild(valueElement);\r\n }else{\r\n const valueContainerElement = document.createElement(\"div\");\r\n valueContainerElement.classList.add(\"inner-items\");\r\n\r\n Object.entries(detail.value).forEach(([key,value]) => {\r\n const valueElement = document.createElement(\"div\");\r\n const labelElement = document.createElement(\"span\");\r\n const seperatorElement = document.createElement(\"span\");\r\n const innerValueElement = document.createElement(\"span\");\r\n \r\n\r\n if(key === \"monfri\"){\r\n key = \"mon - fri\";\r\n }\r\n labelElement.textContent = key.charAt(0).toUpperCase() + key.slice(1);\r\n seperatorElement.textContent = \" : \";\r\n innerValueElement.textContent = value;\r\n\r\n valueElement.appendChild(labelElement);\r\n valueElement.appendChild(seperatorElement);\r\n valueElement.appendChild(innerValueElement);\r\n\r\n valueContainerElement.appendChild(valueElement);\r\n });\r\n\r\n detailElement.appendChild(valueContainerElement);\r\n }\r\n \r\n detailsElement.append(detailElement);\r\n });\r\n\r\n contentsElement.appendChild(detailsElement);\r\n contentsElement.setAttribute(\"data-slug\", item.slug);\r\n primaryBoxFragment.appendChild(contentsElement);\r\n\r\n primaryDepotElm.innerHTML = \"\";\r\n primaryDepotElm.appendChild(primaryBoxFragment);\r\n });\r\n\r\n const windowTrigger = document.querySelector(\".info-window-trigger--js\");\r\n if(isSet(windowTrigger)){\r\n windowTrigger.setAttribute(\"disabled\",\"\");\r\n const windowTriggerSpan = windowTrigger.querySelector('span');\r\n windowTriggerSpan.textContent = 'Currently Viewing';\r\n }\r\n\r\n const depotSearchLocations = this.domNode.querySelectorAll('.depot-result');\r\n\r\n depotSearchLocations.forEach(function (depot){\r\n const button = depot.querySelector(\"button\");\r\n const slug = button.getAttribute(\"data-slug\");\r\n\r\n depot.classList.remove(\"current\");\r\n button.textContent = \"View\";\r\n\r\n if(slug === depotSlug){\r\n depot.classList.add(\"current\");\r\n button.textContent = \"Currently Viewing\";\r\n }\r\n });\r\n\r\n if(isSet(e) && e.type == \"click\"){\r\n this.searchCol.scrollIntoView({ behavior: \"smooth\" });\r\n }\r\n }\r\n}\r\n\r\nexports.DepotFinder = DepotFinder", "import { isSet } from \"../helpers/isset\";\r\n\r\n/**\r\n * Description: Initialise the inline search feilds\r\n * \r\n * @class EnquiryLink\r\n * @typedef {EnquiryLink}\r\n */\r\n\r\nclass EnquiryLink {\r\n constructor (domNode, enquiryForm) {\r\n this.domNode = domNode;\r\n this.enquiryForm = enquiryForm;\r\n this.type = \"simple\";\r\n this.prefix = '';\r\n this.init();\r\n }\r\n\r\n init(){\r\n this.card = this.domNode.closest('.card');\r\n\r\n if(!isSet(this.card)){\r\n console.log(this.domNode + ' is not contained inside a card component');\r\n return;\r\n }\r\n\r\n this.cardTitle = this.card.querySelector('[data-title]');\r\n\r\n if(!isSet(this.cardTitle)){\r\n console.log('There is no assigned title element on ' + this.card);\r\n return;\r\n }\r\n\r\n this.title = this.escape(this.cardTitle.textContent);\r\n\r\n this.setMessagePrefix();\r\n\r\n this.domNode.addEventListener(\r\n 'click',\r\n this.onEnquireButtonClick.bind(this)\r\n );\r\n }\r\n\r\n setMessagePrefix(){\r\n if(this.card.classList.contains('card--stock')){\r\n this.type = \"stock\";\r\n this.prefix = 'the stock item: '\r\n }else if(this.card.classList.contains('card--machinery--model')){\r\n this.type = \"machinery\";\r\n this.prefix = 'the machinery model: '\r\n }else if(this.card.classList.contains('card--simple')){\r\n this.type = \"simple\";\r\n this.prefix = '';\r\n }else{\r\n this.type = \"simple\";\r\n this.prefix = '';\r\n }\r\n }\r\n\r\n /**\r\n * Escapes a string\r\n * @param {String} string The string that is to be escaped\r\n */\r\n escape(string) {\r\n return string\r\n .replace(/&/g, \"&\")\r\n .replace(//g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\");\r\n }\r\n\r\n setQueryString(){\r\n localStorage.setItem(\r\n 'message', \r\n JSON.stringify({\r\n type: this.type,\r\n title: this.title\r\n })\r\n );\r\n this.domNode.href += '?enquire=true';\r\n }\r\n\r\n onEnquireButtonClick(e){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n if(isSet(this.enquiryForm)){\r\n const messageField = this.enquiryForm.querySelector('.message textarea');\r\n\r\n if(isSet(messageField)){\r\n\r\n \r\n const messageValue = \"Hello, I would like to make an enquiry regarding \"+ this.prefix + ' \"' + this.title + '\"';\r\n messageField.value = messageValue;\r\n\r\n const yOffset = -100; \r\n const y = this.enquiryForm.getBoundingClientRect().top + window.scrollY + yOffset;\r\n window.scrollTo(\r\n {\r\n top: y, \r\n behavior: 'smooth'\r\n }\r\n );\r\n }\r\n } else{\r\n this.setQueryString();\r\n window.location.href = this.domNode.href;\r\n }\r\n }\r\n}\r\n\r\nexports.EnquiryLink = EnquiryLink;", "import { CreateOptionsType } from 'embla-carousel/components/Options'\n\nexport type OptionsType = CreateOptionsType<{\n delay: number\n jump: boolean\n playOnInit: boolean\n stopOnFocusIn: boolean\n stopOnInteraction: boolean\n stopOnMouseEnter: boolean\n stopOnLastSnap: boolean\n rootNode: ((emblaRoot: HTMLElement) => HTMLElement | null) | null\n}>\n\nexport const defaultOptions: OptionsType = {\n active: true,\n breakpoints: {},\n delay: 4000,\n jump: false,\n playOnInit: true,\n stopOnFocusIn: true,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n stopOnLastSnap: false,\n rootNode: null\n}\n", "import { OptionsType, defaultOptions } from './Options'\nimport { CreatePluginType } from 'embla-carousel/components/Plugins'\nimport { OptionsHandlerType } from 'embla-carousel/components/OptionsHandler'\nimport { EmblaCarouselType } from 'embla-carousel'\n\ndeclare module 'embla-carousel/components/Plugins' {\n interface EmblaPluginsType {\n autoplay?: AutoplayType\n }\n}\n\ndeclare module 'embla-carousel/components/EventHandler' {\n interface EmblaEventListType {\n autoplayPlay: 'autoplay:play'\n autoplayStop: 'autoplay:stop'\n }\n}\n\nexport type AutoplayType = CreatePluginType<\n {\n play: (jump?: boolean) => void\n stop: () => void\n reset: () => void\n isPlaying: () => boolean\n },\n OptionsType\n>\n\nexport type AutoplayOptionsType = AutoplayType['options']\n\nfunction Autoplay(userOptions: AutoplayOptionsType = {}): AutoplayType {\n let options: OptionsType\n let emblaApi: EmblaCarouselType\n let destroyed: boolean\n let playing = false\n let resume = true\n let jump = false\n let timer = 0\n\n function init(\n emblaApiInstance: EmblaCarouselType,\n optionsHandler: OptionsHandlerType\n ): void {\n emblaApi = emblaApiInstance\n\n const { mergeOptions, optionsAtMedia } = optionsHandler\n const optionsBase = mergeOptions(defaultOptions, Autoplay.globalOptions)\n const allOptions = mergeOptions(optionsBase, userOptions)\n options = optionsAtMedia(allOptions)\n\n if (emblaApi.scrollSnapList().length <= 1) return\n\n jump = options.jump\n destroyed = false\n\n const { eventStore, ownerDocument } = emblaApi.internalEngine()\n const emblaRoot = emblaApi.rootNode()\n const root = (options.rootNode && options.rootNode(emblaRoot)) || emblaRoot\n const container = emblaApi.containerNode()\n\n emblaApi.on('pointerDown', stopTimer)\n\n if (!options.stopOnInteraction) {\n emblaApi.on('pointerUp', startTimer)\n }\n\n if (options.stopOnMouseEnter) {\n eventStore.add(root, 'mouseenter', () => {\n resume = false\n stopTimer()\n })\n\n if (!options.stopOnInteraction) {\n eventStore.add(root, 'mouseleave', () => {\n resume = true\n startTimer()\n })\n }\n }\n\n if (options.stopOnFocusIn) {\n eventStore.add(container, 'focusin', stopTimer)\n\n if (!options.stopOnInteraction) {\n eventStore.add(container, 'focusout', startTimer)\n }\n }\n\n eventStore.add(ownerDocument, 'visibilitychange', visibilityChange)\n\n if (options.playOnInit && !documentIsHidden()) startTimer()\n }\n\n function destroy(): void {\n emblaApi.off('pointerDown', stopTimer).off('pointerUp', startTimer)\n stopTimer()\n destroyed = true\n playing = false\n }\n\n function startTimer(): void {\n if (destroyed) return\n if (!resume) return\n if (!playing) emblaApi.emit('autoplay:play')\n const { ownerWindow } = emblaApi.internalEngine()\n ownerWindow.clearInterval(timer)\n timer = ownerWindow.setInterval(next, options.delay)\n playing = true\n }\n\n function stopTimer(): void {\n if (destroyed) return\n if (playing) emblaApi.emit('autoplay:stop')\n const { ownerWindow } = emblaApi.internalEngine()\n ownerWindow.clearInterval(timer)\n timer = 0\n playing = false\n }\n\n function visibilityChange(): void {\n if (documentIsHidden()) {\n resume = playing\n return stopTimer()\n }\n\n if (resume) startTimer()\n }\n\n function documentIsHidden(): boolean {\n const { ownerDocument } = emblaApi.internalEngine()\n return ownerDocument.visibilityState === 'hidden'\n }\n\n function play(jumpOverride?: boolean): void {\n if (typeof jumpOverride !== 'undefined') jump = jumpOverride\n resume = true\n startTimer()\n }\n\n function stop(): void {\n if (playing) stopTimer()\n }\n\n function reset(): void {\n if (playing) play()\n }\n\n function isPlaying(): boolean {\n return playing\n }\n\n function next(): void {\n const { index } = emblaApi.internalEngine()\n const nextIndex = index.clone().add(1).get()\n const lastIndex = emblaApi.scrollSnapList().length - 1\n const kill = options.stopOnLastSnap && nextIndex === lastIndex\n\n if (kill) stopTimer()\n\n if (emblaApi.canScrollNext()) {\n emblaApi.scrollNext(jump)\n } else {\n emblaApi.scrollTo(0, jump)\n }\n }\n\n const self: AutoplayType = {\n name: 'autoplay',\n options: userOptions,\n init,\n destroy,\n play,\n stop,\n reset,\n isPlaying\n }\n return self\n}\n\nAutoplay.globalOptions = undefined\n\nexport default Autoplay\n", "const TWEEN_FACTOR_BASE = 0.4\r\nlet tweenFactor = 5\r\n\r\nconst numberWithinRange = (number, min, max) =>\r\n Math.min(Math.max(number, min), max)\r\n\r\nconst setTweenFactor = (emblaApi) => {\r\n tweenFactor = TWEEN_FACTOR_BASE * emblaApi.scrollSnapList().length\r\n}\r\n\r\nconst tweenOpacity = (emblaApi, eventName) => {\r\n const engine = emblaApi.internalEngine()\r\n const scrollProgress = emblaApi.scrollProgress()\r\n const slidesInView = emblaApi.slidesInView()\r\n const isScrollEvent = eventName === 'scroll'\r\n\r\n emblaApi.scrollSnapList().forEach((scrollSnap, snapIndex) => {\r\n let diffToTarget = scrollSnap - scrollProgress\r\n const slidesInSnap = engine.slideRegistry[snapIndex]\r\n\r\n slidesInSnap.forEach((slideIndex) => {\r\n if (isScrollEvent && !slidesInView.includes(slideIndex)) return\r\n\r\n if (engine.options.loop) {\r\n engine.slideLooper.loopPoints.forEach((loopItem) => {\r\n const target = loopItem.target()\r\n\r\n if (slideIndex === loopItem.index && target !== 0) {\r\n const sign = Math.sign(target)\r\n\r\n if (sign === -1) {\r\n diffToTarget = scrollSnap - (1 + scrollProgress)\r\n }\r\n if (sign === 1) {\r\n diffToTarget = scrollSnap + (1 - scrollProgress)\r\n }\r\n }\r\n })\r\n }\r\n\r\n const tweenValue = 1 - Math.abs(diffToTarget * tweenFactor)\r\n const opacity = numberWithinRange(tweenValue, 0, 1).toString()\r\n emblaApi.slideNodes()[slideIndex].style.opacity = opacity\r\n })\r\n })\r\n}\r\n\r\nexport const setupTweenOpacity = (emblaApi) => {\r\n const slideNodes = emblaApi.slideNodes()\r\n\r\n setTweenFactor(emblaApi)\r\n tweenOpacity(emblaApi)\r\n\r\n emblaApi\r\n .on('reInit', setTweenFactor)\r\n .on('reInit', tweenOpacity)\r\n .on('scroll', tweenOpacity)\r\n\r\n return () => {\r\n slideNodes.forEach((slide) => slide.removeAttribute('style'))\r\n emblaApi\r\n .off('reInit', setTweenFactor)\r\n .off('reInit', tweenOpacity)\r\n .off('scroll', tweenOpacity)\r\n }\r\n}\r\n", "export const addThumbBtnsClickHandlers = (emblaApiMain, emblaApiThumb) => {\r\n const slidesThumbs = emblaApiThumb.slideNodes()\r\n \r\n const scrollToIndex = slidesThumbs.map(\r\n (_, index) => () => emblaApiMain.scrollTo(index)\r\n )\r\n \r\n slidesThumbs.forEach((slideNode, index) => {\r\n slideNode.addEventListener('click', scrollToIndex[index], false)\r\n })\r\n \r\n return () => {\r\n slidesThumbs.forEach((slideNode, index) => {\r\n slideNode.removeEventListener('click', scrollToIndex[index], false)\r\n })\r\n }\r\n }\r\n \r\n export const addToggleThumbBtnsActive = (emblaApiMain, emblaApiThumb) => {\r\n const slidesThumbs = emblaApiThumb.slideNodes()\r\n \r\n const toggleThumbBtnsState = () => {\r\n emblaApiThumb.scrollTo(emblaApiMain.selectedScrollSnap())\r\n const previous = emblaApiMain.previousScrollSnap()\r\n const selected = emblaApiMain.selectedScrollSnap()\r\n slidesThumbs[previous].classList.remove('embla-thumbs__slide--selected')\r\n slidesThumbs[selected].classList.add('embla-thumbs__slide--selected')\r\n }\r\n \r\n emblaApiMain.on('select', toggleThumbBtnsState)\r\n emblaApiThumb.on('init', toggleThumbBtnsState)\r\n \r\n return () => {\r\n const selected = emblaApiMain.selectedScrollSnap()\r\n slidesThumbs[selected].classList.remove('embla-thumbs__slide--selected')\r\n }\r\n }\r\n ", "import EmblaCarousel from 'embla-carousel';\r\nimport Autoplay from 'embla-carousel-autoplay';\r\nimport ClassNames from 'embla-carousel-class-names';\r\nimport { addPrevNextBtnsClickHandlers } from './embla-carousel-nav';\r\nimport { setupTweenOpacity } from './embla-tween-opacity';\r\nimport { addThumbBtnsClickHandlers , addToggleThumbBtnsActive } from './embla-thumbs-nav';\r\nimport { isSet } from \"../helpers/isset\";\r\n\r\n\r\nfunction initEmblaCarousels(){\r\n const homepageSliderNode = document.querySelector('.header--home--js .embla');\r\n\r\n if(isSet(homepageSliderNode)){\r\n const homepageSliderOpts = {loop: true};\r\n const homepageSliderViewportNode = homepageSliderNode.querySelector('.embla__viewport');\r\n const prevBtn = homepageSliderNode.querySelector('.embla__button--prev');\r\n const nextBtn = homepageSliderNode.querySelector('.embla__button--next');\r\n \r\n const homepageSliderEmblaApi = EmblaCarousel(homepageSliderViewportNode, homepageSliderOpts, [\r\n ClassNames(),\r\n Autoplay({ delay: 8000 })\r\n ]);\r\n \r\n const removePrevNextBtnsClickHandlers = addPrevNextBtnsClickHandlers(\r\n homepageSliderEmblaApi,\r\n prevBtn,\r\n nextBtn\r\n );\r\n \r\n homepageSliderEmblaApi.on('destroy', removePrevNextBtnsClickHandlers);\r\n }\r\n \r\n \r\n const latestNewsSliderNode = document.querySelector('.section--latest-news--js .embla');\r\n \r\n if(isSet(latestNewsSliderNode)){\r\n const latestNewsSliderOpts = {dragFree: true};\r\n const latestNewsSliderViewportNode = latestNewsSliderNode.querySelector('.embla__viewport');\r\n EmblaCarousel(latestNewsSliderViewportNode, latestNewsSliderOpts, [ClassNames()]);\r\n }\r\n\r\n\r\n\r\n const subTypeSliderNodes = document.querySelectorAll('.sub-types--js .embla');\r\n subTypeSliderNodes.forEach(function (subTypeSliderElm) {\r\n const subTypeSliderOpts = {dragFree: true};\r\n const subTypeSliderViewportNode = subTypeSliderElm.querySelector('.embla__viewport');\r\n\r\n const prevBtn = subTypeSliderElm.querySelector('.embla__button--prev');\r\n const nextBtn = subTypeSliderElm.querySelector('.embla__button--next');\r\n \r\n const subTypeSliderEmblaApi = EmblaCarousel(subTypeSliderViewportNode, subTypeSliderOpts, [ClassNames()]);\r\n\r\n const removePrevNextBtnsClickHandlers = addPrevNextBtnsClickHandlers(\r\n subTypeSliderEmblaApi,\r\n prevBtn,\r\n nextBtn\r\n );\r\n\r\n subTypeSliderEmblaApi.on('destroy', removePrevNextBtnsClickHandlers);\r\n });\r\n \r\n \r\n const stockCardSliderNodes = document.querySelectorAll('.card--stock--js .embla');\r\n const stockCardSliderOpts = {loop: true};\r\n \r\n stockCardSliderNodes.forEach(function (stockCardSliderElm) {\r\n const stockCardSliderViewportElm = stockCardSliderElm.querySelector('.embla__viewport');\r\n \r\n const prevBtn = stockCardSliderElm.querySelector('.embla__button--prev');\r\n const nextBtn = stockCardSliderElm.querySelector('.embla__button--next');\r\n \r\n const stockCardSliderEmblaApi = EmblaCarousel(stockCardSliderViewportElm, stockCardSliderOpts);\r\n \r\n const removeTweenOpacity = setupTweenOpacity(stockCardSliderEmblaApi);\r\n \r\n const removePrevNextBtnsClickHandlers = addPrevNextBtnsClickHandlers(\r\n stockCardSliderEmblaApi,\r\n prevBtn,\r\n nextBtn\r\n );\r\n \r\n stockCardSliderEmblaApi\r\n .on('destroy', removeTweenOpacity)\r\n .on('destroy', removePrevNextBtnsClickHandlers);\r\n });\r\n\r\n\r\n const productGalleryNode = document.querySelector('.product-gallery--js .embla__viewport');\r\n if(isSet(productGalleryNode)){\r\n const productGalleryOpts = {loop: true}\r\n const productGalleryThumbsOpts = { containScroll: 'keepSnaps', dragFree: true }\r\n const productGalleryThumbsNode = document.querySelector('.embla-thumbs__viewport');\r\n\r\n const emblaApiMain = EmblaCarousel(\r\n productGalleryNode, \r\n productGalleryOpts\r\n );\r\n\r\n const emblaApiThumb = EmblaCarousel(\r\n productGalleryThumbsNode, \r\n productGalleryThumbsOpts\r\n );\r\n \r\n const removeThumbBtnsClickHandlers = addThumbBtnsClickHandlers(\r\n emblaApiMain,\r\n emblaApiThumb\r\n );\r\n const removeToggleThumbBtnsActive = addToggleThumbBtnsActive(\r\n emblaApiMain,\r\n emblaApiThumb\r\n );\r\n\r\n const prevBtn = productGalleryNode.querySelector('.embla__button--prev');\r\n const nextBtn = productGalleryNode.querySelector('.embla__button--next');\r\n\r\n const removePrevNextBtnsClickHandlers = addPrevNextBtnsClickHandlers(\r\n emblaApiMain,\r\n prevBtn,\r\n nextBtn\r\n );\r\n \r\n emblaApiMain\r\n .on('destroy', removeThumbBtnsClickHandlers)\r\n .on('destroy', removeToggleThumbBtnsActive)\r\n .on('destroy', removePrevNextBtnsClickHandlers)\r\n \r\n emblaApiThumb\r\n .on('destroy', removeThumbBtnsClickHandlers)\r\n .on('destroy', removeToggleThumbBtnsActive)\r\n }\r\n}\r\n\r\nexports.initEmblaCarousels = initEmblaCarousels;", "class Add2Basket {\r\n constructor(domNode){\r\n this.domNode = domNode;\r\n this.button = domNode.querySelector('.button');\r\n this.message = domNode.querySelector('.sa-message');\r\n\r\n this.dropdownFields = document.querySelectorAll('.product-detail__actions .sa-field--custom-dropdown--js:not(.drop-product-variants)');\r\n this.quantity = document.querySelector('.product-detail__actions .sa-field--counter--js input');\r\n\r\n this.init();\r\n }\r\n\r\n init(){\r\n this.dropdownFields.forEach((field) => {\r\n field.addEventListener('optionChanged', this.handleActionChange.bind(this), false);\r\n });\r\n\r\n this.quantity.addEventListener('change', this.handleActionChange.bind(this), false);\r\n\r\n window.addEventListener('load', this.handleActionChange.bind(this), false);\r\n }\r\n\r\n handleActionChange(e){\r\n let flag = true;\r\n\r\n this.dropdownFields.forEach((field) => {\r\n let selection = field.querySelector('button > span');\r\n if(!selection.dataset.value || selection.dataset.value === \"\") flag = false;\r\n });\r\n\r\n if(this.quantity.value == \"0\") flag = false; \r\n\r\n if(flag === true){\r\n this.message.classList.add('is-hidden');\r\n this.button.classList.remove('is-hidden');\r\n this.button.removeAttribute('disabled');\r\n } else{\r\n this.message.classList.remove('is-hidden');\r\n this.button.classList.add('is-hidden');\r\n this.button.setAttribute('disabled', '');\r\n }\r\n }\r\n}\r\n\r\nexports.Add2Basket = Add2Basket;", "class Accordion {\n #eventDetail;\n #events;\n\n /**\r\n * @param {HTMLElement} domNode - The DOM element to initialise on\r\n * @param {AccordionDefault} opts - Optional params to modify functionality\r\n */\n constructor(domNode, opts) {\n /** @type {AccordionDefault}*/\n const DEFAULTS = {\n onBeforeOpen: () => {},\n onAfterOpen: () => {},\n onBeforeClose: () => {},\n onAfterClose: () => {},\n itemSelector: '[f11y-accordion-item]',\n showMultiple: true\n };\n\n /** @type {AccordionDefault}*/\n this.options = Object.assign(DEFAULTS, opts);\n\n /** @type {HTMLElement} The passed domNode */\n this.domNode = domNode;\n this.#eventDetail = {\n detail: {\n component: this\n }\n };\n this.#events = {\n initialised: new CustomEvent('f11yinit', this.#eventDetail),\n initialisedItem: new CustomEvent('f11yinititem', this.#eventDetail),\n destroyed: new CustomEvent('f11ydestroyed', this.#eventDetail),\n beforeOpen: new CustomEvent('f11ybeforeopen', this.#eventDetail),\n afterOpen: new CustomEvent('f11yafteropen', this.#eventDetail),\n beforeClose: new CustomEvent('f11ybeforeclose', this.#eventDetail),\n afterClose: new CustomEvent('f11yafterclose', this.#eventDetail)\n };\n this.init();\n }\n\n /**\r\n * Initialises the class component\r\n */\n init() {\n /** @type {AccordionItemObject[]} */\n this.items = [];\n\n /** @type {Function[]} */\n this.toggleHandlers = [];\n\n /** @type {HTMLElement[]} */\n const items = Array.from(this.domNode.querySelectorAll(this.options.itemSelector));\n for (let i = 0; i < items.length; i += 1) {\n /** @type {HTMLElement} */\n const item = items[i];\n this.initItem(item);\n }\n this.domNode.classList.add(window.f11y.settings.initialisedClass);\n window.dispatchEvent(this.#events.initialised);\n this.domNode.dispatchEvent(this.#events.initialised);\n }\n\n /**\r\n * \r\n * @param {HTMLElement} item \r\n * @returns {AccordionItemObject|undefined}\r\n */\n initItem(item) {\n /** @type {HTMLElement|null} */\n const trigger = item.querySelector(\"[aria-controls]\");\n if (!trigger) {\n console.warn(`Trigger is not defined for item at index:`, item);\n return;\n }\n\n /** @type {string|null} */\n const ariaControls = trigger.getAttribute('aria-controls');\n if (!ariaControls) {\n console.warn(`aria-controls attribute is null for item at index:`, item);\n return;\n }\n\n /** @type {HTMLElement|null} */\n const panel = document.getElementById(ariaControls);\n if (!panel) {\n console.warn(`Panel is not defined for item at index:`, item);\n return;\n }\n\n /** @type {string|null} */\n const ariaExpanded = trigger.getAttribute('aria-expanded');\n if (!ariaExpanded) {\n console.warn(`aria-expanded attribute is not set for:`, item, trigger);\n return;\n }\n\n /** @type {AccordionItemObject} Stores item information */\n const itemObj = {\n item: item,\n panel: panel,\n trigger: trigger,\n isOpen: ariaExpanded\n };\n itemObj.isOpen === \"true\" ? panel.removeAttribute('hidden') : panel.setAttribute('hidden', '');\n this.items.push(itemObj);\n\n /**\r\n * Handler for toggle event.\r\n * @param {Event} event\r\n */\n const toggleHandler = event => this.toggle(itemObj, event);\n trigger.addEventListener(\"click\", toggleHandler);\n this.toggleHandlers.push(toggleHandler);\n item.dispatchEvent(this.#events.initialisedItem);\n return itemObj;\n }\n\n /**\r\n * Removes event listeners, clears member arrays and resets DOM changes e.g. class names\r\n */\n destroy() {\n this.domNode.classList.remove(window.f11y.settings.initialisedClass);\n if (!this.toggleHandlers || !this.items) return;\n for (let i = 0; i < this.toggleHandlers.length; i++) {\n const trigger = this.items[i].trigger;\n const toggleHandler = this.toggleHandlers[i];\n trigger.removeEventListener(\"click\", toggleHandler);\n }\n this.items = [];\n this.toggleHandlers = [];\n window.dispatchEvent(this.#events.destroyed);\n this.domNode.dispatchEvent(this.#events.destroyed);\n }\n dispatchStateUpdateEvent() {\n window.dispatchEvent(window.f11y.events.stateUpdate);\n }\n\n /**\r\n * Toggles passed accordion item.\r\n * @param {AccordionItemObject} item Object that represents a singular accordion item.\r\n * @param {Event|KeyboardEvent|null} event The event that triggered this function method.\r\n */\n toggle(item) {\n let event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n const itemState = item.isOpen;\n if (this.options.showMultiple === false) this.closeAll(event);\n if (itemState === \"false\") {\n this.openItem(item, event);\n return;\n }\n if (itemState === \"true\") {\n this.closeItem(item, event);\n return;\n }\n }\n\n /**\r\n * Closes all accordion items.\r\n * @param {Event|KeyboardEvent|null} event The event that triggered this function method.\r\n */\n closeAll() {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!this.items) return;\n for (let i = 0; i < this.items.length; i += 1) {\n if (this.items[i].isOpen == \"true\") {\n this.closeItem(this.items[i], event);\n }\n }\n }\n\n /**\r\n * Opens all accordion items.\r\n * @param {Event|KeyboardEvent|null} event The event that triggered this function method.\r\n */\n openAll() {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (this.options.showMultiple === false || !this.items) return;\n for (let i = 0; i < this.items.length; i += 1) {\n this.openItem(this.items[i], event);\n }\n }\n\n /**\r\n * Opens the passed accordion item.\r\n * @param {AccordionItemObject} item Object that represents a singular accordion item.\r\n * @param {Event|KeyboardEvent|null} event The event that triggered this function method.\r\n */\n openItem(item) {\n let event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (item.isOpen === \"true\") return;\n this.domNode.dispatchEvent(this.#events.beforeOpen);\n this.options.onBeforeOpen(this, event, item);\n item.panel.removeAttribute(\"hidden\");\n item.trigger.setAttribute(\"aria-expanded\", \"true\");\n item.isOpen = \"true\";\n this.dispatchStateUpdateEvent();\n this.domNode.dispatchEvent(this.#events.afterOpen);\n this.options.onAfterOpen(this, event, item);\n }\n\n /**\r\n * Closes the passed accordion item.\r\n * @param {AccordionItemObject} item Object that represents a singular accordion item.\r\n * @param {Event|KeyboardEvent|null} event The event that triggered this function method.\r\n */\n closeItem(item) {\n let event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (item.isOpen === \"false\" || !item) return;\n this.domNode.dispatchEvent(this.#events.beforeClose);\n this.options.onBeforeClose(this, event, item);\n item.panel.setAttribute(\"hidden\", \"\");\n item.trigger.setAttribute(\"aria-expanded\", \"false\");\n item.isOpen = \"false\";\n this.dispatchStateUpdateEvent();\n this.domNode.dispatchEvent(this.#events.afterClose);\n this.options.onAfterClose(this, event, item);\n }\n}\n\n/**\r\n * Checks if passed element is focusable (aka is within focusableElement array)\r\n * @param {HTMLElement} element \r\n * @param {Array.} filterSelectors \r\n * @returns {boolean}\r\n */\nfunction isFocusable(element) {\n let filterSelectors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.f11y.focusableElements;\n const focusable = filterSelectors.join(', ');\n return element.matches(focusable);\n}\n\n/**\r\n * Gets Focusable elements within an element\r\n * @param {HTMLElement} element Check within this element\r\n * @returns {Node[]}\r\n */\nfunction getFocusable(element) {\n function filter(node) {\n if (node.hasAttribute('hidden') || node.hasAttribute('aria-hidden') || getComputedStyle(node).display === 'none') {\n return NodeFilter.FILTER_REJECT;\n }\n if (isFocusable(node) === true) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n }\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_ELEMENT, {\n acceptNode: filter\n });\n let list = [];\n while (walker.nextNode()) {\n list.push(walker.currentNode);\n }\n return list;\n}\n\nclass Dropdown {\n #eventDetail;\n #events;\n\n /**\r\n * @param {HTMLElement|Node} domNode The DOM element to initialise on\r\n * @param {DropdownDefault} opts Optional params to modify functionality\r\n */\n constructor(domNode, opts) {\n /** @type {DropdownDefault} */\n const DEFAULTS = {\n onBeforeOpen: () => {},\n onAfterOpen: () => {},\n onBeforeClose: () => {},\n onAfterClose: () => {},\n openClass: window.f11y.settings.openClass,\n focusableElements: window.f11y.focusableElements,\n updateOnSelect: false,\n updateSelector: null,\n closeOnBackgroundClick: true,\n openOnClick: true,\n openOnHover: false,\n focusOnMouseOver: true,\n closeOnSelect: false,\n arrowNavigation: true,\n tabNavigation: false,\n awaitOpenAnimation: false,\n awaitCloseAnimation: false\n };\n\n /** @type {DropdownDefault} */\n this.options = Object.assign(DEFAULTS, opts);\n\n /** @type {HTMLElement|Node} */\n this.domNode = domNode;\n this.#eventDetail = {\n detail: {\n component: this\n }\n };\n this.#events = {\n initialised: new CustomEvent('f11yinit', this.#eventDetail),\n initialisedItems: new CustomEvent('f11yinititems', this.#eventDetail),\n destroyed: new CustomEvent('f11ydestroyed', this.#eventDetail),\n beforeOpen: new CustomEvent('f11ybeforeopen', this.#eventDetail),\n afterOpen: new CustomEvent('f11yafteropen', this.#eventDetail),\n beforeClose: new CustomEvent('f11ybeforeclose', this.#eventDetail),\n afterClose: new CustomEvent('f11yafterclose', this.#eventDetail)\n };\n this.init();\n }\n init() {\n /** @type {HTMLElement[]} */\n this.dropdownItems = [];\n\n /** @type {String[]} */\n this.firstChars = [];\n\n /** @type {Function[]} */\n this.itemKeydownHandlers = [];\n\n /** @type {Function[]} */\n this.itemMouseoverHandlers = [];\n\n /** @type {Function[]} */\n this.itemClickHandlers = [];\n\n /** @type {HTMLElement|null} */\n this.trigger = this.domNode.querySelector('[aria-controls]');\n if (!this.trigger) return console.warn('Trigger element does not exist within: ', this.domNode);\n\n /** @type {string|null} */\n const ariaControls = this.trigger.getAttribute('aria-controls');\n if (!ariaControls) return console.warn(`aria-controls attribute is null for: `, this.trigger);\n\n /** @type {HTMLElement|null} */\n this.dropdown = document.getElementById(ariaControls);\n if (!this.dropdown) return console.warn('Dropdown element does not exist');\n if (this.options.updateSelector) this.updateTargetNode = document.querySelector(this.options.updateSelector);\n\n // Bind Node Listeners\n this.onTriggerKeydownBound = this.#onTriggerKeydown.bind(this);\n if (this.options.openOnClick === true) this.onTriggerClickBound = this.#onTriggerClick.bind(this);\n if (this.options.openOnHover === true) this.onTriggerHoverBound = this.#onTriggerHover.bind(this);\n this.onFocusInBound = this.#onFocusin.bind(this);\n this.onFocusOutBound = this.#onFocusout.bind(this);\n\n // Bind Window Listeners\n this.onBackgroundMousedownBound = this.#onBackgroundMousedown.bind(this);\n this.checkBoundingBoxBound = this.checkBoundingBox.bind(this);\n this.updateFocusableElmsBound = this.updateFocusableElms.bind(this);\n this.addNodeListeners();\n this.domNode.classList.add(window.f11y.settings.initialisedClass);\n window.dispatchEvent(this.#events.initialised);\n this.domNode.dispatchEvent(this.#events.initialised);\n }\n destroy() {\n window.dispatchEvent(this.#events.destroyed);\n this.domNode.dispatchEvent(this.#events.destroyed);\n }\n initDropdownItems() {\n if (!this.dropdown) return;\n\n /** @type {HTMLElement[]} */\n this.dropdownItems = [];\n\n /** @type {HTMLElement[]} */\n this.dropdownItems = getFocusable(this.dropdown);\n if (!this.dropdownItems) return;\n const itemKeydownHandler = this.#onItemKeydown.bind(this);\n const itemClickHandler = this.#onItemClick.bind(this);\n this.dropdownItems.forEach(item => {\n item.tabIndex = -1;\n if (item.innerText) {\n const firstChar = item.innerText.trim()[0].toLowerCase();\n if (firstChar && this.firstChars) this.firstChars.push(firstChar);\n }\n if (this.options.updateOnSelect === true) {\n item.addEventListener('click', itemClickHandler);\n this.itemClickHandlers.push(itemClickHandler);\n }\n item.addEventListener('keydown', itemKeydownHandler);\n this.itemKeydownHandlers.push(itemKeydownHandler);\n\n /** @type {Node|null} */\n if (!this.firstItem) this.firstItem = item;\n\n /** @type {Node|null} */\n this.lastItem = item;\n });\n this.domNode.dispatchEvent(this.#events.initialisedItems);\n }\n dispatchStateUpdateEvent() {\n window.dispatchEvent(window.f11y.events.stateUpdate);\n }\n\n /**\r\n * Adds bound method window events \r\n */\n addGlobalListeners() {\n window.addEventListener('mousedown', this.onBackgroundMousedownBound);\n window.addEventListener('f11ystateupdate', this.updateFocusableElmsBound);\n document.addEventListener('scroll', this.checkBoundingBoxBound);\n window.addEventListener('resize', this.checkBoundingBoxBound);\n }\n\n /**\r\n * Removes bound methods window events \r\n */\n removeGlobalListeners() {\n window.removeEventListener('mousedown', this.onBackgroundMousedownBound);\n window.removeEventListener('f11yStateUpdate', this.updateFocusableElmsBound);\n document.removeEventListener('scroll', this.checkBoundingBoxBound);\n window.removeEventListener('resize', this.checkBoundingBoxBound);\n }\n\n /**\r\n * Adds bound methods to the domNode elements\r\n */\n addNodeListeners() {\n if (!this.trigger) return;\n this.trigger.addEventListener('keydown', this.onTriggerKeydownBound);\n if (this.onTriggerClickBound) {\n this.trigger.addEventListener('click', this.onTriggerClickBound);\n }\n if (this.onTriggerHoverBound) {\n this.trigger.addEventListener('mouseover', this.onTriggerHoverBound);\n }\n this.domNode.addEventListener('focusin', this.onFocusInBound);\n this.domNode.addEventListener('focusout', this.onFocusOutBound);\n }\n\n /**\r\n * Adds bound methods to the domNode elements\r\n */\n removeNodeListeners() {\n if (!this.trigger) return;\n this.trigger.removeEventListener('keydown', this.onTriggerKeydownBound);\n if (this.onTriggerClickBound) {\n this.trigger.removeEventListener('click', this.onTriggerClickBound);\n }\n if (this.onTriggerHoverBound) {\n this.trigger.removeEventListener('mouseover', this.onTriggerHoverBound);\n }\n this.domNode.removeEventListener('focusin', this.onFocusInBound);\n this.domNode.removeEventListener('focusout', this.onFocusOutBound);\n }\n\n /**\r\n * Updates available focusable elements inside the dropdown\r\n */\n updateFocusableElms() {\n this.initDropdownItems();\n }\n\n /**\r\n * Checks whether the dropdown is open\r\n * @returns {boolean}\r\n */\n get isOpen() {\n if (!this.trigger) return false;\n return this.trigger.getAttribute('aria-expanded') === \"true\";\n }\n\n /**\r\n * Sets focus to a menu item.\r\n * @param {Node} targetItem New target menu item\r\n */\n setFocusToItem(targetItem) {\n if (!this.dropdownItems) return;\n this.dropdownItems.forEach(function (item) {\n if (item === targetItem) {\n item.tabIndex = 0;\n targetItem.focus();\n } else {\n item.tabIndex = -1;\n }\n });\n }\n\n /**\r\n * Sets focus to the first item in the dropdown menu\r\n */\n setFocusToFirstItem() {\n if (!this.firstItem) return;\n this.setFocusToItem(this.firstItem);\n }\n\n /**\r\n * Sets focus to the last item in the dropdown menu\r\n */\n setFocusToLastItem() {\n if (!this.lastItem) return;\n this.setFocusToItem(this.lastItem);\n }\n\n /**\r\n * Sets focus to the previous menu item\r\n * @param {HTMLElement} currentItem The currently focused item within the dropdown menu\r\n * @returns {Node} The newly focused item within the dropdown menu\r\n */\n #setFocusToPreviousItem(currentItem) {\n if (!this.dropdownItems || !this.firstItem || !this.lastItem) return currentItem;\n\n /** @type {Node} */\n let targetItem;\n let index;\n if (currentItem === this.firstItem) {\n targetItem = this.lastItem;\n } else {\n index = this.dropdownItems.indexOf(currentItem);\n targetItem = this.dropdownItems[index - 1];\n }\n this.setFocusToItem(targetItem);\n return targetItem;\n }\n\n /**\r\n * Sets focus to the next menu item\r\n * @param {HTMLElement} currentItem Currently focused item within the dropdown menu\r\n * @returns {Node} The newly focused item within the dropdown menu\r\n */\n #setFocusToNextItem(currentItem) {\n if (!this.dropdownItems || !this.firstItem || !this.lastItem) return currentItem;\n\n /** @type {Node} */\n let targetItem;\n let index;\n if (currentItem === this.lastItem) {\n targetItem = this.firstItem;\n } else {\n index = this.dropdownItems.indexOf(currentItem);\n targetItem = this.dropdownItems[index + 1];\n }\n this.setFocusToItem(targetItem);\n return targetItem;\n }\n\n /**\r\n * Sets focus by the the first character of a menu item\r\n * @param {HTMLElement} currentItem Currently focused item within the dropdown menu\r\n * @param {string} char The character to base the focus on\r\n */\n #setFocusByFirstChar(currentItem, char) {\n if (char.length > 1) return;\n if (!this.dropdownItems || !this.firstChars) return;\n char = char.toLowerCase();\n let start = this.dropdownItems.indexOf(currentItem) + 1;\n if (start >= this.dropdownItems.length) start = 0;\n let index = this.firstChars.indexOf(char, start);\n if (index === -1) index = this.firstChars.indexOf(char, 0);\n if (index > -1) this.setFocusToItem(this.dropdownItems[index]);\n }\n\n /**\r\n * Opens the dropdown\r\n * @param {Event|KeyboardEvent|null} e The event that triggered this method\r\n */\n openDropdown() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!this.trigger || !this.dropdown) return;\n this.domNode.dispatchEvent(this.#events.beforeOpen);\n this.options.onBeforeOpen(this, e);\n const domNode = this.domNode;\n const dropdown = this.dropdown;\n const trigger = this.trigger;\n const openClass = this.options.openClass;\n const animatingClass = window.f11y.settings.animatingClass;\n const animatingOpenClass = window.f11y.settings.animatingOpenClass;\n trigger.setAttribute('aria-expanded', 'true');\n dropdown.setAttribute('aria-hidden', 'false');\n domNode.classList.add(openClass);\n this.addGlobalListeners();\n if (this.options.awaitOpenAnimation) {\n let animationCount = 0;\n function animationEndHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dropdown.contains(e.target) && e.target !== dropdown) return;\n animationCount--;\n if (animationCount === 0) {\n domNode.classList.remove(animatingClass, animatingOpenClass);\n document.removeEventListener('animationend', animationEndHandler);\n document.removeEventListener('animationstart', animationStartHandler);\n }\n }\n }\n function animationStartHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dropdown.contains(e.target) && e.target !== dropdown) return;\n animationCount++;\n }\n }\n document.addEventListener('animationstart', animationStartHandler);\n document.addEventListener('animationend', animationEndHandler);\n domNode.classList.add(animatingClass, animatingOpenClass);\n }\n this.initDropdownItems();\n this.dispatchStateUpdateEvent();\n this.domNode.dispatchEvent(this.#events.afterOpen);\n this.options.onAfterOpen(this, e);\n }\n\n /**\r\n * Closes the dropdown\r\n * @param {Event|KeyboardEvent|null} e The event that triggered this method\r\n */\n closeDropdown() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!this.trigger || !this.dropdown) return;\n if (this.isOpen) {\n this.domNode.dispatchEvent(this.#events.beforeClose);\n this.options.onBeforeClose(this, e);\n const domNode = this.domNode;\n const dropdown = this.dropdown;\n const trigger = this.trigger;\n const openClass = this.options.openClass;\n const animatingClass = window.f11y.settings.animatingClass;\n const animatingCloseClass = window.f11y.settings.animatingCloseClass;\n dropdown.setAttribute('aria-hidden', 'true');\n if (this.options.awaitCloseAnimation) {\n let animationCount = 0;\n domNode.classList.add(animatingClass, animatingCloseClass);\n\n /**\r\n * Handle any when an animation ends within or on the this.domNode\r\n * @param {AnimationEvent} e AnimationEvent object\r\n * @returns \r\n */\n function animationEndHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dropdown.contains(e.target) && e.target !== dropdown) return;\n animationCount--;\n if (animationCount === 0) {\n domNode.classList.remove(animatingClass, animatingCloseClass);\n domNode.classList.remove(openClass);\n document.removeEventListener('animationstart', animationStartHandler);\n document.removeEventListener('animationend', animationEndHandler);\n }\n }\n }\n\n /**\r\n * Handle any when an animation starts within or on the this.domNode\r\n * @param {AnimationEvent} e AnimationEvent object\r\n */\n function animationStartHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dropdown.contains(e.target) && e.target !== dropdown) return;\n animationCount++;\n }\n }\n document.addEventListener('animationstart', animationStartHandler);\n document.addEventListener('animationend', animationEndHandler);\n } else {\n domNode.classList.remove(openClass);\n }\n trigger.removeAttribute('aria-expanded');\n this.dispatchStateUpdateEvent();\n this.domNode.dispatchEvent(this.#events.afterClose);\n this.options.onAfterClose(this, e);\n }\n this.resetBoundingBox();\n this.removeGlobalListeners();\n }\n\n /**\r\n * Handles focus of Dropdown\r\n */\n #onFocusin() {\n this.domNode.classList.add('has-focus');\n }\n\n /**\r\n * Handles lose of focus on Dropdown\r\n */\n #onFocusout() {\n this.domNode.classList.remove('has-focus');\n }\n\n /**\r\n * Handles all Trigger toggle keyboard events\r\n * @param {KeyboardEvent|null} e The event that triggered this method\r\n */\n #onTriggerKeydown() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!e || !this.trigger) return;\n const key = e.key;\n let flag = false;\n switch (key) {\n case ' ':\n case 'Enter':\n case 'ArrowDown':\n case 'Down':\n this.openDropdown(e);\n this.checkBoundingBox();\n this.setFocusToFirstItem();\n flag = true;\n break;\n case 'Esc':\n case 'Escape':\n if (this.isOpen) {\n this.closeDropdown(e);\n this.trigger.focus();\n flag = true;\n } else {\n flag = false;\n }\n break;\n case 'Up':\n case 'ArrowUp':\n this.openDropdown(e);\n this.checkBoundingBox();\n this.setFocusToLastItem();\n flag = true;\n break;\n case 'Tab':\n if (this.isOpen) {\n this.closeDropdown(e);\n }\n flag = false;\n break;\n }\n if (flag) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n /**\r\n * Handles Trigger toggle click event\r\n * @param {Event|KeyboardEvent|null} e The event that triggered this method\r\n */\n #onTriggerClick() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!e || !this.trigger) return;\n if (this.isOpen) {\n this.closeDropdown(e);\n this.trigger.focus();\n } else {\n this.openDropdown(e);\n this.checkBoundingBox();\n this.setFocusToFirstItem();\n }\n e.stopPropagation();\n e.preventDefault();\n }\n\n /**\r\n * Handles Trigger toggle hover event\r\n * @param {Event|KeyboardEvent|null} e The event that triggered this method\r\n */\n #onTriggerHover() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!e || !this.trigger) return;\n if (!this.isOpen) {\n this.openDropdown(e);\n this.trigger;\n this.checkBoundingBox();\n this.setFocusToFirstItem();\n let timer;\n const closeDropdown = this.closeDropdown.bind(this);\n const domNode = this.domNode;\n function handleDomNodeMouseOver() {\n clearTimeout(timer);\n }\n function handleDomNodeMouseOut(e) {\n timer = setTimeout(() => {\n closeDropdown(e);\n domNode.removeEventListener('mouseout', handleDomNodeMouseOut);\n domNode.removeEventListener('mouseover', handleDomNodeMouseOver);\n }, 650);\n }\n domNode.addEventListener('mouseout', handleDomNodeMouseOut, false);\n domNode.addEventListener('mouseover', handleDomNodeMouseOver, false);\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n /**\r\n * Handles all keyboard events on the menu items\r\n * @param {KeyboardEvent|null} e The event that triggered this method\r\n */\n #onItemKeydown() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!e || !this.trigger || !e.currentTarget) return;\n const tgt = e.currentTarget;\n const key = e.key;\n let flag = false;\n\n /**\r\n * @param {string} str\r\n */\n function isPrintableChar(str) {\n return str.length === 1 && str.match(/\\S/);\n }\n function isInputElement(tgt) {\n return tgt.tagName === \"INPUT\" || tgt.tagName === \"SELECT\" || tgt.tagName === \"TEXTAREA\";\n }\n if (e.ctrlKey || e.altKey || e.metaKey) return;\n if (e.shiftKey) {\n if (isPrintableChar(key) && !isInputElement(tgt)) {\n this.#setFocusByFirstChar(tgt, key);\n flag = true;\n } else {\n flag = false;\n }\n if (e.key === 'Tab') {\n if (this.options.tabNavigation) {\n this.#setFocusToPreviousItem(tgt);\n } else {\n this.trigger.focus();\n this.closeDropdown(e);\n }\n flag = true;\n }\n } else {\n switch (key) {\n case ' ':\n if (tgt.href) {\n window.location.href = tgt.href;\n }\n break;\n case 'Esc':\n case 'Escape':\n this.closeDropdown(e);\n this.trigger.focus();\n flag = true;\n break;\n case 'Up':\n case 'ArrowUp':\n if (this.options.arrowNavigation) this.#setFocusToPreviousItem(tgt);\n flag = true;\n break;\n case 'ArrowDown':\n case 'Down':\n if (this.options.arrowNavigation) this.#setFocusToNextItem(tgt);\n flag = true;\n break;\n case 'Home':\n case 'PageUp':\n this.setFocusToFirstItem();\n flag = true;\n break;\n case 'End':\n case 'PageDown':\n this.setFocusToLastItem();\n flag = true;\n break;\n case 'Tab':\n if (this.options.tabNavigation) {\n this.#setFocusToNextItem(tgt);\n } else {\n this.closeDropdown(e);\n this.trigger.focus();\n }\n flag = true;\n break;\n case 'Enter':\n this.#onItemClick(e);\n break;\n default:\n if (isPrintableChar(key) && !isInputElement(tgt)) {\n this.#setFocusByFirstChar(tgt, key);\n flag = true;\n } else {\n flag = false;\n }\n break;\n }\n }\n if (flag) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n /**\r\n * Handles click events on menu items\r\n * @param {Event|KeyboardEvent|null} e The event that triggered this method\r\n */\n #onItemClick() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!e || !e.currentTarget || !this.updateTargetNode) return;\n if (this.options.updateOnSelect === true) {\n const itemTextContent = e.currentTarget.textContent;\n this.updateTargetNode.textContent = itemTextContent;\n this.updateTargetNode.value = itemTextContent;\n }\n if (this.options.closeOnSelect === true) {\n this.closeDropdown(e);\n }\n }\n\n /**\r\n * Checks the bounding box of the dropdown element against the window bounds\r\n */\n checkBoundingBox() {\n if (!this.dropdown) return;\n let dropdownBounds = this.dropdown.getBoundingClientRect();\n if (dropdownBounds.bottom > window.innerHeight) {\n this.domNode.setAttribute('f11y-out-of-bounds', 'bottom');\n return;\n }\n if (dropdownBounds.top < 0) {\n this.domNode.setAttribute('f11y-out-of-bounds', 'top');\n return;\n }\n }\n\n /**\r\n * Resets any class name changes by checkBoundingBox()\r\n */\n resetBoundingBox() {\n this.domNode.removeAttribute('f11y-out-of-bounds');\n }\n\n /**\r\n * Handles click events that are outside of the dropdown remit\r\n * @param {Event|KeyboardEvent|null} e The event that triggered this method\r\n */\n #onBackgroundMousedown() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!e || !this.trigger || !this.dropdown) return;\n if (!this.domNode.contains(e.target) && this.options.closeOnBackgroundClick) {\n if (this.isOpen) {\n this.closeDropdown(e);\n this.trigger.focus();\n }\n }\n }\n}\n\nclass Layer {\n /**\r\n * @param {HTMLElement} domNode \r\n * @param {LayerDefault} opts \r\n */\n constructor(domNode, opts) {\n /** @type {LayerDefault} */\n const DEFAULTS = {\n onOpen: () => {},\n onClose: () => {},\n openTriggerAttribute: 'f11y-layer-open',\n closeTriggerAttribute: 'f11y-layer-close',\n openClass: window.f11y.settings.openClass,\n focusableElements: window.f11y.focusableElements,\n disableScroll: true,\n closeOnBackgroundClick: true,\n closeOnEscClick: true,\n awaitCloseAnimation: false,\n awaitOpenAnimation: false\n };\n\n /** @type {LayerDefault} */\n this.options = Object.assign(DEFAULTS, opts);\n\n /** @type {HTMLElement} */\n this.domNode = domNode;\n\n /** @type {string} */\n this.id = '';\n this.init();\n }\n\n /**\r\n * Initialises the class component\r\n */\n init() {\n this.id = this.domNode.id;\n this.dialog = this.domNode.querySelector('[role=\"dialog\"]');\n this.triggerElms = document.querySelectorAll('[' + this.options.openTriggerAttribute + '=\"' + this.id + '\"]');\n this.closeElms = document.querySelectorAll('[' + this.options.closeTriggerAttribute + '=\"' + this.id + '\"]');\n\n /** @type {HTMLElement[]} */\n this.focusableElms = Array.from(this.domNode.querySelectorAll(this.options.focusableElements));\n if (!this.dialog) {\n console.warn('Dialog element is not defined in passsed domNode');\n return;\n }\n this.filterFocusableElms();\n this.openLayerBound = this.openLayer.bind(this);\n for (let i = 0; i < this.triggerElms.length; i++) {\n this.triggerElms[i].addEventListener('click', this.openLayerBound, true);\n }\n for (let i = 0; i < this.focusableElms.length; i++) {\n if (!this.firstElm) {\n this.firstElm = this.focusableElms[i];\n }\n this.lastElm = this.focusableElms[i];\n }\n this.onBackgroundMousedownBound = this.#onBackgroundMousedown.bind(this);\n this.onWindowKeydownBound = this.#onWindowKeydown.bind(this);\n this.domNode.classList.add(window.f11y.settings.initialisedClass);\n }\n\n /**\r\n * Refreshes the class component and calls init() and does any necessary resets\r\n */\n refresh() {\n if (!this.dialog) return;\n this.domNode.setAttribute('aria-hidden', 'true');\n this.dialog.setAttribute('aria-modal', 'true');\n this.dialog.setAttribute('role', 'dialog');\n this.init();\n }\n\n /**\r\n * Destroys the layer object\r\n */\n destroy() {\n if (!this.dialog || !this.triggerElms) return;\n this.closeLayer();\n this.domNode.removeAttribute('aria-hidden');\n this.dialog.removeAttribute('aria-modal');\n this.dialog.removeAttribute('role');\n this.domNode.classList.remove(window.f11y.settings.initialisedClass);\n for (let i = 0; i < this.triggerElms.length; i++) {\n this.triggerElms[i].removeEventListener('click', this.openLayerBound, true);\n }\n }\n\n /**\r\n * Removes (mutates) any [aria-hidden] elements from this.focusableElms array\r\n */\n filterFocusableElms() {\n if (!this.focusableElms) return;\n let i = this.focusableElms.length;\n while (i--) {\n const elm = this.focusableElms[i];\n const closestHidden = elm.closest('[aria-hidden]');\n if (closestHidden != this.domNode) {\n this.focusableElms.splice(i, 1);\n }\n }\n }\n\n /**\r\n * Checks whether the layer is open\r\n * @returns {boolean}\r\n */\n isOpen() {\n return this.domNode.getAttribute('aria-hidden') === 'false';\n }\n\n /**\r\n * Checks whether the layer is open\r\n * @param {HTMLElement} newElm Element Node to move focus to\r\n */\n setFocusToElm(newElm) {\n newElm.focus();\n }\n\n /**\r\n * Sets Focus to the first focusable item inside the layer\r\n */\n setFocusToFirstElm() {\n if (!this.firstElm) return;\n this.setFocusToElm(this.firstElm);\n }\n\n /**\r\n * Sets Focus to the last focusable item inside the layer\r\n */\n setFocusToLastElm() {\n if (!this.lastElm) return;\n this.setFocusToElm(this.lastElm);\n }\n\n /**\r\n * Sets Focus to the previous focusable item inside the layer\r\n * @param {HTMLElement} currentElm the currently focused element within the layer\r\n * @returns {HTMLElement} The newly focused element within the layer\r\n */\n #setFocusToPrevElm(currentElm) {\n if (!this.focusableElms || !this.firstElm || !this.lastElm) return currentElm;\n\n /** @type {HTMLElement} */\n let newElm;\n if (currentElm === this.firstElm) {\n newElm = this.lastElm;\n } else {\n let i = this.focusableElms.indexOf(currentElm);\n newElm = this.focusableElms[i - 1];\n }\n this.setFocusToElm(newElm);\n return newElm;\n }\n\n /**\r\n * Sets Focus to the next focusable item inside the layer\r\n * @param {HTMLElement} currentElm the currently focused element within the layer\r\n * @returns {HTMLElement} The newly focused element within the layer\r\n */\n #setFocusToNextElm(currentElm) {\n if (!this.focusableElms || !this.firstElm || !this.lastElm) return currentElm;\n\n /** @type {HTMLElement} */\n let newElm;\n if (currentElm === this.lastElm) {\n newElm = this.firstElm;\n } else {\n let i = this.focusableElms.indexOf(currentElm);\n newElm = this.focusableElms[i + 1];\n }\n this.setFocusToElm(newElm);\n return newElm;\n }\n\n /**\r\n * Opens the layer\r\n * @param {Event|KeyboardEvent|null} e The event object that triggered the method\r\n */\n openLayer() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n this.activeElm = document.activeElement;\n const domNode = this.domNode;\n const dialog = this.dialog;\n const closeElms = this.closeElms;\n const docBody = document.querySelector('body');\n const openClass = this.options.openClass;\n const animatingClass = window.f11y.settings.animatingClass;\n const animatingOpenClass = window.f11y.settings.animatingOpenClass;\n const setFocus = () => this.setFocusToFirstElm();\n const addListeners = () => this.addGlobalListeners();\n const closeLayer = () => this.closeLayer();\n domNode.setAttribute('aria-hidden', 'false');\n domNode.classList.add(openClass);\n this.options.disableScroll ? docBody.style.setProperty('overflow', 'hidden') : '';\n if (this.options.awaitOpenAnimation) {\n let animationCount = 0;\n domNode.classList.add(animatingClass, animatingOpenClass);\n function animationEndHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dialog.contains(e.target) && e.target !== dialog) return;\n animationCount--;\n if (animationCount === 0) {\n domNode.classList.remove(animatingClass, animatingOpenClass);\n document.removeEventListener('animationend', animationEndHandler);\n document.removeEventListener('animationstart', animationStartHandler);\n for (let i = 0; i < closeElms.length; i++) {\n closeElms[i].addEventListener('click', closeLayer, true);\n }\n setFocus();\n addListeners();\n }\n }\n }\n function animationStartHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dialog.contains(e.target) && e.target !== dialog) return;\n animationCount++;\n }\n }\n document.addEventListener('animationstart', animationStartHandler);\n document.addEventListener('animationend', animationEndHandler);\n } else {\n for (let i = 0; i < closeElms.length; i++) {\n closeElms[i].addEventListener('click', closeLayer, true);\n }\n setFocus();\n addListeners();\n }\n window.f11y.store.activeLayer = this.id;\n window.f11y.store.activeLayers.push(this.id);\n window.dispatchEvent(window.f11y.events.stateUpdate);\n this.options.onOpen(this, e);\n }\n\n /**\r\n * Closes the layer\r\n * @param {Event | KeyboardEvent | null} e The event object that triggered the method\r\n */\n closeLayer() {\n let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (this.isOpen()) {\n if (this.id != window.f11y.store.activeLayer) return;\n const domNode = this.domNode;\n const dialog = this.dialog;\n const docBody = document.querySelector('body');\n const openClass = this.options.openClass;\n const animatingClass = window.f11y.settings.animatingClass;\n const animatingCloseClass = window.f11y.settings.animatingCloseClass;\n const removeListeners = () => this.removeGlobalListeners();\n let activeLayers = window.f11y.store.activeLayers;\n const i = activeLayers.indexOf(this.id);\n activeLayers.splice(i, 1);\n window.f11y.store.activeLayers = activeLayers;\n window.f11y.store.activeLayer = activeLayers[activeLayers.length - 1];\n domNode.setAttribute('aria-hidden', 'true');\n if (this.activeElm && this.activeElm.focus) this.activeElm.focus();\n if (this.options.awaitCloseAnimation) {\n let animationCount = 0;\n domNode.classList.add(animatingClass, animatingCloseClass);\n function animationEndHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dialog.contains(e.target) && e.target !== dialog) return;\n animationCount--;\n if (animationCount === 0) {\n domNode.classList.remove(animatingClass, animatingCloseClass);\n domNode.classList.remove(openClass);\n if (window.f11y.store.activeLayers.length <= 0) docBody.style.removeProperty('overflow');\n document.removeEventListener('animationstart', animationStartHandler);\n document.removeEventListener('animationend', animationEndHandler);\n removeListeners();\n }\n }\n }\n function animationStartHandler(e) {\n if (e.target === domNode || domNode.contains(e.target)) {\n if (dialog.contains(e.target) && e.target !== dialog) return;\n animationCount++;\n }\n }\n document.addEventListener('animationstart', animationStartHandler);\n document.addEventListener('animationend', animationEndHandler);\n } else {\n domNode.classList.remove(openClass);\n window.f11y.store.activeLayers.length <= 0 ? docBody.style.removeProperty('overflow') : '';\n removeListeners();\n }\n window.dispatchEvent(window.f11y.events.stateUpdate);\n this.options.onClose(this, e);\n }\n }\n\n /**\r\n * Adds bound method window events \r\n */\n addGlobalListeners() {\n window.addEventListener('keydown', this.onWindowKeydownBound);\n if (this.options.closeOnBackgroundClick) window.addEventListener('mousedown', this.onBackgroundMousedownBound);\n }\n\n /**\r\n * Removes bound methods window events \r\n */\n removeGlobalListeners() {\n window.removeEventListener('keydown', this.onWindowKeydownBound);\n if (this.options.closeOnBackgroundClick) window.removeEventListener('mousedown', this.onBackgroundMousedownBound);\n }\n\n /**\r\n * Closes a layer by id attribute\r\n * @param {string} targetLayer id of the layer to be closed\r\n */\n closeLayerById(targetLayer) {\n if (this.id === targetLayer) {\n this.closeLayer();\n }\n }\n\n /**\r\n * Implements window keydown events functionality\r\n * @param {KeyboardEvent} e The event object that triggered the method\r\n */\n #onWindowKeydown(e) {\n let flag = false;\n const tgt = e.target || e.currentTarget;\n if (e.shiftKey) {\n if (e.key === 'Tab') {\n this.#setFocusToPrevElm(tgt);\n flag = true;\n }\n } else {\n switch (e.key) {\n case 'Escape':\n case 'Esc':\n if (!this.options.closeOnEscClick) {\n flag = false;\n } else {\n this.closeLayer(e);\n flag = true;\n }\n break;\n case 'Tab':\n this.#setFocusToNextElm(tgt);\n flag = true;\n break;\n case 'Home':\n case 'PageUp':\n this.setFocusToFirstElm();\n flag = true;\n break;\n case 'End':\n case 'PageDown':\n this.setFocusToLastElm();\n flag = true;\n break;\n }\n }\n if (flag) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n /**\r\n * Handles click events that are outside of the layer dialog remit\r\n * @param {Event} e The event that triggered this method\r\n */\n #onBackgroundMousedown(e) {\n if (!this.dialog.contains(e.target)) {\n if (this.isOpen()) {\n this.closeLayer(e);\n this.activeElm.focus();\n }\n }\n }\n}\n\nclass Table {\n /**\r\n * @param {HTMLElement} domNode\r\n */\n constructor(domNode) {\n /** @type {HTMLElement} */\n this.domNode = domNode;\n this.init();\n }\n\n /**\r\n * Initialises the class component\r\n */\n init() {\n if (!this.domNode) return;\n this.tableId = this.domNode.getAttribute('id');\n this.tableGroups = Array.from(this.domNode.querySelectorAll('thead, tbody, tfoot'));\n this.tableRows = Array.from(this.domNode.querySelectorAll('tr'));\n this.tableHeaderCells = Array.from(this.domNode.querySelectorAll('th'));\n this.tableDataCells = Array.from(this.domNode.querySelectorAll('td'));\n this.styleElm = document.createElement(\"style\");\n document.head.appendChild(this.styleElm);\n this.stylesheet = this.styleElm.sheet;\n this.insertCellHeaders();\n this.insertTableAria();\n this.domNode.classList.add(window.f11y.settings.initialisedClass);\n }\n\n /**\r\n * Refreshes the class component and calls init() and does any necessary resets\r\n */\n refresh() {\n this.init();\n }\n\n /**\r\n * Inserts Header td values as psuedo ::before content into stylesheet element\r\n */\n insertCellHeaders() {\n if (!this.tableHeaderCells || !this.stylesheet) return;\n for (let i = 0; i < this.tableHeaderCells.length; i += 1) {\n this.stylesheet.insertRule(\"#\" + this.tableId + \" td:nth-child(\" + (i + 1) + \")::before {\" + \"content:'\" + this.tableHeaderCells[i].innerText + \"';\" + \"}\", this.stylesheet.cssRules.length);\n }\n }\n\n /**\r\n * Inserts required aria into table for it to still be accessible if display style is change in order to make table repsonsive\r\n */\n insertTableAria() {\n if (!this.tableGroups || !this.tableRows || !this.tableDataCells || !this.tableHeaderCells) return;\n this.domNode.setAttribute('role', 'table');\n for (let i = 0; i < this.tableGroups.length; i++) {\n this.tableGroups[i].setAttribute('role', 'rowgroup');\n }\n for (let i = 0; i < this.tableRows.length; i++) {\n this.tableRows[i].setAttribute('role', 'row');\n }\n for (let i = 0; i < this.tableHeaderCells.length; i++) {\n this.tableHeaderCells[i].setAttribute('role', 'columnheader');\n }\n for (let i = 0; i < this.tableDataCells.length; i++) {\n this.tableDataCells[i].setAttribute('role', 'cell');\n }\n }\n}\n\nclass TabList {\n /**\r\n * @param {HTMLElement} domNode \r\n * @param {TabListDefault} opts \r\n */\n constructor(domNode, opts) {\n /** @type {TabListDefault} */\n const DEFAULTS = {\n onChange: () => {},\n orientation: 'horizontal',\n disableActiveTab: false,\n changeOnNavigation: false,\n moveFocusOnSelect: false\n };\n\n /** @type {TabListDefault} */\n this.options = Object.assign(DEFAULTS, opts);\n\n /** @type {Element | HTMLElement} */\n this.domNode = domNode;\n this.init();\n }\n init() {\n this.tabs = Array.from(this.domNode.querySelectorAll('[role=tab]'));\n this.activeTabs = Array.from(this.domNode.querySelectorAll('[role=tab]:not([disabled])'));\n\n /** @type {Array} */\n this.tabpanels = [];\n for (let i = 0; i < this.tabs.length; i += 1) {\n const tab = this.tabs[i];\n const tabpanel = document.getElementById(tab.getAttribute('aria-controls'));\n tab.tabIndex = -1;\n if (!this.selected && tab.getAttribute('aria-selected') === 'true') {\n this.selected = tab;\n } else {\n tab.setAttribute('aria-selected', 'false');\n }\n this.tabpanels.push(tabpanel);\n tab.addEventListener('keydown', this.onKeydown.bind(this));\n tab.addEventListener('click', this.onClick.bind(this));\n if (!this.firstTab) {\n this.firstTab = tab;\n }\n this.lastTab = tab;\n }\n this.selected ? this.setSelectedTab(this.selected) : this.setSelectedTab(this.firstTab);\n this.dispatchStateUpdateEvent();\n this.domNode.classList.add(window.f11y.settings.initialisedClass);\n }\n dispatchStateUpdateEvent() {\n window.dispatchEvent(window.f11y.events.stateUpdate);\n }\n\n /**\r\n * Refreshes the class component and calls init() and does any necessary resets\r\n */\n refresh() {\n this.init();\n }\n\n /**\r\n * Handles changing a tab\r\n * @param {HTMLElement} targetTab \r\n * @param {Event | KeyboardEvent | null} event \r\n */\n handleTabChange(targetTab) {\n let event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n this.setSelectedTab(targetTab);\n this.dispatchStateUpdateEvent();\n this.options.onChange(this, event);\n }\n\n /**\r\n * \r\n */\n setActiveTabs() {\n this.activeTabs = Array.from(this.domNode.querySelectorAll('[role=tab]:not([disabled])'));\n this.firstActiveTab = null;\n for (let i = 0; i < this.activeTabs.length; i += 1) {\n const tab = this.activeTabs[i];\n if (!this.firstActiveTab) this.firstActiveTab = tab;\n this.lastActiveTab = tab;\n }\n this.nextTab = this.getNextTab();\n this.prevTab = this.getPrevTab();\n }\n\n /**\r\n * Sets the passed tab and corresponding panel to be selected\r\n * @param {Element} targetTab \r\n */\n setSelectedTab(targetTab) {\n for (let i = 0; i < this.tabs.length; i += 1) {\n const tab = this.tabs[i];\n if (targetTab.id === tab.id) {\n this.selected = this.tabs[i];\n tab.setAttribute('aria-selected', 'true');\n tab.removeAttribute('tabindex');\n this.tabpanels[i].removeAttribute('hidden');\n if (this.options.disableActiveTab === true) {\n tab.setAttribute('disabled', '');\n tab.tabIndex = -1;\n }\n } else {\n tab.setAttribute('aria-selected', 'false');\n tab.removeAttribute('disabled');\n tab.tabIndex = -1;\n this.tabpanels[i].setAttribute('hidden', '');\n }\n }\n this.setActiveTabs();\n }\n getNextTab() {\n let tab = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n let nextTab;\n let tabList;\n const currentTab = tab ?? this.selected;\n if (this.options.disableActiveTab) {\n tabList = this.activeTabs;\n } else {\n tabList = this.tabs;\n }\n const i = tabList.indexOf(currentTab);\n if (currentTab.id === this.lastActiveTab.id) {\n nextTab = this.firstActiveTab;\n } else {\n nextTab = tabList[i + 1];\n }\n return nextTab;\n }\n getPrevTab() {\n let tab = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n let prevTab;\n let tabList;\n const currentTab = tab ?? this.selected;\n if (this.options.disableActiveTab) {\n tabList = this.activeTabs;\n } else {\n tabList = this.tabs;\n }\n const i = tabList.indexOf(currentTab);\n if (currentTab.id === this.firstActiveTab.id) {\n prevTab = this.lastActiveTab;\n } else {\n prevTab = tabList[i - 1];\n }\n return prevTab;\n }\n\n /**\r\n * Moves focus to passed tab\r\n * @param {Element} targetTab \r\n */\n moveFocusToTab(targetTab) {\n targetTab.focus();\n }\n\n /**\r\n * Handles keydown events on tabs\r\n * @param {KeyboardEvent} event \r\n */\n onKeydown(event) {\n const tgt = event.currentTarget;\n const change = this.options.changeOnNavigation;\n const orientation = this.options.orientation;\n let flag = false;\n switch (event.key) {\n case 'ArrowLeft':\n if (orientation === 'horizontal') {\n if (change) {\n this.handleTabChange(this.prevTab);\n this.moveFocusToTab(this.selected);\n } else {\n this.moveFocusToTab(this.getPrevTab(tgt));\n }\n flag = true;\n }\n break;\n case 'ArrowRight':\n if (orientation === 'horizontal') {\n if (change) {\n this.handleTabChange(this.nextTab);\n this.moveFocusToTab(this.selected);\n } else {\n this.moveFocusToTab(this.getNextTab(tgt));\n }\n flag = true;\n }\n break;\n case 'ArrowUp':\n if (orientation === 'vertical') {\n if (change) {\n this.handleTabChange(this.prevTab);\n this.moveFocusToTab(this.selected);\n } else {\n this.moveFocusToTab(this.getPrevTab(tgt));\n }\n flag = true;\n }\n break;\n case 'ArrowDown':\n if (orientation === 'vertical') {\n if (change) {\n this.handleTabChange(this.nextTab);\n this.moveFocusToTab(this.selected);\n } else {\n this.moveFocusToTab(this.getNextTab(tgt));\n }\n flag = true;\n }\n break;\n case 'Home':\n if (change) {\n this.handleTabChange(this.firstActiveTab);\n this.moveFocusToTab(this.selected);\n } else {\n this.moveFocusToTab(this.firstActiveTab);\n }\n flag = true;\n break;\n case 'End':\n if (change) {\n this.handleTabChange(this.lastActiveTab);\n this.moveFocusToTab(this.selected);\n } else {\n this.moveFocusToTab(this.lastActiveTab);\n }\n flag = true;\n break;\n }\n if (flag) {\n event.stopPropagation();\n event.preventDefault();\n }\n }\n\n /**\r\n * Handles click events on tabs\r\n * @param {Event} event \r\n */\n onClick(event) {\n this.handleTabChange(event.currentTarget, event);\n if (this.options.moveFocusOnChange === true) {\n this.moveFocusToTab(this.nextTab);\n }\n }\n}\n\nclass Tooltip {\n /**\r\n * @param {HTMLElement} domNode \r\n * @param {TooltipDefault} opts \r\n */\n constructor(domNode, opts) {\n /** @type {TooltipDefault} */\n const DEFAULTS = {\n onOpen: () => {},\n onClose: () => {},\n positionAttributeName: 'f11y-tooltip-position',\n openClass: window.f11y.settings.openClass,\n leewayTiming: 750,\n delayTiming: 2000,\n awaitCloseAnimation: false,\n awaitOpenAnimation: false\n };\n\n /** @type {TooltipDefault} */\n this.options = Object.assign(DEFAULTS, opts);\n this.domNode = domNode;\n this.init();\n }\n\n /**\r\n * Initialises the class component\r\n */\n init() {\n this.leeway = 0;\n this.delay = 0;\n this.trigger = this.domNode.querySelector('[aria-labelledby]');\n this.tooltip = this.domNode.querySelector('[role=tooltip]');\n this.tooltipPos = this.getTooltipPos();\n this.onTooltipKeydownBound = this.#onTooltipKeydown.bind(this);\n this.onBackgroundMousedownBound = this.#onBackgroundMousedown.bind(this);\n this.domNode.addEventListener('mouseenter', this.openTooltip.bind(this));\n this.trigger.addEventListener('touchstart', this.openTooltip.bind(this));\n this.domNode.addEventListener('focusin', this.onFocusin.bind(this));\n this.trigger.addEventListener('focusin', this.openTooltip.bind(this));\n this.domNode.addEventListener('mouseleave', this.closeTooltip.bind(this));\n this.domNode.addEventListener('touchend', this.closeTooltip.bind(this));\n this.domNode.addEventListener('focusout', this.onFocusout.bind(this));\n this.trigger.addEventListener('focusout', this.closeTooltip.bind(this));\n document.addEventListener('scroll', this.checkBoundingBox.bind(this));\n window.addEventListener('resize', this.checkBoundingBox.bind(this));\n this.domNode.classList.add(window.f11y.settings.initialisedClass);\n }\n\n /**\r\n * Refreshes the class component and calls init() and does any necessary resets\r\n */\n refresh() {\n this.init();\n }\n\n /**\r\n * Checks whether the layer is open\r\n * @returns {boolean}\r\n */\n isOpen() {\n return this.domNode.classList.contains(this.options.openClass) === true;\n }\n\n /**\r\n * Opens the tooltip\r\n */\n openTooltip() {\n const domNode = this.domNode;\n const tooltip = this.tooltip;\n const openClass = this.options.openClass;\n const animatingClass = window.f11y.settings.animatingClass;\n const animatingOpenClass = window.f11y.settings.animatingOpenClass;\n this.options.delayTiming;\n const leeway = this.leeway;\n if (!this.isOpen() && this.options.awaitOpenAnimation) {\n domNode.addEventListener('animationend', handler);\n domNode.classList.add(animatingClass, animatingOpenClass);\n function handler() {\n domNode.classList.remove(animatingClass, animatingOpenClass);\n domNode.classList.add(openClass);\n tooltip.classList.add(openClass);\n clearTimeout(leeway);\n domNode.removeEventListener('animationend', handler);\n }\n } else {\n domNode.classList.add(openClass);\n tooltip.classList.add(openClass);\n clearTimeout(leeway);\n }\n this.checkBoundingBox();\n this.addGlobalListeners();\n window.dispatchEvent(window.f11y.events.stateUpdate);\n }\n\n /**\r\n * Closes the tooltip\r\n */\n closeTooltip() {\n if (this.isOpen()) {\n const domNode = this.domNode;\n const tooltip = this.tooltip;\n const openClass = this.options.openClass;\n const leeway = this.options.leewayTiming;\n const animatingClass = window.f11y.settings.animatingClass;\n const animatingCloseClass = window.f11y.settings.animatingCloseClass;\n if (this.options.awaitCloseAnimation) {\n this.leeway = setTimeout(function () {\n domNode.addEventListener('animationend', handler);\n domNode.classList.add(animatingClass, animatingCloseClass);\n function handler() {\n domNode.classList.remove(animatingClass, animatingCloseClass);\n domNode.classList.remove(openClass);\n tooltip.classList.remove(openClass);\n domNode.removeEventListener('animationend', handler);\n }\n }, leeway);\n } else {\n this.leeway = setTimeout(function () {\n domNode.classList.remove(openClass);\n tooltip.classList.remove(openClass);\n }, leeway);\n }\n window.dispatchEvent(window.f11y.events.stateUpdate);\n }\n this.resetBoundingBox();\n this.removeGlobalListeners();\n }\n\n /**\r\n * Registers global event listeners\r\n */\n addGlobalListeners() {\n document.addEventListener('keydown', this.onTooltipKeydownBound);\n window.addEventListener('mousedown', this.onBackgroundMousedownBound, true);\n }\n\n /**\r\n * Removes global event listeners\r\n */\n removeGlobalListeners() {\n document.removeEventListener('keydown', this.onTooltipKeydownBound);\n window.removeEventListener('mousedown', this.onBackgroundMousedownBound, true);\n }\n\n /**\r\n * Handles the domNode receiving focus\r\n */\n onFocusin() {\n this.domNode.classList.add('has-focus');\n }\n\n /**\r\n * Handles the domNode losing focus\r\n */\n onFocusout() {\n this.domNode.classList.remove('has-focus');\n }\n\n /**\r\n * Handles a keydown event on the tooltip target\r\n * @param {KeyboardEvent} e The event object that triggered the method\r\n * @returns {void}\r\n */\n #onTooltipKeydown(e) {\n const key = e.key;\n let flag = false;\n switch (key) {\n case 'Escape':\n case 'Esc':\n this.closeTooltip();\n flag = true;\n break;\n }\n if (flag) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n /**\r\n * Handles a mouse click event outside the domNode\r\n * @param {Event} e The event object that triggered the method\r\n */\n #onBackgroundMousedown(e) {\n if (!this.domNode.contains(e.target)) {\n if (this.isOpen()) {\n this.closeTooltip();\n }\n }\n }\n\n /**\r\n * Returns the position value from the attribute or a default if one is not set\r\n * @return {string} the position value\r\n */\n getTooltipPos() {\n let setting = 'bottom';\n if (this.domNode.getAttribute(this.options.positionAttributeName)) {\n setting = this.domNode.getAttribute(this.options.positionAttributeName);\n }\n return setting;\n }\n\n /** \r\n * Checks the bounding box of the tooltip element against the window bounds\r\n */\n checkBoundingBox() {\n let bounds = this.tooltip.getBoundingClientRect();\n this.checkHorizontalBounding(bounds);\n this.checkVerticalBounding(bounds);\n }\n\n /**\r\n * Checks the bounds of the tooltip against the window and sets offset css var\r\n * @param {DOMRect} bounds the bounding box values of the tooltip\r\n */\n checkHorizontalBounding(bounds) {\n let windowWidth = window.innerWidth;\n let translateAmount;\n if (bounds.right > windowWidth && bounds.left < 0) {\n console.warn('Tooltip width too wide for the window');\n return;\n }\n if (bounds.right > windowWidth) {\n //move it left\n translateAmount = windowWidth - Math.round(bounds.right) - Math.round(bounds.width) / 1.6;\n this.domNode.style.setProperty('--f11y-tooltip-offset', translateAmount);\n }\n if (bounds.left < 0) {\n // move it right\n translateAmount = Math.floor(bounds.width / 2);\n this.domNode.style.setProperty('--f11y-tooltip-offset', translateAmount);\n }\n }\n\n /**\r\n * Checks the bounds of the tooltip against the window and change the position attribute\r\n * @param {DOMRect} bounds the bounding box values of the tooltip\r\n */\n checkVerticalBounding(bounds) {\n let windowHeight = window.innerHeight;\n if (bounds.bottom > windowHeight && bounds.top < 0) {\n console.warn('Tooltip height too high for the window');\n return;\n }\n if (bounds.bottom > windowHeight) {\n // move it up\n this.domNode.setAttribute(this.options.positionAttributeName, 'top');\n return;\n }\n if (bounds.top < 0) {\n //move it down\n this.domNode.setAttribute(this.options.positionAttributeName, 'bottom');\n return;\n }\n }\n\n /**\r\n * Resets any changes made by checkBoundingBox()\r\n */\n resetBoundingBox() {\n this.domNode.style.removeProperty('--f11y-tooltip-offset');\n this.domNode.setAttribute(this.options.positionAttributeName, this.tooltipPos);\n }\n}\n\n/**\r\n * Checks if something is set aka not null or undefined\r\n * @param {*} thing What do you want to check exists?\r\n * @returns {boolean}\r\n */\nfunction isSet(thing) {\n return typeof thing !== 'undefined' && thing !== null;\n}\n\n/**\r\n * @module f11y\r\n */\n\n/**\r\n * Represents the f11y module.\r\n * @namespace f11y\r\n */\nconst createF11y = () => ({\n components: {\n Accordion,\n Dropdown,\n Layer,\n Table,\n TabList,\n Tooltip\n },\n focusableElements: ['a[href]:not([disabled]):not([hidden]):not([aria-hidden])', 'area[href]:not([disabled]):not([hidden]):not([aria-hidden])', 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe:not([disabled]):not([hidden]):not([aria-hidden])', 'object:not([disabled]):not([hidden]):not([aria-hidden])', 'embed:not([disabled]):not([hidden]):not([aria-hidden])', '[contenteditable]:not([disabled]):not([hidden]):not([aria-hidden])', '[tabindex]'],\n settings: {\n initialisedClass: 'has-initialised',\n openClass: 'is-open',\n animatingClass: 'is-animating',\n animatingOpenClass: 'is-opening',\n animatingCloseClass: 'is-closing',\n awaitOpenAnimation: false,\n awaitCloseAnimation: false\n },\n store: {\n activeLayers: [],\n activeLayer: ''\n },\n utils: {\n isSet: isSet,\n isFocusable: isFocusable,\n getFocusable: getFocusable\n },\n events: {\n stateUpdate: new Event('f11ystateupdate')\n }\n});\n\n// Create a default instance of f11y\nconst defaultF11y = createF11y();\n\n/**\r\n * Initializes the f11y module and attaches it to the window object.\r\n */\nconst initialiseF11y = () => {\n if (typeof window !== 'undefined') {\n window.f11y = defaultF11y;\n }\n};\ninitialiseF11y();\n\nexport { createF11y, defaultF11y as default };\n", "/*globals jQuery,Window,HTMLElement,HTMLDocument,HTMLCollection,NodeList,MutationObserver */\n/*exported Arrive*/\n/*jshint latedef:false */\n\n/*\n * arrive.js\n * v2.4.1\n * https://github.com/uzairfarooq/arrive\n * MIT licensed\n *\n * Copyright (c) 2014-2017 Uzair Farooq\n */\nvar Arrive = (function(window, $, undefined) {\n\n \"use strict\";\n\n if(!window.MutationObserver || typeof HTMLElement === 'undefined'){\n return; //for unsupported browsers\n }\n\n var arriveUniqueId = 0;\n\n var utils = (function() {\n var matches = HTMLElement.prototype.matches || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector\n || HTMLElement.prototype.msMatchesSelector;\n\n return {\n matchesSelector: function(elem, selector) {\n return elem instanceof HTMLElement && matches.call(elem, selector);\n },\n // to enable function overloading - By John Resig (MIT Licensed)\n addMethod: function (object, name, fn) {\n var old = object[ name ];\n object[ name ] = function(){\n if ( fn.length == arguments.length ) {\n return fn.apply( this, arguments );\n }\n else if ( typeof old == 'function' ) {\n return old.apply( this, arguments );\n }\n };\n },\n callCallbacks: function(callbacksToBeCalled, registrationData) {\n if (registrationData && registrationData.options.onceOnly && registrationData.firedElems.length == 1) {\n // as onlyOnce param is true, make sure we fire the event for only one item\n callbacksToBeCalled = [callbacksToBeCalled[0]];\n }\n\n for (var i = 0, cb; (cb = callbacksToBeCalled[i]); i++) {\n if (cb && cb.callback) {\n cb.callback.call(cb.elem, cb.elem);\n }\n }\n\n if (registrationData && registrationData.options.onceOnly && registrationData.firedElems.length == 1) {\n // unbind event after first callback as onceOnly is true.\n registrationData.me.unbindEventWithSelectorAndCallback.call(\n registrationData.target, registrationData.selector, registrationData.callback);\n }\n },\n // traverse through all descendants of a node to check if event should be fired for any descendant\n checkChildNodesRecursively: function(nodes, registrationData, matchFunc, callbacksToBeCalled) {\n // check each new node if it matches the selector\n for (var i=0, node; (node = nodes[i]); i++) {\n if (matchFunc(node, registrationData, callbacksToBeCalled)) {\n callbacksToBeCalled.push({ callback: registrationData.callback, elem: node });\n }\n\n if (node.childNodes.length > 0) {\n utils.checkChildNodesRecursively(node.childNodes, registrationData, matchFunc, callbacksToBeCalled);\n }\n }\n },\n mergeArrays: function(firstArr, secondArr){\n // Overwrites default options with user-defined options.\n var options = {},\n attrName;\n for (attrName in firstArr) {\n if (firstArr.hasOwnProperty(attrName)) {\n options[attrName] = firstArr[attrName];\n }\n }\n for (attrName in secondArr) {\n if (secondArr.hasOwnProperty(attrName)) {\n options[attrName] = secondArr[attrName];\n }\n }\n return options;\n },\n toElementsArray: function (elements) {\n // check if object is an array (or array like object)\n // Note: window object has .length property but it's not array of elements so don't consider it an array\n if (typeof elements !== \"undefined\" && (typeof elements.length !== \"number\" || elements === window)) {\n elements = [elements];\n }\n return elements;\n }\n };\n })();\n\n\n // Class to maintain state of all registered events of a single type\n var EventsBucket = (function() {\n var EventsBucket = function() {\n // holds all the events\n\n this._eventsBucket = [];\n // function to be called while adding an event, the function should do the event initialization/registration\n this._beforeAdding = null;\n // function to be called while removing an event, the function should do the event destruction\n this._beforeRemoving = null;\n };\n\n EventsBucket.prototype.addEvent = function(target, selector, options, callback) {\n var newEvent = {\n target: target,\n selector: selector,\n options: options,\n callback: callback,\n firedElems: []\n };\n\n if (this._beforeAdding) {\n this._beforeAdding(newEvent);\n }\n\n this._eventsBucket.push(newEvent);\n return newEvent;\n };\n\n EventsBucket.prototype.removeEvent = function(compareFunction) {\n for (var i=this._eventsBucket.length - 1, registeredEvent; (registeredEvent = this._eventsBucket[i]); i--) {\n if (compareFunction(registeredEvent)) {\n if (this._beforeRemoving) {\n this._beforeRemoving(registeredEvent);\n }\n\n // mark callback as null so that even if an event mutation was already triggered it does not call callback\n var removedEvents = this._eventsBucket.splice(i, 1);\n if (removedEvents && removedEvents.length) {\n removedEvents[0].callback = null;\n }\n }\n }\n };\n\n EventsBucket.prototype.beforeAdding = function(beforeAdding) {\n this._beforeAdding = beforeAdding;\n };\n\n EventsBucket.prototype.beforeRemoving = function(beforeRemoving) {\n this._beforeRemoving = beforeRemoving;\n };\n\n return EventsBucket;\n })();\n\n\n /**\n * @constructor\n * General class for binding/unbinding arrive and leave events\n */\n var MutationEvents = function(getObserverConfig, onMutation) {\n var eventsBucket = new EventsBucket(),\n me = this;\n\n var defaultOptions = {\n fireOnAttributesModification: false\n };\n\n // actual event registration before adding it to bucket\n eventsBucket.beforeAdding(function(registrationData) {\n var\n target = registrationData.target,\n observer;\n\n // mutation observer does not work on window or document\n if (target === window.document || target === window) {\n target = document.getElementsByTagName(\"html\")[0];\n }\n\n // Create an observer instance\n observer = new MutationObserver(function(e) {\n onMutation.call(this, e, registrationData);\n });\n\n var config = getObserverConfig(registrationData.options);\n\n observer.observe(target, config);\n\n registrationData.observer = observer;\n registrationData.me = me;\n });\n\n // cleanup/unregister before removing an event\n eventsBucket.beforeRemoving(function (eventData) {\n eventData.observer.disconnect();\n });\n\n this.bindEvent = function(selector, options, callback) {\n options = utils.mergeArrays(defaultOptions, options);\n\n var elements = utils.toElementsArray(this);\n\n for (var i = 0; i < elements.length; i++) {\n eventsBucket.addEvent(elements[i], selector, options, callback);\n }\n };\n\n this.unbindEvent = function() {\n var elements = utils.toElementsArray(this);\n eventsBucket.removeEvent(function(eventObj) {\n for (var i = 0; i < elements.length; i++) {\n if (this === undefined || eventObj.target === elements[i]) {\n return true;\n }\n }\n return false;\n });\n };\n\n this.unbindEventWithSelectorOrCallback = function(selector) {\n var elements = utils.toElementsArray(this),\n callback = selector,\n compareFunction;\n\n if (typeof selector === \"function\") {\n compareFunction = function(eventObj) {\n for (var i = 0; i < elements.length; i++) {\n if ((this === undefined || eventObj.target === elements[i]) && eventObj.callback === callback) {\n return true;\n }\n }\n return false;\n };\n }\n else {\n compareFunction = function(eventObj) {\n for (var i = 0; i < elements.length; i++) {\n if ((this === undefined || eventObj.target === elements[i]) && eventObj.selector === selector) {\n return true;\n }\n }\n return false;\n };\n }\n eventsBucket.removeEvent(compareFunction);\n };\n\n this.unbindEventWithSelectorAndCallback = function(selector, callback) {\n var elements = utils.toElementsArray(this);\n eventsBucket.removeEvent(function(eventObj) {\n for (var i = 0; i < elements.length; i++) {\n if ((this === undefined || eventObj.target === elements[i]) && eventObj.selector === selector && eventObj.callback === callback) {\n return true;\n }\n }\n return false;\n });\n };\n\n return this;\n };\n\n\n /**\n * @constructor\n * Processes 'arrive' events\n */\n var ArriveEvents = function() {\n // Default options for 'arrive' event\n var arriveDefaultOptions = {\n fireOnAttributesModification: false,\n onceOnly: false,\n existing: false\n };\n\n function getArriveObserverConfig(options) {\n var config = {\n attributes: false,\n childList: true,\n subtree: true\n };\n\n if (options.fireOnAttributesModification) {\n config.attributes = true;\n }\n\n return config;\n }\n\n function onArriveMutation(mutations, registrationData) {\n mutations.forEach(function( mutation ) {\n var newNodes = mutation.addedNodes,\n targetNode = mutation.target,\n callbacksToBeCalled = [],\n node;\n\n // If new nodes are added\n if( newNodes !== null && newNodes.length > 0 ) {\n utils.checkChildNodesRecursively(newNodes, registrationData, nodeMatchFunc, callbacksToBeCalled);\n }\n else if (mutation.type === \"attributes\") {\n if (nodeMatchFunc(targetNode, registrationData, callbacksToBeCalled)) {\n callbacksToBeCalled.push({ callback: registrationData.callback, elem: targetNode });\n }\n }\n\n utils.callCallbacks(callbacksToBeCalled, registrationData);\n });\n }\n\n function nodeMatchFunc(node, registrationData, callbacksToBeCalled) {\n // check a single node to see if it matches the selector\n if (utils.matchesSelector(node, registrationData.selector)) {\n if(node._id === undefined) {\n node._id = arriveUniqueId++;\n }\n // make sure the arrive event is not already fired for the element\n if (registrationData.firedElems.indexOf(node._id) == -1) {\n registrationData.firedElems.push(node._id);\n\n return true;\n }\n }\n\n return false;\n }\n\n arriveEvents = new MutationEvents(getArriveObserverConfig, onArriveMutation);\n\n var mutationBindEvent = arriveEvents.bindEvent;\n\n // override bindEvent function\n arriveEvents.bindEvent = function(selector, options, callback) {\n\n if (typeof callback === \"undefined\") {\n callback = options;\n options = arriveDefaultOptions;\n } else {\n options = utils.mergeArrays(arriveDefaultOptions, options);\n }\n\n var elements = utils.toElementsArray(this);\n\n if (options.existing) {\n var existing = [];\n\n for (var i = 0; i < elements.length; i++) {\n var nodes = elements[i].querySelectorAll(selector);\n for (var j = 0; j < nodes.length; j++) {\n existing.push({ callback: callback, elem: nodes[j] });\n }\n }\n\n // no need to bind event if the callback has to be fired only once and we have already found the element\n if (options.onceOnly && existing.length) {\n return callback.call(existing[0].elem, existing[0].elem);\n }\n\n setTimeout(utils.callCallbacks, 1, existing);\n }\n\n mutationBindEvent.call(this, selector, options, callback);\n };\n\n return arriveEvents;\n };\n\n\n /**\n * @constructor\n * Processes 'leave' events\n */\n var LeaveEvents = function() {\n // Default options for 'leave' event\n var leaveDefaultOptions = {};\n\n function getLeaveObserverConfig() {\n var config = {\n childList: true,\n subtree: true\n };\n\n return config;\n }\n\n function onLeaveMutation(mutations, registrationData) {\n mutations.forEach(function( mutation ) {\n var removedNodes = mutation.removedNodes,\n callbacksToBeCalled = [];\n\n if( removedNodes !== null && removedNodes.length > 0 ) {\n utils.checkChildNodesRecursively(removedNodes, registrationData, nodeMatchFunc, callbacksToBeCalled);\n }\n\n utils.callCallbacks(callbacksToBeCalled, registrationData);\n });\n }\n\n function nodeMatchFunc(node, registrationData) {\n return utils.matchesSelector(node, registrationData.selector);\n }\n\n leaveEvents = new MutationEvents(getLeaveObserverConfig, onLeaveMutation);\n\n var mutationBindEvent = leaveEvents.bindEvent;\n\n // override bindEvent function\n leaveEvents.bindEvent = function(selector, options, callback) {\n\n if (typeof callback === \"undefined\") {\n callback = options;\n options = leaveDefaultOptions;\n } else {\n options = utils.mergeArrays(leaveDefaultOptions, options);\n }\n\n mutationBindEvent.call(this, selector, options, callback);\n };\n\n return leaveEvents;\n };\n\n\n var arriveEvents = new ArriveEvents(),\n leaveEvents = new LeaveEvents();\n\n function exposeUnbindApi(eventObj, exposeTo, funcName) {\n // expose unbind function with function overriding\n utils.addMethod(exposeTo, funcName, eventObj.unbindEvent);\n utils.addMethod(exposeTo, funcName, eventObj.unbindEventWithSelectorOrCallback);\n utils.addMethod(exposeTo, funcName, eventObj.unbindEventWithSelectorAndCallback);\n }\n\n /*** expose APIs ***/\n function exposeApi(exposeTo) {\n exposeTo.arrive = arriveEvents.bindEvent;\n exposeUnbindApi(arriveEvents, exposeTo, \"unbindArrive\");\n\n exposeTo.leave = leaveEvents.bindEvent;\n exposeUnbindApi(leaveEvents, exposeTo, \"unbindLeave\");\n }\n\n if ($) {\n exposeApi($.fn);\n }\n exposeApi(HTMLElement.prototype);\n exposeApi(NodeList.prototype);\n exposeApi(HTMLCollection.prototype);\n exposeApi(HTMLDocument.prototype);\n exposeApi(Window.prototype);\n\n var Arrive = {};\n // expose functions to unbind all arrive/leave events\n exposeUnbindApi(arriveEvents, Arrive, \"unbindAllArrive\");\n exposeUnbindApi(leaveEvents, Arrive, \"unbindAllLeave\");\n\n return Arrive;\n\n})(window, typeof jQuery === 'undefined' ? null : jQuery, undefined);", "/*Functionality Library*/\r\nimport f11y from 'f11y';\r\nimport { Arrive } from 'arrive';\r\n\r\nimport { isJavascriptEnabled } from \"./helpers/enabled\";\r\nimport { isSet } from \"./helpers/isset\";\r\nimport { Sticky } from \"./patterns/sticky-header\";\r\nimport { Video } from \"./patterns/video\";\r\nimport { SiteSearch } from \"./patterns/site-search\";\r\nimport { Toast } from \"./patterns/toast\";\r\nimport { ContentSearch } from \"./patterns/content-search\";\r\nimport { InlineSearch } from \"./patterns/inline-search\";\r\nimport { FieldCounter } from \"./patterns/field-counter\";\r\nimport { DepotFinder } from \"./patterns/depot-finder\";\r\nimport { EnquiryLink } from \"./patterns/enquiry-link\";\r\nimport { initEmblaCarousels } from \"./patterns/embla-carousel-init\";\r\nimport { Add2Basket } from \"./patterns/add-to-basket\";\r\nimport { checkStickyHeight } from \"./helpers/check-sticky\";\r\n\r\n\r\nisJavascriptEnabled();\r\n\r\n\r\n/**\r\n * Sticky Masthead\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst masthead = document.querySelector(\"#masthead\");\r\nif(isSet(masthead)){\r\n new Sticky(masthead);\r\n}\r\n\r\n\r\n/**\r\n * Height checking for other sticky elements\r\n */\r\nconst stickyElms = document.querySelectorAll(\".is-sticky\");\r\nstickyElms.forEach( function (stickyElm) {\r\n checkStickyHeight(stickyElm);\r\n});\r\n\r\n\r\n/**\r\n * Initialise Enquiry Buttons\r\n */\r\nconst enquireForm = document.querySelector(\".scotagrienquiryform2024 form\");\r\nconst enquireButtonElms = document.querySelectorAll(\".enquire-button--js\");\r\n\r\nenquireButtonElms.forEach( function (enquireButtonElm) {\r\n new EnquiryLink(enquireButtonElm, enquireForm);\r\n});\r\n\r\ndocument.arrive(\r\n \".enquire-button--js\", \r\n function(newEnquireButtonElm) {\r\n new EnquiryLink(newEnquireButtonElm, enquireForm);\r\n }\r\n);\r\n\r\n\r\n//Handles prefilling contact form if we have been redirected from a enquiry link\r\nfunction handleContactEnquire(){\r\n const contactForm = document.querySelector('.scotagricontactform2024 form');\r\n\r\n if(!isSet(contactForm)) return;\r\n\r\n const params = new Proxy(new URLSearchParams(window.location.search), {\r\n get: (searchParams, prop) => searchParams.get(prop),\r\n });\r\n\r\n if(params.enquire !== \"true\") return;\r\n\r\n const getMessage = JSON.parse(localStorage.getItem(\"message\"));\r\n\r\n if(!isSet(getMessage)) return;\r\n\r\n let prefix = '';\r\n\r\n switch (getMessage.type) {\r\n case 'stock':\r\n prefix = 'the stock item: ';\r\n break;\r\n case 'machinery':\r\n prefix = 'the machinery model: ';\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n const messageField = contactForm.querySelector('.message textarea');\r\n\r\n if(isSet(messageField)){\r\n const messageValue = \"Hello, I would like to make an enquiry regarding \"+ prefix + ' \"' + getMessage.title + '\"';\r\n messageField.value = messageValue;\r\n\r\n const yOffset = -100; \r\n const y = contactForm.getBoundingClientRect().top + window.scrollY + yOffset;\r\n window.scrollTo(\r\n {\r\n top: y, \r\n behavior: 'smooth'\r\n }\r\n );\r\n }\r\n}\r\nhandleContactEnquire();\r\n\r\n/**\r\n * Initialise Embla Carousels\r\n */\r\ninitEmblaCarousels();\r\ndocument.arrive(\r\n \".embla\", \r\n function() {\r\n initEmblaCarousels();\r\n }\r\n);\r\n\r\n\r\n/**\r\n * Initialise TabLists\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst tabLists = document.querySelectorAll(\".tabs--js\");\r\ntabLists.forEach( function (tabList) {\r\n new f11y.components.TabList(\r\n tabList\r\n );\r\n});\r\n\r\n\r\n/**\r\n * Expandable Menu Accordions\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst expandableMenus = document.querySelectorAll(\".has-expandable--js\");\r\n\r\n/** @type {DropdownDefault} */\r\nconst expandableMenuOpts = {\r\n}\r\n\r\nexpandableMenus.forEach(function (expandableMenuElm) {\r\n new f11y.components.Accordion(\r\n expandableMenuElm,\r\n expandableMenuOpts\r\n );\r\n});\r\n\r\n\r\n/**\r\n * Menu Dropdowns\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst menuDropdowns = document.querySelectorAll(\".has-popup--js\");\r\n\r\n/** @type DropdownDefault */\r\nconst menuDropdownOpts = {\r\n awaitOpenAnimation: true,\r\n awaitCloseAnimation: true\r\n}\r\n\r\nmenuDropdowns.forEach(function (menuDropdownElm) {\r\n new f11y.components.Dropdown(\r\n menuDropdownElm,\r\n menuDropdownOpts\r\n );\r\n});\r\n\r\n\r\n/**\r\n * Mega Menu Dropdowns\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst megaMenus = document.querySelectorAll(\".has-mega-menu--js\");\r\n\r\n/** @type DropdownDefault */\r\nconst megaMenuOpts = {\r\n tabNavigation: true,\r\n awaitOpenAnimation: true,\r\n awaitCloseAnimation: true\r\n}\r\n\r\nmegaMenus.forEach(function (megaMenuElm) {\r\n new f11y.components.Dropdown(\r\n megaMenuElm,\r\n megaMenuOpts\r\n );\r\n});\r\n\r\n\r\n/**\r\n * filter Accordions\r\n */\r\nconst filters = document.querySelectorAll(\".filter--js\");\r\nfilters.forEach(function (filter) {\r\n new f11y.components.Accordion(\r\n filter,\r\n {\r\n onClose: function() {\r\n const stickyElms = document.querySelectorAll(\".is-sticky\");\r\n \r\n stickyElms.forEach( function (stickyElm) {\r\n checkStickyHeight(stickyElm);\r\n });\r\n },\r\n onOpen: function() {\r\n const stickyElms = document.querySelectorAll(\".is-sticky\");\r\n stickyElms.forEach( function (stickyElm) {\r\n checkStickyHeight(stickyElm);\r\n });\r\n },\r\n showMultiple: true,\r\n }\r\n );\r\n});\r\n\r\n\r\n/**\r\n * Machinery Type Accordions\r\n */\r\nconst subTypes = document.querySelectorAll(\".sub-types--js\");\r\nsubTypes.forEach(function (accordion) {\r\n new f11y.components.Accordion(\r\n accordion,\r\n {\r\n onOpen: function(itemObj){\r\n const subTypeContainer = itemObj.item.closest('article');\r\n subTypeContainer.classList.add('is-open');\r\n },\r\n onClose: function(itemObj){\r\n const subTypeContainer = itemObj.item.closest('article');\r\n subTypeContainer.classList.remove('is-open');\r\n },\r\n showMultiple: true,\r\n }\r\n );\r\n});\r\n\r\n\r\ndocument.arrive(\r\n \".sub-types--js\", \r\n function(newElm) {\r\n new f11y.components.Accordion(\r\n newElm,\r\n {\r\n onOpen: function(itemObj){\r\n const subTypeContainer = itemObj.item.closest('article');\r\n subTypeContainer.classList.add('is-open');\r\n },\r\n onClose: function(itemObj){\r\n const subTypeContainer = itemObj.item.closest('article');\r\n subTypeContainer.classList.remove('is-open');\r\n },\r\n showMultiple: true,\r\n }\r\n );\r\n }\r\n);\r\n\r\n\r\n/**\r\n * Modals\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst modals = document.querySelectorAll(\".layer--js\");\r\n\r\nlet isMastheadHidden;\r\n\r\n/** @type DropdownDefault */\r\nconst modalOpts = {\r\n onOpen: function(obj){\r\n if(obj.domNode.id === \"layer--mobile-nav\") return;\r\n const masthead = document.querySelector(\"#masthead\");\r\n\r\n if(!masthead.classList.contains('hide')){\r\n masthead.classList.add('hide');\r\n isMastheadHidden = true\r\n }else{\r\n isMastheadHidden = false\r\n }\r\n },\r\n onClose: function(){\r\n if(isMastheadHidden === true){\r\n masthead.classList.remove('hide');\r\n }\r\n },\r\n awaitOpenAnimation: true,\r\n awaitCloseAnimation: true\r\n}\r\n\r\nmodals.forEach(function (modalElm) {\r\n new f11y.components.Layer(\r\n modalElm,\r\n modalOpts\r\n );\r\n});\r\n\r\ndocument.arrive(\r\n \".layer--js\", \r\n function(newElm) {\r\n new f11y.components.Layer(\r\n newElm,\r\n modalOpts\r\n );\r\n }\r\n);\r\n\r\n\r\n/**\r\n * Vimeo Videos\r\n */\r\n/** @type {HTMLElement[]} */\r\nconst vimeoVideos = document.querySelectorAll(\"[data-vimeo-url]\");\r\n\r\nvimeoVideos.forEach(function (vimeoVideoElm) {\r\n new Video(vimeoVideoElm);\r\n});\r\n\r\n\r\n/**\r\n * Initialise Custom Select Fields\r\n */\r\nconst selectFields = document.querySelectorAll(\".sa-field--dropdown--js select\");\r\nselectFields.forEach(function (selectElm) {\r\n NiceSelect.bind(\r\n selectElm, \r\n {\r\n searchable: false, \r\n placeholder: 'select', \r\n searchtext: 'Search...', \r\n selectedtext: 'Selected'\r\n }\r\n );\r\n});\r\n\r\nlet elements = window.f11y.focusableElements;\r\nelements.push('[role=menuitem]');\r\nwindow.f11y.focusableElements = elements;\r\n\r\n\r\nconst customDropdownFields = document.querySelectorAll(\".sa-field--custom-dropdown--js\");\r\ncustomDropdownFields.forEach(function (dropdownElm) {\r\n\r\n let trigger = dropdownElm.querySelector('button');\r\n let triggerid = trigger.id;\r\n let selector = '#' + triggerid + ' > span';\r\n\r\n new f11y.components.Dropdown(\r\n dropdownElm,\r\n {\r\n onAfterClose: (object, e) => {\r\n if(!dropdownElm.contains(e.target)) return;\r\n\r\n object.dropdownItems.forEach((item)=>{\r\n item.classList.remove('is-selected')\r\n });\r\n \r\n e.currentTarget.classList.add('is-selected');\r\n selectionMade(e, object, dropdownElm);\r\n },\r\n updateOnSelect: true,\r\n closeOnSelect: true,\r\n updateSelector: selector\r\n }\r\n );\r\n});\r\n\r\nfunction selectionMade(e, object, dropdown) {\r\n let value = e.target.textContent;\r\n\r\n object.updateTargetNode.dataset.value = value;\r\n const eventDetail = {\r\n detail: {\r\n event: e,\r\n object: object,\r\n dropdown: dropdown\r\n }\r\n };\r\n const customEvent = new CustomEvent('optionChanged', eventDetail);\r\n\r\n dropdown.dispatchEvent(customEvent);\r\n}\r\n\r\n/**\r\n * Initialise custom counter fields\r\n */\r\nconst counterFields = document.querySelectorAll(\".sa-field--counter--js\");\r\ncounterFields.forEach(function (counterElm){\r\n new FieldCounter(counterElm)\r\n});\r\n\r\n\r\n/**\r\n * Search Functionalities\r\n */\r\nconst siteSearch = document.querySelector(\".site-search--js\");\r\nnew SiteSearch(siteSearch);\r\n\r\nconst contentSearch = document.querySelectorAll(\".content-search--js\");\r\ncontentSearch.forEach(function (element) {\r\n new ContentSearch(element);\r\n});\r\n\r\nconst inlineSearch = document.querySelectorAll(\".sa-field--inline-search--js\");\r\ninlineSearch.forEach(function (element) {\r\n new InlineSearch(element);\r\n});\r\n\r\n\r\n\r\n/**\r\n * Initialise Google Maps API & Depot Finder\r\n */\r\n(g=>{var h,a,k,p=\"The Google Maps JavaScript API\",c=\"google\",l=\"importLibrary\",q=\"__ib__\",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement(\"script\"));e.set(\"libraries\",[...r]+\"\");for(k in g)e.set(k.replace(/[A-Z]/g,t=>\"_\"+t[0].toLowerCase()),g[k]);e.set(\"callback\",c+\".maps.\"+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+\" could not load.\"));a.nonce=m.querySelector(\"script[nonce]\")?.nonce||\"\";m.head.append(a)}));d[l]?console.warn(p+\" only loads once. Ignoring:\",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({\r\n key: \"AIzaSyASHgpurCiCV1hIuZiG05KQvczM-vxo_CE\",\r\n v: \"weekly\",\r\n});\r\n\r\nconst depotFinderContainer = document.querySelector('.depot-finder--js');\r\nif(isSet(depotFinderContainer)){\r\n const depotFinderResultContainer = depotFinderContainer.querySelector('.results-container');\r\n\r\n depotFinderResultContainer.addEventListener('loaded', initMap, false);\r\n\r\n // Initialize and add the map\r\n async function initMap() {\r\n depotFinderResultContainer.removeEventListener('loaded', initMap, false);\r\n\r\n const {Map, InfoWindow} = await google.maps.importLibrary(\"maps\");\r\n const {Marker} = await google.maps.importLibrary(\"marker\");\r\n \r\n new DepotFinder(depotFinderContainer, Map, Marker, InfoWindow);\r\n }\r\n}\r\n\r\nfunction initiliseToasts(){\r\n const toastContainerElm = document.querySelector(\".toast--container\");\r\n const toastSuccessTemplate = document.querySelector('#basket-toast--success');\r\n const toastErrorTemplate = document.querySelector('#basket-toast--error');\r\n const toastOptions = {\r\n swipeTracking: true,\r\n awaitOpenTransition: true,\r\n awaitCloseTransition: true,\r\n swipeDirection: 'left'\r\n };\r\n \r\n window.basketSuccessAPI = new Toast(\r\n toastContainerElm,\r\n toastSuccessTemplate,\r\n toastOptions\r\n );\r\n\r\n window.basketErrorAPI = new Toast(\r\n toastContainerElm,\r\n toastErrorTemplate,\r\n toastOptions\r\n );\r\n}\r\ninitiliseToasts();\r\n\r\n\r\nconst addToBasketContainer = document.querySelector(\".sa-add-to-basket--js\");\r\nif(isSet(addToBasketContainer)){\r\n new Add2Basket(addToBasketContainer);\r\n}", "function checkStickyHeight(domNode){\r\n if(!domNode.classList.contains('is-sticky')){\r\n console.warn('No .is-sticky class on passed DOM Node.');\r\n }\r\n\r\n const nodeHeight = domNode.offsetHeight;\r\n const windowHeight = window.innerHeight;\r\n const siteHeaderHeight = document.getElementById('masthead').offsetHeight;\r\n const availableHeight = windowHeight - siteHeaderHeight - 30;\r\n\r\n if(nodeHeight > availableHeight){\r\n domNode.classList.add('no-sticky');\r\n return true\r\n }else{\r\n domNode.classList.remove('no-sticky');\r\n return false\r\n }\r\n}\r\n\r\nexport {checkStickyHeight};"], "mappings": "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", "names": ["require_enabled", "__commonJSMin", "exports", "isJavascriptEnabled", "__name", "require_isset", "__commonJSMin", "exports", "isSet", "node", "__name", "require_sticky_header", "__commonJSMin", "exports", "Sticky", "__name", "domNode", "headerElm", "stickyOffset", "direction", "currentScroll", "prevScroll", "prevDirection", "headerHeight", "require_video", "__commonJSMin", "exports", "import_isset", "Video", "__name", "domNode", "videoElm", "actionElm", "actionIcon", "vimeoHTML", "err", "require_site_search", "__commonJSMin", "exports", "SiteSearch", "__name", "domNode", "innerContainer", "innerContainerElm", "value", "string", "customClass", "fragment", "messageElm", "message", "title", "href", "listItem", "link", "para", "icon", "event", "cleanValue", "searchURL", "responseJSON", "response", "error", "resultsArr", "list", "i", "result", "cta", "require_toast", "__commonJSMin", "exports", "Toast", "__name", "domNode", "toastTemplate", "opts", "DEFAULTS", "#onFocusIn", "#onFocusOut", "templateString", "customToastTemplate", "builtToast", "#createToast", "toast", "animatingClass", "animatingOpenClass", "#onHoverIn", "#onHoverOut", "event", "openClass", "handler", "toastObj", "duration", "id", "obj", "activeToasts", "animatingCloseClass", "template", "toastInstance", "toastContainer", "array", "toastId", "templatableElm", "attr", "offset", "i", "e", "dir", "prop", "swipeAmount", "timeTaken", "velocity", "yPos", "xPos", "#checkSwiping", "clamp", "threshold", "timer", "require_content_search", "__commonJSMin", "exports", "ContentSearch", "__name", "domNode", "url", "res", "err", "e", "searchString", "contentType", "filteredList", "item", "searchableContent", "i", "noResults", "noResultText", "json", "htmlString", "html", "require_inline_search", "__commonJSMin", "exports", "import_isset", "InlineSearch", "__name", "domNode", "value", "clearButton", "span", "icon", "e", "submitButton", "key", "flag", "require_field_counter", "__commonJSMin", "exports", "FieldCounter", "__name", "domNode", "stockAmount", "value", "e", "parsedValue", "newValue", "targetInput", "inputFilter", "errMsg", "changeEvent", "event", "isNumber", "subject", "isString", "isBoolean", "isObject", "Object", "prototype", "toString", "call", "mathAbs", "n", "Math", "abs", "mathSign", "sign", "deltaAbs", "valueB", "valueA", "factorAbs", "diff", "arrayKeys", "array", "objectKeys", "map", "Number", "arrayLast", "arrayLastIndex", "max", "length", "arrayIsLastIndex", "index", "arrayFromNumber", "startAt", "Array", "from", "_", "i", "object", "keys", "objectsMergeDeep", "objectA", "objectB", "reduce", "mergedObjects", "currentObject", "forEach", "key", "areObjects", "isMouseEvent", "evt", "ownerWindow", "MouseEvent", "Alignment", "align", "viewSize", "predefined", "start", "center", "end", "measure", "EventStore", "listeners", "add", "node", "type", "handler", "options", "passive", "removeListener", "addEventListener", "removeEventListener", "legacyMediaQueryList", "addListener", "push", "self", "clear", "filter", "remove", "Animations", "ownerDocument", "update", "render", "documentVisibleHandler", "timeStep", "lastTimeStamp", "lag", "animationFrame", "init", "hidden", "reset", "destroy", "stop", "animate", "timeStamp", "elapsed", "lagOffset", "requestAnimationFrame", "cancelAnimationFrame", "Axis", "axis", "contentDirection", "isRightToLeft", "isVertical", "scroll", "cross", "startEdge", "getStartEdge", "endEdge", "getEndEdge", "measureSize", "nodeRect", "height", "width", "direction", "Limit", "min", "reachedMin", "reachedMax", "reachedAny", "constrain", "removeOffset", "ceil", "Counter", "loop", "loopEnd", "counter", "withinLimit", "get", "set", "clone", "DragHandler", "rootNode", "target", "dragTracker", "location", "animation", "scrollTo", "scrollBody", "scrollTarget", "eventHandler", "percentOfView", "dragFree", "dragThreshold", "skipSnaps", "baseFriction", "watchDrag", "crossAxis", "focusNodes", "nonPassiveEvent", "initEvents", "dragEvents", "goToNextThreshold", "snapForceBoost", "mouse", "touch", "freeForceBoost", "baseSpeed", "isMoving", "startScroll", "startCross", "pointerIsDown", "preventScroll", "preventClick", "isMouse", "emblaApi", "downIfAllowed", "down", "preventDefault", "up", "click", "addDragEvents", "move", "isFocusNode", "nodeName", "includes", "forceBoost", "allowedForce", "force", "targetChanged", "next", "baseForce", "byDistance", "distance", "byIndex", "isMouseEvt", "buttons", "button", "pointerDown", "useFriction", "useDuration", "readPoint", "emit", "lastScroll", "lastCross", "diffScroll", "diffCross", "cancelable", "pointerMove", "rawForce", "pointerUp", "forceFactor", "speed", "friction", "stopPropagation", "DragTracker", "startEvent", "lastEvent", "readTime", "evtAxis", "coord", "touches", "expired", "logInterval", "diffDrag", "diffTime", "NodeRects", "offsetTop", "offsetLeft", "offsetWidth", "offsetHeight", "top", "right", "bottom", "left", "PercentOfView", "ResizeHandler", "container", "slides", "watchResize", "nodeRects", "resizeObserver", "containerSize", "slideSizes", "destroyed", "readSize", "defaultCallback", "entries", "entry", "isContainer", "slideIndex", "indexOf", "lastSize", "newSize", "reInit", "ResizeObserver", "concat", "observe", "disconnect", "ScrollBody", "offsetLocation", "baseDuration", "bodyVelocity", "scrollDirection", "scrollDuration", "scrollFriction", "rawLocation", "rawLocationPrevious", "seek", "isInstant", "directionDiff", "settled", "duration", "velocity", "useBaseDuration", "useBaseFriction", "ScrollBounds", "limit", "pullBackThreshold", "edgeOffsetTolerance", "frictionLimit", "disabled", "shouldConstrain", "edge", "diffToEdge", "diffToTarget", "subtract", "toggleActive", "active", "ScrollContain", "contentSize", "snapsAligned", "containScroll", "pixelTolerance", "scrollBounds", "snapsBounded", "measureBounded", "scrollContainLimit", "findScrollContainLimit", "snapsContained", "measureContained", "usePixelTolerance", "bound", "snap", "startSnap", "endSnap", "lastIndexOf", "snapAligned", "isFirst", "isLast", "scrollBound", "parseFloat", "toFixed", "slice", "ScrollLimit", "scrollSnaps", "ScrollLooper", "vectors", "jointSafety", "shouldLoop", "loopDistance", "v", "ScrollProgress", "currentLocation", "ScrollSnaps", "alignment", "containerRect", "slideRects", "slidesToScroll", "groupSlides", "alignments", "measureSizes", "snaps", "measureUnaligned", "measureAligned", "rects", "rect", "g", "SlideRegistry", "containSnaps", "slideIndexes", "slideRegistry", "createSlideRegistry", "groupedSlideIndexes", "doNotContain", "group", "groups", "range", "ScrollTarget", "targetVector", "minDistance", "distances", "sort", "a", "b", "findTargetSnap", "ascDiffsToSnaps", "shortcut", "d1", "d2", "targets", "matchingTargets", "t", "diffToSnap", "targetSnapDistance", "reachedBound", "snapDistance", "ScrollTo", "indexCurrent", "indexPrevious", "distanceDiff", "indexDiff", "targetIndex", "SlideFocus", "root", "eventStore", "lastTabPressTime", "document", "registerTabPress", "addSlideFocusEvent", "event", "code", "Date", "getTime", "slide", "focus", "scrollLeft", "findIndex", "capture", "Vector1D", "initialValue", "value", "normalizeInput", "Translate", "translate", "x", "y", "containerStyle", "style", "to", "transform", "getAttribute", "removeAttribute", "SlideLooper", "slideSizesWithGaps", "ascItems", "descItems", "reverse", "loopPoints", "startPoints", "endPoints", "removeSlideSizes", "indexes", "slidesInGap", "gap", "findSlideBounds", "offset", "roundingSafety", "findLoopPoints", "isEndEdge", "slideBounds", "initial", "altered", "boundEdge", "loopPoint", "slideLocation", "canLoop", "every", "otherIndexes", "shiftLocation", "SlidesHandler", "watchSlides", "mutationObserver", "mutations", "mutation", "MutationObserver", "childList", "SlidesInView", "threshold", "intersectionEntryMap", "inViewCache", "notInViewCache", "intersectionObserver", "IntersectionObserver", "parentElement", "createInViewList", "inView", "list", "parseInt", "isIntersecting", "SlideSizes", "readEdgeGap", "withEdgeGap", "startGap", "measureStartGap", "endGap", "measureEndGap", "measureWithGaps", "slideRect", "getComputedStyle", "getPropertyValue", "SlidesToScroll", "groupByNumber", "byNumber", "groupSize", "bySize", "rectB", "rectA", "edgeA", "edgeB", "gapA", "gapB", "chunkSize", "currentSize", "previousSize", "Engine", "scrollAxis", "startIndex", "inViewThreshold", "dragHandler", "scrollLooper", "slideLooper", "hasSettled", "engine", "startLocation", "scrollProgress", "slidesInView", "slideFocus", "resizeHandler", "scrollSnapList", "slidesHandler", "EventHandler", "api", "getListeners", "e", "on", "cb", "off", "OptionsHandler", "mergeOptions", "optionsA", "optionsB", "optionsAtMedia", "breakpoints", "matchedMediaOptions", "media", "matchMedia", "matches", "mediaOption", "optionsMediaQueries", "optionsList", "acc", "mediaQueries", "PluginsHandler", "optionsHandler", "activePlugins", "plugins", "plugin", "assign", "name", "EmblaCarousel", "userOptions", "userPlugins", "defaultView", "pluginsHandler", "mediaHandlers", "reActivate", "optionsBase", "defaultOptions", "globalOptions", "pluginList", "pluginApis", "storeElements", "userContainer", "userSlides", "querySelector", "children", "customSlides", "querySelectorAll", "createEngine", "optionsWithoutLoop", "activate", "withOptions", "withPlugins", "query", "offsetParent", "selectedScrollSnap", "deActivate", "jump", "scrollNext", "scrollPrev", "prev", "canScrollNext", "canScrollPrev", "previousScrollSnap", "slidesNotInView", "internalEngine", "containerNode", "slideNodes", "setTimeout", "init_embla_carousel_esm", "__esmMin", "undefined", "addTogglePrevNextBtnsActive", "addPrevNextBtnsClickHandlers", "init_embla_carousel_nav", "__esmMin", "__name", "emblaApi", "prevBtn", "nextBtn", "togglePrevNextBtnsState", "scrollPrev", "scrollNext", "removeTogglePrevNextBtnsActive", "removeClass", "node", "className", "classList", "contains", "remove", "addClass", "add", "nodeListToArray", "nodeList", "Array", "from", "ClassNames", "userOptions", "options", "emblaApi", "root", "slides", "selectedEvents", "draggingEvents", "inViewEvents", "init", "emblaApiInstance", "optionsHandler", "mergeOptions", "optionsAtMedia", "optionsBase", "defaultOptions", "globalOptions", "allOptions", "rootNode", "slideNodes", "internalEngine", "watchDrag", "draggable", "dragging", "forEach", "evt", "on", "toggleDraggingClass", "snapped", "toggleSnappedClasses", "inView", "toggleInViewClasses", "destroy", "off", "slide", "_", "toggleSlideClasses", "slideIndexes", "slideNodeList", "containerNode", "querySelectorAll", "index", "slideRegistry", "selectedScrollSnap", "slidesInView", "name", "init_embla_carousel_class_names_esm", "__esmMin", "active", "breakpoints", "undefined", "require_depot_finder", "__commonJSMin", "exports", "import_isset", "init_embla_carousel_esm", "init_embla_carousel_nav", "init_embla_carousel_class_names_esm", "DepotFinder", "__name", "domNode", "MapLib", "MarkerLib", "InfoWindowLib", "zoom", "tilt", "lat", "lng", "url", "jsonList", "locations", "primarySlug", "location", "locationObj", "updatePrimaryDepot", "primaryDepotElm", "currentSlug", "i", "map", "icons", "marker", "window", "slug", "updatePrimaryDepotHandler", "e", "trigger", "triggerSpan", "markerHandler", "handleDepotOptionClick", "depotLocations", "currentDepotSlug", "depotResult", "depotResultSliderOpts", "depotResultSliderNode", "depotResultSliderViewportNode", "prevBtn", "nextBtn", "depotResultSliderEmblaApi", "EmblaCarousel", "ClassNames", "removePrevNextBtnsClickHandlers", "addPrevNextBtnsClickHandlers", "resultElm", "buttonElm", "position", "markers", "windows", "button", "icon", "mapControlsContainer", "userLat", "userLng", "depotLat", "depotLng", "unit", "radUserlat", "radDepotLat", "theta", "radTheta", "dist", "pos", "resolve", "reject", "userLocation", "user", "closestLocation", "closestLocationDistance", "locationLat", "locationLng", "distance", "closestWindow", "closestMarker", "infoWindow", "depotSlug", "item", "primaryBoxFragment", "contentsElement", "depotTitleElement", "details", "detailsElement", "detail", "detailElement", "iconElement", "valueElement", "valueContainerElement", "key", "value", "labelElement", "seperatorElement", "innerValueElement", "windowTrigger", "windowTriggerSpan", "depot", "require_enquiry_link", "__commonJSMin", "exports", "import_isset", "EnquiryLink", "__name", "domNode", "enquiryForm", "string", "e", "messageField", "messageValue", "yOffset", "y", "Autoplay", "userOptions", "options", "emblaApi", "destroyed", "playing", "resume", "jump", "timer", "init", "emblaApiInstance", "optionsHandler", "mergeOptions", "optionsAtMedia", "optionsBase", "defaultOptions", "globalOptions", "allOptions", "scrollSnapList", "length", "eventStore", "ownerDocument", "internalEngine", "emblaRoot", "rootNode", "root", "container", "containerNode", "on", "stopTimer", "stopOnInteraction", "startTimer", "stopOnMouseEnter", "add", "stopOnFocusIn", "visibilityChange", "playOnInit", "documentIsHidden", "destroy", "off", "emit", "ownerWindow", "clearInterval", "setInterval", "next", "delay", "visibilityState", "play", "jumpOverride", "stop", "reset", "isPlaying", "index", "nextIndex", "clone", "get", "lastIndex", "stopOnLastSnap", "canScrollNext", "scrollNext", "scrollTo", "name", "init_embla_carousel_autoplay_esm", "__esmMin", "active", "breakpoints", "undefined", "tweenFactor", "numberWithinRange", "setTweenFactor", "tweenOpacity", "setupTweenOpacity", "init_embla_tween_opacity", "__esmMin", "__name", "number", "min", "max", "emblaApi", "eventName", "engine", "scrollProgress", "slidesInView", "isScrollEvent", "scrollSnap", "snapIndex", "diffToTarget", "slideIndex", "loopItem", "target", "sign", "tweenValue", "opacity", "slideNodes", "slide", "addThumbBtnsClickHandlers", "addToggleThumbBtnsActive", "init_embla_thumbs_nav", "__esmMin", "__name", "emblaApiMain", "emblaApiThumb", "slidesThumbs", "scrollToIndex", "_", "index", "slideNode", "toggleThumbBtnsState", "previous", "selected", "require_embla_carousel_init", "__commonJSMin", "exports", "init_embla_carousel_esm", "init_embla_carousel_autoplay_esm", "init_embla_carousel_class_names_esm", "init_embla_carousel_nav", "init_embla_tween_opacity", "init_embla_thumbs_nav", "import_isset", "initEmblaCarousels", "homepageSliderNode", "homepageSliderOpts", "homepageSliderViewportNode", "prevBtn", "nextBtn", "homepageSliderEmblaApi", "EmblaCarousel", "ClassNames", "Autoplay", "removePrevNextBtnsClickHandlers", "addPrevNextBtnsClickHandlers", "latestNewsSliderNode", "latestNewsSliderOpts", "latestNewsSliderViewportNode", "subTypeSliderElm", "subTypeSliderOpts", "subTypeSliderViewportNode", "subTypeSliderEmblaApi", "stockCardSliderNodes", "stockCardSliderOpts", "stockCardSliderElm", "stockCardSliderViewportElm", "stockCardSliderEmblaApi", "removeTweenOpacity", "setupTweenOpacity", "productGalleryNode", "productGalleryOpts", "productGalleryThumbsOpts", "productGalleryThumbsNode", "emblaApiMain", "emblaApiThumb", "removeThumbBtnsClickHandlers", "addThumbBtnsClickHandlers", "removeToggleThumbBtnsActive", "addToggleThumbBtnsActive", "__name", "require_add_to_basket", "__commonJSMin", "exports", "Add2Basket", "__name", "domNode", "field", "e", "flag", "selection", "Accordion", "__name", "#eventDetail", "#events", "domNode", "opts", "DEFAULTS", "items", "i", "item", "trigger", "ariaControls", "panel", "ariaExpanded", "itemObj", "toggleHandler", "event", "itemState", "isFocusable", "element", "focusable", "getFocusable", "filter", "node", "walker", "list", "Dropdown", "#onTriggerKeydown", "#onTriggerClick", "#onTriggerHover", "#onFocusin", "#onFocusout", "#onBackgroundMousedown", "itemKeydownHandler", "#onItemKeydown", "itemClickHandler", "#onItemClick", "firstChar", "targetItem", "#setFocusToPreviousItem", "currentItem", "index", "#setFocusToNextItem", "#setFocusByFirstChar", "char", "start", "e", "dropdown", "openClass", "animatingClass", "animatingOpenClass", "animationEndHandler", "animationCount", "animationStartHandler", "animatingCloseClass", "key", "flag", "handleDomNodeMouseOver", "timer", "handleDomNodeMouseOut", "closeDropdown", "tgt", "isPrintableChar", "str", "isInputElement", "itemTextContent", "dropdownBounds", "Layer", "#onWindowKeydown", "newElm", "#setFocusToPrevElm", "currentElm", "#setFocusToNextElm", "dialog", "closeElms", "docBody", "setFocus", "addListeners", "closeLayer", "removeListeners", "activeLayers", "targetLayer", "Table", "TabList", "tab", "tabpanel", "targetTab", "nextTab", "tabList", "currentTab", "prevTab", "change", "orientation", "Tooltip", "#onTooltipKeydown", "tooltip", "leeway", "handler", "setting", "bounds", "windowWidth", "translateAmount", "windowHeight", "isSet", "thing", "createF11y", "defaultF11y", "initialiseF11y", "Arrive", "window", "$", "undefined", "arriveUniqueId", "utils", "matches", "elem", "selector", "object", "name", "fn", "old", "callbacksToBeCalled", "registrationData", "i", "cb", "nodes", "matchFunc", "node", "firstArr", "secondArr", "options", "attrName", "elements", "EventsBucket", "__name", "target", "callback", "newEvent", "compareFunction", "registeredEvent", "removedEvents", "beforeAdding", "beforeRemoving", "MutationEvents", "getObserverConfig", "onMutation", "eventsBucket", "me", "defaultOptions", "observer", "e", "config", "eventData", "eventObj", "ArriveEvents", "arriveDefaultOptions", "getArriveObserverConfig", "onArriveMutation", "mutations", "mutation", "newNodes", "targetNode", "nodeMatchFunc", "arriveEvents", "mutationBindEvent", "existing", "j", "LeaveEvents", "leaveDefaultOptions", "getLeaveObserverConfig", "onLeaveMutation", "removedNodes", "leaveEvents", "exposeUnbindApi", "exposeTo", "funcName", "exposeApi", "import_enabled", "import_isset", "import_sticky_header", "import_video", "import_site_search", "import_toast", "import_content_search", "import_inline_search", "import_field_counter", "import_depot_finder", "import_enquiry_link", "import_embla_carousel_init", "import_add_to_basket", "checkStickyHeight", "domNode", "nodeHeight", "windowHeight", "siteHeaderHeight", "availableHeight", "__name", "masthead", "stickyElms", "stickyElm", "checkStickyHeight", "enquireForm", "enquireButtonElms", "enquireButtonElm", "newEnquireButtonElm", "handleContactEnquire", "contactForm", "searchParams", "prop", "getMessage", "prefix", "messageField", "messageValue", "yOffset", "y", "__name", "tabLists", "tabList", "defaultF11y", "expandableMenus", "expandableMenuOpts", "expandableMenuElm", "menuDropdowns", "menuDropdownOpts", "menuDropdownElm", "megaMenus", "megaMenuOpts", "megaMenuElm", "filters", "filter", "subTypes", "accordion", "itemObj", "newElm", "modals", "isMastheadHidden", "modalOpts", "obj", "modalElm", "vimeoVideos", "vimeoVideoElm", "selectFields", "selectElm", "elements", "customDropdownFields", "dropdownElm", "selector", "object", "e", "item", "selectionMade", "dropdown", "value", "eventDetail", "customEvent", "counterFields", "counterElm", "siteSearch", "contentSearch", "element", "inlineSearch", "g", "h", "a", "k", "p", "c", "l", "q", "m", "b", "d", "r", "u", "f", "n", "t", "depotFinderContainer", "depotFinderResultContainer", "initMap", "Map", "InfoWindow", "Marker", "initiliseToasts", "toastContainerElm", "toastSuccessTemplate", "toastErrorTemplate", "toastOptions", "addToBasketContainer"] }