{"version":3,"file":"809.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/PlayIcon/PlayIcon.template.js","webpack://@hero-digital/masonite/./src/components/modules/VideoPlayer/VideoPlayer.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\nexport default IconTemplate\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 ${tag}>\n`\n}\n\nexport default PlayIcon\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","/**\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. '