{"version":3,"sources":["webpack:///./src/js/helpers/index.js","webpack:///./src/js/constants.js","webpack:///./src/js/modules/video.js"],"names":["isMobile","window","matchMedia","matches","isTabletLandscape","focusableElements","isDescendant","parent","child","node","parentNode","decodeEntity","str","ta","document","createElement","innerHTML","value","getSafeId","getRandomInt","min","max","Math","ceil","floor","random","sortFiltersBySitecore","unsortedFilters","sitecoreFilters","filtersInSitecore","filter","facet","indexOf","sortRemainingFilters","sort","a","b","toLowerCase","BREAKPOINTS","Object","freeze","mobile","tablet","tabletLandscape","desktop","moduleMax","wide","debounce","callback","wait","timerId","args","clearTimeout","setTimeout","KEYS","END","HOME","LEFT","UP","RIGHT","DOWN","ENTER","ESC","TAB","SPACE","KEYS_DIRECTION","37","38","39","40","Module","Component","this","videoId","el","dataset","modal","closest","dom","$poster","_$","$thumbContainer","isThumb","_on","initVideo","bind","handleKeyDown","e","getElementById","keyCode","_a","target","iframe","setAttribute","appendChild","onload","_b","_$$","focus"],"mappings":"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","file":"41.df99d67c16dda2522ff6.js?v=fd6df6dca6a22a7218c3","sourcesContent":["// /**\n// * Checks browser is running on a native mobile device\n// */\nexport const isMobileDevice = () => {\n const userAgent = navigator.userAgent || navigator.vendor || window.opera;\n\n return (\n /windows phone/i.test(userAgent) ||\n /android/i.test(userAgent) ||\n (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream)\n );\n};\n\n// /**\n// * Checks iOS user agent\n// */\nexport const iOS = () => {\n return (\n [\n 'iPad Simulator',\n 'iPhone Simulator',\n 'iPod Simulator',\n 'iPad',\n 'iPhone',\n 'iPod'\n ].includes(navigator.platform) ||\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document)\n );\n};\n\n// /**\n// * Returns if media query matches mobile\n// */\nexport const isMobile = () => {\n return window.matchMedia('(max-width: 767px)').matches;\n};\n\n// /**\n// * Returns if media query matches tabletLandscape\n// */\nexport const isTabletLandscape = () => {\n return window.matchMedia('(max-width: 1023px)').matches;\n};\n\n// /**\n// * Returns the browser's scrollbar width\n// */\nexport const getScrollbarWidth = () => {\n return window.innerWidth - document.documentElement.clientWidth;\n};\n\n// /**\n// * Checks if an element is focusable\n// *\n// * @param {Object} el - HTML element you want to check if it's focusable\n// */\nexport const isFocusable = el => {\n if (\n el.tabIndex > 0 ||\n (el.tabIndex === 0 && el.getAttribute('tabIndex') !== null)\n ) {\n return true;\n }\n\n if (el.disabled) {\n return false;\n }\n\n /* eslint-disable indent */\n switch (el.nodeName) {\n case 'A':\n return !!el.href && el.rel !== 'ignore';\n case 'INPUT':\n return el.type !== 'hidden' && el.type !== 'file';\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n default:\n return false;\n }\n /* eslint-enable indent */\n};\n\n// /**\n// * FOCUSABLE ELEMENTS\n// */\nexport const focusableElements = [\n '[contenteditable]',\n '[tabindex]:not([tabindex^=\"-\"])',\n 'a[href]',\n 'area[href]',\n 'button:not([disabled]):not([aria-hidden])',\n 'embed',\n 'iframe',\n 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\n 'object',\n 'select:not([disabled]):not([aria-hidden])',\n 'textarea:not([disabled]):not([aria-hidden])'\n];\n\n// * Check if an element is outside the viewport\n// */\nexport const isOutOfViewport = elem => {\n // Get element's bounding\n const bounding = elem.getBoundingClientRect();\n\n // Check if it's out of the viewport on each side\n const out = {};\n out.top = bounding.top < 0;\n out.left = bounding.left < 0;\n out.bottom =\n bounding.bottom >\n (window.innerHeight || document.documentElement.clientHeight);\n out.right =\n bounding.right >\n (window.innerWidth || document.documentElement.clientWidth);\n out.any = out.top || out.left || out.bottom || out.right;\n out.all = out.top && out.left && out.bottom && out.right;\n\n return out;\n};\n\nexport const sameOrigin = (uri1, uri2 = false) => {\n if (uri1[0] === '/') return true;\n if (uri1[0] === '/' && uri2[0] === '/') return true;\n if (!uri2) uri2 = window.location.href;\n\n uri1 = new URL(uri1);\n uri2 = new URL(uri2);\n\n const host1 = uri1.hostname.split('www.')[1];\n const host2 = uri2.hostname.split('www.')[2];\n\n if (host1 !== host2) return false;\n if (uri1.port !== uri2.port) return false;\n\n return true;\n};\n\n// * Check if child is a descendant of parent\n// */\nexport const isDescendant = (parent, child) => {\n let node = child.parentNode;\n\n while(node) {\n if (node === parent) {\n return true;\n }\n\n node = node.parentNode;\n }\n\n return false;\n};\n\n// * Decode HTML entities\n// */\nexport const decodeEntity = str => {\n const ta = document.createElement('textarea');\n ta.innerHTML = str;\n return ta.value;\n};\n\n// * Returns a sanitized string to safely populate id parameters in HTML tags\n// */\nexport const getSafeId = str => {\n //return str.replace(/\\W/g, '_');\n return str;\n};\n\n// * Returns a random integer between min (inclusive) and max (inclusive).\n// */\nexport const getRandomInt = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n\nexport const sortFiltersBySitecore = (\n unsortedFilters,\n sitecoreFilters = []\n) => {\n const filtersInSitecore = unsortedFilters.filter(\n facet => sitecoreFilters.indexOf(facet.value) > -1\n );\n\n const remainingFilters = unsortedFilters.filter(\n facet => sitecoreFilters.indexOf(facet.value) === -1\n );\n\n const sortRemainingFilters = remainingFilters.sort((a, b) => {\n if (a.value.toLowerCase() > b.value.toLowerCase()) {\n return 1;\n }\n return -1;\n });\n\n const filtersInSitecoreOrdered = filtersInSitecore.sort(\n (a, b) =>\n sitecoreFilters.indexOf(a.value) - sitecoreFilters.indexOf(b.value)\n );\n\n return [...filtersInSitecoreOrdered, ...sortRemainingFilters];\n};\n\nexport const BREAKPOINTS = Object.freeze({\n mobile: 361,\n tablet: 769,\n tabletLandscape: 1025,\n desktop: 1281,\n moduleMax: 1251,\n wide: 1601\n});\n\nexport const debounce = (callback, wait) => {\n let timerId;\n return (...args) => {\n clearTimeout(timerId);\n timerId = setTimeout(() => {\n callback(...args);\n }, wait);\n };\n};\n","export const KEYS = {\n END: 35,\n HOME: 36,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n ENTER: 13,\n ESC: 27,\n TAB: 9,\n SPACE: 32\n};\n\nexport const KEYS_DIRECTION = {\n 37: -1,\n 38: -1,\n 39: 1,\n 40: 1\n};\n","import { Component } from '@verndale/core';\nimport { KEYS } from '../constants';\nimport { isDescendant } from '../helpers';\nimport { focusableElements } from '../helpers';\n\nclass Module extends Component {\n setupDefaults() {\n this.videoId = this.el.dataset.videoId;\n this.modal = this.el.closest('.modal__content');\n this.dom = {\n $poster: this.el._$('.video__thumbnail'),\n $thumbContainer: document._$('.video-list__slide-thumbs')\n };\n\n this.isThumb = isDescendant(this.dom.$thumbContainer, this.el);\n }\n\n addListeners() {\n if (this.isThumb) return;\n this.el._on('click', this.initVideo.bind(this));\n this.el._on('keydown', this.handleKeyDown.bind(this));\n }\n\n handleKeyDown(e) {\n if (!this.modal && document.getElementById(`vframe-${this.videoId}`)) return;\n if (e.keyCode === KEYS.ENTER || e.keyCode === KEYS.SPACE) {\n this.initVideo();\n }\n }\n\n initVideo(e = null) {\n if (e && !e.target.closest('.video__container')) return; // only if it gets triggered by clicking/tapping\n if (!this.modal && document.getElementById(`vframe-${this.videoId}`)) return;\n\n const iframe = document.createElement('iframe');\n\n iframe.setAttribute('width', '100%');\n iframe.setAttribute('height', '100%');\n iframe.setAttribute('frameborder', 0);\n iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen');\n iframe.setAttribute('id', `vframe-${this.videoId}`);\n iframe.setAttribute('title', `Youtube video ${this.videoId}`);\n iframe.setAttribute('allowfullscreen', true);\n iframe.setAttribute(\n 'src',\n `https://www.youtube.com/embed/${this.videoId}?modestbranding=1&rel=0&showinfo=0&autohide=1&autoplay=1&mute=1&enablejsapi=1`\n );\n\n this.dom.$poster?.parentNode.appendChild(iframe);\n\n iframe.onload = () => {\n this.dom.$poster?.parentNode._$$(focusableElements)[0]?.focus();\n }\n }\n}\n\nexport default Module;\n"],"sourceRoot":""}