{"version":3,"file":"264.min.js?t=1744984834426","mappings":"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","sources":["webpack://@hero-digital/masonite/./src/components/foundation/Icon/Icon.template.js","webpack://@hero-digital/masonite/./src/components/modules/Modal/Modal.js","webpack://@hero-digital/masonite/./src/components/modules/Modal/ModalOverlay.template.js","webpack://@hero-digital/masonite/./src/components/modules/ModalButton/ModalButton.js","webpack://@hero-digital/masonite/./src/components/modules/PlayIcon/PlayIcon.template.js","webpack://@hero-digital/masonite/./src/components/modules/VideoModal/VideoModal.js","webpack://@hero-digital/masonite/./src/components/modules/VideoPlayer/VideoPlayer.js","webpack://@hero-digital/masonite/./src/components/modules/VideoPlayer/VideoPlayer.template.js","webpack://@hero-digital/masonite/./src/js/utilities/classnames.js","webpack://@hero-digital/masonite/./src/js/utilities/renderer.js"],"sourcesContent":["/**\n * @param {String} id component id\n * @param {Object} icon SVG icon to display\n * @param {String} addClassName Additional class name\n * @returns\n */\n\n// prettier-ignore-file\nconst IconTemplate = ({ id = '', icon, addClassName = '' }) => {\n\tif (!icon) {\n\t\treturn ''\n\t}\n\n\tconst idAttribute = id ? `id=\"${id}\"` : ''\n\tconst classAttribute = addClassName ? `class=\"${addClassName}\"` : ''\n\n\treturn `\n \n \n \n `\n}\n\nexport default IconTemplate\n","import Services from 'services'\nimport { fromTemplate } from 'utilities/renderer'\n\nimport ModalOverlayTemplate from './ModalOverlay.template'\n\nimport ModalButton from '../ModalButton/ModalButton'\n\n/**\n * Modal component that displays a modal\n */\nclass Modal {\n\tstatic SELECTORS = {\n\t\tCONTENT: '[data-modal-content=\"content\"]',\n\t\tCLOSE_BUTTON: '[data-modal-close-button=\"close\"]'\n\t}\n\n\tstatic EVENTS = {\n\t\tOPEN_MODAL: 'Modal Open event',\n\t\tCLOSE_MODAL: 'Modal Close event'\n\t}\n\n\tconstructor(element) {\n\t\tthis.isOpen = false\n\t\tthis.element = element\n\t\tthis.id = this.element.id\n\n\t\tthis.services = Services.getInstance()\n\t\tthis.EventEmitterService = this.services.EventEmitterService\n\n\t\tconst defaultOpen = this.element.dataset.defaultOpen\n\n\t\tthis.cacheDom()\n\t\tthis.createModal()\n\t\tthis.attachEvents()\n\n\t\tif (defaultOpen === 'true') {\n\t\t\tthis.open()\n\t\t}\n\t}\n\n\t/**\n\t * Cache DOM elements\n\t */\n\tcacheDom() {\n\t\tthis.modalContentEl = this.element.querySelector(Modal.SELECTORS.CONTENT)\n\t\tthis.closeButtonEl = this.element.querySelector(\n\t\t\tModal.SELECTORS.CLOSE_BUTTON\n\t\t)\n\t}\n\n\t/**\n\t * Add event listeners\n\t */\n\tattachEvents() {\n\t\tthis.closeButtonEl.addEventListener('click', this.close)\n\t\tthis.overlayEl.addEventListener('click', this.close)\n\t\tthis.element.addEventListener('keydown', this.handleKeyDown)\n\t\tthis.element.addEventListener('click', this.handleElementClick)\n\n\t\tthis.EventEmitterService.on(\n\t\t\tModalButton.EVENTS.BUTTON_CLICK,\n\t\t\tthis.showModalEvent\n\t\t)\n\t}\n\n\t/**\n\t * Remove event listeners\n\t */\n\tremoveEvents() {\n\t\tthis.closeButtonEl.removeEventListener('click', this.close)\n\t\tthis.overlayEl.removeEventListener('click', this.close)\n\t\tthis.element.removeEventListener('keydown', this.handleKeyDown)\n\t\tthis.element.removeEventListener('click', this.handleElementClick)\n\n\t\tthis.EventEmitterService.off(\n\t\t\tModalButton.EVENTS.BUTTON_CLICK,\n\t\t\tthis.showModalEvent\n\t\t)\n\t}\n\n\t/**\n\t * Create the modal layout and add overlay and close button\n\t */\n\tcreateModal() {\n\t\tthis.element.setAttribute('aria-hidden', 'false')\n\n\t\tthis.overlayEl = fromTemplate(\n\t\t\tModalOverlayTemplate({\n\t\t\t\tid: `${this.id}-modal-overlay`\n\t\t\t})\n\t\t)\n\n\t\tdocument.body.appendChild(this.overlayEl)\n\t\tthis.overlayEl.appendChild(this.element)\n\t\tthis.modalContentEl.classList.add('modal__content')\n\t}\n\n\t/**\n\t * Destroy the modal instance and remove event listeners\n\t */\n\tdestroy() {\n\t\tthis.removeEvents()\n\n\t\tif (this.overlayEl) {\n\t\t\tthis.overlayEl.remove()\n\t\t}\n\t}\n\n\t/**\n\t * Show modal event Modalbutton triggers click event\n\t */\n\tshowModalEvent = (id) => {\n\t\tif (id === this.id) {\n\t\t\tthis.open()\n\t\t}\n\t}\n\n\t/**\n\t * Open modal, set modal properties and styles and set focus trap\n\t */\n\topen = () => {\n\t\tthis.activeElement = document.activeElement\n\t\tthis.isOpen = true\n\n\t\tthis.element.setAttribute('aria-hidden', 'false')\n\t\tthis.element.classList.add('modal--visible')\n\t\tthis.overlayEl.classList.add('modal__overlay--visible')\n\n\t\t// Trap focus inside the modal\n\t\tconst { hasFocusableElements, focusableElements } =\n\t\t\tthis.hasFocusableContent()\n\t\tthis.element.setAttribute('tabindex', '-1')\n\n\t\tif (hasFocusableElements) {\n\t\t\tfocusableElements[0].focus()\n\t\t}\n\n\t\tthis.EventEmitterService.emit(Modal.EVENTS.OPEN_MODAL, this.id)\n\n\t\t// prevent page content from scrolling beneath the modal\n\t\tdocument.body.classList.add('no-scroll')\n\t}\n\n\t/**\n\t * close modal, set modal properties and styles and move focus to trigger\n\t */\n\tclose = () => {\n\t\tthis.isOpen = false\n\t\tthis.element.setAttribute('aria-hidden', 'true')\n\t\tthis.element.classList.remove('modal--visible')\n\t\tthis.overlayEl.classList.remove('modal__overlay--visible')\n\n\t\t// Restore the focus to the previously active element\n\t\tthis.activeElement.focus()\n\t\tthis.EventEmitterService.emit(Modal.EVENTS.CLOSE_MODAL, this.id)\n\n\t\t// remove no-scroll on body\n\t\tdocument.body.classList.remove('no-scroll')\n\t}\n\n\t/**\n\t * Validates if element has focusable children\n\t */\n\thasFocusableContent() {\n\t\tconst focusableElements = Array.from(\n\t\t\tthis.element.querySelectorAll(\n\t\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]), video'\n\t\t\t)\n\t\t).filter((element) => element.offsetParent !== null)\n\n\t\treturn {\n\t\t\thasFocusableElements: focusableElements.length > 0,\n\t\t\tfocusableElements\n\t\t}\n\t}\n\n\t/**\n\t * Prevents click event from bubbling up to the overlay\n\t * @param {*} event\n\t */\n\thandleElementClick = (event) => {\n\t\tevent.stopPropagation()\n\t}\n\n\t/**\n\t * Close modal on Escape key and handle focus trap\n\t */\n\thandleKeyDown = (event) => {\n\t\tif (event.key === 'Escape') {\n\t\t\tthis.close()\n\t\t}\n\n\t\t// Focus Trap\n\t\tif (event.key === 'Tab') {\n\t\t\tconst { focusableElements } = this.hasFocusableContent()\n\n\t\t\tconst firstElement = focusableElements[0]\n\t\t\tconst lastElement = focusableElements[focusableElements.length - 1]\n\n\t\t\tif (event.shiftKey && document.activeElement === firstElement) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlastElement.focus()\n\t\t\t} else if (!event.shiftKey && document.activeElement === lastElement) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tfirstElement.focus()\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport default Modal\n","/**\n * Render Modal overlay template\n * @param {String} id Component ID\n * @param {String} addClassName overlay class\n */\nconst ModalOverlayTemplate = ({ id = '', addClassName = '' }) => `\n \n `\n\nexport default ModalOverlayTemplate\n","import Services from 'services'\n\n/**\n * ModalButton component that emits a click event for the modal assigned by data-modal-id prop\n */\nexport default class ModalButton {\n\tstatic SELECTORS = {\n\t\tBUTTON: '[data-cmp-is=\"modal-button\"]'\n\t}\n\n\tstatic EVENTS = {\n\t\tBUTTON_CLICK: 'modalbutton click event'\n\t}\n\n\tconstructor(element) {\n\t\tthis.element = element\n\t\tthis.services = Services.getInstance()\n\t\tthis.EventEmitterService = this.services.EventEmitterService\n\n\t\tthis.attachEvents()\n\t}\n\n\t/**\n\t * Add event listeners\n\t */\n\tattachEvents() {\n\t\tthis.element.addEventListener('click', this.openModal)\n\t}\n\n\t/**\n\t * Remove event listeners\n\t */\n\tdetachEvents() {\n\t\tthis.element.removeEventListener('click', this.openModal)\n\t}\n\n\t/**\n\t * Destroy the modal instance and remove event listeners\n\t */\n\tdestroy() {\n\t\tthis.detachEvents()\n\t}\n\n\t/**\n\t * Emits click event for modal\n\t */\n\topenModal = () => {\n\t\tconst modalId = this.element.dataset.modalId\n\n\t\tthis.EventEmitterService.emit(ModalButton.EVENTS.BUTTON_CLICK, modalId)\n\t}\n}\n","import Icon from 'foundation/Icon/Icon.template.js'\nimport classNames from 'utilities/classnames'\n\n/**\n * Play Icon Positions\n */\nexport const POSITIONS = {\n\tBOTTOM_LEFT: 'bottom-left',\n\tBOTTOM_RIGHT: 'bottom-right',\n\tCENTER: 'center',\n\tTOP_LEFT: 'top-left',\n\tTOP_RIGHT: 'top-right'\n}\n\n/**\n * Play Icon Sizes\n */\nexport const SIZES = {\n\tLARGE: 'large',\n\tSMALL: 'small'\n}\n\n/**\n * Render Video Play Icon template\n * @param {String} addClassName Additional class name to component\n * @param {Object} a11y Accessibility labels\n * @param {String} a11y.buttonLabel Accessibility label for button\n * @param {String} a11y.playLabel Accessibility label for play icon\n * @param {String} a11y.pauseLabel Accessibility label for pause icon\n * @param {Array} dataAttributes Data attributes to add to component\n * @param {String} id ID to add to component\n * @param {Boolean} isButton If true, component will render as a button\n * @param {Boolean} isInline If true, component will render inline vs the full contents of the parent\n * @param {String} position Position of play icon\n * @param {String} size Size of play icon (small or large)\n */\nconst PlayIcon = ({\n\taddClassName,\n\ta11y: { buttonLabel = '', playLabel = 'Play', pauseLabel = 'Pause' } = {},\n\tdataAttributes,\n\tid,\n\tisButton,\n\tisInline,\n\tposition,\n\tsize,\n\tisBlackAndWhite = false\n} = {}) => {\n\tconst tag = isButton ? 'button' : 'div'\n\n\treturn /* HTML */ `\n <${tag}\n class=\"${classNames(\n\t\t\t'mod-play-icon',\n\t\t\taddClassName,\n\t\t\tisBlackAndWhite && `mod-play-icon--black-white`,\n\t\t\tisInline && `mod-play-icon--inline`,\n\t\t\tposition && `mod-play-icon--position`,\n\t\t\tposition && `mod-play-icon--position-${position}`,\n\t\t\tsize && `mod-play-icon--size-${size}`\n\t\t)}\"\n ${id ? `id=\"${id}\"` : ''}\n ${buttonLabel ? `aria-label=\"${buttonLabel}\"` : ''}\n ${dataAttributes ? dataAttributes.join(' ') : ''}\n data-is-paused=\"true\"\n >\n
\n
\n ${Icon({\n\t\t\t\ticon: 'play'\n\t\t\t})}\n
\n
\n ${Icon({\n\t\t\t\ticon: 'pause'\n\t\t\t})}\n
\n
\n \n`\n}\n\nexport default PlayIcon\n","import Services from 'services'\nimport { fromTemplate } from 'utilities/renderer'\n\nimport VideoPlayer from '../VideoPlayer/VideoPlayer'\nimport videoPlayerTemplate from '../VideoPlayer/VideoPlayer.template'\n\nimport Modal from '../Modal/Modal'\n\n/**\n * Video Player component\n */\nexport default class VideoModal {\n\tstatic SELECTORS = {\n\t\tELEMENT: '[data-cmp-is=\"video-modal\"]',\n\t\tMODAL: '[data-cmp-is=\"modal\"]',\n\t\tMODAL_CONTENT: '[data-modal-content=\"content\"]'\n\t}\n\n\tstatic EVENTS = {\n\t\tELEMENT_CLICK: 'Video click event'\n\t}\n\n\tconstructor(element) {\n\t\tthis.element = element\n\t\tthis.id = this.element.id\n\t\tthis.modalElId = this.element.dataset.modalId\n\t\tthis.video = null\n\t\tthis.modalEl = null\n\t\tthis.modalContentEl = null\n\t\tthis.services = Services.getInstance()\n\t\tthis.EventEmitterService = this.services.EventEmitterService\n\n\t\tthis.cacheDom()\n\t\tthis.buildPlayer()\n\t\tthis.attachEvents()\n\t}\n\n\t/**\n\t * Cache DOM elements\n\t */\n\tcacheDom() {\n\t\tthis.modalEl = document.getElementById(this.modalElId)\n\t\tthis.modalContentEl = this.modalEl?.querySelector(\n\t\t\tVideoModal.SELECTORS.MODAL_CONTENT\n\t\t)\n\t\tthis.title = this.element.dataset.title || ''\n\t}\n\n\t/**\n\t * Build player element and add it to modal\n\t */\n\tbuildPlayer() {\n\t\tconst videoSrc = this.element.dataset.videoSrc\n\t\tconst posterSrc = this.element.dataset.posterSrc\n\t\tconst captionSrc = this.element.dataset.captionSrc\n\t\tconst captionLabel = this.element.dataset.captionLabel\n\t\tconst captionSrclang = this.element.dataset.captionSrclang\n\n\t\tconst videoEl = fromTemplate(\n\t\t\tvideoPlayerTemplate({\n\t\t\t\tid: `${this.id}-player`,\n\t\t\t\tposterSrc,\n\t\t\t\tvideoSrc,\n\t\t\t\tcontrols: true,\n\t\t\t\tdataAttributes: ['data-type=\"modal\"', `data-title=\"${this.title}\"`],\n\t\t\t\tvideoCaptions: {\n\t\t\t\t\tsrc: captionSrc,\n\t\t\t\t\tlabel: captionLabel,\n\t\t\t\t\tsrclang: captionSrclang\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t\tif (videoEl) {\n\t\t\tthis.video = new VideoPlayer(videoEl)\n\t\t}\n\n\t\tif (this.modalContentEl && videoEl) {\n\t\t\tthis.modalContentEl.appendChild(videoEl)\n\t\t}\n\t}\n\n\t/**\n\t * Add event listeners\n\t */\n\tattachEvents() {\n\t\tthis.EventEmitterService.on(Modal.EVENTS.OPEN_MODAL, this.playPlayer)\n\t\tthis.EventEmitterService.on(Modal.EVENTS.CLOSE_MODAL, this.closePlayer)\n\t}\n\n\t/**\n\t * Remove event listeners\n\t */\n\tremoveEvents() {\n\t\tthis.EventEmitterService.off(Modal.EVENTS.OPEN_MODAL, this.playPlayer)\n\t\tthis.EventEmitterService.off(Modal.EVENTS.CLOSE_MODAL, this.closePlayer)\n\t}\n\n\t/**\n\t * Destroy the modal instance and remove event listeners\n\t */\n\tdestroy() {\n\t\tthis.removeEvents()\n\t}\n\n\t/**\n\t * Play player on modal open event\n\t * @param {*} id\n\t */\n\tplayPlayer = (id) => {\n\t\tconst autoplay = this.element.dataset.autoplay === 'true'\n\n\t\tif (this.modalElId === id && autoplay) {\n\t\t\tthis.video.play({ triggerAnalyticsEvent: true })\n\t\t}\n\t}\n\n\t/**\n\t * Close player on modal close event\n\t */\n\tclosePlayer = (id) => {\n\t\tif (this.modalElId === id) {\n\t\t\tthis.video.stop({ triggerAnalyticsEvent: true })\n\t\t}\n\t}\n}\n","import Services from 'services'\nimport playIcon, { POSITIONS } from 'modules/PlayIcon/PlayIcon.template'\nimport { fromTemplate } from 'utilities/renderer'\nimport Analytics from 'services/Analytics/Analytics'\nimport { debounce } from 'utilities/utilities'\n\n/**\n * Video Player component\n */\nexport default class VideoPlayer {\n\tstatic SELECTORS = {\n\t\tVIDEO: '[data-video-player=\"video-player\"]',\n\t\tPLAY_BUTTON: '[data-video-payer=\"play-button\"]'\n\t}\n\n\tstatic ATTRIBUTES = {\n\t\tPLAY_BUTTON_STATUS: 'data-is-paused',\n\t\tPLAY_BUTTON_LABEL: 'data-play-label',\n\t\tPAUSE_BUTTON_LABEL: 'data-pause-label',\n\t\tPLAY_BUTTON_POSITION: 'data-play-button-position',\n\t\tHIDE_PLAY_BUTTON_AFTER_PLAY: 'data-hide-button-after-play'\n\t}\n\n\tstatic EVENTS = {\n\t\tPLAY: 'videoPlay',\n\t\tPAUSE: 'videoPause',\n\t\tSTOP: 'videoStop',\n\t\tPLAY_VIDEO: 'playVideo', // Remote instruction to play video\n\t\tPAUSE_VIDEO: 'pauseVideo' // Remote instruction to pause video\n\t}\n\n\tstatic CLASSES = {\n\t\tHIDDEN: 'mod-player__play-button--hidden'\n\t}\n\n\tconstructor(element) {\n\t\tthis.element = element\n\t\tthis.services = Services.getInstance()\n\t\tthis.analyticsService = Analytics.getInstance() // ref to analytics service\n\t\tthis.videoProgressMarkers = new Map()\n\t\tthis.EventEmitterService = this.services.EventEmitterService\n\t\tthis.trackInteractionDebounce = debounce(this.trackInteraction, 200)\n\t\tthis.hasStarted = false\n\n\t\tthis.cacheDom()\n\t\tthis.initPlayButton()\n\t\tthis.attachEvents()\n\t}\n\n\t/**\n\t * Cache DOM elements\n\t */\n\tcacheDom() {\n\t\tthis.videoEl = this.element.querySelector(VideoPlayer.SELECTORS.VIDEO)\n\t\tthis.videoProgressMarkers.set(this.videoEl, [25, 50, 75, 100])\n\n\t\tthis.playButtonEl = this.element.querySelector(\n\t\t\tVideoPlayer.SELECTORS.PLAY_BUTTON\n\t\t)\n\n\t\tthis.hasControls = this.videoEl?.hasAttribute('controls')\n\n\t\tthis.videoElId = this.videoEl?.id || null\n\t}\n\n\t/**\n\t * Add event listeners\n\t */\n\tattachEvents() {\n\t\tthis.playButton?.addEventListener('click', this.togglePlay)\n\n\t\tthis.videoEl.addEventListener('ended', this.handleVideoEnd)\n\t\tthis.videoEl.addEventListener('play', this.trackInteractionDebounce)\n\t\tthis.videoEl.addEventListener('seeking', this.trackInteractionDebounce)\n\t\tthis.videoEl.addEventListener('timeupdate', this.trackInteractionDebounce)\n\t\tthis.videoEl.addEventListener('pause', this.trackInteractionDebounce)\n\t\tthis.videoEl.addEventListener('ended', this.trackInteraction)\n\n\t\tthis.EventEmitterService.on(\n\t\t\tVideoPlayer.EVENTS.PLAY_VIDEO,\n\t\t\tthis.remotePlay\n\t\t)\n\t\tthis.EventEmitterService.on(\n\t\t\tVideoPlayer.EVENTS.PAUSE_VIDEO,\n\t\t\tthis.remotePause\n\t\t)\n\t}\n\n\t/**\n\t * Remove event listeners\n\t */\n\tremoveEvents() {\n\t\tthis.playButton?.removeEventListener('click', this.togglePlay)\n\n\t\tthis.videoEl.removeEventListener('ended', this.handleVideoEnd)\n\n\t\tthis.videoEl.removeEventListener('play', this.trackInteractionDebounce)\n\t\tthis.videoEl.removeEventListener(\n\t\t\t'timeupdate',\n\t\t\tthis.trackInteractionDebounce\n\t\t)\n\t\tthis.videoEl.removeEventListener('pause', this.trackInteractionDebounce)\n\t\tthis.videoEl.removeEventListener('ended', this.trackInteraction)\n\n\t\tthis.EventEmitterService.off(\n\t\t\tVideoPlayer.EVENTS.PLAY_VIDEO,\n\t\t\tthis.remotePlay\n\t\t)\n\t\tthis.EventEmitterService.off(\n\t\t\tVideoPlayer.EVENTS.PAUSE_VIDEO,\n\t\t\tthis.remotePause\n\t\t)\n\t}\n\n\t/**\n\t * Destroy the modal instance and remove event listeners\n\t */\n\tdestroy() {\n\t\tthis.removeEvents()\n\t}\n\n\t/**\n\t * Track interaction\n\t */\n\ttrackInteraction = (event) => {\n\t\tconst { target } = event\n\t\tconst videoType = target.dataset?.type\n\n\t\tif (\n\t\t\t(videoType !== 'poster' && videoType !== 'modal') ||\n\t\t\tthis.filterAnalyticsEvent\n\t\t)\n\t\t\treturn\n\n\t\tswitch (event.type) {\n\t\t\tcase 'play':\n\t\t\t\tif (this.hasStarted) return\n\n\t\t\t\tthis.hasStarted = true\n\t\t\t\tthis.analyticsService.trackInteraction('video', {\n\t\t\t\t\tvideo_title: target.dataset?.title || undefined,\n\t\t\t\t\tvideo_status: 'start',\n\t\t\t\t\tvideo_view: 1,\n\t\t\t\t\tvideo_url: target.currentSrc,\n\t\t\t\t\tvideo_provider: 'widen'\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase 'timeupdate': {\n\t\t\t\tconst progress = Math.floor(\n\t\t\t\t\t(target.currentTime / target.duration) * 100\n\t\t\t\t)\n\t\t\t\tlet progressMarkers = this.videoProgressMarkers.get(target)\n\n\t\t\t\tfor (let i = 0; i < progressMarkers.length; i++) {\n\t\t\t\t\tif (progress >= progressMarkers[i]) {\n\t\t\t\t\t\tthis.analyticsService.trackInteraction('video', {\n\t\t\t\t\t\t\tvideo_title: target.dataset?.title || undefined,\n\t\t\t\t\t\t\tvideo_status: 'progress',\n\t\t\t\t\t\t\tvideo_percent: progressMarkers[i],\n\t\t\t\t\t\t\tvideo_url: target.currentSrc,\n\t\t\t\t\t\t\tvideo_provider: 'widen'\n\t\t\t\t\t\t})\n\t\t\t\t\t\tprogressMarkers = progressMarkers.slice(i + 1)\n\t\t\t\t\t\tthis.videoProgressMarkers.set(target, progressMarkers)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'pause': {\n\t\t\t\t/**\n\t\t\t\t * This is a workaround to stop the video player firing the pause event\n\t\t\t\t * along with the ended event when a file finishes playing.\n\t\t\t\t */\n\t\t\t\tconst eventThreshold = Math.floor(target.duration) - 2 // Stop registering events 2 seconds before end of video\n\t\t\t\tif (target.currentTime >= eventThreshold) return\n\n\t\t\t\tthis.analyticsService.trackInteraction('video', {\n\t\t\t\t\tvideo_title: target.dataset?.title || undefined,\n\t\t\t\t\tvideo_status: 'pause',\n\t\t\t\t\tvideo_url: target.currentSrc,\n\t\t\t\t\tvideo_provider: 'widen'\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'ended':\n\t\t\t\tthis.hasStarted = false\n\n\t\t\t\tthis.analyticsService.trackInteraction('video', {\n\t\t\t\t\tvideo_title: target.dataset?.title || undefined,\n\t\t\t\t\tvideo_status: 'complete',\n\t\t\t\t\tvideo_percent: 100,\n\t\t\t\t\tvideo_url: target.currentSrc,\n\t\t\t\t\tvideo_provider: 'widen'\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Initialize and render the play button if there is an element to render it to\n\t */\n\tinitPlayButton() {\n\t\tconst hasPlayButton = !!this.playButton\n\n\t\tif (this.playButtonEl) {\n\t\t\tconst playButtonPosition =\n\t\t\t\tthis.playButtonEl.getAttribute(\n\t\t\t\t\tVideoPlayer.ATTRIBUTES.PLAY_BUTTON_POSITION\n\t\t\t\t) || POSITIONS.BOTTOM_RIGHT\n\n\t\t\tif (!hasPlayButton) {\n\t\t\t\tthis.playButton = fromTemplate(\n\t\t\t\t\tplayIcon({\n\t\t\t\t\t\tisButton: true,\n\t\t\t\t\t\tisInline: true,\n\t\t\t\t\t\tposition: playButtonPosition\n\t\t\t\t\t})\n\t\t\t\t)\n\n\t\t\t\tthis.playButtonEl.appendChild(this.playButton)\n\t\t\t}\n\n\t\t\tthis.playButton.setAttribute(\n\t\t\t\tVideoPlayer.ATTRIBUTES.PLAY_BUTTON_STATUS,\n\t\t\t\t!this.videoEl.autoplay\n\t\t\t)\n\n\t\t\tthis.playButton.setAttribute(\n\t\t\t\t'aria-label',\n\t\t\t\tthis.element.getAttribute(\n\t\t\t\t\tthis.videoEl.autoplay\n\t\t\t\t\t\t? VideoPlayer.ATTRIBUTES.PAUSE_BUTTON_LABEL\n\t\t\t\t\t\t: VideoPlayer.ATTRIBUTES.PLAY_BUTTON_LABEL\n\t\t\t\t)\n\t\t\t)\n\n\t\t\tif (this.hasControls) {\n\t\t\t\t// hide the controls when the custom play button is enabled\n\t\t\t\tthis.videoEl.removeAttribute('controls')\n\t\t\t}\n\n\t\t\tthis.playButtonEl.classList.remove(VideoPlayer.CLASSES.HIDDEN)\n\t\t}\n\t}\n\n\t/**\n\t * Toggle Video\n\t */\n\ttogglePlay = () => {\n\t\tif (this.videoEl.paused) {\n\t\t\tthis.play()\n\t\t} else {\n\t\t\tthis.pause()\n\t\t}\n\t}\n\n\t/**\n\t * Play Video and update button\n\t * @param {object} event - Event object\n\t * @param {boolean} event.forcePause - Force the video to play without checking if it is already playing\n\t */\n\tplay = ({ forcePlay = false, triggerAnalyticsEvent = false } = {}) => {\n\t\tif (this.videoEl?.paused || forcePlay) {\n\t\t\tthis.videoEl.play()\n\t\t\tthis.EventEmitterService.emit(VideoPlayer.EVENTS.PLAY, {\n\t\t\t\tvideoId: this.videoElId\n\t\t\t})\n\n\t\t\tif (triggerAnalyticsEvent) {\n\t\t\t\tthis.videoEl.dispatchEvent(new Event('play'))\n\t\t\t}\n\n\t\t\tif (this.playButton) {\n\t\t\t\tthis.playButton.setAttribute(\n\t\t\t\t\tVideoPlayer.ATTRIBUTES.PLAY_BUTTON_STATUS,\n\t\t\t\t\tfalse\n\t\t\t\t)\n\t\t\t\tthis.playButton.setAttribute(\n\t\t\t\t\t'aria-label',\n\t\t\t\t\tthis.element.getAttribute(\n\t\t\t\t\t\tVideoPlayer.ATTRIBUTES.PAUSE_BUTTON_LABEL\n\t\t\t\t\t)\n\t\t\t\t)\n\n\t\t\t\tif (\n\t\t\t\t\tthis.playButtonEl.getAttribute(\n\t\t\t\t\t\tVideoPlayer.ATTRIBUTES.HIDE_PLAY_BUTTON_AFTER_PLAY\n\t\t\t\t\t) === 'true'\n\t\t\t\t) {\n\t\t\t\t\tthis.playButtonEl.classList.add(VideoPlayer.CLASSES.HIDDEN)\n\t\t\t\t}\n\n\t\t\t\tif (this.hasControls && !this.videoEl.getAttribute('controls')) {\n\t\t\t\t\t// reenable the controls when the custom play button is enabled and controls has been set\n\t\t\t\t\tthis.videoEl.setAttribute('controls', '')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Stop Video\n\t */\n\tstop = ({ triggerAnalyticsEvent = false }) => {\n\t\tthis.hasStarted = false\n\t\tthis.videoEl.pause()\n\t\tthis.EventEmitterService.emit(VideoPlayer.EVENTS.STOP, {\n\t\t\tvideoId: this.videoElId\n\t\t})\n\n\t\tif (triggerAnalyticsEvent) {\n\t\t\tthis.videoEl.dispatchEvent(new Event('pause'))\n\t\t\t// reset the video to the beginning after a pause event\n\t\t\t// setting a timeout give the debounce function time to clear so that\n\t\t\t// timeupdate event is not fired\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.videoEl.currentTime = 0\n\t\t\t}, 500)\n\t\t} else {\n\t\t\tthis.videoEl.currentTime = 0\n\t\t}\n\t}\n\n\t/**\n\t * Pause Video and update play button\n\t * @param {object} event - Event object\n\t * @param {boolean} event.forcePause - Force the video to pause without checking if it is already paused\n\t */\n\tpause = ({ forcePause = false } = {}) => {\n\t\tif (!this.videoEl?.paused || forcePause) {\n\t\t\tthis.videoEl.pause()\n\t\t\tthis.EventEmitterService.emit(VideoPlayer.EVENTS.PAUSE, {\n\t\t\t\tvideoId: this.videoElId\n\t\t\t})\n\n\t\t\tif (this.playButton) {\n\t\t\t\tthis.playButton.setAttribute(\n\t\t\t\t\tVideoPlayer.ATTRIBUTES.PLAY_BUTTON_STATUS,\n\t\t\t\t\ttrue\n\t\t\t\t)\n\n\t\t\t\tthis.playButton.setAttribute(\n\t\t\t\t\t'aria-label',\n\t\t\t\t\tthis.element.getAttribute(\n\t\t\t\t\t\tVideoPlayer.ATTRIBUTES.PLAY_BUTTON_LABEL\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Process a Remote play event\n\t * @param {object} event - Event object\n\t * @param {string} event.videoId - Video ID\n\t */\n\tremotePlay = (event) => {\n\t\tconst { videoId } = event\n\n\t\tif (videoId === this.videoElId) {\n\t\t\tthis.play({ forcePlay: true })\n\t\t}\n\t}\n\n\t/**\n\t * Process a Remote pause event\n\t * @param {object} event - Event object\n\t * @param {string} event.videoId - Video ID\n\t */\n\tremotePause = (event) => {\n\t\tconst { videoId } = event\n\n\t\tif (videoId === this.videoElId) {\n\t\t\tthis.pause({ forcePause: true })\n\t\t}\n\t}\n\n\t/**\n\t * When the video ends, emit a STOP event, reset the poster image and show play button\n\t */\n\thandleVideoEnd = () => {\n\t\tthis.EventEmitterService.emit(VideoPlayer.EVENTS.STOP, {\n\t\t\tvideoId: this.videoElId\n\t\t})\n\t\tthis.initPlayButton()\n\t\tthis.videoEl.load()\n\t}\n}\n","import classNames from 'utilities/classnames'\nimport { POSITIONS as PLAY_BUTTON_POSITIONS } from 'modules/PlayIcon/PlayIcon.template'\n\nexport { PLAY_BUTTON_POSITIONS }\n\n/**\n * Render Video Player component template\n * @param {Object} args\n * @param {Array} args.dataAttributes Additional data attributes\n * @param {Object} args.a11y\n * @param {String} args.a11y.playLabel Play button label\n * @param {String} args.a11y.pauseLabel Pause button label\n * @param {String} addClassName Additional class name\n * @param {Boolean} autoplay enable autoplay\n * @param {String} buttonClassName Button class name\n * @param {Boolean} hideControls hide controls\n * @param {Boolean} hidePlayButtonAfterPlay hide play button after video is played the first time\n * @param {String} id Component ID\n * @param {Boolean} muted mute video\n * @param {String} playButtonPosition play button position\n * @param {Boolean} playsInline play video inline\n * @param {String} posterSrc Video poster image\n * @param {Boolean} showPlayButton show play/pause button\n * @param {String} videoSrc Video source\n */\nconst VideoPlayerTemplate = ({\n\ta11y: { playLabel = 'Play', pauseLabel = 'Pause' } = {},\n\taddClassName = '',\n\tautoplay = false,\n\tbuttonClassName = '',\n\thideControls = false,\n\thidePlayButtonAfterPlay = false,\n\tid = '',\n\tmuted = false,\n\tplayButtonPosition = PLAY_BUTTON_POSITIONS.BOTTOM_RIGHT,\n\tplaysInline = false,\n\tposterSrc = '',\n\tshowPlayButton = false,\n\tvideoSrc,\n\tdataAttributes,\n\tvideoCaptions\n}) => /* HTML */ `\n\t\n\t\t${showPlayButton\n\t\t\t? `
`\n\t\t\t: ''}\n\t\t\n\t\t\t${videoCaptions && videoCaptions.src\n\t\t\t\t? `\n \n `\n\t\t\t\t: ''}\n\t\t\tYour browser does not support the video tag.\n\t\t\n\t\n`\n\nexport default VideoPlayerTemplate\n","/**\n * Conditionally returns a list of class names based\n * on the value's truthyness\n * @param {(boolean | undefined | ?string)[]} classes - An array of class names to be joined together\n * @returns {string} - A string of joined class names\n *\n * @example\n * classNames(true && 'foo', false && 'bar', 'baz', undefined && '') // => 'foo baz'\n */\nexport default function classNames(...classes) {\n\treturn classes.filter(Boolean).join(' ')\n}\n","// Utility for rendering HTML elements\n\n/**\n * @function fromTemplate\n * @description Converts an HTML element string to a DOM object\n * @param {string} templateString String representation of a DOM element (e.g. '
content
')\n * @returns {Node} DOM Node\n */\nexport function fromTemplate(templateString) {\n\tconst el = document.createElement('div')\n\tel.innerHTML = templateString.trim()\n\n\t// If there are multiple child nodes return the wrapped elements in a div\n\tif (el.childNodes.length > 1) {\n\t\treturn el\n\t}\n\n\treturn el.firstChild\n}\n\n/**\n * @function empty\n * @description Empties all of the inner elements from an element\n * @param {Node} element Element to empty\n */\nexport function empty(element) {\n\twhile (element.firstChild) {\n\t\telement.removeChild(element.firstChild)\n\t}\n}\n\n/**\n * @function insert\n * @description Replaced the inner content of an element with a new node\n * @param {Node} node The DOM node element to insert\n * @param {Node} toElement The DOM node element to insert node into\n * @returns {Node}\n */\nexport function insert(node, toElement) {\n\t// dump the inner nodes before appending new content\n\tempty(toElement)\n\n\t// append the new node\n\ttoElement.appendChild(node)\n\n\treturn toElement\n}\n"],"names":["_ref","id","icon","addClassName","Modal","static","CONTENT","CLOSE_BUTTON","OPEN_MODAL","CLOSE_MODAL","constructor","element","this","isOpen","services","Services","getInstance","EventEmitterService","defaultOpen","dataset","cacheDom","createModal","attachEvents","open","modalContentEl","querySelector","SELECTORS","closeButtonEl","addEventListener","close","overlayEl","handleKeyDown","handleElementClick","on","ModalButton","EVENTS","BUTTON_CLICK","showModalEvent","removeEvents","removeEventListener","off","setAttribute","fromTemplate","ModalOverlayTemplate","document","body","appendChild","classList","add","destroy","remove","activeElement","hasFocusableElements","focusableElements","hasFocusableContent","focus","emit","Array","from","querySelectorAll","filter","offsetParent","length","event","stopPropagation","key","firstElement","lastElement","shiftKey","preventDefault","BUTTON","openModal","detachEvents","modalId","POSITIONS","BOTTOM_LEFT","BOTTOM_RIGHT","CENTER","TOP_LEFT","TOP_RIGHT","SIZES","LARGE","SMALL","a11y","buttonLabel","playLabel","pauseLabel","dataAttributes","isButton","isInline","position","size","isBlackAndWhite","arguments","undefined","tag","classNames","join","Icon","VideoModal","ELEMENT","MODAL","MODAL_CONTENT","ELEMENT_CLICK","modalElId","video","modalEl","buildPlayer","getElementById","title","videoSrc","posterSrc","captionSrc","captionLabel","captionSrclang","videoEl","videoPlayerTemplate","controls","videoCaptions","src","label","srclang","VideoPlayer","playPlayer","closePlayer","autoplay","play","triggerAnalyticsEvent","stop","VIDEO","PLAY_BUTTON","PLAY_BUTTON_STATUS","PLAY_BUTTON_LABEL","PAUSE_BUTTON_LABEL","PLAY_BUTTON_POSITION","HIDE_PLAY_BUTTON_AFTER_PLAY","PLAY","PAUSE","STOP","PLAY_VIDEO","PAUSE_VIDEO","HIDDEN","analyticsService","Analytics","videoProgressMarkers","Map","trackInteractionDebounce","debounce","trackInteraction","hasStarted","initPlayButton","set","playButtonEl","hasControls","hasAttribute","videoElId","playButton","togglePlay","handleVideoEnd","remotePlay","remotePause","target","videoType","type","filterAnalyticsEvent","video_title","video_status","video_view","video_url","currentSrc","video_provider","progress","Math","floor","currentTime","duration","progressMarkers","get","i","video_percent","slice","eventThreshold","hasPlayButton","playButtonPosition","getAttribute","ATTRIBUTES","playIcon","removeAttribute","CLASSES","paused","pause","_this","forcePlay","videoId","dispatchEvent","Event","setTimeout","_this2","forcePause","load","buttonClassName","hideControls","hidePlayButtonAfterPlay","muted","PLAY_BUTTON_POSITIONS","playsInline","showPlayButton","_len","classes","_key","Boolean","templateString","el","createElement","innerHTML","trim","childNodes","firstChild","empty","removeChild","insert","node","toElement"],"sourceRoot":""}