{"version":3,"file":"index.es.min.js","sources":["../../../packages/components/src/video/constants.mjs","../../../packages/helpers/src/getScript.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/dataLayer.js","../../../packages/helpers/src/playerYoutube.js","../../../packages/helpers/src/htmlElement.js","../../../packages/helpers/src/playerYouku.js","../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/video/components/youtube-overlay.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/components/src/constants.mjs","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/video/video.js"],"sourcesContent":["export const VIDEO_SERVICE_YOUTUBE = 'youtube'\nexport const VIDEO_SERVICE_YOUKU = 'youku'\nexport const VIDEO_SERVICE_LOCAL = 'local'\n","export default function getScript(source, asyncLoad = true, defer = false) {\n return new Promise((resolve, reject) => {\n if (document.querySelector(`script[src=\"${source}\"]`)) {\n return resolve() // Script already loaded\n }\n\n const script = document.createElement('script')\n const prior = document.getElementsByTagName('script')[0]\n script.async = asyncLoad\n script.defer = defer\n script.addEventListener('load', () => resolve())\n script.addEventListener('error', () => reject(new Error('Loading script')))\n script.src = source\n prior.parentNode.insertBefore(script, prior)\n })\n}\n","export default class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject\n this.resolve = resolve\n })\n }\n}\n","export const getDataLayer = () => {\n return window[window?.padlNamespace]?.dataLayer\n}\n\nexport const getMarketCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'ch'\n }\n\n return dataLayer.app.app.market.toLocaleLowerCase()\n}\n\nexport const getLangCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'en'\n }\n\n return getDataLayer().page.page.pageInfo.language.toLocaleLowerCase()\n}\n\nexport const getSegmentCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'B2C'\n }\n\n return getDataLayer().page.page.pageInfo.segmentBusiness\n}\n\nexport const isLoggedIn = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer || !dataLayer.user) {\n return false\n }\n\n return dataLayer.user.isLoggedIn\n}\n\nexport const interpolateMarketLang = (string, market, lang) => {\n return string.replace('{market}', market).replace('{lang}', lang)\n}\n","import getScript from './getScript'\nimport Deferred from './deferred'\nimport { getMarketCode } from './dataLayer'\n\nfunction initYouTubeIframeAPI() {\n const deferred = new Deferred()\n\n if (window.YT?.Player || getMarketCode() === 'cn') {\n deferred.resolve()\n }\n\n // YouTube API will call this function automatically when player API is ready\n // https://developers.google.com/youtube/iframe_api_reference\n window.onYouTubeIframeAPIReady = function () {\n deferred.resolve()\n }\n\n getScript('https://www.youtube.com/iframe_api', false).then(() => {\n window.YT?.ready(() => deferred.resolve())\n })\n\n return deferred.promise\n}\n\nclass PlayerYoutube {\n constructor() {\n this.iframeApi = initYouTubeIframeAPI()\n }\n\n attach(iframeContainer, videoId, isBackgroundVideoPlaying, isAutoPlay = 1, moreParams = {}) {\n let params = {}\n\n if (isBackgroundVideoPlaying) {\n params = { playlist: videoId, controls: 0, loop: 1 }\n }\n\n return new Promise(resolve => {\n this.iframeApi.then(() => {\n const player = new window.YT.Player(iframeContainer, {\n videoId,\n host: 'https://www.youtube-nocookie.com',\n playerVars: {\n // disablekb: 1,\n // showinfo: 0,\n // modestbranding: 1,\n enablejsapi: 1,\n rel: 0,\n fs: 0,\n autoplay: isAutoPlay,\n ...params,\n ...moreParams\n },\n events: {\n onReady: () => {\n if (isBackgroundVideoPlaying) {\n player.mute()\n }\n resolve(player)\n },\n onStateChange: () => ({}),\n onError: () => ({})\n }\n })\n })\n })\n }\n}\n\nexport default PlayerYoutube\n","/**\n * Return real width for a DOM Node\n * @param {HTMLElement} el\n * @returns {number}\n */\nexport const outerWidth = el => {\n const style = getComputedStyle(el)\n const width = style.getPropertyValue('width') || 0\n const marginLeft = style.getPropertyValue('margin-left') || 0\n const marginRight = style.getPropertyValue('margin-right') || 0\n\n return parseInt(width) + parseInt(marginLeft) + parseInt(marginRight)\n}\n\n/**\n * Return real height for a DOM Node\n * @param {DOM Node} el\n * @returns {number}\n */\nexport const outerHeight = el => {\n const style = getComputedStyle(el)\n const height = style.getPropertyValue('height') || 0\n const marginTop = style.getPropertyValue('margin-top') || 0\n const marginBottom = style.getPropertyValue('margin-bottom') || 0\n\n return parseInt(height) + parseInt(marginTop) + parseInt(marginBottom)\n}\n\nexport const appendSchema = content => {\n const el = window.document.createElement('script')\n el.setAttribute('type', 'application/ld+json')\n el.innerHTML = JSON.stringify(content)\n window.document.head.appendChild(el)\n}\n","import getScript from './getScript'\nimport { outerWidth, outerHeight } from './htmlElement'\n\nclass PlayerYouku {\n constructor() {\n this.iframeApi = new Promise(resolve => {\n getScript('https://player.youku.com/jsapi').then(() => resolve())\n })\n }\n\n attach(iframeContainerId, videoId, isBackgroundVideoPlaying, isAutoPlay = 1, moreParams = {}) {\n let params = {}\n if (isBackgroundVideoPlaying) {\n const container = document.getElementById(iframeContainerId)\n\n params = {\n playlist: videoId,\n controls: 0,\n loop: 1,\n autoplay: 1,\n width: outerWidth(container),\n height: outerHeight(container)\n }\n }\n return new Promise(resolve => {\n this.iframeApi.then(() => {\n const player = new window.YKU.Player(iframeContainerId, {\n styleid: '0',\n client_id: 'a3660779c8b57c32',\n vid: videoId,\n newPlayer: true,\n autoplay: isAutoPlay,\n show_related: false,\n width: 640,\n height: 360,\n ...params,\n ...moreParams,\n events: {\n onPlayerReady: () => resolve(player),\n onPlayStart: () => ({}),\n onPlay: () => ({}),\n onPlayEnd: () => ({}),\n onPause: () => ({}),\n onWaiting: () => ({}),\n onFullScreen: () => ({}),\n onPlayError: () => ({})\n }\n })\n })\n })\n }\n}\n\nexport default PlayerYouku\n","const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n const data = getData([...attributes])\n const props = [...attributes]\n .filter(attribute => attribute.nodeName !== 'data')\n .reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n if (isNil(data)) {\n return props\n }\n\n try {\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log('ERROR: No data', error, data?.nodeValue)\n }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass YoutubeOverlay extends HTMLElement {\n connectedCallback() {\n const { video_id = '' } = createProps(this.attributes)\n\n if (video_id) {\n this.render(video_id)\n }\n }\n\n render(videoId) {\n this.setAttribute('role', 'button')\n this.style.backgroundImage = `url(https://img.youtube.com/vi/${videoId}/sddefault.jpg)`\n this.innerHTML = `\n <div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"90\"\n height=\"60\"\n viewBox=\"0 0 90 60\"\n >\n <rect width=\"90\" height=\"60\" rx=\"12\" fill=\"#FF0000\" />\n <polygon points=\"36,15 36,45 60,30\" fill=\"#FFFFFF\" />\n </svg>\n </div>\n `\n }\n}\n\ncustomElements.get('nb-youtube-overlay') ||\n customElements.define('nb-youtube-overlay', YoutubeOverlay)\n\nexport default YoutubeOverlay\n","export const dispatchEvent = ({ eventName, args, element }) => {\n // Use the provided element or fallback to window if available\n if (!element) {\n if (typeof window !== 'undefined') {\n element = window\n } else {\n throw new Error(\n '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n )\n }\n }\n\n let event\n if (args) {\n event = new CustomEvent(eventName, { detail: args, bubbles: true })\n } else {\n if (typeof Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n }\n element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n if (!e.detail) {\n return\n }\n return e.detail\n}\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566',\n kr: 'https://apps.apple.com/kr/app/%EB%84%A4%EC%8A%A4%ED%94%84%EB%A0%88%EC%86%8C-%EB%B6%80%ED%8B%B0%ED%81%AC/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n 'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n const lt = (ref: number) => {\n return window.innerWidth < ref\n }\n\n return {\n get is() {\n const { innerWidth: vw, devicePixelRatio } = window\n return {\n mobile: vw < BREAKPOINT_M,\n mobile_tablet: vw < BREAKPOINT_TABLET,\n tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n }\n },\n lt\n }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n ESC: 27,\n SPACE: 32,\n ENTER: 13,\n TAB: 9\n}\n\nexport function capitalize(s = '') {\n return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n const arr = str.match(/[a-z]+|\\d+/gi)\n if (!arr) { return str }\n return arr.map((m, i) => {\n let low = m.toLowerCase()\n if (i !== 0) {\n low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n }\n return low\n }).join(\"\")\n}\n\nexport function slug(s = '') {\n return s\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n return target + '%'\n}\n\nexport function parseHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n var result = ''\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n var charactersLength = characters.length\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n const findText = [\n 'Default campaign ID (tracking missing in Page Builder export)',\n 'Default campaign name (tracking missing in Page Builder export)',\n 'promoname', \n 'promoid', \n 'promocreative', \n 'undefined'\n ];\n \n for (let key in obj) {\n const value = obj[key];\n \n if (value === null || value === undefined || value === '') {\n delete obj[key];\n continue;\n }\n \n if (typeof value === 'string') {\n for (const text of findText) {\n if (value.includes(text)) {\n delete obj[key];\n break;\n }\n }\n }\n }\n \n return obj;\n}\n\nexport function makeHash(str: string) {\n var hash = 0,\n i,\n chr\n if (!str) {\n return hash\n }\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n let linkHash = link\n let linkNoHash = link\n if (link.indexOf('#') !== -1) {\n linkNoHash = link.replace('#', '')\n } else {\n linkHash = '#' + link\n }\n\n return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n const inViewPort = (attribute: string, value: any) => {\n node.setAttribute(attribute, value)\n\n const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n if (url) {\n const img = new Image()\n img.src = url\n img.onload = cb\n img.onerror = () => {\n cb()\n node.classList.add(CLASSNAME_ON_ERROR)\n throw new Error(`Image ${url} cannot be loaded`)\n }\n\n return\n }\n\n cb()\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n inViewPort(attribute, value)\n } else {\n if ('IntersectionObserver' in window) {\n node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n inViewPort(attribute, value)\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n })\n lazyBackgroundObserver.observe(node)\n } else {\n inViewPort(attribute, value)\n }\n }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n cb()\n } else {\n if ('IntersectionObserver' in window) {\n let lazyBackgroundObserver = new IntersectionObserver(\n function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n cb()\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n },\n { rootMargin: '150% 0px' }\n )\n lazyBackgroundObserver.observe(node)\n }\n }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n let timer: number\n return function (event: T) {\n if (timer) {\n window.clearTimeout(timer)\n }\n timer = window.setTimeout(func, time, event)\n }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n let ua = window.navigator.userAgent,\n isIE = /MSIE|Trident/.test(ua)\n\n return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n src,\n callback = null,\n async = false,\n defer = false,\n module = false,\n id = ''\n}: {\n src: string;\n callback: null | GlobalEventHandlers[\"onload\"]\n module: boolean,\n defer: boolean,\n async: boolean,\n id: string\n}) => {\n const script = document.createElement('script')\n script.type = module ? 'module' : 'text/javascript'\n script.src = src\n id ? (script.id = id) : false // add id attribute only if passed\n if (typeof callback === 'function') {\n script.onload = callback\n }\n script.async = async\n script.defer = defer\n document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n const script = document.createElement('link')\n script.rel = 'stylesheet'\n script.href = src\n document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n const observer = new IntersectionObserver(handler)\n observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n let curIdx = 0\n\n while (txt) {\n const stIdx = txt.indexOf(stChr, curIdx)\n if (stIdx === -1) {\n break\n }\n const enIdx = txt.indexOf(enChr, stIdx + 1)\n if (enIdx === -1) {\n break\n }\n const hashId = txt.substring(stIdx + stChr.length, enIdx)\n if (vars[hashId] != null) {\n txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n curIdx = stIdx\n } else {\n curIdx = enIdx\n }\n }\n return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n const container = elementScope.querySelector<HTMLElement>(containerSelector)\n if (!container) {\n return\n }\n\n const items = container.querySelectorAll<HTMLElement>(el)\n let max = -1\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n let h = item.offsetHeight\n max = h > max ? h : max\n }\n\n if (max <= 0) {\n return\n }\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n item.style.height = `${max}px`\n }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n } as { [s: string]: string }\n\n return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * Because setting attributes escapes more than the characters above and then preact also\n * escapes text we need a more complete way of unescaping all html entities (not just the ones\n * above)\n */\nconst domParser = new DOMParser()\nexport const unescapeHtml = (text: string) => {\n return domParser.parseFromString(text, \"text/html\").body.textContent\n}\n\nexport const sanitizeString = (data: {}) => {\n if (!data) {\n return ''\n }\n\n return data.toString().replace(/\"/g, '"').replace(/'/g, ''')\n}\n\nexport const stripTags = (s: string) => {\n return (s || '').replace(/(<([^>]+)>)/gi, '')\n}\n\nexport const setAttributes = (element: Element, attrs: Record<string, any>) => {\n for (let key in attrs) {\n element.setAttribute(key, attrs[key])\n }\n return element\n}\n\nexport const getMetaContent = (metaName: string) => {\n const metaTag = document.querySelector(`meta[name=${metaName}]`)\n if (!metaTag) {\n return ''\n }\n return metaTag.getAttribute('content')\n}\n\nexport const isObjectEmpty = (obj: {}) => {\n return Object.keys(obj).length === 0\n}\n","import { VIDEO_SERVICE_YOUKU, VIDEO_SERVICE_YOUTUBE, VIDEO_SERVICE_LOCAL } from './constants.mjs'\nimport PlayerYoutube from '@kissui/helpers/src/playerYoutube'\nimport PlayerYouku from '@kissui/helpers/src/playerYouku'\nimport './components/youtube-overlay'\n\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport {\n EVENT_VIDEO,\n EVENT_POPIN_CLOSED,\n EVENT_POPIN_OPENED,\n EVENT_VIDEO_TOGGLE,\n VIDEO_ON_HOVER,\n VIDEO_ON_OUT\n} from '@kissui/components'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport { setAttributes } from '@kissui/helpers/src/utils'\n\nclass Video extends HTMLElement {\n #percentThresholds = [25, 50, 75, 90]\n #lastTrackedThreshold = 0\n #progressInterval\n #eventCategory = 'User Engagement'\n\n constructor() {\n super()\n\n this.videoId = null\n this.videoMobile = null\n this.currentVideo = null\n this.videoService = ''\n this.containerId = ''\n this.ccPolicyLanguage = null\n this.ccPolicyCountry = null\n this.ccLoadPolicy = null\n this.displayControls = 0 // not display by default\n this.disabledKeyboard = 1 // disabled by default\n this.isBackground = false\n this.autoPlay = 0\n this.loop = 0\n this.mute = 'false'\n this.playOnHover = 'false'\n this.allowPopinAutoplay = false\n\n this.isPlaying = false\n\n this.play = null\n this.pause = null\n this.stop = null\n this.moveTo = null\n\n this.loadInterupted = null\n this.controlsReady = null\n this.overlayElement = null\n\n this._externalControl = this._externalControl.bind(this)\n }\n\n connectedCallback() {\n const { video_id, video_mobile, container_id, video_service, auto_play } = createProps(\n this.attributes\n )\n this.videoId = video_id || this.videoId\n this.videoMobile = video_mobile || this.videoMobile\n this.containerId = container_id || this.containerId\n this.videoService = video_service || this.videoService\n this.currentVideo =\n viewportHelper.is.mobile && this.videoMobile !== '' && this.videoMobile !== null\n ? this.videoMobile\n : this.videoId\n\n this.getAttributes(auto_play)\n this.init()\n }\n\n getAttributes(auto_play) {\n this.popinId = this.getAttribute('popin_id') || this.popinId\n this.ccPolicyLanguage = this.getAttribute('ccPolicy_language') || this.ccPolicyLanguage\n this.ccPolicyCountry = this.getAttribute('ccPolicy_country') || this.ccPolicyCountry\n this.ccLoadPolicy = this.getAttribute('cc_load_policy') || this.ccLoadPolicy\n this.displayControls =\n parseInt(this.getAttribute('display_controls')) || this.displayControls\n this.isBackground = this.getAttribute('is_background') === 'true' || this.isBackground\n this.autoPlay = this.getAttribute('auto_play') === 'true' || auto_play ? 1 : this.autoPlay\n this.loop = this.getAttribute('loop') === 'true' ? 1 : this.loop\n this.mute = this.getAttribute('mute') || this.mute\n this.playOnHover = this.getAttribute('play_on_hover') || this.playOnHover\n this.allowPopinAutoplay =\n this.getAttribute('allow_popin_autoplay') === 'true' || this.allowPopinAutoplay\n }\n\n init() {\n this.unbindEvent()\n\n if (this.popinId !== '') {\n this.setPopinEvents()\n }\n\n if (this.playOnHover === 'true') {\n this.setHoverEvents()\n }\n\n if (this.currentVideo) {\n this.render()\n\n if (this.videoService === VIDEO_SERVICE_LOCAL) {\n this.initLocal()\n } else {\n this.initServiceVideo()\n }\n\n this.boundExternalControl = this._externalControl.bind(this)\n window.addEventListener(EVENT_VIDEO + this.containerId, this.boundExternalControl)\n }\n }\n\n initServiceVideo() {\n if (!this.controlsReady) {\n if (this.videoService === VIDEO_SERVICE_YOUKU) {\n this.initYouku()\n } else {\n this.initYoutubeOverlay()\n }\n }\n }\n\n setPopinEvents() {\n this.boundOnPopinClosed = this.onPopinClosed.bind(this)\n window.addEventListener(EVENT_POPIN_CLOSED, this.boundOnPopinClosed)\n this.boundOnPopinOpened = this.onPopinOpened.bind(this)\n window.addEventListener(EVENT_POPIN_OPENED, this.boundOnPopinOpened)\n this.boundOnTogglePlayback = this.onTogglePlayback.bind(this)\n window.addEventListener(EVENT_VIDEO_TOGGLE, this.boundOnTogglePlayback)\n }\n\n setHoverEvents() {\n this.boundOnHover = this.onHover.bind(this)\n window.addEventListener(VIDEO_ON_HOVER, this.boundOnHover)\n this.boundOnOut = this.onOut.bind(this)\n window.addEventListener(VIDEO_ON_OUT, this.boundOnOut)\n }\n\n popinValid(id) {\n return this.popinId !== undefined && this.popinId !== '' && id === this.popinId\n }\n\n async onPopinOpened(e) {\n if (!this.allowPopinAutoplay || !this.popinValid(e.detail.id)) {\n return\n }\n\n // YouTube: hide lazy-overlay and init video on popin open\n // YouTube: prevent recreating player when popin closed & reopened\n if (this.videoService === VIDEO_SERVICE_YOUTUBE && !this.controlsReady) {\n this.initYoutube()\n return\n }\n\n await this.controlsReady\n this.play()\n }\n\n async onPopinClosed(e) {\n if (this.popinValid(e.detail.id)) {\n await this.controlsReady\n\n this.videoService === VIDEO_SERVICE_YOUTUBE ? this.stop() : this.pause()\n }\n }\n async onHover(e) {\n if (e.detail.id === this.containerId) {\n await this.controlsReady\n this.mute()\n this.play()\n this.loop = 1\n }\n }\n async onOut(e) {\n if (e.detail.id === this.containerId) {\n await this.controlsReady\n this.stop()\n }\n }\n\n async onTogglePlayback(e) {\n if (this.popinValid(e.detail.id)) {\n await this.controlsReady\n if (this.isPlaying) {\n this.pause()\n } else {\n this.play()\n }\n }\n }\n\n initYouku() {\n // Todo : Youku is not playing on mobile\n // Todo : to CSS display is not good\n const self = this\n const _YkPlayer = new PlayerYouku()\n\n this.controlsReady = new Promise((resolve, reject) => {\n this.loadInterupted = reject\n _YkPlayer\n .attach(this.containerId, this.currentVideo, this.isBackground, this.autoPlay)\n .then(player => {\n self.play = () => {\n player.playVideo()\n }\n self.pause = () => player.pauseVideo()\n self.stop = () => {\n player.pauseVideo()\n }\n\n window.addEventListener(\n 'message',\n function (e) {\n const { msg, stateParam } = e.data\n\n if (msg == 'state') {\n if (stateParam === 'play') {\n self.isPlaying = true\n } else if (stateParam === 'pause' || stateParam === 'stop') {\n self.isPlaying = false\n }\n }\n },\n false\n )\n })\n .finally(() => resolve())\n })\n }\n\n initYoutubeOverlay() {\n if (this.autoPlay) {\n this.initYoutube()\n return\n }\n\n this.overlayElement = document.createElement('nb-youtube-overlay')\n setAttributes(this.overlayElement, { video_id: this.currentVideo })\n this.appendChild(this.overlayElement)\n this.overlayElement.addEventListener('click', () => this.initYoutube())\n }\n\n initYoutube() {\n const _YtPlayer = new PlayerYoutube()\n\n const additionalParams = {\n color: '#8F7247',\n controls: this.displayControls,\n disablekb: this.disabledKeyboard,\n fs: 1\n }\n\n if (this.loop) {\n additionalParams.loop = this.loop\n additionalParams.controls = 0\n additionalParams.playlist = this.currentVideo\n }\n\n if (this.ccPolicyLanguage !== null) {\n Object.assign(additionalParams, {\n cc_load_policy: this.ccLoadPolicy || 1,\n cc_lang_pref: this.ccPolicyLanguage\n })\n }\n\n this.controlsReady = new Promise((resolve, reject) => {\n this.loadInterupted = reject\n _YtPlayer\n .attach(\n this.containerId,\n this.currentVideo,\n this.isBackground,\n this.autoPlay,\n additionalParams\n )\n .then(player => {\n this.play = () => player.playVideo()\n this.pause = () => player.pauseVideo()\n this.mute = () => player.mute()\n this.unMute = () => player.unMute()\n this.stop = () => player.stopVideo()\n this.moveTo = (time = 0) => player.seekTo(time, true)\n\n player.addEventListener('onStateChange', event =>\n this.onYoutubePlayerStateChange(player, event)\n )\n\n this.play()\n\n if (this.overlayElement) {\n this.overlayElement.removeEventListener('click', () => this.initYoutube())\n this.overlayElement.remove()\n }\n })\n .finally(() => resolve())\n })\n }\n\n onYoutubePlayerStateChange(player, event) {\n if (!player || !event || !window.YT) {\n return\n }\n\n const { PlayerState } = window.YT\n const { videoTitle } = player\n // -1 – unstarted\n // 0 – ended\n // 1 – playing\n // 2 – paused\n // 3 – buffering\n // 5 – video cued\n const state = event.data\n window.gtmDataObject = window.gtmDataObject || []\n\n if (state === PlayerState.PLAYING) {\n this.isPlaying = true\n\n window.gtmDataObject.push({\n event: 'video_playing',\n eventCategory: this.#eventCategory,\n eventAction: 'YouTube Video - Play',\n eventLabel: videoTitle,\n videoTitle\n })\n\n // Track video progress every second\n this.#progressInterval = setInterval(() => {\n this.trackVideoProgress(player, event)\n }, 1000)\n } else if (state === PlayerState.PAUSED) {\n this.isPlaying = false\n\n window.gtmDataObject.push({\n event: 'video_paused',\n eventCategory: this.#eventCategory,\n eventAction: 'YouTube Video - Pause',\n eventLabel: videoTitle,\n videoTitle\n })\n } else if (state === PlayerState.ENDED) {\n window.gtmDataObject.push({\n event: 'video_ended',\n eventCategory: this.#eventCategory,\n eventAction: 'YouTube Video - Complete',\n eventLabel: `Video - Complete - ${videoTitle}`,\n videoTitle\n })\n clearInterval(this.#progressInterval)\n }\n }\n\n trackVideoProgress(player, event) {\n const { PlayerState } = window.YT\n const { videoTitle, playerInfo } = player\n const state = event.data\n\n if (playerInfo?.duration && playerInfo?.currentTime) {\n const percentWatched = (playerInfo.currentTime / playerInfo.duration) * 100\n\n for (let threshold of this.#percentThresholds) {\n if (\n state === PlayerState.PLAYING &&\n percentWatched >= threshold &&\n this.#lastTrackedThreshold < threshold\n ) {\n window.gtmDataObject.push({\n event: 'video_progress',\n eventCategory: this.#eventCategory,\n eventAction: 'YouTube Video - Progress',\n eventLabel: `Video - Watched ${threshold}% - ${videoTitle}`,\n percentWatched: threshold,\n videoTitle\n })\n this.#lastTrackedThreshold = threshold\n }\n }\n }\n }\n\n initLocal() {\n const video = document.getElementById(this.containerId)\n this.play = () => video.play()\n this.pause = () => video.pause()\n }\n\n renderVideo() {\n if (this.videoService === VIDEO_SERVICE_LOCAL) {\n const autoPlay = this.autoPlay === 1 ? 'true' : 'false'\n const loop = this.loop === 1 ? 'true' : 'false'\n\n return `\n <video autoplay=\"${autoPlay}\" muted=\"${this.mute}\" loop=\"${loop}\" id=\"${\n this.containerId\n }\" ${this.displayControls === 1 ? `controls=\"true\"` : ''}>\n <source src=\"${this.currentVideo}\" type=\"video/mp4\">\n </video>\n `\n }\n\n return `<div id=\"${this.containerId}\"></div>`\n }\n\n render() {\n this.innerHTML = `${this.renderVideo()}`\n }\n\n _externalControl(e) {\n const event = readEvent(e)\n const { action, time = null } = event\n\n switch (action) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n case 'mute':\n this.mute()\n break\n case 'unmute':\n this.unMute()\n break\n case 'stop':\n this.stop()\n break\n case 'moveTo':\n this.moveTo(time)\n break\n default:\n }\n }\n\n unbindEvent() {\n if (this.popinId !== '') {\n window.removeEventListener(EVENT_POPIN_CLOSED, this.boundOnPopinClosed)\n window.removeEventListener(EVENT_POPIN_OPENED, this.boundOnPopinOpened)\n window.removeEventListener(EVENT_VIDEO_TOGGLE, this.boundOnTogglePlayback)\n }\n\n if (this.playOnHover === 'true') {\n window.removeEventListener(VIDEO_ON_HOVER, this.boundOnHover)\n window.removeEventListener(VIDEO_ON_OUT, this.boundOnOut)\n }\n\n if (this.currentVideo !== '') {\n window.removeEventListener(EVENT_VIDEO + this.containerId, this.boundExternalControl)\n }\n\n if (this.loadInterupted) {\n this.loadInterupted()\n this.loadInterupted = null\n }\n\n if (this.overlayElement) {\n this.overlayElement.removeEventListener('click', () => this.initYoutube())\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-video') || customElements.define('nb-video', Video)\n\nexport default Video\n"],"names":["VIDEO_SERVICE_YOUTUBE","VIDEO_SERVICE_LOCAL","getScript","source","asyncLoad","defer","Promise","resolve","reject","document","querySelector","script","createElement","prior","getElementsByTagName","async","addEventListener","Error","src","parentNode","insertBefore","Deferred","constructor","this","promise","getMarketCode","dataLayer","window","padlNamespace","app","market","toLocaleLowerCase","PlayerYoutube","iframeApi","deferred","YT","Player","onYouTubeIframeAPIReady","then","ready","initYouTubeIframeAPI","attach","iframeContainer","videoId","isBackgroundVideoPlaying","isAutoPlay","moreParams","params","playlist","controls","loop","player","host","playerVars","enablejsapi","rel","fs","autoplay","events","onReady","mute","onStateChange","onError","outerWidth","el","style","getComputedStyle","width","getPropertyValue","marginLeft","marginRight","parseInt","outerHeight","height","marginTop","marginBottom","PlayerYouku","iframeContainerId","container","getElementById","YKU","styleid","client_id","vid","newPlayer","show_related","onPlayerReady","onPlayStart","onPlay","onPlayEnd","onPause","onWaiting","onFullScreen","onPlayError","createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","YoutubeOverlay","HTMLElement","connectedCallback","video_id","render","setAttribute","backgroundImage","innerHTML","customElements","get","define","BREAKPOINT_TABLET","EVENT_VIDEO","EVENT_POPIN_OPENED","EVENT_POPIN_CLOSED","EVENT_VIDEO_TOGGLE","VIDEO_ON_HOVER","VIDEO_ON_OUT","helper","is","innerWidth","vw","devicePixelRatio","mobile","mobile_tablet","tablet","desktop","retina","lt","ref","DOMParser","Video","__privateAdd","_percentThresholds","_lastTrackedThreshold","_progressInterval","_eventCategory","videoMobile","currentVideo","videoService","containerId","ccPolicyLanguage","ccPolicyCountry","ccLoadPolicy","displayControls","disabledKeyboard","isBackground","autoPlay","playOnHover","allowPopinAutoplay","isPlaying","play","pause","stop","moveTo","loadInterupted","controlsReady","overlayElement","_externalControl","bind","video_mobile","container_id","video_service","auto_play","viewportHelper","getAttributes","init","popinId","getAttribute","unbindEvent","setPopinEvents","setHoverEvents","initLocal","initServiceVideo","boundExternalControl","initYouku","initYoutubeOverlay","boundOnPopinClosed","onPopinClosed","boundOnPopinOpened","onPopinOpened","boundOnTogglePlayback","onTogglePlayback","boundOnHover","onHover","boundOnOut","onOut","popinValid","id","undefined","e","detail","initYoutube","self","_YkPlayer","playVideo","pauseVideo","msg","stateParam","finally","setAttributes","element","attrs","key","appendChild","_YtPlayer","additionalParams","color","disablekb","Object","assign","cc_load_policy","cc_lang_pref","unMute","stopVideo","time","seekTo","event","onYoutubePlayerStateChange","removeEventListener","remove","PlayerState","videoTitle","state","gtmDataObject","PLAYING","push","eventCategory","__privateGet","eventAction","eventLabel","__privateSet","setInterval","trackVideoProgress","PAUSED","ENDED","clearInterval","playerInfo","duration","currentTime","percentWatched","threshold","video","renderVideo","readEvent","action","disconnectedCallback","WeakMap"],"mappings":"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"}