{"version":3,"file":"264.min.js?t=1743173738202","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 */\nconst IconTemplate = ({ id = '', icon, addClassName = '' }) =>\n icon\n ? `\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 static SELECTORS = {\n CONTENT: '[data-modal-content=\"content\"]',\n CLOSE_BUTTON: '[data-modal-close-button=\"close\"]'\n }\n\n static EVENTS = {\n OPEN_MODAL: 'Modal Open event',\n CLOSE_MODAL: 'Modal Close event'\n }\n\n constructor(element) {\n this.isOpen = false\n this.element = element\n this.id = this.element.id\n\n this.services = Services.getInstance()\n this.EventEmitterService = this.services.EventEmitterService\n\n const defaultOpen = this.element.dataset.defaultOpen\n\n this.cacheDom()\n this.createModal()\n this.attachEvents()\n\n if (defaultOpen === 'true') {\n this.open()\n }\n }\n\n /**\n * Cache DOM elements\n */\n cacheDom() {\n this.modalContentEl = this.element.querySelector(Modal.SELECTORS.CONTENT)\n this.closeButtonEl = this.element.querySelector(\n Modal.SELECTORS.CLOSE_BUTTON\n )\n }\n\n /**\n * Add event listeners\n */\n attachEvents() {\n this.closeButtonEl.addEventListener('click', this.close)\n this.overlayEl.addEventListener('click', this.close)\n this.element.addEventListener('keydown', this.handleKeyDown)\n this.element.addEventListener('click', this.handleElementClick)\n\n this.EventEmitterService.on(\n ModalButton.EVENTS.BUTTON_CLICK,\n this.showModalEvent\n )\n }\n\n /**\n * Remove event listeners\n */\n removeEvents() {\n this.closeButtonEl.removeEventListener('click', this.close)\n this.overlayEl.removeEventListener('click', this.close)\n this.element.removeEventListener('keydown', this.handleKeyDown)\n this.element.removeEventListener('click', this.handleElementClick)\n\n this.EventEmitterService.off(\n ModalButton.EVENTS.BUTTON_CLICK,\n this.showModalEvent\n )\n }\n\n /**\n * Create the modal layout and add overlay and close button\n */\n createModal() {\n this.element.setAttribute('aria-hidden', 'false')\n\n this.overlayEl = fromTemplate(\n ModalOverlayTemplate({\n id: `${this.id}-modal-overlay`\n })\n )\n\n document.body.appendChild(this.overlayEl)\n this.overlayEl.appendChild(this.element)\n this.modalContentEl.classList.add('modal__content')\n }\n\n /**\n * Destroy the modal instance and remove event listeners\n */\n destroy() {\n this.removeEvents()\n\n if (this.overlayEl) {\n this.overlayEl.remove()\n }\n }\n\n /**\n * Show modal event Modalbutton triggers click event\n */\n showModalEvent = (id) => {\n if (id === this.id) {\n this.open()\n }\n }\n\n /**\n * Open modal, set modal properties and styles and set focus trap\n */\n open = () => {\n this.activeElement = document.activeElement\n this.isOpen = true\n\n this.element.setAttribute('aria-hidden', 'false')\n this.element.classList.add('modal--visible')\n this.overlayEl.classList.add('modal__overlay--visible')\n\n // Trap focus inside the modal\n const { hasFocusableElements, focusableElements } =\n this.hasFocusableContent()\n this.element.setAttribute('tabindex', '-1')\n\n if (hasFocusableElements) {\n focusableElements[0].focus()\n }\n\n this.EventEmitterService.emit(Modal.EVENTS.OPEN_MODAL, this.id)\n\n // prevent page content from scrolling beneath the modal\n document.body.classList.add('no-scroll')\n }\n\n /**\n * close modal, set modal properties and styles and move focus to trigger\n */\n close = () => {\n this.isOpen = false\n this.element.setAttribute('aria-hidden', 'true')\n this.element.classList.remove('modal--visible')\n this.overlayEl.classList.remove('modal__overlay--visible')\n\n // Restore the focus to the previously active element\n this.activeElement.focus()\n this.EventEmitterService.emit(Modal.EVENTS.CLOSE_MODAL, this.id)\n\n // remove no-scroll on body\n document.body.classList.remove('no-scroll')\n }\n\n /**\n * Validates if element has focusable children\n */\n hasFocusableContent() {\n const focusableElements = Array.from(\n this.element.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]), video'\n )\n ).filter((element) => element.offsetParent !== null)\n\n return {\n hasFocusableElements: focusableElements.length > 0,\n focusableElements\n }\n }\n\n /**\n * Prevents click event from bubbling up to the overlay\n * @param {*} event\n */\n handleElementClick = (event) => {\n event.stopPropagation()\n }\n\n /**\n * Close modal on Escape key and handle focus trap\n */\n handleKeyDown = (event) => {\n if (event.key === 'Escape') {\n this.close()\n }\n\n // Focus Trap\n if (event.key === 'Tab') {\n const { focusableElements } = this.hasFocusableContent()\n\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault()\n lastElement.focus()\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault()\n firstElement.focus()\n }\n }\n }\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 static SELECTORS = {\n BUTTON: '[data-cmp-is=\"modal-button\"]'\n }\n\n static EVENTS = {\n BUTTON_CLICK: 'modalbutton click event'\n }\n\n constructor(element) {\n this.element = element\n this.services = Services.getInstance()\n this.EventEmitterService = this.services.EventEmitterService\n\n this.attachEvents()\n }\n\n /**\n * Add event listeners\n */\n attachEvents() {\n this.element.addEventListener('click', this.openModal)\n }\n\n /**\n * Remove event listeners\n */\n detachEvents() {\n this.element.removeEventListener('click', this.openModal)\n }\n\n /**\n * Destroy the modal instance and remove event listeners\n */\n destroy() {\n this.detachEvents()\n }\n\n /**\n * Emits click event for modal\n */\n openModal = () => {\n const modalId = this.element.dataset.modalId\n\n this.EventEmitterService.emit(ModalButton.EVENTS.BUTTON_CLICK, modalId)\n }\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 BOTTOM_LEFT: 'bottom-left',\n BOTTOM_RIGHT: 'bottom-right',\n CENTER: 'center',\n TOP_LEFT: 'top-left',\n TOP_RIGHT: 'top-right'\n}\n\n/**\n * Play Icon Sizes\n */\nexport const SIZES = {\n LARGE: 'large',\n SMALL: '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 addClassName,\n a11y: { buttonLabel = '', playLabel = 'Play', pauseLabel = 'Pause' } = {},\n dataAttributes,\n id,\n isButton,\n isInline,\n position,\n size,\n isBlackAndWhite = false\n} = {}) => {\n const tag = isButton ? 'button' : 'div'\n\n return /* HTML */ `\n <${tag}\n class=\"${classNames(\n 'mod-play-icon',\n addClassName,\n isBlackAndWhite && `mod-play-icon--black-white`,\n isInline && `mod-play-icon--inline`,\n position && `mod-play-icon--position`,\n position && `mod-play-icon--position-${position}`,\n size && `mod-play-icon--size-${size}`\n )}\"\n ${id ? `id=\"${id}\"` : ''}\n ${buttonLabel ? `aria-label=\"${buttonLabel}\"` : ''}\n ${dataAttributes ? dataAttributes.join(' ') : ''}\n data-is-paused=\"true\"\n >\n
\n
\n ${Icon({\n icon: 'play'\n })}\n
\n
\n ${Icon({\n icon: 'pause'\n })}\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 static SELECTORS = {\n ELEMENT: '[data-cmp-is=\"video-modal\"]',\n MODAL: '[data-cmp-is=\"modal\"]',\n MODAL_CONTENT: '[data-modal-content=\"content\"]'\n }\n\n static EVENTS = {\n ELEMENT_CLICK: 'Video click event'\n }\n\n constructor(element) {\n this.element = element\n this.id = this.element.id\n this.modalElId = this.element.dataset.modalId\n this.video = null\n this.modalEl = null\n this.modalContentEl = null\n this.services = Services.getInstance()\n this.EventEmitterService = this.services.EventEmitterService\n\n this.cacheDom()\n this.buildPlayer()\n this.attachEvents()\n }\n\n /**\n * Cache DOM elements\n */\n cacheDom() {\n this.modalEl = document.getElementById(this.modalElId)\n this.modalContentEl = this.modalEl?.querySelector(\n VideoModal.SELECTORS.MODAL_CONTENT\n )\n this.title = this.element.dataset.title || ''\n }\n\n /**\n * Build player element and add it to modal\n */\n buildPlayer() {\n const videoSrc = this.element.dataset.videoSrc\n const posterSrc = this.element.dataset.posterSrc\n const captionSrc = this.element.dataset.captionSrc\n const captionLabel = this.element.dataset.captionLabel\n const captionSrclang = this.element.dataset.captionSrclang\n\n const videoEl = fromTemplate(\n videoPlayerTemplate({\n id: `${this.id}-player`,\n posterSrc,\n videoSrc,\n controls: true,\n dataAttributes: ['data-type=\"modal\"', `data-title=\"${this.title}\"`],\n videoCaptions: {\n src: captionSrc,\n label: captionLabel,\n srclang: captionSrclang\n }\n })\n )\n if (videoEl) {\n this.video = new VideoPlayer(videoEl)\n }\n\n if (this.modalContentEl && videoEl) {\n this.modalContentEl.appendChild(videoEl)\n }\n }\n\n /**\n * Add event listeners\n */\n attachEvents() {\n this.EventEmitterService.on(Modal.EVENTS.OPEN_MODAL, this.playPlayer)\n this.EventEmitterService.on(Modal.EVENTS.CLOSE_MODAL, this.closePlayer)\n }\n\n /**\n * Remove event listeners\n */\n removeEvents() {\n this.EventEmitterService.off(Modal.EVENTS.OPEN_MODAL, this.playPlayer)\n this.EventEmitterService.off(Modal.EVENTS.CLOSE_MODAL, this.closePlayer)\n }\n\n /**\n * Destroy the modal instance and remove event listeners\n */\n destroy() {\n this.removeEvents()\n }\n\n /**\n * Play player on modal open event\n * @param {*} id\n */\n playPlayer = (id) => {\n const autoplay = this.element.dataset.autoplay === 'true'\n\n if (this.modalElId === id && autoplay) {\n this.video.play({ triggerAnalyticsEvent: true })\n }\n }\n\n /**\n * Close player on modal close event\n */\n closePlayer = (id) => {\n if (this.modalElId === id) {\n this.video.stop({ triggerAnalyticsEvent: true })\n }\n }\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 static SELECTORS = {\n VIDEO: '[data-video-player=\"video-player\"]',\n PLAY_BUTTON: '[data-video-payer=\"play-button\"]'\n }\n\n static ATTRIBUTES = {\n PLAY_BUTTON_STATUS: 'data-is-paused',\n PLAY_BUTTON_LABEL: 'data-play-label',\n PAUSE_BUTTON_LABEL: 'data-pause-label',\n PLAY_BUTTON_POSITION: 'data-play-button-position',\n HIDE_PLAY_BUTTON_AFTER_PLAY: 'data-hide-button-after-play'\n }\n\n static EVENTS = {\n PLAY: 'videoPlay',\n PAUSE: 'videoPause',\n STOP: 'videoStop',\n PLAY_VIDEO: 'playVideo', // Remote instruction to play video\n PAUSE_VIDEO: 'pauseVideo' // Remote instruction to pause video\n }\n\n static CLASSES = {\n HIDDEN: 'mod-player__play-button--hidden'\n }\n\n constructor(element) {\n this.element = element\n this.services = Services.getInstance()\n this.analyticsService = Analytics.getInstance() // ref to analytics service\n this.videoProgressMarkers = new Map()\n this.EventEmitterService = this.services.EventEmitterService\n this.trackInteractionDebounce = debounce(this.trackInteraction, 200)\n this.hasStarted = false\n\n this.cacheDom()\n this.initPlayButton()\n this.attachEvents()\n }\n\n /**\n * Cache DOM elements\n */\n cacheDom() {\n this.videoEl = this.element.querySelector(VideoPlayer.SELECTORS.VIDEO)\n this.videoProgressMarkers.set(this.videoEl, [25, 50, 75, 100])\n\n this.playButtonEl = this.element.querySelector(\n VideoPlayer.SELECTORS.PLAY_BUTTON\n )\n\n this.hasControls = this.videoEl?.hasAttribute('controls')\n\n this.videoElId = this.videoEl?.id || null\n }\n\n /**\n * Add event listeners\n */\n attachEvents() {\n this.playButton?.addEventListener('click', this.togglePlay)\n\n this.videoEl.addEventListener('ended', this.handleVideoEnd)\n this.videoEl.addEventListener('play', this.trackInteractionDebounce)\n this.videoEl.addEventListener('seeking', this.trackInteractionDebounce)\n this.videoEl.addEventListener('timeupdate', this.trackInteractionDebounce)\n this.videoEl.addEventListener('pause', this.trackInteractionDebounce)\n this.videoEl.addEventListener('ended', this.trackInteraction)\n\n this.EventEmitterService.on(VideoPlayer.EVENTS.PLAY_VIDEO, this.remotePlay)\n this.EventEmitterService.on(\n VideoPlayer.EVENTS.PAUSE_VIDEO,\n this.remotePause\n )\n }\n\n /**\n * Remove event listeners\n */\n removeEvents() {\n this.playButton?.removeEventListener('click', this.togglePlay)\n\n this.videoEl.removeEventListener('ended', this.handleVideoEnd)\n\n this.videoEl.removeEventListener('play', this.trackInteractionDebounce)\n this.videoEl.removeEventListener(\n 'timeupdate',\n this.trackInteractionDebounce\n )\n this.videoEl.removeEventListener('pause', this.trackInteractionDebounce)\n this.videoEl.removeEventListener('ended', this.trackInteraction)\n\n this.EventEmitterService.off(VideoPlayer.EVENTS.PLAY_VIDEO, this.remotePlay)\n this.EventEmitterService.off(\n VideoPlayer.EVENTS.PAUSE_VIDEO,\n this.remotePause\n )\n }\n\n /**\n * Destroy the modal instance and remove event listeners\n */\n destroy() {\n this.removeEvents()\n }\n\n /**\n * Track interaction\n */\n trackInteraction = (event) => {\n const { target } = event\n const videoType = target.dataset?.type\n\n if (\n (videoType !== 'poster' && videoType !== 'modal') ||\n this.filterAnalyticsEvent\n )\n return\n\n switch (event.type) {\n case 'play':\n if (this.hasStarted) return\n\n this.hasStarted = true\n this.analyticsService.trackInteraction('video', {\n video_title: target.dataset?.title || undefined,\n video_status: 'start',\n video_view: 1,\n video_url: target.currentSrc,\n video_provider: 'widen'\n })\n break\n case 'timeupdate': {\n const progress = Math.floor(\n (target.currentTime / target.duration) * 100\n )\n let progressMarkers = this.videoProgressMarkers.get(target)\n\n for (let i = 0; i < progressMarkers.length; i++) {\n if (progress >= progressMarkers[i]) {\n this.analyticsService.trackInteraction('video', {\n video_title: target.dataset?.title || undefined,\n video_status: 'progress',\n video_percent: progressMarkers[i],\n video_url: target.currentSrc,\n video_provider: 'widen'\n })\n progressMarkers = progressMarkers.slice(i + 1)\n this.videoProgressMarkers.set(target, progressMarkers)\n break\n }\n }\n break\n }\n case 'pause': {\n /**\n * This is a workaround to stop the video player firing the pause event\n * along with the ended event when a file finishes playing.\n */\n const eventThreshold = Math.floor(target.duration) - 2 // Stop registering events 2 seconds before end of video\n if (target.currentTime >= eventThreshold) return\n\n this.analyticsService.trackInteraction('video', {\n video_title: target.dataset?.title || undefined,\n video_status: 'pause',\n video_url: target.currentSrc,\n video_provider: 'widen'\n })\n break\n }\n case 'ended':\n this.hasStarted = false\n\n this.analyticsService.trackInteraction('video', {\n video_title: target.dataset?.title || undefined,\n video_status: 'complete',\n video_percent: 100,\n video_url: target.currentSrc,\n video_provider: 'widen'\n })\n break\n default:\n break\n }\n }\n\n /**\n * Initialize and render the play button if there is an element to render it to\n */\n initPlayButton() {\n const hasPlayButton = !!this.playButton\n\n if (this.playButtonEl) {\n const playButtonPosition =\n this.playButtonEl.getAttribute(\n VideoPlayer.ATTRIBUTES.PLAY_BUTTON_POSITION\n ) || POSITIONS.BOTTOM_RIGHT\n\n if (!hasPlayButton) {\n this.playButton = fromTemplate(\n playIcon({\n isButton: true,\n isInline: true,\n position: playButtonPosition\n })\n )\n\n this.playButtonEl.appendChild(this.playButton)\n }\n\n this.playButton.setAttribute(\n VideoPlayer.ATTRIBUTES.PLAY_BUTTON_STATUS,\n !this.videoEl.autoplay\n )\n\n this.playButton.setAttribute(\n 'aria-label',\n this.element.getAttribute(\n this.videoEl.autoplay\n ? VideoPlayer.ATTRIBUTES.PAUSE_BUTTON_LABEL\n : VideoPlayer.ATTRIBUTES.PLAY_BUTTON_LABEL\n )\n )\n\n if (this.hasControls) {\n // hide the controls when the custom play button is enabled\n this.videoEl.removeAttribute('controls')\n }\n\n this.playButtonEl.classList.remove(VideoPlayer.CLASSES.HIDDEN)\n }\n }\n\n /**\n * Toggle Video\n */\n togglePlay = () => {\n if (this.videoEl.paused) {\n this.play()\n } else {\n this.pause()\n }\n }\n\n /**\n * Play Video and update button\n * @param {object} event - Event object\n * @param {boolean} event.forcePause - Force the video to play without checking if it is already playing\n */\n play = ({ forcePlay = false, triggerAnalyticsEvent = false } = {}) => {\n if (this.videoEl?.paused || forcePlay) {\n this.videoEl.play()\n this.EventEmitterService.emit(VideoPlayer.EVENTS.PLAY, {\n videoId: this.videoElId\n })\n\n if (triggerAnalyticsEvent) {\n this.videoEl.dispatchEvent(new Event('play'))\n }\n\n if (this.playButton) {\n this.playButton.setAttribute(\n VideoPlayer.ATTRIBUTES.PLAY_BUTTON_STATUS,\n false\n )\n this.playButton.setAttribute(\n 'aria-label',\n this.element.getAttribute(VideoPlayer.ATTRIBUTES.PAUSE_BUTTON_LABEL)\n )\n\n if (\n this.playButtonEl.getAttribute(\n VideoPlayer.ATTRIBUTES.HIDE_PLAY_BUTTON_AFTER_PLAY\n ) === 'true'\n ) {\n this.playButtonEl.classList.add(VideoPlayer.CLASSES.HIDDEN)\n }\n\n if (this.hasControls && !this.videoEl.getAttribute('controls')) {\n // reenable the controls when the custom play button is enabled and controls has been set\n this.videoEl.setAttribute('controls', '')\n }\n }\n }\n }\n\n /**\n * Stop Video\n */\n stop = ({ triggerAnalyticsEvent = false }) => {\n this.hasStarted = false\n this.videoEl.pause()\n this.EventEmitterService.emit(VideoPlayer.EVENTS.STOP, {\n videoId: this.videoElId\n })\n\n if (triggerAnalyticsEvent) {\n this.videoEl.dispatchEvent(new Event('pause'))\n // reset the video to the beginning after a pause event\n // setting a timeout give the debounce function time to clear so that\n // timeupdate event is not fired\n setTimeout(() => {\n this.videoEl.currentTime = 0\n }, 500)\n } else {\n this.videoEl.currentTime = 0\n }\n }\n\n /**\n * Pause Video and update play button\n * @param {object} event - Event object\n * @param {boolean} event.forcePause - Force the video to pause without checking if it is already paused\n */\n pause = ({ forcePause = false } = {}) => {\n if (!this.videoEl?.paused || forcePause) {\n this.videoEl.pause()\n this.EventEmitterService.emit(VideoPlayer.EVENTS.PAUSE, {\n videoId: this.videoElId\n })\n\n if (this.playButton) {\n this.playButton.setAttribute(\n VideoPlayer.ATTRIBUTES.PLAY_BUTTON_STATUS,\n true\n )\n\n this.playButton.setAttribute(\n 'aria-label',\n this.element.getAttribute(VideoPlayer.ATTRIBUTES.PLAY_BUTTON_LABEL)\n )\n }\n }\n }\n\n /**\n * Process a Remote play event\n * @param {object} event - Event object\n * @param {string} event.videoId - Video ID\n */\n remotePlay = (event) => {\n const { videoId } = event\n\n if (videoId === this.videoElId) {\n this.play({ forcePlay: true })\n }\n }\n\n /**\n * Process a Remote pause event\n * @param {object} event - Event object\n * @param {string} event.videoId - Video ID\n */\n remotePause = (event) => {\n const { videoId } = event\n\n if (videoId === this.videoElId) {\n this.pause({ forcePause: true })\n }\n }\n\n /**\n * When the video ends, emit a STOP event, reset the poster image and show play button\n */\n handleVideoEnd = () => {\n this.EventEmitterService.emit(VideoPlayer.EVENTS.STOP, {\n videoId: this.videoElId\n })\n this.initPlayButton()\n this.videoEl.load()\n }\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 a11y: { playLabel = 'Play', pauseLabel = 'Pause' } = {},\n addClassName = '',\n autoplay = false,\n buttonClassName = '',\n hideControls = false,\n hidePlayButtonAfterPlay = false,\n id = '',\n muted = false,\n playButtonPosition = PLAY_BUTTON_POSITIONS.BOTTOM_RIGHT,\n playsInline = false,\n posterSrc = '',\n showPlayButton = false,\n videoSrc,\n dataAttributes,\n videoCaptions\n}) => /* HTML */ `\n \n ${showPlayButton\n ? `
`\n : ''}\n \n ${videoCaptions && videoCaptions.src\n ? `\n \n `\n : ''}\n Your browser does not support the video tag.\n \n \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 return 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 const el = document.createElement('div')\n el.innerHTML = templateString.trim()\n\n // If there are multiple child nodes return the wrapped elements in a div\n if (el.childNodes.length > 1) {\n return el\n }\n\n return 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 while (element.firstChild) {\n element.removeChild(element.firstChild)\n }\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 // dump the inner nodes before appending new content\n empty(toElement)\n\n // append the new node\n toElement.appendChild(node)\n\n return 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":""}