{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/utils.ts","../../../packages/helpers/src/props.helpers.js","../../../packages/helpers/src/refs.helpers.js","../../../packages/components/src/constants.mjs","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/getCurrency.js","../../../packages/helpers/src/catalog.js","../../../packages/components/src/sku/services/index.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/helpers/src/dataLayer.js","../../../packages/helpers/src/cremaDataHelper.js","../../../services/plp/services.js","../../../packages/components/src/sku-coffee/services/index.js","../../../packages/page-builder-sections/src/product-grid/dataTransform/product.machine.dto.js","../../../packages/components/src/sku/constants.mjs","../../../packages/page-builder-sections/src/product-grid/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/product-grid/dataTransform/product.coffee.dto.js","../../../packages/page-builder-sections/src/product-grid/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/product-grid/dataTransform/product.giftCard.dto.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/components/src/colors/components/color/constants.mjs","../../../packages/page-builder-sections/src/cross-sell/services/fetcher.service.js","../../../packages/components/src/colors/components/color/color.js","../../../packages/components/src/colors/colors.js","../../../packages/components/src/colors/constants.mjs","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/components/src/sku/fragments/labels.js","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/fragments/heading.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/components/src/sku/fragments/addToCart.js","../../../packages/components/src/sku/fragments/additionalMessage.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.coffee.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.machine.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.giftCard.dto.js","../../../packages/components/src/sku-quick-view/shared-quick-view-types.ts","../../../packages/components/src/sku-quick-view/shared-quick-view.ts","../../../packages/components/src/sku/sku.js","../../../packages/components/src/sku/fragments/setCardTheme.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/components/src/sku/fragments/quickView.js","../../../packages/components/src/sku/fragments/price.js","../../../packages/helpers/src/colors.helpers.js","../../../packages/helpers/src/rating.service.js","../../../packages/components/src/sku-machine/fragments/ratings.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/sku-machine/sku-machine.js","../../../packages/helpers/src/energy-label.helpers.js","../../../packages/components/src/sku-machine/fragments/voltage.js","../../../packages/page-builder-sections/src/hero-product-showcase-v3/data/slider-data.js","../../../packages/page-builder-sections/src/hero-product-showcase-v3/hero-product-showcase-v3.js"],"sourcesContent":["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 for (let key in obj) {\n if (obj[key] === null || obj[key] === undefined || obj[key] === '') {\n delete obj[key]\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","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","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n const { ref } = $ref.dataset\n\n // Check if ref is of type array\n const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n if (refArray !== null) {\n return getRefArray(refs, $ref, refArray)\n } else {\n return { ...refs, [$ref.dataset.ref]: $ref }\n }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n if (refs[name] === undefined) {\n refs[name] = []\n }\n refs[name][index] = $ref\n return refs\n}\n\nexport default createRefs\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}\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 const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n const techno = productData.technologies[0]\n return techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n // Sleeve of original or vertuo\n return product.sales_multiple / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple !== 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n ) {\n // Sleeve of vertuo\n return product.sales_multiple / SLEEVE_OF_7\n }\n\n if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n // Bundle of original or vertuo\n return product.unitQuantity / SLEEVE_OF_10\n }\n\n if (\n product.sales_multiple === 1 &&\n getTechnologyNameFn(product) === COFFEE_VERTUO &&\n isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n ) {\n // Bundle of vertuo\n return product.unitQuantity / SLEEVE_OF_7\n }\n\n return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n // TODO: this function should not change the productData, but some components still need it\n productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n return false\n }\n\n // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n const promises = []\n\n if (!napi) {\n return Promise.reject()\n }\n\n if (!Array.isArray(skus)) {\n skus = [skus]\n }\n\n // Load manually the product to delete SKU fail\n for (const sku of skus) {\n promises.push(\n getProductFn(sku)\n .then(data => skus.splice(skus.indexOf(sku), 1, data))\n .catch(() => {\n skus.splice(skus.indexOf(sku), 1)\n console.error(`getProduct fail on sku ${sku}`)\n })\n )\n }\n\n return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n const priceFormatter = await getPriceFormatter()\n const currency = getCurrency()\n\n return priceFormatter.html\n ? priceFormatter.html(currency, price)\n : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n const productDetails = await getProduct(sku)\n const productCategories = productDetails ? productDetails.supercategories : []\n const productCategoriesNew = await Promise.all(\n productCategories.map(async categoryEncoded => {\n const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n return productCategoryData\n })\n )\n return productCategoriesNew\n}\n","import {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getSkuComponentByType = ({ type, is_machine_b2b }) => {\n let result = 'nb-sku'\n\n if (type === ECAPI_TYPE_CAPSULE) {\n result = 'nb-sku-coffee'\n } else if (type === ECAPI_TYPE_MACHINE && is_machine_b2b) {\n result = 'nb-sku-machine-b2b'\n } else if (type === ECAPI_TYPE_MACHINE) {\n result = 'nb-sku-machine'\n } else if (type === ECAPI_TYPE_ACCESSORY) {\n result = 'nb-sku-accessory'\n } else if (type === ECAPI_TYPE_GIFT_CARD) {\n result = 'nb-sku-gift-card'\n }\n\n return result\n}\n\nexport const apiOverride = (productData, pageBuilderData) => {\n if (!productData || !pageBuilderData) {\n return {}\n }\n\n const { images, name, headline, description } = productData\n const { api_override } = pageBuilderData\n\n if (!api_override) {\n return {}\n }\n\n return {\n image: api_override.image || images?.icon || images?.url || images?.push || images?.main,\n name: api_override.name || name,\n headline: api_override.headline || headline,\n description: api_override.description || description\n }\n}\n","export type EventListener = {\n element: HTMLElement\n type: string\n listener: (e: Event) => void\n options?: boolean | AddEventListenerOptions\n}\n\nconst add = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n return eventListener.element.addEventListener(\n eventListener.type,\n eventListener.listener,\n eventListener.options\n )\n })\n}\n\nconst remove = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n eventListener.element.removeEventListener(eventListener.type, eventListener.listener)\n })\n}\n\nconst busNamespace = 'pageBuilder'\n\nexport const emitCustomEvent = (eventName: string, data: unknown) => {\n const customEvent = new CustomEvent(`${busNamespace}.${eventName}`, {\n detail: data,\n bubbles: true,\n cancelable: true,\n composed: false\n })\n\n window.dispatchEvent(customEvent)\n}\n\nexport default { add, emitCustomEvent, remove }\n","import { getProduct } from '@kissui/helpers/src/catalog'\nimport { emitCustomEvent } from './events.helpers'\nimport { removeEmptyValues } from '@kissui/helpers/src/utils'\n\nconst raisedByPB = 'page builder'\nconst raisedByWC = 'Web component'\n\n/**\n * helper method for 'itemDisplay' GTM event\n * @param {*} event : 'itemDisplay' - Mandatory as is\n * @param {*} eventRaisedBy : 'Web component' - Mandatory as is\n * @param {*} eventAction : 'Click' - Action that led to the item display. For example, click\n * @param {*} itemTypes : ['products'] - Mandatory as is\n * @param {*} rootElement : ['nb-slider'] - Root DOM element for item detection. Closest common ancestor element of the inserted/displayed promotions and products. It will help the detection to reduce its performance consumption. Set to 0 (zero) in order to request detection through the entire document.\n */\nexport const itemDisplay = args => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'itemDisplay',\n eventRaisedBy: raisedByWC,\n eventAction: 'Click',\n itemTypes: ['products'],\n ...args\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('itemDisplay', eventData)\n}\n\n/**\n *\n * helper method for 'customEvent' GTM event\n * @param {*} args (event, eventRaisedBy, eventCategory, eventAction, eventLabel, nonInteraction)\n */\n\nexport const customEvent = args => {\n window.gtmDataObject = window.gtmDataObject || []\n var eventData\n if (args.event_GA4 === undefined || args.event_GA4 === false) {\n eventData = {\n event: 'customEvent',\n eventRaisedBy: raisedByWC,\n eventCategory: 'User Engagement',\n eventAction: 'Click',\n eventLabel: '',\n nonInteraction: 0,\n ...args\n }\n } else {\n eventData = {\n event_raised_by: raisedByPB,\n ...args\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('customEvent', eventData)\n}\n\n/**\n * Helper method for tracking component interactions, compatible with GA4.\n *\n * @param {String} creative : component raising the event, e.g. 'before_coffees_list', 'before_machines_list', 'before_accessories_list'\n * @param {String} actionType : description of the interaction, e.g 'pdp quick view'\n * @param {String} internationalId : long SKU, e.g. 'erp.pt.b2c/prod/7243.30'\n * @param {String} internationalName : international name of the product, e.g. 'Vertuo Carafe Pour-Over Style Mild'\n * @param {String} productType : type of product, i.e. 'capsule', 'machine', 'accessory'\n * @param {String} range : product range, e.g. 'ispirazione italiana'\n * @param {String} technology : technology, i.e. 'original', 'vertuo'\n * @param {Number} price : price, e.g. .51\n * @param {String} eventAction : description of the action, e.g. 'PDP Quick View'\n *\n * Initally created for PDP Quick View tracking:\n * https://dsu-confluence.nestle.biz/display/DIANA/BEFORE+-+PDP+Quick+View\n * Will probably be rolled out across all components, update this comment accordingly.\n */\nexport const trackComponentInteraction = ({\n creative = '',\n actionType = '',\n internationalId = '',\n internationalName = '',\n productType = '',\n technology = '',\n category = '',\n rawPrice = '',\n eventAction = ''\n}) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: creative,\n action_type: actionType,\n item_id_event: internationalId,\n item_name_event: internationalName,\n item_category_event: productType,\n item_technology_event: technology,\n item_range_event: category,\n item_price_event: rawPrice,\n eventCategory: 'User Engagement',\n eventAction: eventAction,\n eventLabel: `${productType} - ${technology} - ${internationalName}`\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\n/**\n *\n * Push 'view_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const viewPromotion = args => {\n const event = 'view_promotion'\n const eventData = {\n event,\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n eventData.ecommerce = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n }\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const handlePromoClick = args => {\n const { campaign, cta_name } = args\n\n const cleanedData = removeEmptyValues(campaign)\n selectPromotion({ cta_name, ...cleanedData })\n}\n\n/**\n *\n * Push 'select_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, cta_name, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const selectPromotion = args => {\n const event = 'select_promotion'\n const eventData = {\n event: 'select_promotion',\n cta_name: args?.cta_name ?? '(not set)',\n event_raised_by: raisedByPB,\n ecommerce: {}\n }\n if (Object.keys(args).length) {\n const { id = '', creative = '', name = '', position = '' } = args\n eventData.ecommerce = {\n promotion_id: id,\n promotion_name: name,\n creative_slot: position,\n creative_name: creative\n }\n\n removeEmptyValues(eventData.ecommerce)\n }\n\n window.gtmDataObject ??= []\n window.gtmDataObject.push(eventData)\n emitCustomEvent(event, eventData)\n}\n\nexport const interactionClick = (nameComponent, ctaName) => {\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n eventCategory: 'User Engagement',\n eventAction: 'Click CTA',\n eventLabel: `Page Builder - ${nameComponent} - ${ctaName}`,\n component_name: nameComponent,\n action_type: 'web component click',\n cta_name: ctaName\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const getProductInfo = async (sku, data) => {\n let product = data\n if (!product) {\n product = await getProduct(sku)\n }\n return product\n}\n\nexport const getProductPayload = (data, actionField = {}) => {\n const {\n internationalName,\n internationalId,\n category,\n unitPrice,\n legacyId,\n name,\n technologies,\n bundled,\n inStock,\n type\n } = data\n\n const technology = technologies.map(item => item.split('/').pop()).join('|')\n const isDiscovery = category.toLowerCase().includes('discovery')\n\n return [\n // Array consists of one product details for PDP Product Detail View\n {\n ...actionField,\n name: internationalName, // '[[International Product Name]]' NIE, Contract\n id: internationalId, // '[[International Product ID]]'\n price: unitPrice, // '[[Product Price]'\n // dimension43: '[[true/false]]', // '[[true/false]]' // Signifies if this product is part of a standing order or not\n dimension44: isDiscovery.toString(), // '[[true/false]]', // Signifies if this product is part of a discovery offer\n dimension53: legacyId, // '[[Product Local market ID]]', // Local market id for product\n dimension54: name, // '[[Product Local market Name]]', // Local market name for product\n dimension55: category, // '[[Product Range]]', // Range of the product, eg: Barista Creations for Ice (Nessoft Category)\n dimension56: technology, // '[[Product Technology]]', //Product technology according to Nespresso categorization (original, vertuo, pro)\n dimension57: bundled ? 'bundle' : 'single', // '[[Product Type]]', //If the product is single or bundle\n dimension192: inStock ? 'in stock' : 'out of stock', // '[in stock]', // \"in stock\" or \"out of stock\"\n category: type, // '[[Product Category]]', //Product category according to Nespresso categorization (Nessoft type): capsule, accessory, machine\n brand: 'Nespresso' // Static value set to Nespresso\n }\n ]\n}\n\nexport const trackDetailView = async (sku, data) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/HQ+PB+Tracking+-+Product+Detail+View\n if (window.pbTrackDetailViewPDP || !sku || !window.napi) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo)\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'detailView',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n detail: {\n actionField: {},\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n // Track only once per page\n window.pbTrackDetailViewPDP = true\n emitCustomEvent('detailView', eventData)\n}\n\nexport const trackAddToCartImpression = (product, isStickyBar) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?spaceKey=DIANA&title=PDP+-+Sticky+Add+To+Cart+Custom+Event\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'page_builder_component_interaction',\n event_raised_by: raisedByPB,\n component_name: 'before_sku_main_info',\n action_type: isStickyBar\n ? 'sticky add to cart impression'\n : 'standard add to cart impression',\n //product info\n item_id_event: product.internationalId,\n item_name_event: product.internationalName,\n item_category_event: product.type,\n item_price_event: product.price_per_capsule?.split(' ')[0],\n item_market_id_event: product.legacyId,\n item_market_name_event: product.name,\n item_range_event: product.category_name,\n item_technology_event: product.technology?.[0]?.split('/').slice(-1) ?? '',\n item_type_event: product.bundled ? 'bundle' : 'single'\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const productImpression = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n // don't track already tracked products\n window.gtmDataObject = window.gtmDataObject || []\n const hasDetailView = window.gtmDataObject.find(item => item.event === 'detailView')\n const alreadyTracked = !!hasDetailView?.ecommerce?.detail?.products.find(p =>\n sku.includes(p.id)\n )\n if (alreadyTracked) {\n return\n }\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { list: list, position: position })\n const currency = productInfo.currency\n const eventData = {\n event: 'impression',\n eventAction: 'Product Impression',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n impressions: productPayload\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('impression', eventData)\n}\n\nexport const productClick = async (position, list, sku, data) => {\n // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n\n if (typeof list !== 'string') return\n\n const productInfo = await getProductInfo(sku, data)\n const productPayload = getProductPayload(productInfo, { position: position })\n const currency = productInfo.currency\n\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = {\n event: 'productClick',\n eventAction: 'Product Click',\n currencyCode: currency,\n eventRaisedBy: raisedByPB,\n ecommerce: {\n click: {\n actionField: {\n list: list\n },\n products: productPayload\n }\n }\n }\n window.gtmDataObject.push(eventData)\n emitCustomEvent('productClick', eventData)\n}\n\nexport function filterTrackingFromPlpFilters(filtersSelected) {\n const grouped = groupSelectedFilters(filtersSelected)\n const groupKeys = Object.keys(grouped)\n const typesFiltersSelected = groupKeys.join('|').substring(0, 99)\n const valuesFiltersSelected = groupKeys\n .map(key => grouped[key].values.map(value => value.split('/').at(-1)).join(','))\n .join('|')\n .substring(0, 99)\n\n return [typesFiltersSelected, valuesFiltersSelected]\n}\n\nexport const filterActionEvent = (\n actionType,\n filterType,\n filterValues,\n clickLocation,\n dataType\n) => {\n // https://dsu-confluence.nestle.biz/display/DIANA/PLP+-+Filter+Revamp\n window.gtmDataObject = window.gtmDataObject || []\n const eventData = getExplicitFilterEventData(\n actionType,\n filterType,\n filterValues,\n clickLocation\n )\n\n window.gtmDataObject.push(eventData)\n if (window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING && dataType) {\n window.gtmDataObject.push({\n ...window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING,\n experiment_action: `${actionType} - ${dataType}`,\n cta_name: 'All filters'\n })\n }\n\n emitCustomEvent('plp_filter', eventData)\n}\n\nconst getExplicitFilterEventData = (actionType, filterType, filterValues, clickLocation) => {\n return {\n event: 'plp_filter',\n event_raised_by: raisedByPB,\n action_type: actionType,\n filter_type: filterType,\n ...(filterValues ? { filter_values: filterValues } : {}),\n ...(clickLocation ? { click_location: clickLocation } : {})\n }\n}\n\nfunction groupSelectedFilters(filtersSelected = []) {\n return filtersSelected.reduce((grouped, { key, value }) => {\n if (!grouped[key]) grouped[key] = { key, values: [] }\n grouped[key].values.push(value.replaceAll(',', '-'))\n return grouped\n }, {})\n}\n\nfunction arrTolastURLElementMapper(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.split('/').pop()?.trim() || '')\n}\n\nfunction arrToJoinedString(arr, joiner = '|') {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n return arr.map(item => item.trim()).join(joiner)\n}\n\nfunction findTechnogiesText(arr) {\n if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n if (arr.length === 1) return cleanText(arrTolastURLElementMapper(arr)?.[0])\n else return 'multiple'\n}\n\nfunction cleanText(str) {\n if (typeof str === 'undefined') return undefined\n\n return str.toString().trim()\n}\n\nconst generateEcommerceObject = async (productIds, options) => {\n const productRequests = productIds.map(SKU => getProduct(SKU))\n const productData = await Promise.all(productRequests)\n\n return {\n ecommerce: {\n currency: window[window.config.padl.namespace].dataLayer.app.app.currency,\n value: productData.reduce((ac, product) => {\n return ac + product.price\n }, 0),\n items: productData.map((product, index) => {\n if (product.type === 'bundle' || product.type === 'giftcard') {\n return {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n index: index + 1\n }\n }\n\n let output = {\n item_id: cleanText(product.internationalId),\n item_name: cleanText(product.internationalName),\n item_brand: 'nespresso',\n item_category: cleanText(product.type),\n item_category2: arrToJoinedString(\n arrTolastURLElementMapper(product.technologies)\n ),\n item_category3: cleanText(product.category),\n price: product.price,\n quantity: product.salesMultiple,\n affiliation: 'nespresso online store',\n coupon: undefined,\n discount: undefined,\n location_id: undefined,\n item_list_name: cleanText(options?.listName),\n item_list_id: cleanText(options?.listId),\n index: index + 1,\n item_market_id: cleanText(product.legacyId),\n item_market_name: cleanText(product.name),\n item_technology: findTechnogiesText(product.technologies),\n item_range: cleanText(product.category),\n item_discovery_offer: product.category.includes('discovery').toString(),\n item_added_by_user: undefined,\n item_ecotax_applicable: product?.displayEcoTax\n ? cleanText(product?.displayEcoTax.toString())\n : undefined,\n item_selection_list: cleanText(arrToJoinedString(product.productSelections)),\n item_in_stock: product?.inStock\n ? cleanText(product?.inStock.toString())\n : undefined,\n item_subscription_name: undefined,\n item_subscription_category: undefined,\n item_subscription_price: undefined,\n item_subscription_duration: undefined,\n item_subscription_fee: undefined\n }\n\n switch (product.type) {\n case 'capsule': {\n const capsuleProduct = product\n\n output.item_category4 = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_type = capsuleProduct.bundled ? 'bundle' : 'single'\n\n output.item_coffee_aromatic_profile = cleanText(\n arrToJoinedString(capsuleProduct.capsuleProductAromatics)?.toLowerCase()\n )\n\n output.item_coffee_intensity =\n cleanText(capsuleProduct.capsuleProperties.intensity) ?? undefined\n\n output.item_coffee_cup_size = cleanText(\n arrToJoinedString(capsuleProduct.capsuleCupSizes)\n )?.toLowerCase()\n\n break\n }\n case 'machine': {\n const machineProduct = product\n\n output.item_machine_shade = cleanText(machineProduct.colorShade?.name)\n\n break\n }\n }\n\n if (product.type === 'machine' || product.type === 'accessory') {\n output.item_avg_rating = product.ratingCode\n output.item_number_of_reviews = product.ratingCode\n }\n\n return output\n })\n }\n }\n}\n\nexport const selectItems = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'select_item',\n event_raised_by: options?.eventRaisedBy ?? 'before_cross_sell_v3',\n click_location: options?.clickLocation ?? 'page builder cross sell quick view',\n item_list_id: options?.listId ?? 'before_cross_sell_v3',\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\n}\n\nexport const viewItemList = async (productIds, options) => {\n const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n const output = {\n event: 'view_item_list',\n event_raised_by: options?.eventRaisedBy,\n subscription_product_included: 'false',\n discovery_offer_included: 'false',\n ...ecommerceObject\n }\n\n if (options?.eventRaisedBy === undefined) delete output.event_raised_by\n\n window.gtmDataObject.push({ ecommerce: null })\n window.gtmDataObject.push(output)\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 { getMarketCode } from './dataLayer'\n\nconst LABEL_CATEGORY_NAME = 'cat/capsule-range-label'\nconst LABEL_CATEGORY_NAME_MACHINE = 'cat/machine-range-label'\nexport const RANGE_CATEGORY_NAME = 'cat/capsule-range'\nconst FAIR_TRADE_CATEGORY_NAME = 'cat/capsule-range-fair-trade'\nconst VERTUO_NEXT_CATEGORY_NAME = 'cat/capsule-attribute-only-vertuo-next'\nconst ORGANIC_EU_CATEGORY_NAME = 'capsule-attribute-organic-eu'\nconst RAINFOREST_CATEGORY_NAME = 'capsule-attribute-rainforest'\nconst SUSTAINABILITY_CATEGORY_NAME = 'capsule-attribute-sustainability'\nconst ARABICA_CATEGORY_NAME = 'capsule-attribute-arabica'\nconst PRODUCT_HIGHLIGHT_CATEGORY_NAME = 'cat/capsule-attribute-highlight'\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n\nconst COMMON_URL = 'https://www.nespresso.com/shared_res/agility/commons/img/icons/'\n\nexport const FAIR_TRADE_IMG = COMMON_URL + 'fairTrade.svg'\nexport const ORGANIC_LOGO_IMG_EU = COMMON_URL + 'logo-organic-eu.svg'\nexport const ORGANIC_LOGO_IMG_US = COMMON_URL + 'logo-organic-us.svg'\nexport const ORGANIC_LOGO_IMG_CA = COMMON_URL + 'logo-organic-ca.svg'\nexport const ORGANIC_LOGO_IMG_BR = COMMON_URL + 'logo-organic-br.svg'\nexport const ORGANIC_LOGO_IMG_JP = COMMON_URL + 'logo-organic-jp.svg'\nexport const ORGANIC_LOGO_IMG_BE = COMMON_URL + 'logo-organic-be.png'\n\nexport const VERTUONEXT_LOGO_IMG = COMMON_URL + 'logo-only-vertuo-next.svg'\nexport const RAINFOREST_LOGO_IMG = COMMON_URL + 'logo-rainforest.svg'\nexport const SUSTAINABILITY_LOGO_IMG = COMMON_URL + 'logo-sustainability.svg'\nexport const Q_CERTIFICATION_ARABICA_LOGO_IMG = COMMON_URL + 'q_grade_certification_arabica.svg'\nexport const DESIGN_AWARD_2021_IMG = COMMON_URL + 'design_award_2021.svg'\n\nexport const LOGO_IMG_MAP = {\n fair_trade: FAIR_TRADE_IMG,\n is_organic: getOrganicLogo(),\n only_vertuo_next: VERTUONEXT_LOGO_IMG,\n is_q_certified_arabica: Q_CERTIFICATION_ARABICA_LOGO_IMG,\n is_rainforest: RAINFOREST_LOGO_IMG,\n is_sustainable: SUSTAINABILITY_LOGO_IMG,\n is_design_award_2021: DESIGN_AWARD_2021_IMG\n}\n\nexport function getOrganicLogo() {\n let organicLogoImg = ORGANIC_LOGO_IMG_EU\n\n switch (getMarketCode()) {\n case 'us':\n organicLogoImg = ORGANIC_LOGO_IMG_US\n break\n case 'ca':\n organicLogoImg = ORGANIC_LOGO_IMG_CA\n break\n case 'br':\n organicLogoImg = ORGANIC_LOGO_IMG_BR\n break\n case 'jp':\n organicLogoImg = ORGANIC_LOGO_IMG_JP\n break\n case 'be':\n organicLogoImg = ORGANIC_LOGO_IMG_BE\n break\n }\n\n return organicLogoImg\n}\n\n/**\n * retrieves the list of categories of type Vertuo Next\n * @param {category[]} categories\n */\nexport function getVertuoNext(categories) {\n return categories.find(category => isVertuoNext(category))\n}\n\n/**\n * returns true when the category is product vertuo next\n * @param {category} category\n */\nfunction isVertuoNext(category) {\n return getCategoryRegEx(VERTUO_NEXT_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type organic EU\n * @param {category[]} categories\n */\nexport function getOrganicEu(categories) {\n return categories.find(category => isOrganicEu(category))\n}\n\n/**\n * returns true when the category is product organic EU\n * @param {category} category\n */\nfunction isOrganicEu(category) {\n return getCategoryRegEx(ORGANIC_EU_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type rainforest\n * @param {category[]} categories\n */\nexport function getRainforest(categories) {\n return categories.find(category => isRainforest(category))\n}\n\n/**\n * returns true when the category is rainforest\n * @param {category} category\n */\nfunction isRainforest(category) {\n return getCategoryRegEx(RAINFOREST_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type sustainability\n * @param {category[]} categories\n */\nexport function getSustainability(categories) {\n return categories.find(category => isSustainability(category))\n}\n\n/**\n * retrieves the list of categories of type arabica\n * @param {category[]} categories\n */\nexport function getArabica(categories) {\n return categories.find(category => isArabica(category))\n}\n\n/**\n * returns true when the category is arabica\n * @param {category} category\n */\nfunction isArabica(category) {\n return getCategoryRegEx(ARABICA_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is sustainability\n * @param {category} category\n */\nfunction isSustainability(category) {\n return getCategoryRegEx(SUSTAINABILITY_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getLabels(categories) {\n return categories.filter(category => isLabel(category))\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getProductHighlight(categories) {\n return categories.find(category => isProductHighlight(category))\n}\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getFairTrade(categories) {\n return categories.find(category => isFairTrade(category))\n}\n\n/**\n * returns a regex to match the tail (global) of a given local category ID\n * @param {string} categoryIdTail : should contain the end of the category ID\n */\nexport function getCategoryRegEx(categoryIdTail) {\n return new RegExp(categoryIdTail.replace(/\\//g, '\\\\/'))\n}\n\n/**\n * returns true when the category is child of the label category (is type label)\n * @param {category} category\n */\nfunction isLabel(category) {\n return (\n getCategoryRegEx(LABEL_CATEGORY_NAME).test(category.id) ||\n getCategoryRegEx(LABEL_CATEGORY_NAME_MACHINE).test(category.id)\n )\n}\n\n/**\n * returns true when the category is product highlight\n * @param {category} category\n */\nfunction isProductHighlight(category) {\n return getCategoryRegEx(PRODUCT_HIGHLIGHT_CATEGORY_NAME).test(category.id)\n}\n/**\n * returns true when the category is fair trade\n * @param {category} category\n */\nfunction isFairTrade(category) {\n return getCategoryRegEx(FAIR_TRADE_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isRange(category) {\n return category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n}\n\nexport function getTechnologyName(productData, categories) {\n if (!productData || !productData.technologies || !productData.technologies.length) {\n return null\n }\n\n const techno = productData.technologies[0]\n const categoryNameAsSubstring = techno.substring(\n techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n )\n const category = categories?.find(cat => cat.id === techno)\n\n // Backward compatibility, return name as substring if the list of categories are not available\n return category?.name || categoryNameAsSubstring\n}\n\nexport function isCategoryHidden(categoryId) {\n let hideCategory = false\n // To enable AB testing: exclude categories which are to be hidden\n if (\n window.PLP_HIDE_CATEGORIES?.length &&\n window.PLP_HIDE_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0\n ) {\n hideCategory = true\n }\n\n // To enable AB testing: exclude categories except those which are to be shown\n if (window.PLP_ONLY_SHOW_CATEGORIES?.length) {\n // Default to hide\n hideCategory = true\n if (window.PLP_ONLY_SHOW_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0) {\n hideCategory = false\n }\n }\n return hideCategory\n}\n","import {\n getVertuoNext,\n getOrganicEu,\n getRainforest,\n getLabels,\n getProductHighlight,\n getFairTrade,\n getSustainability,\n isRange,\n getCategoryRegEx,\n RANGE_CATEGORY_NAME,\n getArabica\n} from '@kissui/helpers/src/cremaDataHelper'\n\n/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nexport async function getMergedPLPData(plpData) {\n const { data } = plpData\n if (!data) {\n return []\n }\n\n const eCommerceData = data.configuration.eCommerceData\n\n addLabels(eCommerceData)\n\n addProductAttribute(\n eCommerceData,\n getFairTrade,\n (prod, category) => (prod.fairTrade = category.name)\n )\n addProductAttribute(eCommerceData, getProductHighlight, prod => (prod.highlighted = true))\n addProductAttribute(eCommerceData, getVertuoNext, prod => (prod.onlyVertuoNext = true))\n addProductAttribute(eCommerceData, getOrganicEu, prod => (prod.organicEu = true))\n addProductAttribute(eCommerceData, getRainforest, prod => (prod.rainforest = true))\n addProductAttribute(eCommerceData, getSustainability, prod => (prod.sustainability = true))\n addProductAttribute(eCommerceData, getArabica, prod => (prod.arabica = true))\n\n addSubSegments(eCommerceData)\n\n return eCommerceData.categories\n}\n\nfunction addSubSegments(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n // should be forEach if nothing returned/assigned\n categories.forEach(category => {\n const hasSegment = category.subCategories.length > 0 && isRange(category)\n if (hasSegment) {\n category.segments = category.subCategories.map(categoryId => {\n const segment = categories.find(subCategory => subCategory.id === categoryId)\n if (segment && isSubsegment(categories, segment)) {\n segment.products = getProductsData(productGroups, segment.id, products)\n segment.isSegment = true\n }\n return segment\n })\n }\n\n category.products = getProductsData(productGroups, category.id, products)\n })\n}\n\nexport function getProductsData(productGroups, categoryId, products) {\n let result = []\n try {\n const currentCategory = productGroups.find(category => category.categoryId === categoryId)\n\n if (!currentCategory) {\n return result\n }\n\n const { productIds } = currentCategory\n return productIds.map(productId => {\n const product = products.find(product => product.id === productId)\n return product\n })\n } catch (e) {\n //generally an anti pattern to only log the error, with no try catch the result would be the same\n console.log(e)\n }\n\n return result\n}\n\n/**\n * adds labels property to products containing each label's category data (JSON parsed description property) assigned to it\n * labels are categories that have the label base category as parent\n * to apply a label on a given product, the label has to contain the product\n * this function has to clean the productGroups as well by removing the label ones\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addLabels(eCommerceData) {\n const { categories, productGroups, products } = eCommerceData\n const labels = getLabels(categories)\n const labelGroups = getLabelGroups(productGroups, labels)\n labelGroups.forEach(group => {\n const label = labels.find(label => label.id === group.categoryId)\n group.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n prod.labels = prod.labels || []\n prod.labels.push(label.description)\n })\n })\n //removing label categories from productGroups\n labelGroups.forEach(labelGroup => {\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === labelGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n })\n}\n\n/**\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a the category on a given product, the category's productGroup has to contain the product\n * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addProductAttribute(eCommerceData, categoryFetcher, assignHandler) {\n const { categories, productGroups, products } = eCommerceData\n const category = categoryFetcher(categories)\n if (!category) {\n return\n }\n const categoryGroup = getCategoryGroup(productGroups, category)\n if (!categoryGroup) {\n return\n }\n categoryGroup.productIds.forEach(productId => {\n const prod = products.find(product => product.id === productId)\n if (categoryFetcher === getArabica) {\n console.log('addProductAttribute', prod)\n }\n assignHandler(prod, category)\n })\n const indexToRemove = productGroups.findIndex(\n productGroup => productGroup.categoryId === categoryGroup.categoryId\n )\n productGroups.splice(indexToRemove, 1)\n}\n\n/**\n * retrieve all the productGroup that are labels\n * @param {productGroup[]} productGroups\n * @param {category[]} labels\n */\nfunction getLabelGroups(productGroups, labels) {\n return productGroups.filter(group => labels.some(label => label.id === group.categoryId))\n}\n\n/**\n * retrieve the productGroup which correspond to a category\n * @param {productGroup[]} productGroups\n * @param {category} fairTrade\n */\nfunction getCategoryGroup(productGroups, category) {\n return productGroups.find(group => category.id === group.categoryId)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isSubsegment(categories, category) {\n /*category.superCategories.some(superCategoryId => {\n const superCategoryData = categories.find(categoryToFind => categoryToFind.id === superCategoryId)\n })*/\n const result = category.superCategories.some(superCategory =>\n getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n )\n return result\n}\nexport function getFinalPrice(show_sleeve_price, product, isBundled) {\n let showCapsulePrice = show_sleeve_price\n let final_price\n let price_per_capsule\n\n const bundled = isBundled(product)\n\n if (product.type === 'capsule' && !bundled) {\n final_price = product.price * product.salesMultiple\n // this isn't necessary in prod but the mock price formatter needs it\n final_price = Math.round(final_price * 100) / 100\n price_per_capsule = product.price\n } else {\n showCapsulePrice = false\n final_price = product.price\n }\n\n return { showCapsulePrice, final_price, price_per_capsule }\n}\n","import { INTENSITY_MAX_OL, INTENSITY_MAX_VL } from '@kissui/components'\n\nexport const getMaxIntensity = ({ technologies }) =>\n technologies.indexOf('original') !== -1 ? INTENSITY_MAX_OL : INTENSITY_MAX_VL\n","const VOLTAGE_110 = '110'\nconst VOLTAGE_220 = '220'\n\nexport const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n const { strikethrough_price, variant } = pageBuilderProductProps\n const { show_voltage, voltage_label, a11y_voltage_label, voltage_list } = variant\n const { colorVariants, ratingsAndReviews } = product\n\n // lists header props not coming from this.props\n let options = {\n ratings: ratingsAndReviews\n }\n\n if (show_voltage) {\n const currentVoltage = getCurrentVoltage(product)\n const voltageData = getVoltageSwitcher(colorVariants, voltage_list, product)\n\n const colors = colorVariants\n .filter(productColor => productColor.name.indexOf(currentVoltage) > -1)\n .map(productColor => getColorModel(productColor))\n\n options = {\n ...options,\n colors,\n show_voltage,\n voltage_label,\n a11y_voltage_label,\n voltage_list: voltageData\n }\n }\n\n if (options.colors) {\n options.activeSku = product.internationalId\n options.colors = !options.colors\n ? colorVariants.map(productColor => getColorModel(productColor))\n : options.colors\n options.max_colors = 99\n }\n\n options.strikethrough_price = strikethrough_price || ''\n options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n return options\n}\n\nconst getCurrentVoltage = product =>\n product.name.indexOf(VOLTAGE_110) > -1 ? VOLTAGE_110 : VOLTAGE_220\n\nconst getColorModel = product => {\n return {\n category:\n product.colorCategories && product.colorCategories[0]\n ? product.colorCategories[0]\n : null,\n name: product.colorShade ? product.colorShade.name : null,\n code: product.colorShade ? product.colorShade.cssColorCode : null,\n sku: product.internationalId,\n link: product.url\n }\n}\n\n/**\n * Return an array with the url of the opposite voltage for the machine\n * https://dsu-confluence.nestle.biz/x/fKgaCQ\n * @param colorVariants - HMC Crema UI PDP Data\n * @param voltage_list - Page Builder\n * @param product - HMC Crema UI PDP Data Current product display\n * @returns {Array} voltages\n * @returns {String} voltages[].label - Label of voltage\n * @returns {String} voltages[].link - Empty if current voltage, or fill with the machine url of the opposite voltage\n */\nconst getVoltageSwitcher = (colorVariants, voltage_list, product) => {\n // From current voltage, get the same color for the opposite voltage\n const currentVoltage = getCurrentVoltage(product)\n const oppositeVoltages = voltage_list.filter(voltage => voltage.label !== currentVoltage)\n\n if (!oppositeVoltages || !oppositeVoltages.length) {\n return voltage_list\n }\n\n const oppositeVoltage = oppositeVoltages.pop().label\n\n // Find in machines same name with new voltage\n const oppositeVoltageMachineName = product.name.replace(currentVoltage, oppositeVoltage)\n const oppositeVariation = colorVariants.find(\n machine =>\n machine.name === oppositeVoltageMachineName &&\n product.colorShade.cssColorCode === machine.colorShade.cssColorCode\n )\n\n if (!oppositeVariation) {\n return voltage_list\n }\n\n const { url = '' } = oppositeVariation\n\n // Build final array, current voltage without link and opposite voltage with link\n return voltage_list.map(voltage => {\n if (voltage.label !== currentVoltage) {\n voltage.url = url\n voltage.selected = false\n } else {\n voltage.selected = true\n }\n\n return voltage\n })\n}\n","export const VARIATION_PLP = 'plp'\nexport const VARIATION_PDP = 'pdp'\nexport const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_SMALL = 'small'\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { options } = pageBuilderProps\n const {\n variant,\n labels,\n strikethrough_price,\n additional_message,\n additional_message_icon,\n additional_message_link\n } = pageBuilderProductProps\n\n // lists header props not coming from this.props\n let data = {\n sku: product.internationalId,\n technologies: product.technologies,\n longSku: product.id,\n name: product.name,\n headline: sanitizeString(product.headline),\n sales_multiple: product.salesMultiple,\n unit_quantity: product.unitQuantity,\n type: product.type,\n category_name: product.rangeData?.name || '',\n label_range: product.rangeData?.name || '',\n price: product.price ? priceFormatter.short(currency, product.price) : null,\n strikethrough_price: strikethrough_price || '',\n variation: VARIATION_PLP,\n image_alt_text: product.name,\n image: product.images?.icon,\n url: product.pdpURLs?.desktop || '',\n additional_message: additional_message || '',\n additional_message_icon: additional_message_icon || '',\n additional_message_link: additional_message_link || {},\n ...apiOverride(product, pageBuilderProductProps)\n }\n\n if (labels && labels.length) {\n data.labels = labels\n }\n\n if (product.highlighted) {\n data.highlighted = product.highlighted\n }\n\n let dataTransformObjectProductType = {}\n if (product.type === ECAPI_TYPE_CAPSULE) {\n dataTransformObjectProductType = getMergedProductCoffeeData(\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n )\n } else if (product.type === ECAPI_TYPE_MACHINE) {\n dataTransformObjectProductType = getMergedProductMachineData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n dataTransformObjectProductType = getMergedProductAccessoryData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n dataTransformObjectProductType = getMergedProductGiftCardData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n }\n\n return {\n ...product,\n ...options,\n ...variant,\n ...data,\n ...dataTransformObjectProductType\n }\n}\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { bundle_details } = pageBuilderProductProps\n const { options } = pageBuilderProps\n const { show_sleeve_price } = options\n\n const isBundledResult = isBundled(product)\n\n const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n show_sleeve_price,\n product,\n isBundled\n )\n\n const option = {\n bundled: isBundledResult,\n intensity: product.capsuleProperties?.intensity || product.intensity || null,\n max_intensity: getMaxIntensity(product),\n price_per_capsule: price_per_capsule\n ? priceFormatter.short(currency, price_per_capsule)\n : null,\n show_capsule_price: showCapsulePrice\n }\n\n if (show_sleeve_price) {\n option.price = priceFormatter.short(currency, final_price)\n }\n\n if (bundle_details) {\n option.bundle_details = bundle_details\n }\n\n return option\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n const { variant } = pageBuilderProductProps\n\n return {\n image: variant && variant.default_image\n }\n}\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","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { makeId, setAttributes, convertToCamelCase } from '@kissui/helpers/src/utils'\nimport { isSafari } from '@kissui/helpers/src/useragent.helpers'\nimport { CONTRAST_LIGHT } from '@kissui/components'\nimport { getOppositeContrast } from '@kissui/helpers/src/contrast.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { BROWSER_CONTEXT, EVENT_SLIDER_READY } from '../constants.mjs'\n\nconst MAX_LOOP_TO_INIT = 50 // max 5 seconds\n\nclass SliderNatural extends HTMLElement {\n constructor() {\n super()\n // Default options\n this.contrast = CONTRAST_LIGHT\n this.defaultPosition = 0\n this.displayButtons = true\n this.displayNav = true\n this.displayCounter = false\n this.displayGradients = false\n this.itemsPerSlide = 1\n this.overflow = true\n this.overflowOpacity = 0.25\n this.flexAuto = false\n // Events\n this.boundPrevClick = this.#onPrevClick.bind(this)\n this.boundNextClick = this.#onNextClick.bind(this)\n this.boundNavClick = this.#onNavClick.bind(this)\n this.boundScroll = this.#onScroll.bind(this)\n }\n\n connectedCallback() {\n this.slot = this.innerHTML\n this.props = createProps(this.attributes)\n this.#render()\n\n // We need an id for event dispatcher\n if (!this.id || this.id === 'undefined') {\n this.id = this.props.testId ? this.props.testId : `slider_natural_${makeId(5)}`\n }\n\n this.#setProperties()\n\n this.loops = 0\n this.#waitForSliderToBeSized()\n .then(() => {\n this.initSlider()\n this.#dispatchReady()\n })\n .catch(e => {\n console.error(e)\n })\n .finally(() => {\n if (this.wait) {\n clearInterval(this.wait)\n this.wait = null\n }\n })\n }\n\n #waitForSliderToBeSized() {\n return new Promise((resolve, reject) => {\n this.wait = setInterval(() => {\n if (this.carousel.offsetWidth > 0) {\n return resolve()\n }\n\n this.loops += 1\n if (this.loops === MAX_LOOP_TO_INIT) {\n return reject(\n 'Error: slider width is ZERO even after 5s, cannot finish slider init'\n )\n }\n }, 100)\n })\n }\n\n #set(key, value) {\n const normalisedValue = this.#getOption(value)\n if (normalisedValue !== undefined) {\n this[convertToCamelCase(key)] = normalisedValue\n }\n }\n\n #getOption(value) {\n if (!isNaN(value)) {\n return parseFloat(value)\n } else if (value === 'true') {\n return true\n } else if (value === 'false') {\n return false\n } else {\n return value\n }\n }\n\n #setProperties() {\n const { options, a11y_labels } = this.props\n\n // Create refs to html elements\n this.container = this.querySelector('.container')\n this.wrapper = this.querySelector('.wrapper')\n this.carousel = this.querySelector('ul')\n\n // Set slider properties\n this.currentIndex = 0\n this.a11y_labels = a11y_labels\n if (viewportHelper.is.mobile) {\n this.options = options.mobile\n } else if (viewportHelper.is.tablet) {\n this.options = options.tablet\n } else {\n this.options = options.desktop\n }\n\n // Set options\n for (const property in this.options) {\n this.#set(property, this.options[property])\n }\n\n // If counter is displayed we force buttons and pagination to false\n if (this.displayCounter) {\n this.displayNav = this.displayButtons = false\n }\n\n // Overflow needs a class\n if (this.overflow) {\n this.container.classList.add('overflow')\n }\n\n // Contrast needs an attribute\n this.buttonsContrast = getOppositeContrast(this.contrast)\n this.setAttribute('contrast', this.contrast)\n\n // Set CSS properties for non dynamic options\n this.#setCssSlideMinHeight()\n this.#setCssSliderGap()\n this.#setCssPlaceholder()\n }\n\n /** Public Method **/\n initSlider() {\n // Get an updated number of items (if async we run again)\n this.slidesElements = this.querySelectorAll('.nn-carousel > li:not(.safari-fix)')\n this.itemNumber = this.slidesElements.length\n\n // For asynchronous initSlider() we need to reset first itemWidth and itemPerSlide to get the original values before other calculations\n this.#set('item_width', this.options['item_width'])\n this.#set('items_per_slide', this.options['items_per_slide'])\n\n // If itemsPerSlide is 'auto' we need to calculate it's real value based on itemWidth or scrollWidth / itemNumber\n // We also need to set the CSS --item-width variable to handle the calculation correctly\n if (this.itemsPerSlide === 'auto') {\n this.#calculateItemsPerSlide()\n }\n this.#setCssSlideWidth()\n this.#setCssItemsPerSlide()\n this.#setCssFlexAuto()\n\n // Other properties that can be set only after the rest\n this.maxSlides = this.itemNumber - this.itemsPerSlide\n\n // Finish rendering\n this.#renderButtons()\n this.#renderNav()\n this.#renderCounter()\n this.#renderGradients()\n\n // Init methods in this order !\n this.#applyCenteredLayout()\n this.#getSliderPositions()\n this.#getOpacityParams()\n this.#setOpacity()\n this.#updateStates()\n this.#bindEvent()\n this.#gotoDefaultPosition()\n\n // Render this safariFix at the end because we don't want the extra li to be considered in sliderElements\n this.#renderSafariFix()\n }\n\n #render() {\n this.innerHTML = `<div class=\"container\"><div class=\"wrapper\"><ul class=\"nn-carousel\">${this.slot}</ul></div></div>`\n }\n\n #renderButtons() {\n // Important: if maxSlides <= 0 it means we don't have scroll, so we don't need buttons\n const hasNoButton = !this.displayButtons || this.maxSlides <= 0\n if (hasNoButton) {\n // Needed if we reinit\n if (this.prevButton && this.nextButton) {\n this.prevButton.remove()\n this.nextButton.remove()\n }\n return\n }\n\n // Check if button exists already (for async content in order to avoid creating two occurrences)\n if (!this.prevButton) {\n this.prevButton = this.#renderButton('prev')\n }\n if (!this.nextButton) {\n this.nextButton = this.#renderButton('next')\n }\n }\n\n #renderButton(pos, renderInCounter = false) {\n const { creative = '', id = '', name = '', position = '' } = this.props.campaign ?? {}\n const buttonContrast = renderInCounter ? this.contrast : this.buttonsContrast\n const isPrev = pos === 'prev'\n\n const buttonEl = document.createElement('nb-cta')\n buttonEl.classList.add(pos)\n setAttributes(buttonEl, {\n variation: 'navigation',\n contrast: buttonContrast,\n size: '48',\n icon_right: isPrev ? '24/symbol/chevron-left' : '24/symbol/chevron-right',\n label: this.a11y_labels[pos],\n campaign_creative: creative,\n campaign_id: id,\n campaign_name: name,\n campaign_position: position\n })\n if (!renderInCounter) {\n isPrev ? this.container.prepend(buttonEl) : this.container.append(buttonEl)\n } else {\n isPrev ? this.counter.prepend(buttonEl) : this.counter.append(buttonEl)\n }\n return buttonEl\n }\n\n #renderNav() {\n if (!this.displayNav || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.nav) {\n this.nav.remove()\n }\n return\n }\n\n // Check if nav exists already (for async content in order to avoid creating two occurrences)\n if (this.nav) {\n this.nav.remove()\n }\n\n const nav = document.createElement('nav')\n\n let bullets = ''\n for (let i = 0; i <= this.maxSlides; i++) {\n bullets += this.#renderBullet(i)\n }\n\n nav.innerHTML = `${bullets}`\n\n this.appendChild(nav)\n this.nav = this.querySelector('nav')\n this.navElements = this.querySelectorAll('nav button')\n }\n\n #renderBullet(index) {\n return `<button data-item='${index}' aria-label='${this.a11y_labels.nav} ${index}'><span></span></button>`\n }\n\n #renderCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n // Needed if we reinit\n if (this.counter) {\n this.counter.remove()\n }\n return\n }\n\n // Check if counter exists already (for async content in order to avoid creating two occurrences)\n if (this.counter) {\n this.counter.remove()\n }\n\n this.counter = document.createElement('div')\n this.counter.classList.add('counter')\n this.counter.classList.add('t-sm-500')\n this.counter.setAttribute('aria-hidden', 'true')\n\n this.counter.innerHTML = `<span class='current'>${this.currentIndex + 1}</span>\n <span>/</span>\n <span>${this.maxSlides + 1}</span>`\n\n this.prevButton = this.#renderButton('prev', true)\n this.nextButton = this.#renderButton('next', true)\n\n this.appendChild(this.counter)\n }\n\n #renderGradients() {\n if (!this.displayGradients || this.overflow) {\n return\n }\n\n if (this.gradientsWidth) {\n this.#setCss('--gradients-width', this.gradientsWidth, true)\n }\n\n if (this.gradientsColor) {\n this.#setCss('--gradients-color', this.gradientsColor)\n this.#setCss('--gradients-color-transparent', this.gradientsColor + '00')\n }\n\n this.container.classList.add('hasGradients')\n }\n\n #renderSafariFix() {\n // In safari, both Desktop and iOS, the scroll doesn't reach the end, because the scroll-padding on the right side seems to not been taken into account\n // Same bug is happening in Chrome on iOS (seems to use Safari webkit rendering)\n // The fix is to render an extra <li> with the size equal to the scroll-padding\n if (!this.overflow || !isSafari()) {\n return\n }\n\n // Check if safariFix exists already (for async content in order to avoid creating two occurences)\n if (!this.safariFix) {\n this.safariFix = document.createElement('li')\n this.safariFix.classList.add('safari-fix')\n this.safariFix.setAttribute('aria-hidden', true)\n this.carousel.appendChild(this.safariFix)\n }\n\n const safariFixWidth = (this.paddingCorrection - this.sliderGap) / BROWSER_CONTEXT\n this.safariFix.style.setProperty('width', safariFixWidth + 'rem')\n }\n\n #calculateItemsPerSlide() {\n // For asynchronous slider content, if initSlider() is called twice, we need to remove first this class\n this.carousel.classList.remove('no-slides')\n\n let itemWidth = this.itemWidth\n\n // If itemWidth is not provided or 'auto', we need to calculate an average width for items that doesn't have fixed width\n if (this.itemWidth === undefined || this.itemWidth === 'auto') {\n itemWidth =\n (this.carousel.scrollWidth - this.sliderGap * (this.itemNumber - 1)) /\n this.itemNumber\n }\n\n this.itemsPerSlide = Math.floor(this.carousel.offsetWidth / itemWidth)\n // TODO: the fix below doesn't work, needs to be resolved.\n // const isLastElementSingle =\n // this.slidesElements[this.slidesElements.length - 2].offsetWidth +\n // this.slidesElements[this.slidesElements.length - 1].offsetWidth >\n // this.carousel.offsetWidth\n\n // this.itemsPerSlide = isLastElementSingle\n // ? 0\n // : Math.floor(this.carousel.offsetWidth / itemWidth)\n }\n\n #getSliderPositions() {\n this.sliderPositions = []\n this.maxScroll = this.carousel.scrollWidth - this.carousel.offsetWidth\n\n if (this.slidesElements.length === 0) {\n return\n }\n\n // We need to manage the first item initial position in case the slides are\n // visible on each side (equivalent to scroll-padding CSS of ul.nn-carousel)\n const firstItemOffsetLeft = this.slidesElements[0].offsetLeft\n\n this.querySelectorAll('.nn-carousel > li:not(.safari-fix)').forEach(element => {\n this.sliderPositions.push(element.offsetLeft - firstItemOffsetLeft)\n })\n }\n\n #setCss(name, value, isRem = false) {\n this.style.setProperty(name, isRem ? value / BROWSER_CONTEXT + 'rem' : value)\n }\n\n #setCssSlideWidth() {\n if (this.itemWidth === 'auto') {\n const itemWidthAuto =\n (this.container.clientWidth - (this.itemsPerSlide - 1) * this.sliderGap) /\n (this.itemsPerSlide || 1)\n this.#setCss('--item-width', itemWidthAuto, true)\n } else if (this.itemWidth) {\n this.#setCss('--item-width', this.itemWidth, true)\n }\n }\n\n #setCssSlideMinHeight() {\n if (this.slideMinHeight === 'auto') {\n this.#setCss('--slide-min-height', 'auto')\n } else if (this.slideMinHeight !== undefined) {\n this.#setCss('--slide-min-height', this.slideMinHeight, true)\n }\n }\n\n #setCssSliderGap() {\n if (this.sliderGap || this.sliderGap === 0) {\n this.#setCss('--slider-gap', this.sliderGap, true)\n }\n }\n\n #setCssFlexAuto() {\n if (this.flexAuto) {\n this.carousel.classList.add('flex-auto')\n }\n }\n\n #setCssPlaceholder() {\n if (this.placeholderBackground) {\n this.#setCss('--placeholder-background', this.placeholderBackground)\n }\n }\n\n #setCssItemsPerSlide() {\n this.#setCss('--items-per-slide', this.itemsPerSlide)\n }\n\n #applyCenteredLayout() {\n if (this.maxSlides > 0) {\n return\n }\n // If maxSlides is 0 or negative, it means that we have less items than needed to fulfill the carousel width\n // So to center the items (for example the bubbles when only 3) we need to apply a justify-content: center fix\n this.carousel.classList.add('no-slides')\n }\n\n /** Public Method **/\n updateSlider(index, instantly = false) {\n this.#getSliderPositions()\n this.goToSlide(parseInt(index), instantly)\n }\n\n #updateStates() {\n this.#setActiveButtons()\n this.#setActiveBullet()\n this.#setCounter()\n this.#setActiveSlides()\n }\n\n #updateStatesScroll(index) {\n this.#setActiveButtons(index)\n this.#setCounter()\n }\n\n #setActiveButtons(currentIndex) {\n if ((!this.displayButtons || this.maxSlides <= 0) && !this.displayCounter) {\n return\n }\n\n // First we remove all hide classes (because with pagination we can move from more than 2 slides)\n this.prevButton.classList.remove('hide')\n this.nextButton.classList.remove('hide')\n\n // Then we reset hide class on the right button\n if (this.currentIndex === 0) {\n this.prevButton.classList.add('hide')\n } else if (this.currentIndex === this.maxSlides || currentIndex === this.maxSlides) {\n this.nextButton.classList.add('hide')\n }\n }\n\n #setActiveBullet() {\n if (!this.displayNav || this.maxSlides <= 0) {\n return\n }\n\n this.navElements.forEach(item => {\n item.classList.remove('active')\n })\n\n this.navElements[this.currentIndex].classList.add('active')\n }\n\n #setCounter() {\n if (!this.displayCounter || this.maxSlides === 0) {\n return\n }\n\n if (!this.displayCounter) {\n return\n }\n\n this.counter.querySelector('.current').textContent = parseInt(this.currentIndex + 1)\n }\n\n #setActiveSlides() {\n // If we have no items overflowing on each side, we don't need to manage disabled slides\n if (!this.overflow) {\n return\n }\n\n this.slidesElements.forEach(element => {\n element.setAttribute('aria-disabled', 'true')\n })\n\n let tempIndex = parseInt(this.currentIndex)\n for (let i = 0; i < this.itemsPerSlide; i++) {\n if (this.slidesElements[tempIndex + i]) {\n this.slidesElements[tempIndex + i].removeAttribute('aria-disabled')\n }\n }\n }\n\n /** Public Method **/\n goToSlide(index, instantly = false) {\n if (index !== undefined) {\n this.currentIndex = index\n }\n\n // If index is over maxSlides, it means we reached out the end of scroll, so we don't need to update states anymore\n if (index < this.maxSlides) {\n this.#updateStates()\n }\n\n // We scroll to the right position (scrollTo duration is approx 750ms)\n this.carousel.scrollTo({\n left: this.sliderPositions[parseInt(this.currentIndex, 10)],\n behavior: instantly ? 'auto' : 'smooth'\n })\n }\n\n #gotoDefaultPosition() {\n if (this.defaultPosition === 0 || this.defaultPosition > this.maxSlides + 1) {\n return\n }\n this.goToSlide(this.defaultPosition, true)\n }\n\n #onScroll() {\n // Clear our timeout throughout the scroll\n if (this.isScrolling) {\n clearTimeout(this.isScrolling)\n }\n\n this.#setOpacity()\n\n // Set a timeout to run after scrolling ends\n this.isScrolling = setTimeout(() => {\n // Update the expected scroll positions again as sometimes they are initially incorrect\n this.#getSliderPositions()\n\n const carouselScrollLeft = Math.round(this.carousel.scrollLeft)\n\n // Ideal use case (exact pixel value)\n let index = this.sliderPositions.indexOf(carouselScrollLeft)\n\n // Sometimes the scrollLeft value can be +1 or -1 pixels. If the position is not found\n // then the index will be -1. In this case, try searching the list of positions to see\n // if the scroll position is one pixel left or right of the expected position (hence\n // using -1 and +1 in the indexOf() call below)\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft - 1)\n }\n if (index === -1) {\n index = this.sliderPositions.indexOf(carouselScrollLeft + 1)\n }\n\n // For items with flexible width (flex_auto) the last position of the scroll can not match an exact SliderPositions\n if (carouselScrollLeft === this.maxScroll) {\n index = this.maxSlides\n }\n\n if (index >= 0) {\n this.#switchBullets(index, true)\n }\n\n this.#updateStatesScroll(index)\n }, 100)\n }\n\n #getOpacityParams() {\n if (!this.overflow || !this.slidesElements.length) {\n return\n }\n // Set properties used for slide opacity calculation in #setOpacity()\n this.paddingCorrection = parseInt(\n getComputedStyle(this.carousel).getPropertyValue('padding-left')\n )\n\n this.itemWidthAdjusted = this.slidesElements[0].offsetWidth + this.sliderGap\n }\n\n #setOpacity() {\n if (!this.overflow) {\n return\n }\n const scrollX = this.carousel.scrollLeft\n\n this.slidesElements.forEach((item, index) => {\n // Adjust item offsetLeft because of slider padding on each side\n const itemOffsetLeft = item.offsetLeft - this.paddingCorrection\n // Adjust item offsetLeft to add itemWidth + sliderGap\n let itemX = itemOffsetLeft + this.itemWidthAdjusted\n\n // Determine if we need to calculate left or right items\n let percentage = 100\n\n if (scrollX > itemX) {\n // Avoid calculation if item is outside on left\n percentage = 0\n } else if (scrollX >= this.itemWidthAdjusted * index) {\n // Do left calculations\n percentage = Math.round(((itemX - scrollX) / this.itemWidthAdjusted) * 100)\n } else if (scrollX < itemX - (1 + this.itemsPerSlide) * this.itemWidthAdjusted) {\n // Avoid calculation if item is outside on right\n percentage = 0\n } else if (scrollX <= itemX - this.itemsPerSlide * this.itemWidthAdjusted) {\n // Do right calculations\n percentage = Math.round(\n (this.itemsPerSlide + 1) * 100 -\n ((itemX - scrollX) / this.itemWidthAdjusted) * 100\n )\n }\n\n const opacityPercentage = percentage / 100\n let finalOpacity =\n Math.round(\n (opacityPercentage * (1 - this.overflowOpacity) + this.overflowOpacity) * 100\n ) / 100\n\n item.firstElementChild.style.setProperty('opacity', finalOpacity)\n })\n }\n\n #switchBullets(index, alreadyScrolled = false) {\n if (!this.slidesElements[index]) {\n return\n }\n\n this.currentIndex = index\n\n // only fires goToSlide if user clicks on pagination buttons\n if (!alreadyScrolled) {\n this.goToSlide()\n } else {\n this.#updateStates()\n }\n }\n\n #onPrevClick() {\n if (this.currentIndex > 0) {\n this.currentIndex = this.currentIndex - 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNextClick() {\n if (this.currentIndex < this.maxSlides) {\n this.currentIndex = this.currentIndex + 1\n this.#updateStates()\n }\n this.goToSlide()\n }\n\n #onNavClick(e) {\n this.currentIndex = parseInt(e.target.dataset.item)\n this.#setActiveBullet()\n this.#switchBullets(this.currentIndex)\n }\n\n #dispatchReady() {\n dispatchEvent({\n eventName: EVENT_SLIDER_READY,\n args: { id: this.id },\n element: this\n })\n }\n\n #bindEvent() {\n this.#unbindEvent()\n\n this.carousel.addEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.addEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.addEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.addEventListener('click', this.boundNavClick)\n })\n }\n }\n\n #unbindEvent() {\n this.carousel.removeEventListener('scroll', this.boundScroll)\n if (this.prevButton) {\n this.prevButton.removeEventListener('click', this.boundPrevClick)\n }\n if (this.nextButton) {\n this.nextButton.removeEventListener('click', this.boundNextClick)\n }\n if (this.navElements) {\n this.navElements.forEach(element => {\n element.removeEventListener('click', this.boundNavClick)\n })\n }\n }\n\n disconnectedCallback() {\n this.#unbindEvent()\n }\n}\n\ncustomElements.get('nb-slider-natural') || customElements.define('nb-slider-natural', SliderNatural)\n\nexport default SliderNatural\n","import { CONTRAST_DARK, CONTRAST_LIGHT } from '@kissui/components'\n\nexport const getOppositeContrast = contrast => {\n return contrast === CONTRAST_LIGHT ? CONTRAST_DARK : CONTRAST_LIGHT\n}\n","export const isIOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1\n}\n\nexport const isMacOS = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return agent.indexOf('Mac') > -1 && start > -1\n}\n\nexport const isApple = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n return (\n (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1 || agent.indexOf('Mac') > -1) &&\n start > -1\n )\n}\n\nexport const isAndroid = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('Android ')\n return start > -1\n}\n\nexport const isHuawei = () => {\n const agent = window.navigator.userAgent,\n start = agent.indexOf('HUAWEI'),\n devices = navigator.userAgent.match(\n /ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL/i\n )\n return start > -1 || devices !== null\n}\n\nexport const isSafari = () => {\n // https://stackoverflow.com/questions/7944460/detect-safari-browser\n // This includes Chrome on IOS which seems to be Safari, So it's fully OK !\n const agent = window.navigator.userAgent\n return /^((?!chrome|android).)*safari/i.test(agent)\n}\n\nexport const isWebInspector = () => {\n // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n // If we are in a web inspector, in our Nespresso context platform can be MacIntel or eventually Win32 for windows users\n const platform = window.navigator.platform\n return platform.indexOf('MacIntel') > -1 || platform.indexOf('Win32') > -1\n}\n","export const EVENT_COLOR_CLICKED = 'EVENT_COLOR_CLICKED'\n","import {\n getProduct,\n getProductCategories,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD\n} from '@kissui/helpers/src/catalog'\n\n/**\n * Api fetcher service\n *\n * @returns {object}\n */\nconst fetcher = () => {\n const apiRatings = window.napi && window.napi.ratings\n const apiPriceFormat = window.napi && window.napi.priceFormat\n let priceFormatter = null\n\n const loadPriceFormat = async () => {\n priceFormatter = await apiPriceFormat()\n }\n\n const getApiProduct = async sku => await getProduct(sku)\n\n /**\n * Get all products merged with data coming from API\n *\n * @returns {Promise<array>}list of products\n * @param productList\n * @param withRating\n */\n const getAll = (productList, withRating) =>\n Promise.all(\n productList.map(async product => {\n try {\n const fetchedProduct = await getOne(product, withRating)\n productList.splice(productList.indexOf(product), 1, fetchedProduct)\n } catch (error) {\n productList.splice(productList.indexOf(product), 1)\n }\n })\n )\n\n /**\n * Get product merged with data coming from API\n *\n * @returns {Promise} product\n * @param product\n * @param withRating\n */\n const getOne = async (product, withRating) => {\n try {\n return await fetchOne(product, withRating)\n } catch (error) {\n console.error(`Fetch for product ${product.sku} failed: ${error}`)\n throw error\n }\n }\n\n /**\n * Fetch and merge product with data coming from API\n *\n * @param {object} product - base product from static data\n * @param apiProduct\n * @param withRating\n * @param list\n * @returns {Promise<object>} Product\n */\n const fetchOne = async (product, withRating) => {\n const { api_override: { name = '', headline = '', description = '' } = {} } = product\n\n const apiProduct = await getApiProduct(product.sku)\n const productCategories = await getProductCategories(product.sku)\n\n const overrides = {\n name: name !== '' ? name : apiProduct.name,\n headline: headline !== '' ? headline : apiProduct.headline,\n description: description !== '' ? description : apiProduct.description,\n longSku: apiProduct ? apiProduct.id : null,\n price: apiProduct ? apiProduct.price : null,\n pdp_urls: getValueObject(apiProduct, 'pdpURLs'),\n images: apiProduct.images,\n slides: apiProduct.slides,\n technologies: apiProduct.technologies,\n type: apiProduct.type,\n productCategories\n }\n\n if (withRating && product.productRatings?.ratingEnabled) {\n overrides.rating = await getRating(product, apiProduct)\n }\n\n if (apiProduct.type === ECAPI_TYPE_CAPSULE) {\n overrides.bundled = apiProduct.bundled\n overrides.intensity = apiProduct.capsuleProperties?.intensity || 0\n overrides.unit_quantity = getValueNumber(apiProduct, 'unitQuantity', 1)\n overrides.sales_multiple = getValueNumber(apiProduct, 'salesMultiple', 10)\n }\n\n if (apiProduct.type === ECAPI_TYPE_GIFT_CARD) {\n if (!product.variant.giftcard_price) {\n throw new Error('Gift Card amount price is not defined')\n }\n\n overrides.price = product.variant.giftcard_price\n overrides.images = { icon: product.variant.default_image }\n }\n\n return { ...merge(product, apiProduct), ...overrides }\n }\n\n /**\n * Merge products based on static product existing keys\n * A shallow copy is made to prevent original object mutation\n *\n * @param {object} product\n * @param {object} apiProduct\n * @param {boolean} force Force property override\n * @returns {object} Product\n */\n const merge = (product, apiProduct, force = false) => {\n const mergedProduct = { ...product }\n\n if (!apiProduct) {\n return mergedProduct\n }\n\n for (const key of Object.keys(mergedProduct)) {\n const empty = mergedProduct[key] === '' || mergedProduct[key] === '0'\n if (key in apiProduct && (empty || force)) {\n mergedProduct[key] = apiProduct[key]\n }\n }\n\n return mergedProduct\n }\n\n /**\n * @param {object} apiProduct\n * @returns {number}\n */\n const getValueNumber = (apiProduct, key, defaultValue) =>\n parseInt((apiProduct && apiProduct[key]) || defaultValue)\n\n /**\n * @param {object} apiProduct\n * @returns {object}\n */\n const getValueObject = (apiProduct, key) => {\n return apiProduct && Object.keys(apiProduct[key]).length > 0 ? apiProduct[key] : {}\n }\n\n /**\n * @param {string} sku\n * @returns {Promise<number>} Rating value\n */\n const getRating = async ({ sku }, apiProduct) => {\n if (\n !apiRatings ||\n (apiProduct && apiProduct.productRatings && !apiProduct.productRatings.ratingEnabled)\n ) {\n return toFloat(0, 1)\n }\n\n try {\n const { ratingAverage = 0 } = await apiRatings().summary(sku)\n return toFloat(ratingAverage !== 0 ? ratingAverage : 0, 1)\n } catch (error) {\n console.error(`Product rating fetch failed on sku ${sku}`, error)\n return toFloat(0, 1)\n }\n }\n\n /**\n * Get currency from datalayer\n * @returns {string}\n */\n const _getCurrency = () => {\n const { dataLayer = {} } = window[window.config.padl.namespace]\n return dataLayer.app?.app?.currency\n }\n\n /**\n * @returns {string}\n * @param price\n */\n const formatPrice = price => {\n const { short } = priceFormatter\n return short(_getCurrency(), price)\n }\n\n /**\n * @param {number} value\n * @param {number} decimal\n * @returns {number}\n */\n const toFloat = (value, decimal = 2) => parseFloat(value).toFixed(decimal)\n\n return {\n loadPriceFormat,\n getApiProduct,\n getAll,\n getOne,\n fetchOne,\n merge,\n formatPrice\n }\n}\n\nexport default fetcher()\n","import { EVENT_COLOR_CLICKED } from './constants.mjs'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nclass color extends HTMLElement {\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.createEventListeners()\n }\n\n createEventListeners() {\n this.addEventListener('click', this.handleClick)\n }\n\n render() {\n const { link, label, code, a11y_label = 'color', selected, size = 'large' } = this.props\n\n const element = document.createElement(link ? 'a' : 'button')\n\n if (link) {\n element.setAttribute('href', link)\n }\n if (label) {\n element.setAttribute('title', label)\n element.setAttribute('aria-label', `${label} ${a11y_label}`)\n }\n if (selected === 'true') {\n element.setAttribute('class', 'selected')\n }\n\n this.classList.add(size)\n\n element.innerHTML = `\n <div><span style=\"background-color: ${code}\"></span></div>\n `\n this.innerHTML = element.outerHTML\n }\n\n handleClick() {\n const { sku } = this.props\n dispatchEvent({\n element: this,\n eventName: EVENT_COLOR_CLICKED,\n args: { sku }\n })\n }\n}\n\ncustomElements.get('nb-color') || customElements.define('nb-color', color)\n\nexport default color\n","import { EVENT_COLOR_CLICKED } from './components/color/constants.mjs'\nimport { DEFAULT_MAX_COLOR_COUNT, EVENT_COLOR_CHANGE } from './constants.mjs'\n\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport fetcherService from '@kissui/page-builder-sections/src/cross-sell/services/fetcher.service'\nimport './components/color'\n\nclass Colors extends HTMLElement {\n constructor() {\n super()\n this._apiProducts = {}\n this._colors = []\n this._maxColors = DEFAULT_MAX_COLOR_COUNT\n }\n\n async connectedCallback() {\n this.props = createProps(this.attributes)\n this.updateMaxColors()\n\n await this.fetchColors()\n\n this.render()\n this.createEventListeners()\n }\n\n hasColorData() {\n return this.props.colors && this.props.colors.every(this.hasAllProps)\n }\n\n hasAllProps(color) {\n return color.sku != null && color.name != null && color.code != null\n }\n\n createEventListeners() {\n this.addEventListener(EVENT_COLOR_CLICKED, this.onColorChange)\n }\n\n render() {\n const { heading = '' } = this.props\n\n this.innerHTML = `\n ${heading ? `<p class=\"t-sm-400-sl\">${heading}</p>` : ``}\n ${this.renderColors()}${this.renderExtraColors()}\n `\n }\n\n renderColors() {\n return this._colors.map(this.renderColor.bind(this)).join('')\n }\n\n renderColor(color) {\n const { a11y_label = '', activeSku, size = 'large' } = this.props\n const { code = '', name = '', link = '', sku = '' } = color\n this.classList.add(size)\n\n return `\n <nb-color\n code=\"${code}\"\n label=\"${name}\"\n link=\"${link}\"\n sku=\"${sku}\"\n selected=\"${sku === activeSku}\"\n ${a11y_label ? `a11y_label=\"${a11y_label}\"` : ''}\n size=\"${size}\"\n ></nb-color>\n `\n }\n\n renderExtraColors() {\n const { colors = [], extra_url, extra_title } = this.props\n const extraColorsLength = Math.max(0, colors.length - this._maxColors)\n if (extraColorsLength <= 0 || !extra_url) {\n return ''\n }\n\n return `\n <nb-link\n size=\"small\"\n color=\"black\"\n seo_label=\"${extra_title}\"\n aria-label=\"${extra_title}\"\n link=\"${extra_url}\"\n >+${extraColorsLength}</nb-link>`\n }\n\n async fetchColors() {\n if (this.hasColorData()) {\n this._colors = this.clampColor(this.props.colors)\n return\n }\n try {\n const preparedColors = this.prepareColors(this._maxColors)\n await Promise.all(preparedColors.map(this.fetchColor.bind(this)))\n } catch (error) {\n console.error(`Fetch for colors failed: ${error}`)\n }\n }\n\n async fetchColor(color) {\n const { prevent } = this.props\n const apiProduct = await fetcherService.getApiProduct(color.sku)\n const apiColor = {\n code: apiProduct.colorShade.cssCode,\n name: apiProduct.colorShade.name,\n link: prevent === undefined ? apiProduct.pdpURLs.desktop : ''\n }\n this._apiProducts[color.sku] = apiProduct\n this._colors.push({ ...color, ...apiColor })\n }\n\n prepareColors() {\n const { colors = [] } = this.props\n return this.clampColor(colors).filter(this.hasSKU)\n }\n\n clampColor(colors) {\n return colors.slice(0, this._maxColors)\n }\n\n hasSKU(colorItem) {\n return colorItem.sku != null && colorItem.sku !== ''\n }\n\n updateMaxColors() {\n const { max_colors } = this.props\n if (max_colors) {\n this._maxColors = parseInt(max_colors)\n }\n }\n\n onColorChange($event) {\n const { sku } = readEvent($event)\n const productData = { ...this._apiProducts[sku], sku }\n if (productData) {\n dispatchEvent({\n element: this,\n eventName: EVENT_COLOR_CHANGE,\n args: { productData }\n })\n }\n }\n}\n\n// Registers custom element\ncustomElements.get('nb-colors') || customElements.define('nb-colors', Colors)\n\nexport default Colors\n","export const DEFAULT_MAX_COLOR_COUNT = 4\nexport const EVENT_COLOR_CHANGE = 'EVENT_COLOR_CHANGE'\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLabels extends HTMLElement {\n constructor() {\n super()\n this.props = {}\n this.labels = []\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n }\n\n render() {\n const { labels = [], direction = 'column' } = this.props\n this.classList.add(`${direction === 'row' ? 'direction-row' : 'direction-' + direction}`)\n\n if (labels.length === 0) {\n return ''\n }\n this.labels = labels\n\n this.innerHTML = `${this.renderLabels()}`\n }\n\n renderLabels() {\n return this.labels\n .map(label => {\n const { name = '', bgColor = '', color = '' } = label\n return `<mark class=\"t-3xs-500-caps-sl\"\n ${\n bgColor &&\n color &&\n `style=\"background: ${bgColor}; color: ${color}\"`\n }>\n <span aria-hidden=\"true\">${name}</span>\n <span class=\"sr-only\">${name}</span>\n </mark>`\n })\n .join('')\n }\n}\n\ncustomElements.get('nb-card-labels') || customElements.define('nb-card-labels', CardLabels)\n\nexport default CardLabels\n","export class NespressoElement extends HTMLElement {\n constructor() {\n super()\n this.template = ''\n }\n\n connectedCallback() {\n this.props = this._createProps()\n this.onStart?.()\n this.loadTemplate()\n this.onReady?.()\n }\n\n /**\n * Load the attributes and create the props object\n * @returns {any}\n * @private\n */\n _createProps(forceAttributes = null) {\n const attributes = forceAttributes || this.attributes\n\n const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n let props\n try {\n props = [...attributes].reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n const data = getData([...attributes])\n\n if (data === undefined || data === null) {\n return props\n }\n\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log(this.nodeName, 'ERROR: No data', error)\n }\n }\n\n /**\n * Render by DOM diff\n */\n render(force = false) {\n if (force) {\n // todo review the performance of this\n this.innerHTML = ''\n }\n /**\n * Convert a template string into HTML DOM nodes\n * @param {String} str The template string\n * @return {Node} The template HTML\n */\n const _stringToHTML = str => {\n const parser = new DOMParser()\n const doc = parser.parseFromString(str, 'text/html')\n return doc.body\n }\n\n /**\n * Compare the template to the UI and make updates\n * @param {Node} template The template HTML\n * @param {Node} elem The UI HTML\n */\n const _diff = (template, elem) => {\n /**\n * Get the type for a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeType = node => {\n if (node.nodeType === 3) {\n return 'text'\n }\n if (node.nodeType === 8) {\n return 'comment'\n }\n return node.tagName.toLowerCase()\n }\n\n /**\n * Get the content from a node\n * @param {Node} node The node\n * @return {String} The type\n */\n const _getNodeContent = node => {\n if (node.childNodes && node.childNodes.length > 0) {\n return null\n }\n return node.textContent\n }\n\n // Get arrays of child nodes\n const domNodes = Array.prototype.slice.call(elem.childNodes)\n const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n // If extra elements in DOM, remove them\n var count = domNodes.length - templateNodes.length\n if (count > 0) {\n for (; count > 0; count--) {\n domNodes[domNodes.length - count].parentNode.removeChild(\n domNodes[domNodes.length - count]\n )\n }\n }\n\n // Diff each item in the templateNodes\n templateNodes.forEach(function (node, index) {\n // If element doesn't exist, create it\n if (!domNodes[index]) {\n elem.appendChild(node.cloneNode(true))\n return\n }\n\n // If element is not the same type, replace it with new element\n if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n return\n }\n\n // If content is different, update it\n const templateContent = _getNodeContent(node)\n if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n domNodes[index].textContent = templateContent\n }\n\n // If target element should be empty, wipe it\n if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n domNodes[index].innerHTML = ''\n return\n }\n\n // If element is empty and shouldn't be, build it up\n // This uses a document fragment to minimize reflows\n if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n const fragment = document.createDocumentFragment()\n _diff(node, fragment)\n domNodes[index].appendChild(fragment)\n return\n }\n\n // If there are existing child elements that need to be modified, diff them\n if (node.childNodes.length > 0) {\n _diff(node, domNodes[index])\n }\n })\n }\n\n // todo - add support to reactivity\n // this.template(this.state)\n const templateHTML = _stringToHTML(this.template)\n _diff(templateHTML, this)\n }\n\n /**\n * Set the HTML to be used in the template\n * @param {String} html The HTML to use\n *\n * This function is overwritten by the extended class to set the HTML\n *\n */\n loadTemplate(template = '', force = false) {\n this.template = template === '' ? this.template : `${template}`\n this.render(force)\n }\n\n disconnectedCallback() {\n this.onDestroy?.()\n }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n customElements.define('nb-nespresso-element', NespressoElement)\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\n/**\n * Display labels\n * @param {Object[]} labels - List of labels\n * @param {string} labels[].name - Text\n * @param {string} labels[].bgColor - Background\n * @param {string} labels[].color - Font color\n * @param {HTMLElement} component - Apply css on component\n * @returns {String} - Render of labels\n */\nexport const renderLabels = ({ labels = [] }, component = null) => {\n if (!component || !labels || !labels.length) {\n return ''\n }\n\n if (component && labels.length) {\n component.classList.add('has-labels')\n }\n\n const direction = viewportHelper.is.mobile ? 'row' : 'column'\n const data = stringifyForAttribute({ labels })\n\n return `<nb-card-labels data=\"${data}\" direction=\"${direction}\"></nb-card-labels>`\n}\n","import './image.scss'\n\nexport const renderImage = (\n { url, image_alt_text, image, quick_view_plp = {} },\n theme = 'portrait'\n) => {\n if (!image) {\n return ''\n }\n\n let img = `<nb-img file=\"${image}\"\n description=\"${image_alt_text}\"\n aspect_ratio=\"${theme === 'portrait' ? '16/9' : '1/1'}\"\n object_fit=\"contain\"\n force_height=\"${theme === 'portrait' ? '160' : '120'}\">\n </nb-img>`\n\n const renderClass = url ? '' : 'class=\"cursor-default\"'\n\n if (url || quick_view_plp?.show_view) {\n const linkHref = url || 'javascript:void(0)'\n img = `<a ${renderClass.trim()} href=\"${linkHref}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">${img}</a>`\n }\n\n return `<div class=\"cb-image\">\n ${img}\n </div>`\n}\n","import { VARIATION_PDP } from '@kissui/components/src/sku/constants'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nconst isPdp = variation => variation === VARIATION_PDP\n\nconst getHeadingLevel = ({ variation }) => (isPdp(variation) ? 'h1' : 'h3')\n\nconst renderLink = ({ url, a11y_product_card = '', name = '', name_custom = '' }) => {\n const a11yProductName = a11y_product_card.replace('{productName}', name)\n const productName = name_custom !== '' ? name_custom : name\n\n return `<a href=\"${url}\" target=\"_self\" title=\"${a11yProductName}\" aria-label=\"${a11yProductName}\">${productName}</a>`\n}\n\nexport const renderHeading = props => {\n const { url, name = '', name_custom = '' } = props\n\n if (!name) {\n return ''\n }\n\n const finalName = name_custom !== '' ? name_custom : name\n const result = []\n const headingLevel = getHeadingLevel(props)\n\n result.push(\n `<${headingLevel} class=\"cb-heading ${\n viewportHelper.is.mobile ? 't-md-700-sl' : 'h-lg-700'\n }\">`\n )\n\n if (url && !isPdp(props.variation)) {\n result.push(renderLink(props))\n } else {\n result.push(`${finalName}`)\n }\n\n result.push(`</${headingLevel}>`)\n\n return result.join('')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nexport const renderHeadline = ({ headline = '', is_headline_hidden = false }) => {\n if ((is_headline_hidden && viewportHelper.is.mobile) || !headline) {\n return ''\n }\n\n return `<p class=\"cb-text t-sm-400-sl\">${headline}</p>`\n}\n","export const renderLabelTechnology = ({ label_technology }) => {\n if (!label_technology) {\n return ''\n }\n\n return `<p class=\"cb-technology t-xs-700-sl\">${label_technology}</p>`\n}\n","export const renderLabelRange = ({ label_range }) => {\n if (!label_range) {\n return ''\n }\n\n return `<p class=\"cb-range t-xs-500-sl\">${label_range}</p>`\n}\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n if (!strikethrough_price) {\n return ''\n }\n\n fetchStrikethroughPrice(strikethrough_price)\n .then(payload => {\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.innerHTML = payload\n })\n .catch(e => {\n console.error(`Error: Component SKU - Strike Through Price - ${e}`)\n\n const element = getStrikethroughPriceElement(component)\n if (!element) {\n return\n }\n\n element.style.display = 'none'\n })\n\n return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n VARIATION_PLP,\n VARIATION_SMALL,\n VARIATION_CROSS_SELL,\n VARIATION_PDP\n} from '@kissui/components/src/sku/constants'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst getButtonSize = variation => {\n switch (variation) {\n case VARIATION_PLP:\n return viewportHelper.is.mobile ? 'small' : 'large'\n case VARIATION_SMALL:\n return 'small'\n default:\n return 'large'\n }\n}\n\nfunction getComputedProps(activeSku, activeLongSku, sku, longSku, disableTracking) {\n const skuProp = activeSku || sku\n const activeLongSkuProp = activeLongSku || longSku\n const disableTrackingProp = disableTracking && `disableTracking=true`\n\n return { skuProp, activeLongSkuProp, disableTrackingProp }\n}\n\nexport const renderAddToCart = props => {\n const {\n activeLongSku,\n activeSku,\n category_name = '',\n contact_cta = {},\n hidePrice,\n longSku = '',\n position,\n rendererName = '',\n show_view_details = false,\n sku,\n url,\n variation = VARIATION_PLP,\n view_details_label = 'View details',\n technologies = [],\n disableTracking = false\n } = props\n\n const buttonSize = getButtonSize(variation)\n let cta_url = url,\n cta_label = view_details_label,\n contact_cta_text = contact_cta.contact_cta_text || '',\n contact_url_anchor = contact_cta.contact_url_anchor || '',\n is_b2b = checkForB2B(technologies)\n\n // CONTACT US BUTTON\n const { skuProp, activeLongSkuProp, disableTrackingProp } = getComputedProps(\n activeSku,\n activeLongSku,\n sku,\n longSku,\n disableTracking\n )\n\n function b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label) {\n //CONTACT US BUTTON[ hidePrice = true]\n const linkAttribute = contact_url_anchor ? `link=\"${cta_url}\"` : ''\n\n return `<nb-cta ${linkAttribute} variation=\"primary\" data-disabletracking=\"true\">${cta_label}</nb-cta>`\n }\n\n function b2bLoggedIn({\n skuProp,\n activeLongSkuProp,\n buttonSize,\n category_name,\n position,\n rendererName,\n variation,\n disableTrackingProp\n }) {\n return `\n <nb-add-to-cart\n sku=\"${skuProp}\"\n longSku=\"${activeLongSkuProp}\"\n buttonSize=\"${buttonSize}\"\n showPrice\n range='${category_name}'\n position='${position}'\n rendererName='${rendererName}'\n tracking_no_impression=\"${variation === VARIATION_PDP}\"\n ${disableTrackingProp}\n >\n </nb-add-to-cart>\n `\n }\n\n function remainingCases(cta_url, cta_label) {\n //VIEW DETAILS BUTTON [ hidePrice = false]\n return `<nb-cta link=\"${cta_url}\" variation=\"primary\">${cta_label}</nb-cta>`\n }\n\n if (hidePrice || show_view_details) {\n if (\n is_b2b &&\n (variation === VARIATION_PDP || variation === VARIATION_CROSS_SELL) &&\n !isLoggedIn()\n ) {\n cta_url = contact_url_anchor\n cta_label = contact_cta_text\n\n return b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label)\n } else if (is_b2b && variation === VARIATION_PDP && isLoggedIn()) {\n return b2bLoggedIn({\n skuProp,\n activeLongSkuProp,\n buttonSize,\n category_name,\n position,\n rendererName,\n variation,\n disableTrackingProp\n })\n }\n\n return remainingCases(cta_url, cta_label)\n }\n\n // ADD TO CART BUTTON\n return `\n <nb-add-to-cart\n sku=\"${skuProp}\"\n longSku=\"${activeLongSkuProp}\"\n buttonSize=\"${buttonSize}\"\n showPrice\n range='${category_name}'\n position='${position}'\n rendererName='${rendererName}'\n tracking_no_impression=\"${variation === VARIATION_PDP}\"\n ${disableTrackingProp}\n ></nb-add-to-cart>\n `\n}\n\nfunction checkForB2B(technologies) {\n return Array.isArray(technologies) && technologies.some(tech => tech.includes('pro'))\n}\n","export const renderAdditionalMessage = ({\n additional_message_icon,\n additional_message,\n additional_message_link\n}) => {\n if (!additional_message && !additional_message_link) {\n return ''\n }\n\n let additionalMessageFinal = ''\n\n if (additional_message) {\n let renderIcon = ''\n if (additional_message_icon) {\n renderIcon = `<nb-icon icon=\"${additional_message_icon}\" class=\"additionalMsgIcon\"></nb-icon>`\n }\n\n additionalMessageFinal = `<p class=\"cb-warn t-sm-500-sl\">\n ${renderIcon}\n ${additional_message}</p>`\n }\n\n const hasAdditionalMessageLink =\n additional_message_link && additional_message_link.link && additional_message_link.label\n\n if (!hasAdditionalMessageLink) {\n return additionalMessageFinal\n }\n\n return (\n additionalMessageFinal +\n `<nb-link\n link='${additional_message_link.link}'\n color=\"${additional_message_link.color}\"\n size=\"${additional_message_link.size}\"\n seo_label=\"${additional_message_link.seo_label}\">\n ${additional_message_link.label}\n </nb-link>`\n )\n}\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n ECAPI_TYPE_ACCESSORY,\n ECAPI_TYPE_CAPSULE,\n ECAPI_TYPE_GIFT_CARD,\n ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { options } = pageBuilderProps\n const {\n variant = {},\n labels = [],\n strikethrough_price,\n additional_message,\n additional_message_icon,\n additional_message_link,\n contact_cta\n } = pageBuilderProductProps || {}\n\n // lists header props not coming from this.props\n let data = {\n sku: product.internationalId,\n technologies: product.technologies,\n longSku: product.id,\n name: product.name,\n headline: sanitizeString(product.headline),\n sales_multiple: product.salesMultiple,\n unit_quantity: product.unitQuantity,\n type: product.type,\n category_name: product.rangeData?.name || '',\n label_range: product.rangeData?.name || '',\n price: product.price ? priceFormatter.short(currency, product.price) : null,\n rawPrice: product.price,\n strikethrough_price: strikethrough_price || '',\n variation: VARIATION_PLP,\n image_alt_text: product.name,\n image: product.images?.icon || product.images?.push || product.images?.main,\n additional_message: additional_message || '',\n additional_message_icon: additional_message_icon || '',\n additional_message_link: additional_message_link || {},\n contact_cta: contact_cta || {},\n ...apiOverride(product, pageBuilderProductProps)\n }\n\n if (labels && labels.length) {\n data.labels = labels\n }\n\n if (product.highlighted) {\n data.highlighted = product.highlighted\n }\n\n let dataTransformObjectProductType = {}\n if (product.type === ECAPI_TYPE_CAPSULE) {\n dataTransformObjectProductType = getMergedProductCoffeeData(\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n )\n } else if (product.type === ECAPI_TYPE_MACHINE) {\n dataTransformObjectProductType = getMergedProductMachineData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n dataTransformObjectProductType = getMergedProductAccessoryData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n dataTransformObjectProductType = getMergedProductGiftCardData(\n product,\n pageBuilderProductProps,\n pageBuilderProps\n )\n }\n\n return {\n ...product,\n ...options,\n ...variant,\n ...data,\n ...dataTransformObjectProductType\n }\n}\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n product,\n pageBuilderProductProps,\n pageBuilderProps,\n priceFormatter,\n currency\n) => {\n const { bundle_details } = pageBuilderProductProps\n const { options } = pageBuilderProps\n const { show_sleeve_price } = options\n\n const isBundledResult = isBundled(product)\n\n const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n show_sleeve_price,\n product,\n isBundled\n )\n\n const option = {\n bundled: isBundledResult,\n intensity: product.capsuleProperties?.intensity || product.intensity || null,\n max_intensity: getMaxIntensity(product),\n price_per_capsule: price_per_capsule\n ? priceFormatter.short(currency, price_per_capsule)\n : null,\n show_capsule_price: showCapsulePrice\n }\n\n if (show_sleeve_price) {\n option.price = priceFormatter.short(currency, final_price)\n }\n\n if (bundle_details) {\n option.bundle_details = bundle_details\n }\n\n return option\n}\n","export const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n const { strikethrough_price, variant = {} } = pageBuilderProductProps\n const { ratingsAndReviews } = product\n\n // lists header props not coming from this.props\n const options = {\n ratings: ratingsAndReviews\n }\n\n if (variant?.colors) {\n options.colors = variant.colors\n options.activeSku = product.internationalId\n options.max_colors = 99\n }\n\n options.strikethrough_price = strikethrough_price || ''\n options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n return options\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n const { variant = {} } = pageBuilderProductProps\n\n return {\n image: variant && variant.default_image\n }\n}\n","export const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_PLP = 'plp'\n\nexport interface CapsuleFeaturesInputType {\n acidity?: number | null\n bitterness?: number | null\n body?: number | null\n intensity?: number | null\n roastLevel?: number | null\n}\n\nexport interface CapsuleFeatureType {\n value: number | null\n}\n\nexport interface CapsuleFeaturesOutputType {\n acidity: CapsuleFeatureType\n bitterness: CapsuleFeatureType\n body: CapsuleFeatureType\n intensity: CapsuleFeatureType\n roast: CapsuleFeatureType\n}\n\nexport type QuickViewProductType = {\n modelType: string\n id: string\n legacyId: string\n internationalId: string\n name: string\n urlFriendlyName: string\n internationalName: string\n headline: string\n rootCategory: string\n category: string\n supercategories: string[]\n mobileImages: {\n modelType: string\n icon: string\n main: string\n }\n responsiveImages: {\n standard: string\n }\n pdpURLs: {\n opr: string\n desktop: string\n mobile: string\n }\n unitQuantity: number\n salesMultiple: number\n maxOrderQuantity: number\n technologies: string[]\n comingSoon: boolean\n unit_quantity: number\n productSelections: string[]\n type: string\n priceDisplay: string\n isOrderable: boolean\n bundled: boolean\n capsuleProperties: {\n intensity: number\n bitterness: number\n acidity: number\n roastLevel: number\n }\n capsuleProductAromatics: string[]\n aromaticProfileDescription: string\n roastingDescription: string\n capsuleCupSizes: string[]\n capsuleCupSizesDetails: {\n id: string\n name: string\n capacityLabel: string\n }[]\n capsuleAromatics: {\n id: string\n name: string\n }[]\n decaffeinated: boolean\n}\n\n//Confirmed this props are not available in Product Type\nexport type ProductNewPropsType = {\n currency: string\n pdpURLs: {\n desktop: string\n mobile: string\n }\n responsiveImages: {\n standard: string\n }\n supercategories: string[]\n productSelections: string[]\n capsuleProperties?: CapsuleFeaturesInputType\n capsuleProductAromatics: string[]\n unitPrice: number\n cupSizesDetails?: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n category_name: string\n url: string\n}\n\n// This is the Product Type signature Combined\nexport type ProductPropsType = QuickViewProductType & ProductNewPropsType\n\nexport type AddToCartPropsType = {\n sku?: string\n longSku?: string\n category_name?: string\n price?: string\n strikethrough_price?: number\n hidePrice?: boolean\n type?: string\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unitQuantity?: number\n unit_quantity?: number\n bundled?: boolean\n url?: string\n}\n\nexport type PageBuilderProductPropsType = {\n sku: string\n highlighted: boolean\n labels: {\n bgColor: string\n color: string\n name: string\n }[]\n strikethrough_price: string\n variant: {\n is_capsule: boolean\n number_of_sleeves: number\n number_of_capsules: string\n bundle_details: {\n popin_link_text: string\n popin_label_close: string\n description: string\n other_skus: string\n other_skus_quantity: string\n }\n logos: {\n fair_trade: boolean\n alt_fair_trade: string\n is_organic: boolean\n alt_organic: string\n only_vertuo_next: boolean\n alt_vertuo_next: string\n is_rainforest: boolean\n alt_rainforest: string\n is_sustainable: boolean\n alt_sustainable: string\n is_q_certified_arabica: boolean\n alt_q_certification_arabica: string\n }\n sku_timer: {\n launch_date: string\n remaining_days: string\n remaining_day: string\n label: string\n a11y_label: string\n }\n ingredients: {\n heading: string\n description: string\n }\n }\n}\n\nexport type PageBuilderPropsType = {\n quick_view_plp?: {\n popin?: {\n close?: string\n }\n cup_sizes?: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile?: {\n heading: string\n items: string[]\n }\n link?: {\n label: string\n url: string\n }\n levels?: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n campaign?: {\n id?: string\n name?: string\n creative?: string\n position?: string\n }\n tracking_position: string\n tracking_list: string\n capsuleProperties?: CapsuleFeaturesInputType\n price_per_capsule?: number | string\n show_capsule_price?: boolean\n label_capsules?: string\n capsule_price_label?: string\n capsule_price_syntax?: string\n show_sleeve_price?: boolean\n show_sleeve?: boolean\n sleeve_syntax?: string\n number_of_sleeves?: number\n label_sleeves?: string\n label_sleeve?: string\n technologies: string[]\n sales_multiple?: number\n unit_quantity?: number\n bundled?: boolean\n pdpURLs: {\n desktop: string\n mobile: string\n }\n intensity_label: string\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n copywriting: {\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n}\n\nexport type SkuType = {\n tracking_list: string\n tracking_position: string\n id: string\n sku: string\n longSku: string\n name: string\n name_custom: string\n available: boolean\n description: string | null\n hidePrice: boolean\n image_alt_text: string\n inStock: boolean\n internationalId: string\n internationalName: string\n legacyId: string\n maxOrderQuantity: number | null\n packagingType: string | null\n price: string\n pushRatingEnabled: boolean\n ranges: string[]\n salesMultiple: number\n technologies: string[]\n type: string\n unitQuantity: number\n url: string\n labels: []\n category_name: string\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n highlighted: boolean\n strikethrough_price: string\n view_details_label: string\n headline: string\n cupSizes: string[]\n cupSizesDetails: {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string | null\n }\n detailsIcon: string | null\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n }[]\n flavors: string[]\n in_stock: boolean\n sales_multiple: number\n bundled: boolean\n logos: []\n is_headline_hidden: boolean\n a11y_price: string\n a11y_product_card: string\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n intensity: number\n a11y_intensity_max: string\n label_decaffeinato: string\n show_sleeve_price: boolean\n show_sleeve: boolean\n price_per_capsule: number | string\n final_price: string | null\n capsule_price_label: string\n capsule_price_syntax: string\n sleeve_syntax: string\n perSleeveLabel: string\n number_of_sleeves: number\n number_of_capsules: string\n show_capsule_price: boolean\n sort_price: number\n bundle_details: any\n quick_view_plp: {\n show_view: boolean\n quick_view_text: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n levels: {\n a11y_level_of: string\n acidity_label: string\n bitterness_label: string\n roastiness_label: string\n body_label: string\n }\n }\n hasPricePerSleeve: boolean\n sleevePrice: string\n rendererName: string\n position: number\n rawPrice: number\n variation: string\n intensity_label: string\n campaign: {\n id: string\n name: string\n creative: string\n position: string\n }\n capsuleProductAromatics: string[]\n copywriting: {\n heading: string\n sku_quick_view: {\n more_info: string\n a11y_more_info: string\n popin: {\n close: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: false\n items: string[]\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n }\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n }\n options: {\n intensity_label: string\n show_sleeve: boolean\n label_sleeve: string\n label_sleeves: string\n label_capsules: string\n sleeve_syntax: string\n show_sleeve_price: boolean\n capsule_price_label: string\n capsule_price_syntax: string\n a11y_intensity_max: string\n label_decaffeinato: string\n is_headline_hidden: boolean\n sizes_title: string\n notes_title: string\n enabledExperiments: string[]\n }\n products: {\n sku: string\n longSku: string\n price: number\n strikethrough_price: number\n hidePrice: boolean\n url: string\n }[]\n priceFormatter: {\n formatPrice: (price: number) => string\n }\n currency: string\n}\n\nexport type MergedProductType = {\n intensity_label: string\n capsuleProductAromatics?: string[]\n pdpURLs?: {\n desktop: string\n mobile: string\n }\n}\n\nexport type AddToCardPropertiesType = SkuType & MergedProductType\n\ntype CupSizeType = {\n icon: string\n label: string\n size: string\n capacityLabel: string | null\n category: {\n id: string\n name: string\n description: string | null\n icon: {\n url: string\n altText: string\n }\n detailsIcon: {\n url: string\n altText: string\n }\n url: string | null\n capacityLabel: string | null\n rangeLink: string | null\n subCategories: []\n superCategories: string[]\n }\n}[]\n\nexport type QuickViewPropsType = {\n popin: {\n popin_id: string\n close?: string\n footer: boolean\n }\n product: MergedProductType\n intensity: {\n intensity_label?: string\n a11y_intensity_max: string\n }\n cup_sizes: {\n heading: string\n unit_is_oz: boolean\n items?: [] | CupSizeType\n }\n aromatic_profile: {\n heading: string\n items: string[]\n }\n link: {\n label: string\n url?: string\n }\n levels: any\n pricing: {\n add_to_cart: AddToCartPropsType & {\n position: string\n variation: string\n url: string\n view_details_label: string\n rendererName: string\n }\n showSleeve: any\n showCapsulePrice: any\n }\n campaign: any\n}\n","import { getMergedProductData } from '@kissui/page-builder-sections/src/cross-sell-natural/dataTransform'\n\nimport {\n CapsuleFeaturesInputType,\n CapsuleFeaturesOutputType,\n ProductPropsType,\n AddToCartPropsType,\n SkuType,\n ProductNewPropsType,\n MergedProductType,\n AddToCardPropertiesType,\n QuickViewPropsType,\n VARIATION_PLP,\n VARIATION_CROSS_SELL\n} from './shared-quick-view-types'\n\nexport const getCapsuleFeatures = ({\n acidity = null,\n bitterness = null,\n body = null,\n intensity = null,\n roastLevel = null\n}: CapsuleFeaturesInputType = {}): CapsuleFeaturesOutputType => ({\n acidity: { value: acidity },\n bitterness: { value: bitterness },\n body: { value: body },\n intensity: { value: intensity },\n roast: { value: roastLevel }\n})\n\nexport const getSkuQuickViewData = async (\n product: ProductPropsType,\n popinId: string,\n skuData: SkuType,\n componentType: string\n) => {\n const { tracking_position, tracking_list } = skuData\n\n const handlePLPVariation = () => {\n if (!product) return\n let quickViewElement = document.createElement('nb-sku-quick-view')\n quickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n quickViewElement.setAttribute('id', popinId)\n quickViewElement.setAttribute('tracking_no_impression', 'true')\n quickViewElement.setAttribute('tracking_position', tracking_position)\n quickViewElement.setAttribute('tracking_list', tracking_list)\n quickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n quickViewElement.setAttribute('listname_text', skuData.copywriting.heading)\n document.body.appendChild(quickViewElement)\n }\n\n const handleCrossSellVariation = () => {\n const { sku_quick_view } = skuData.copywriting\n if (!sku_quick_view.more_info) return ''\n const quickViewElement = document.querySelector('nb-sku-quick-view')\n if (quickViewElement) quickViewElement.remove()\n\n let newQuickViewElement = document.createElement('nb-sku-quick-view')\n newQuickViewElement.setAttribute(\n 'data',\n JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n )\n newQuickViewElement.setAttribute('tracking_no_impression', 'true')\n newQuickViewElement.setAttribute('tracking_position', tracking_position)\n newQuickViewElement.setAttribute('tracking_list', tracking_list)\n newQuickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n newQuickViewElement.setAttribute('listname_text', skuData.copywriting.heading)\n document.body.appendChild(newQuickViewElement)\n }\n\n const variationHandlers: { [key: string]: () => void | string } = {\n [VARIATION_PLP]: handlePLPVariation,\n [VARIATION_CROSS_SELL]: handleCrossSellVariation\n }\n\n const handleVariation = variationHandlers[componentType]\n if (handleVariation) {\n handleVariation()\n }\n}\n\nexport const getSkuQuickViewProp = (\n popinId: string,\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n let mergedProductData = getMergedProductDataForComponentType(product, skuData, componentType)\n let addToCartProps = getAddToCartProperties(componentType, skuData, mergedProductData)\n\n return isVariationOnPLP(componentType)\n ? getPlpQuickViewProps(popinId, skuData, mergedProductData, addToCartProps)\n : getCrossSellQuickViewProps(popinId, product, skuData, mergedProductData, addToCartProps)\n}\n\nconst getMergedProductDataForComponentType = (\n product: ProductPropsType,\n skuData: SkuType,\n componentType: string\n) => {\n switch (componentType) {\n case VARIATION_PLP:\n return {\n ...skuData,\n ...product,\n ...getCapsuleFeatures(product?.capsuleProperties)\n }\n case VARIATION_CROSS_SELL: {\n const matchedProduct =\n skuData.products?.find(\n productPageBuilder => productPageBuilder.sku === product?.legacyId\n ) || {}\n return getMergedProductData(\n product,\n matchedProduct,\n skuData,\n skuData?.priceFormatter,\n skuData?.currency\n )\n }\n default:\n return {}\n }\n}\n\nexport const getAddToCartProperties = (\n componentType: string,\n skuData: SkuType,\n mergedProductData: MergedProductType\n): AddToCartPropsType => {\n const data: AddToCardPropertiesType = isVariationOnPLP(componentType)\n ? skuData\n : (mergedProductData as AddToCardPropertiesType)\n return getAddToCartProps(data, componentType)\n}\n\nexport const getAddToCartProps = (\n data: AddToCardPropertiesType,\n componentType: string\n): AddToCartPropsType => {\n const commonProps: AddToCartPropsType = {\n sku: data.sku,\n longSku: data.longSku,\n category_name: data.category_name,\n price: data.price ?? 0,\n strikethrough_price: Number(data.strikethrough_price),\n hidePrice: data.hidePrice,\n technologies: data.technologies || [],\n url: data.url || ''\n }\n\n if (isVariationOnPLP(componentType)) {\n return {\n ...commonProps,\n type: data.type,\n price_per_capsule: data.price_per_capsule,\n show_capsule_price: data.show_capsule_price,\n label_capsules: data.label_capsules,\n capsule_price_label: data.capsule_price_label,\n capsule_price_syntax: data.capsule_price_syntax,\n show_sleeve_price: data.show_sleeve_price,\n show_sleeve: data.show_sleeve,\n sleeve_syntax: data.sleeve_syntax,\n number_of_sleeves: data.number_of_sleeves,\n label_sleeves: data.label_sleeves,\n label_sleeve: data.label_sleeve,\n technologies: data.technologies || [],\n sales_multiple: data.sales_multiple,\n unit_quantity: data.unitQuantity,\n bundled: data.bundled,\n url: data.url || ''\n }\n }\n\n return commonProps\n}\n\nexport const getPlpQuickViewProps = (\n popinId: string,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n return {\n popin: {\n popin_id: popinId,\n close: skuData?.quick_view_plp?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: mergedProductData?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.quick_view_plp?.cup_sizes,\n items: skuData?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.quick_view_plp?.aromatic_profile,\n items: skuData?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.quick_view_plp?.link,\n url: skuData?.url\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: skuData.campaign\n }\n}\n\nexport const getCrossSellQuickViewProps = (\n popinId: string,\n product: ProductNewPropsType,\n skuData: SkuType,\n mergedProductData: MergedProductType,\n addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n const props: QuickViewPropsType = {\n popin: {\n popin_id: popinId,\n close: skuData?.copywriting?.sku_quick_view?.popin?.close,\n footer: true\n },\n product: {\n ...mergedProductData\n },\n intensity: {\n intensity_label: skuData?.options?.intensity_label,\n a11y_intensity_max: 'max of {max_intensity}'\n },\n cup_sizes: {\n ...skuData?.copywriting?.sku_quick_view?.cup_sizes,\n items: product?.cupSizesDetails\n },\n aromatic_profile: {\n ...skuData?.copywriting?.sku_quick_view?.aromatic_profile,\n items: product?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n },\n link: {\n ...skuData?.copywriting?.sku_quick_view?.link,\n url: mergedProductData?.pdpURLs?.desktop\n },\n levels: {\n ...skuData?.quick_view_plp?.levels\n },\n pricing: {\n add_to_cart: {\n ...addToCartProps,\n position: '',\n variation: 'small',\n url: '',\n view_details_label: 'View details',\n rendererName: ''\n },\n showSleeve: {},\n showCapsulePrice: {}\n },\n campaign: {}\n }\n return props\n}\nconst isVariationOnPLP = (componentType: string) => componentType === VARIATION_PLP\n","import { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { renderLabels } from './fragments/labels'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\nimport { renderImage } from './fragments/image'\nimport { renderHeading } from './fragments/heading'\nimport { renderHeadline } from './fragments/headline'\nimport { renderLabelTechnology } from './fragments/labelTechnology'\nimport { renderLabelRange } from './fragments/labelRange'\nimport { renderQuickView } from './fragments/quickView'\nimport { renderStrikethroughPrice } from './fragments/strikethroughPrice'\nimport { renderPrice } from './fragments/price'\nimport { renderAddToCart } from './fragments/addToCart'\nimport { renderAdditionalMessage } from './fragments/additionalMessage'\nimport { setCardTheme } from './fragments/setCardTheme'\nimport { getSkuQuickViewData } from '@kissui/components/src/sku-quick-view/shared-quick-view'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getTechnologyName, getProduct } from '@kissui/helpers/src/catalog'\nimport { trackComponentInteraction, productClick } from '@kissui/helpers/src/gtmEvents'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nclass Sku extends NespressoElement {\n constructor() {\n super()\n this.type = 'default'\n this.popinId = ''\n this.isQuickViewPlp = false\n this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n this.boundOnQuickViewOpen = this.onQuickViewOpen.bind(this)\n this.clickMethod = this.boundOnPDPLinkClick\n }\n\n loadTemplate() {\n this.classList.add('nb-sku')\n this.classList.add(`nb-sku__${this.type}`)\n setCardTheme(this.props, this)\n\n Object.assign(this.props, this.getSleevePrice(this.props))\n Object.assign(this.props, this.checkHiddenPriceForLoggedInUser(this.props))\n\n const { quick_view_plp = {} } = this.props\n this.isQuickViewPlp = quick_view_plp?.show_view || false\n this.clickMethod = this.isQuickViewPlp\n ? this.boundOnQuickViewOpen\n : this.boundOnPDPLinkClick\n\n this.template = `${this.renderVisual()}\n ${this.renderHeader()}\n <div class=\"cb-content\">\n ${this.renderInformation()}\n ${this.isQuickViewPlp ? this.renderQuickView() : ''}\n <div class=\"cb-shop\">\n <div class=\"cb-price\">\n ${this.renderPricing()}\n </div>\n ${this.renderAction()}\n </div>\n ${this.renderFooter()}\n </div>`\n\n this.render()\n }\n\n onReady() {\n const { activeSku, sku } = this.props\n this.setAttribute('data-product-short-sku', activeSku || sku)\n this.bindEvent()\n }\n\n renderHeaderDefault() {\n return `${renderLabels(this.props, this)}${renderLogos(this.props, this)}`\n }\n\n renderHeader() {\n return this.renderHeaderDefault()\n }\n\n renderVisualDefault() {\n const theme = this.hasAttribute('portrait') ? 'portrait' : 'landscape'\n return renderImage(this.props, theme)\n }\n\n getSleevePrice({ number_of_sleeves, price }) {\n let hasPricePerSleeve = true\n let sleevePrice\n if (number_of_sleeves === '1') {\n sleevePrice = price\n } else {\n hasPricePerSleeve = false\n }\n return { hasPricePerSleeve, sleevePrice }\n }\n\n checkHiddenPriceForLoggedInUser({ hidePrice, show_view_details }) {\n return {\n hidePrice: isLoggedIn() ? false : hidePrice,\n show_view_details: isLoggedIn() ? false : show_view_details\n }\n }\n\n renderVisual() {\n return this.renderVisualDefault()\n }\n\n renderInformationDefault() {\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}`\n }\n\n renderInformation() {\n return this.renderInformationDefault()\n }\n\n renderQuickView() {\n return renderQuickView(this.props)\n }\n\n renderPricingDefault() {\n const isPortrait = this.hasAttribute('portrait')\n\n const pricingWithClass = `\n ${renderStrikethroughPrice(this.props, this)}\n <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n ${renderPrice(this.props)}\n </div>`\n\n return pricingWithClass\n }\n\n renderPricing() {\n return this.renderPricingDefault()\n }\n\n renderActionDefault() {\n return renderAddToCart(this.props, false, this)\n }\n\n renderAction() {\n const actionSlot = this.querySelector('[slot=\"action\"]')?.outerHTML\n if (actionSlot) {\n return actionSlot\n }\n return this.renderActionDefault()\n }\n\n renderFooterDefault() {\n return renderAdditionalMessage(this.props)\n }\n\n renderFooter() {\n return this.renderFooterDefault()\n }\n\n async onPDPLinkClick() {\n const productIndex = this.getAttribute('tracking_position') || 0\n const list = this.getAttribute('tracking_list') || ''\n\n await productClick(productIndex, list, this.props.longSku)\n }\n\n renderSkuQuickView(product) {\n this.popinId = `plp-quick-view`\n\n let quickViewElement = document.querySelector(`#${this.popinId}`)\n if (quickViewElement) {\n quickViewElement.remove()\n }\n\n getSkuQuickViewData(product, this.popinId, this.props, VARIATION_PLP)\n }\n\n async onQuickViewOpen(e) {\n e.preventDefault()\n\n const { sku } = this.props\n if (!sku) {\n return\n }\n\n try {\n const product = await getProduct(sku)\n\n this.renderSkuQuickView(product)\n trackComponentInteraction({\n creative: this.props.campaign?.creative,\n actionType: 'pdp quick view',\n internationalId: product.internationalId,\n internationalName: product.internationalName,\n productType: product.type,\n technology: getTechnologyName(product),\n category: product.category,\n rawPrice: product.price,\n eventAction: 'PDP Quick View'\n })\n dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: this.popinId } })\n } catch (e) {\n console.error(`getProduct fail on sku ${sku}`)\n }\n return false\n }\n\n bindEvent() {\n this.unbindEvent()\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (!quickViewTextExists) {\n this.classList.add('sku-hover')\n }\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.addEventListener('click', this.clickMethod)\n })\n\n // to avoid adding click event to the button inside the sku card\n this.addStopPropagationEvent('nb-add-to-cart')\n this.addStopPropagationEvent('nb-cta')\n }\n }\n\n unbindEvent() {\n const showQuickView = this.props.quick_view_plp?.show_view\n const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n if (showQuickView && this.props.variation === VARIATION_PLP) {\n const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n elements.forEach(element => {\n element.removeEventListener('click', this.clickMethod)\n })\n\n this.removeStopPropagationEvent('nb-add-to-cart')\n this.removeStopPropagationEvent('nb-cta')\n }\n }\n\n addStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.addEventListener('click', this.stopPropagationHandler)\n }\n }\n\n removeStopPropagationEvent(selector) {\n const element = this.querySelector(selector)\n if (element) {\n element.removeEventListener('click', this.stopPropagationHandler)\n }\n }\n\n stopPropagationHandler(event) {\n event.stopPropagation()\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-sku') || customElements.define('nb-sku', Sku)\n\nexport default Sku\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\n\nexport const setCardTheme = ({ variation, type }, component) => {\n // PDP\n if (variation === VARIATION_PDP) {\n component.setAttribute('pdp', 'true') // Used by CSS to increase font-size, etc.\n }\n\n // COFFEE on PLP on MOBILE\n if (variation === VARIATION_PLP && type === ECAPI_TYPE_CAPSULE && viewportHelper.is.mobile) {\n component.setAttribute('landscape', 'true')\n return\n }\n\n component.setAttribute('portrait', 'true')\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderLogos = (props, component) => {\n const {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n } = props\n\n if (\n !fair_trade &&\n !is_organic &&\n !only_vertuo_next &&\n !is_rainforest &&\n !is_sustainable &&\n !is_q_certified_arabica &&\n (logos == null || logos.length < 1)\n ) {\n return ''\n }\n\n component.classList.add('has-logos')\n\n const data = {\n fair_trade,\n alt_fair_trade,\n is_organic,\n alt_organic,\n only_vertuo_next,\n alt_vertuo_next,\n is_rainforest,\n alt_rainforest,\n is_sustainable,\n alt_sustainable,\n is_q_certified_arabica,\n alt_q_certification_arabica,\n logos\n }\n return `<nb-card-logos data='${stringifyForAttribute(data)}'></nb-card-logos>`\n}\n","import { getTechnologyName } from '@kissui/helpers/src/catalog'\n\nexport const renderQuickView = ({\n sku,\n quick_view,\n tracking_list,\n tracking_position,\n campaign_creative,\n internationalId,\n internationalName,\n type,\n technologies,\n category,\n rawPrice,\n colors\n}) => {\n if (!quick_view || !quick_view.label || !quick_view.popin_id) {\n return ''\n }\n\n const skuData = JSON.stringify({\n internationalId: internationalId,\n internationalName: internationalName,\n type: type,\n technology: getTechnologyName({ technologies }),\n category: category,\n rawPrice: rawPrice\n })\n let colorsSkusList = []\n if (typeof colors !== 'undefined') {\n colors.map(color => {\n colorsSkusList.push(color.sku)\n })\n }\n\n return `<nb-link\n color=\"gold\"\n size=\"large\"\n sku_colors=\"${colorsSkusList}\"\n popin_id=\"${quick_view.popin_id}\"\n sku='${sku}'\n sku_data='${skuData}'\n campaign_creative='${campaign_creative}'\n tracking_list='${tracking_list}'\n tracking_position='${tracking_position}'>${quick_view.label}</nb-link>`\n}\n","import { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\nexport const renderPrice = ({\n price,\n hidePrice,\n giftcard_price,\n price_per_capsule,\n show_sleeve_price,\n type\n}) => {\n if ((!price && !giftcard_price) || hidePrice) {\n return ''\n }\n let finalPrice = null\n if (!show_sleeve_price && price_per_capsule) {\n finalPrice = price_per_capsule\n } else {\n finalPrice = price\n }\n if (type !== ECAPI_TYPE_CAPSULE) {\n finalPrice = price\n }\n\n return `<p class=\"cb-price-current\"><span>${finalPrice || giftcard_price}</span></p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nconst DISPLAY_COLOR_MAX = 4\n\nexport const renderColors = props => {\n if (!props) {\n return ''\n }\n\n const {\n colors,\n sku,\n max_colors = DISPLAY_COLOR_MAX,\n a11y_extra_color = '',\n url,\n activeSku,\n name\n } = props\n\n if (!colors) {\n return ''\n }\n\n const colorData = stringifyForAttribute({\n colors,\n max_colors,\n activeSku: activeSku || sku,\n extra_url: url,\n extra_title: name + ', ' + a11y_extra_color\n })\n\n const size = viewportHelper.is.mobile ? 'small' : 'large'\n\n return `<nb-colors data=\"${colorData}\" size=\"${size}\"></nb-colors>`\n}\n","// Caching mechanism for ratings\nconst API_RATING_CACHE_TTL = 86400000 // 24 hrs\nconst API_RATING_CACHE_PREFIX = 'n-ratings-'\n\nconst setWithExpiry = (key, value) => {\n const now = new Date()\n\n // 'item' is an object which contains the original value\n // as well as the time when it's supposed to expire\n const item = {\n value: value,\n expiry: now.getTime() + API_RATING_CACHE_TTL\n }\n localStorage.setItem(key, JSON.stringify(item))\n}\n\nconst getWithExpiry = key => {\n const itemStr = localStorage.getItem(key)\n if (!itemStr) return undefined\n\n const item = JSON.parse(itemStr)\n const now = new Date()\n\n // compare the expiry time of the item with the current time\n if (now.getTime() > item.expiry) {\n // If the item is expired, delete the item from storage and return null\n localStorage.removeItem(key)\n return undefined\n }\n\n return item.value\n}\n\nexport const getEncodedProductId = longSku => window.btoa(longSku)\n\nexport const getRatingDetails = async sku => {\n const key = `${API_RATING_CACHE_PREFIX}${sku}`\n let data = getWithExpiry(key)\n if (data === undefined) {\n // already expired or not cached\n data = await window.napi.ratings().summary(sku)\n setWithExpiry(key, data)\n }\n return data\n}\n\nexport const isRatingEnabled = product =>\n product.productRatings && product.productRatings.ratingEnabled\n\nexport const isRated = (productRatings, minimum_rating) =>\n productRatings.reviewCount > 0 &&\n productRatings.ratingAverage > 0 &&\n productRatings.ratingAverage >= minimum_rating\n\nexport const getRatingPercentage = ratingSpread => {\n const ratingAverageSum = ratingSpread.reduce((partialSum, value) => partialSum + value, 0)\n\n return ratingSpread.map(element => {\n return (element / ratingAverageSum) * 100\n })\n}\n\nexport const checkIfReviewsAvailable = ratingsResult => ratingsResult.reviewCount > 0\n\nexport const getProductReviews = async (\n market,\n language,\n encodedProductId,\n sort = 'highlightedFirst',\n page = 0\n) => {\n const url = `/ecapi/rating/v1/${market}/${language}/${encodedProductId}/read?platform=desktop&page=${page}&sort=${sort}`\n const response = await fetch(url)\n\n return response.json()\n}\n\nexport const postLike = async (market, language, encodedProductId, reviewId) => {\n const url = `/ecapi/rating/v1/${market}/${language}/${encodedProductId}/${reviewId}/like`\n\n const response = await fetch(url, {\n method: 'POST'\n })\n\n return response.json()\n}\n\nexport const getNapiProductReviews = async (sku, sort = 'highlightedFirst', page = 0) => {\n return window.napi.ratings().read(sku, sort, page)\n}\n\nexport const postNapiLike = async (sku, reviewId) => {\n return window.napi.ratings().like(sku, reviewId)\n}\n","import { getRatingDetails, isRated } from '@kissui/helpers/src/rating.service'\n\nexport const renderRatings = ({ sku, minimum_rating = 0 }, component) => {\n getRatingDetails(sku)\n .then(ratings => {\n const ratingElementBlock = component.querySelector('.cb-ratings-block')\n if (!ratings || !isRated(ratings, minimum_rating)) {\n if (ratingElementBlock) {\n ratingElementBlock.innerHTML = ''\n }\n\n return ''\n }\n\n if (ratingElementBlock) {\n ratingElementBlock.innerHTML = `<nb-rating stars=\"${ratings.ratingAverage}\"></nb-rating>`\n }\n })\n .catch(err => {\n const ratingElementBlock = component.querySelector('.cb-ratings-block')\n if (ratingElementBlock) {\n ratingElementBlock.innerHTML = ''\n }\n console.error(err)\n })\n\n return ''\n}\n\nexport const renderRatingsWithData = props => {\n const {\n show_ratings,\n minimum_rating = 0,\n ratingAverage,\n reviewCount,\n review_cta,\n reviews_cta\n } = props\n\n if (!show_ratings || !isRated(props, minimum_rating)) {\n return ''\n }\n\n let link = ''\n if (reviewCount && review_cta && reviews_cta) {\n const ctaLabel = (reviewCount > 1 ? reviews_cta : review_cta).replace(\n '{nb_review}',\n reviewCount\n )\n if (ctaLabel) {\n link = `<nb-link class=\"is-review\" icon_right=\"chevron-right\" size=\"small\" color=\"gold\">\n ${ctaLabel}\n </nb-link>`\n }\n }\n\n const toInt = parseFloat(ratingAverage).toFixed(2)\n\n return `<nb-rating stars=\"${toInt}\"></nb-rating>\n ${link}`\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","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n if (typeof scrollTo === \"number\") {\n return scrollTo\n }\n\n const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n if (scrollToElement === null && typeof scrollTo === \"string\") {\n throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n }\n\n return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n const viewportHeight = window.innerHeight\n const bodyHeight = document.body.clientHeight\n\n if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n return Math.abs(\n scrollDuration +\n scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n )\n }\n return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n const { scrollDuration: baseScrollDuration = 300 } = options\n const deferred = new Deferred()\n\n let scrollPosition: number = 0;\n\n try {\n scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n }\n catch (error) {\n console.error(error)\n return\n }\n\n let currentTime = 0\n const initialTimestamp = window.performance.now()\n const initialScroll = window.scrollY\n const deltaScroll = initialScroll - scrollPosition\n\n const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n const finalTimestamp = initialTimestamp + scrollDuration\n\n function step() {\n const currentTimestamp = window.performance.now()\n if (currentTimestamp < finalTimestamp) {\n currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n currentTime = --currentTime * currentTime * currentTime + 1\n const moveStep = deltaScroll * currentTime\n window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n window.requestAnimationFrame(step)\n } else {\n window.scrollTo(0, scrollPosition)\n setTimeout(() => deferred.resolve(undefined), 125)\n }\n return deferred.promise\n }\n\n window.requestAnimationFrame(step)\n return deferred.promise\n}\n\nexport default scrollTo\n","import Sku from '@kissui/components/src/sku'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { renderLabelTechnology } from '@kissui/components/src/sku/fragments/labelTechnology'\nimport { renderLabelRange } from '@kissui/components/src/sku/fragments/labelRange'\nimport { renderHeadline } from '@kissui/components/src/sku/fragments/headline'\nimport { renderHeading } from '@kissui/components/src/sku/fragments/heading'\nimport { renderImage } from '@kissui/components/src/sku/fragments/image'\nimport { renderColors } from '@kissui/helpers/src/colors.helpers'\nimport { renderRatings, renderRatingsWithData } from './fragments/ratings'\nimport { renderEnergyLabel } from '@kissui/helpers/src/energy-label.helpers'\nimport { renderVoltage } from './fragments/voltage'\nimport { isRatingEnabled } from '@kissui/helpers/src/rating.service'\nimport { EVENT_COLOR_CLICKED } from '@kissui/components/src/colors/components/color/constants.mjs'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getProduct, getPriceFormatter, getCurrency } from '@kissui/helpers/src/catalog'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { apiOverride } from '@kissui/components/src/sku/services'\n\nclass SkuMachine extends Sku {\n constructor() {\n super()\n this.type = 'machine'\n this.reviewLink = null\n this.boundOnColorClick = this.onColorClick.bind(this)\n this.boundOnReviewLinkClick = this.onReviewLinkClick.bind(this)\n }\n\n renderHeader() {\n return `${this.renderHeaderDefault()}\n ${renderEnergyLabel(this.props)}`\n }\n\n renderInformation() {\n const { variation } = this.props\n\n if (variation === VARIATION_PDP) {\n return this.renderInformationPDP()\n }\n if (variation === VARIATION_PLP) {\n return this.renderInformationPLP()\n }\n\n return this.renderInformationDefault()\n }\n\n renderInformationDefault() {\n return `${renderColors(this.props)}\n ${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${\n this.props.show_ratings && isRatingEnabled(this.props)\n ? `<div class=\"cb-ratings-block\"><nb-loader></nb-loader></div> ${renderRatings(\n this.props,\n this\n )}`\n : ''\n }\n ${renderHeadline(this.props)}`\n }\n\n renderInformationPLP() {\n return `${renderColors(this.props)}\n ${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${\n this.props.show_ratings\n ? `<div class=\"cb-ratings-block\"><nb-loader></nb-loader></div> ${renderRatings(\n { ...this.props, sku: this.props.sku || this.props.legacyId },\n this\n )}`\n : ''\n }\n ${renderHeadline(this.props)}`\n }\n\n renderInformationPDP() {\n const { showVoltage = {} } = this.props\n return `${renderLabelTechnology(this.props)}\n ${renderLabelRange(this.props)}\n ${renderHeading(this.props)}\n ${renderHeadline(this.props)}\n ${renderRatingsWithData(this.props)}\n ${renderVoltage(showVoltage)}\n ${renderColors(this.props)}`\n }\n\n renderVisualDefault() {\n const { variation } = this.props\n if (variation === VARIATION_PDP) {\n return ''\n }\n\n return renderImage(this.props)\n }\n\n onReviewLinkClick(e) {\n e.preventDefault()\n if (document.querySelector('nb-rating-reviews')) {\n scrollTo(`nb-rating-reviews`)\n }\n }\n\n onColorClick(e) {\n const event = readEvent(e)\n if (!event.sku) {\n return\n }\n\n this.template = '<nb-loader></nb-loader>'\n this.render()\n\n return Promise.all([getPriceFormatter(), getProduct(event.sku)])\n .then(([formatter, payload]) => {\n if (!payload || !formatter) {\n return\n }\n\n const newLabels = this.props.colors?.find(c => c.sku === event.sku)?.labels\n\n this.props = {\n ...this.props,\n ...payload,\n colors: this.props.colors,\n sku: payload.legacyId || '',\n longSku: payload.id || '',\n image: payload.responsiveImages?.standard || payload.images?.icon || '',\n image_alt_text: payload.name || '',\n price: formatter.short(getCurrency(), payload.price),\n activeSku: payload.legacyId || '',\n activeLongSku: payload.id || '',\n url: payload.pdpURLs?.desktop || '',\n labels: newLabels,\n ...apiOverride(payload, this.props)\n }\n })\n .catch(() => {\n console.error(`getProduct fail on sku ${event.sku}`)\n })\n .finally(() => {\n this.loadTemplate()\n this.onReady?.()\n })\n }\n\n bindEvent() {\n this.addEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n\n this.reviewLink = this.querySelector('.is-review')\n if (this.reviewLink) {\n this.reviewLink.addEventListener('click', this.boundOnReviewLinkClick)\n }\n }\n\n unbindEvent() {\n this.removeEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n\n if (this.reviewLink) {\n this.reviewLink.removeEventListener('click', this.boundOnReviewLinkClick)\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-sku-machine') || customElements.define('nb-sku-machine', SkuMachine)\n\nexport default SkuMachine\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderEnergyLabel = props => {\n const { a11y_energy_label, energy_level } = props\n\n if (!energy_level) {\n return ''\n }\n\n const data = {\n a11y_label: a11y_energy_label,\n level: energy_level\n }\n\n return `<nb-energy-label data='${stringifyForAttribute(data)}'></nb-energy-label>`\n}\n","export const renderVoltage = props => {\n if (!props) {\n return ''\n }\n\n const { show_voltage, voltage_label, voltage_list, a11y_voltage_label } = props\n\n if (!show_voltage || !voltage_label || !voltage_list || !voltage_list.length) {\n return ''\n }\n\n const voltageItem = voltage_list\n .map(({ label, url }) => {\n if (url) {\n return `<a href=\"${url}\" target=\"_self\"><span class=\"t-sm-400\">${label}</span></a>`\n }\n\n return `<div aria-current=\"page\"><span class=\"t-sm-700\">${label}</span></div>`\n })\n .join('')\n\n return `<div class=\"cb-sku-tab\">\n <span class=\"sr-only\">${a11y_voltage_label}</span>\n <p class='t-sm-400' aria-hidden=\"true\">${voltage_label}</p>\n ${voltageItem}\n </div>`\n}\n","import { COLOR_WHITE_1000 } from '@kissui/components'\n\nconst BUBBLE_MOBILE_WIDTH = '104'\nconst BUBBLE_TABLET_DESKTOP_WIDTH = '112'\nconst GRADIENT_WIDTH = '8'\n\nexport const sliderData = {\n options: {\n mobile: {\n items_per_slide: 2,\n item_width: BUBBLE_MOBILE_WIDTH,\n slide_min_height: 'auto',\n slider_gap: '8',\n display_buttons: 'true',\n display_nav: 'true',\n display_counter: 'true',\n overflow: 'false',\n flex_auto: 'false',\n placeholder_background: 'transparent',\n display_gradients: 'false',\n gradients_color: COLOR_WHITE_1000,\n gradients_width: GRADIENT_WIDTH\n },\n tablet: {\n items_per_slide: 4,\n item_width: BUBBLE_TABLET_DESKTOP_WIDTH,\n slide_min_height: 'auto',\n slider_gap: '8',\n display_buttons: 'true',\n display_nav: 'true',\n display_counter: 'false',\n overflow: 'false',\n flex_auto: 'false',\n placeholder_background: 'transparent',\n display_gradients: 'false',\n gradients_color: COLOR_WHITE_1000,\n gradients_width: GRADIENT_WIDTH\n },\n desktop: {\n items_per_slide: 4,\n item_width: BUBBLE_TABLET_DESKTOP_WIDTH,\n slide_min_height: 'auto',\n slider_gap: '8',\n display_counter: 'false',\n display_nav: 'true',\n overflow: 'false',\n overflow_opacity: '0',\n flex_auto: 'false',\n placeholder_background: 'transparent',\n display_gradients: 'false',\n gradients_color: COLOR_WHITE_1000,\n gradients_width: GRADIENT_WIDTH\n }\n }\n}\n","import { makeId, stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { EVENT_POPIN_KEY_DOWN } from '@kissui/components'\nimport { getProduct, getPriceFormatter, getCurrency } from '@kissui/helpers/src/catalog'\nimport { getSkuComponentByType } from '@kissui/components/src/sku/services'\nimport { handlePromoClick } from '@kissui/helpers/src/gtmEvents'\nimport { getMergedProductData } from '@kissui/page-builder-sections/src/product-grid/dataTransform'\nimport '@kissui/components/src/slider-natural'\nimport '@kissui/components/src/sku-machine'\nimport { VARIATION_SMALL } from '@kissui/components/src/sku/constants'\nimport { sliderData } from './data/slider-data'\n\nconst DEFAULT_PANEL = 0\nclass HeroProductShowcaseV3 extends HTMLElement {\n constructor() {\n super()\n this.sliderData = sliderData\n this.buttonElements = null\n this.currentProducts = null\n this.displayGradients = false\n this.currentIndex = null\n this.productsCached = {}\n this.boundHandleClick = this.handleClick.bind(this)\n this.boundSliderScroll = this.onSliderScroll.bind(this)\n this.boundKeyNavTab = this.keyNavTab.bind(this)\n this.hasTabs = true\n\n this.tracking_list = ''\n this.popinId = `quick_view_popin_${makeId(5)}`\n this.props = null\n this.currency = null\n this.priceFormatter = null\n this.resizeTimer = null\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.render()\n this.refs = createRefs(this)\n this.initSlider(this.refs['slider'])\n this.bindEvent()\n this.onReady().then()\n }\n\n async onReady() {\n this.priceFormatter = await getPriceFormatter()\n this.currency = getCurrency()\n this.switchTabs({ index: DEFAULT_PANEL })\n\n this.setBgImgHeight()\n }\n\n render() {\n const { layout, campaign } = this.props\n const { heading } = this.props.copywriting\n\n this.tracking_list = heading\n this.innerHTML = `\n <nb-container\n background_retina=\"${layout.background.retina}\"\n background_desktop=\"${layout.background.desktop}\"\n background_mobile=\"${layout.background.mobile}\"\n campaign_id=\"${campaign.id}\"\n campaign_name=\"${campaign.name}\"\n campaign_position=\"${campaign.position}\"\n campaign_creative=\"${campaign.creative}\"\n contrast=\"dark\"\n classname=\"${layout.padding_bottom}\"\n lazy_load=\"false\">\n\n <div class=\"hero-product-showcase-v3__header\">\n ${this.renderSubtitle()}\n ${this.renderHeading()}\n ${this.renderContent()}\n </div>\n\n ${this.renderOneOrMultipleTabs()}\n </nb-container>\n `\n\n this.tabs = this.querySelector('.tabs')\n this.buttonElements = this.querySelectorAll('.tabs button')\n this.panelElements = this.querySelectorAll('.panel')\n }\n\n renderSubtitle() {\n const { subtitle } = this.props.copywriting\n\n if (!subtitle) {\n return ''\n }\n\n return `<h5 class='t-xs-500-caps-sl hero-product-showcase-v3__subtitle'>${subtitle}</h5>`\n }\n renderHeading() {\n const { heading, title_image_m, title_image_d, title_image_alt } = this.props.copywriting\n const titleImage = viewportHelper.is.mobile ? title_image_m : title_image_d\n\n if (titleImage) {\n return `<nb-img file=\"${titleImage}\" description=\"${title_image_alt}\"></nb-img>`\n }\n\n if (!heading) {\n return ''\n }\n\n return `<h2 class='h-2xl-700 hero-product-showcase-v3__heading'>${heading}</h2>`\n }\n renderContent() {\n const { text } = this.props.copywriting\n\n if (!text) {\n return ''\n }\n\n return `<p class='t-sm-500 hero-product-showcase-v3__desc'>${text}</p>`\n }\n\n renderOneOrMultipleTabs() {\n const { tabs = [] } = this.props.copywriting\n if (tabs.length === 1) {\n return this.renderOnePanel()\n } else {\n return this.renderTabs() + this.renderPanels()\n }\n }\n\n renderOnePanel() {\n this.hasTabs = false\n const { tabs } = this.props.copywriting\n\n if (!tabs || !tabs.length) {\n return ''\n }\n\n const products_number = tabs[0].products.length\n\n return `\n <div class='hero-product-showcase-v3__panels' data-ref='slider' tabindex='-1'>\n <div class=\"panel\" data-ref=\"panel-0\" products-number=\"${products_number}\">\n <nb-loader></nb-loader>\n </div>\n </div>\n `\n }\n\n renderTabs() {\n this.hasTabs = true\n this.classList.add('hasSlider')\n\n const { a11y_label_tablist, tabs } = this.props.copywriting\n\n if (!tabs || !tabs.length) {\n return ''\n }\n\n const renderedTabs = tabs.reduce(\n (output, tab, index) => `${output}${this.renderTab(tab, index)}`,\n ''\n )\n\n return `<div class='tabs' role='tablist' aria-label='${a11y_label_tablist}' tab-number='${tabs.length}'>${renderedTabs}</div>`\n }\n\n renderTab({ label, label_mobile, a11y_label, icon, icon_active }, index, active) {\n const renderedLabel =\n viewportHelper.is.mobile && label_mobile && label_mobile !== '' ? label_mobile : label\n const iconToUse = active ? icon_active : icon\n const tabIndex = active ? 0 : -1\n const ariaSelected = active ? 'true' : 'false'\n\n return `\n <button\n data-index=\"${index}\"\n role=\"tab\"\n id=\"hero-product-showcase-tab-${index}\"\n aria-controls=\"hero-product-showcase-tabpanel-${index}\"\n aria-label=\"${a11y_label}\"\n aria-selected=\"${ariaSelected}\"\n tabindex=\"${tabIndex}\">\n <nb-icon icon=\"${iconToUse}\" class=\"\"></nb-icon>\n <span class=\"t-xs-700-caps-sl\">\n ${renderedLabel}\n </span>\n </button>\n `\n }\n\n renderPanels() {\n const { tabs } = this.props.copywriting\n\n if (!tabs || !tabs.length) {\n return ''\n }\n\n const renderedPanels = tabs.reduce(\n (output, _tab, index) => `${output}${this.renderPanel(index)}`,\n ''\n )\n\n return `<div class='hero-product-showcase-v3__panels' data-ref='slider' tabindex='-1'>${renderedPanels}</div>`\n }\n\n renderPanel(index) {\n const { tabs } = this.props.copywriting\n\n if (!tabs || !tabs.length) {\n return ''\n }\n\n const products_number = tabs[index].products.length\n\n return `\n <div class=\"panel\"\n role=\"tabpanel\"\n data-ref=\"panel-${index}\"\n id=\"hero-product-showcase-tabpanel-${index}\"\n aria-label=\"${tabs[index].a11y_label}\"\n products-number=\"${products_number}\">\n <nb-loader></nb-loader>\n </div>\n `\n }\n\n async switchTabs({ index, alreadyScrolled = false, userAction = false } = {}) {\n const { tabs } = this.props.copywriting\n\n if (!tabs || !tabs.length || !tabs[index]) {\n return\n }\n\n this.currentProducts = tabs[index].products\n this.currentIndex = index\n\n if (this.hasTabs) {\n this.setButtonSelected()\n }\n\n if (!alreadyScrolled) {\n await this.goSlider()\n\n const campaign = this.props.campaign\n if (userAction && campaign?.id) {\n const label = tabs[index].label || 'not set'\n handlePromoClick({ campaign, cta_name: `TAB - ${label}` })\n }\n }\n\n if (!this.productsCached[this.currentIndex]) {\n this.productsCached[this.currentIndex] = []\n await this.loadProducts()\n }\n }\n\n async loadProducts() {\n this.productsCached[this.currentIndex] = this.currentProducts\n\n await this.renderProducts()\n }\n\n renderSliderWithProducts(products, totalProducts) {\n if (!products || !products.length) {\n return\n }\n\n if (totalProducts > 4) {\n totalProducts = 4\n }\n\n this.refs[`panel-${this.currentIndex}`].innerHTML = `\n <nb-slider-natural\n data-products=\"${totalProducts}\"\n data=\"${stringifyForAttribute(this.sliderData)}\">\n ${products}\n </nb-slider-natural>\n `\n }\n async renderProducts() {\n const { tabs } = this.props.copywriting\n if (!tabs || !tabs.length) {\n return\n }\n\n try {\n const renderedProducts = await Promise.all(\n this.productsCached[this.currentIndex]\n .filter(product => product)\n .map((product, index) => this.renderProduct(product, index))\n ).then(responses => responses.join(''))\n\n this.renderSliderWithProducts(\n renderedProducts,\n this.productsCached[this.currentIndex].length\n )\n } catch (error) {\n console.error(error)\n }\n }\n\n async renderProduct(product, index) {\n const { quick_view_plp } = this.props.copywriting\n\n if (!product.sku) {\n return ''\n }\n\n try {\n const productInfo = await getProduct(product.sku)\n const mergedProductData = getMergedProductData(\n productInfo,\n product,\n this.props,\n this.priceFormatter,\n this.currency\n )\n\n mergedProductData.variation = VARIATION_SMALL\n mergedProductData.quick_view_plp = quick_view_plp\n\n const tag = getSkuComponentByType(mergedProductData)\n const elementProduct = document.createElement(tag)\n elementProduct.setAttribute('data', JSON.stringify(mergedProductData))\n elementProduct.setAttribute('tracking_position', index + 1)\n elementProduct.setAttribute('tracking_list', 'Hero Showcase - ' + this.tracking_list)\n elementProduct.setAttribute('campaign_creative', this.props.campaign?.creative)\n return `<li>${elementProduct.outerHTML}</li>`\n } catch (error) {\n console.error(`Error getting product ${product.sku}: ${error.message}`)\n this.props.products.splice(this.props.products.indexOf(product.sku), 1)\n return ''\n }\n }\n\n initSlider(ref) {\n if (!ref) {\n return\n }\n\n const { tabs } = this.props.copywriting\n\n if (!tabs || !tabs.length) {\n return\n }\n\n this.slider = ref\n this.slider.lastScrollPosition = this.slider.scrollLeft\n this.slider.itemNumber = tabs.length\n this.createSliderAdditionalCopies()\n this.getSliderPositions()\n this.getSliderWidth()\n this.bindSliderScroll()\n }\n\n createSliderAdditionalCopies() {\n const {\n a11y_slider_previous_button,\n a11y_slider_next_button,\n a11y_goto_slide = 'Goto slide'\n } = this.props.copywriting.navigation\n\n this.sliderData['a11y_labels'] = {\n prev: a11y_slider_previous_button,\n next: a11y_slider_next_button,\n nav: a11y_goto_slide\n }\n }\n\n getSliderPositions() {\n this.slider.sliderPositions = []\n\n this.querySelectorAll('.panel').forEach(element => {\n this.slider.sliderPositions.push(element.offsetLeft)\n })\n }\n\n getSliderWidth() {\n this.slider.width = this.slider.clientWidth\n }\n\n bindSliderScroll() {\n this.slider.addEventListener('scroll', this.boundSliderScroll)\n }\n\n unbindSliderScroll() {\n this.slider.removeEventListener('scroll', this.boundSliderScroll)\n }\n\n goSlider() {\n const previousOverflowX = this.slider.style.overflowX\n\n this.slider.style.overflowX = 'scroll'\n this.unbindSliderScroll()\n\n // Wait for the browser to update the styles\n setTimeout(() => {\n try {\n this.slider.scrollTo({\n left: this.slider.sliderPositions[this.currentIndex],\n behavior: 'smooth'\n })\n } catch (error) {\n // TODO: Properly handle the errors.\n }\n }, 0)\n\n this.slider.style.overflowX = previousOverflowX\n setTimeout(() => {\n this.bindSliderScroll()\n }, 1000)\n }\n\n onSliderScroll() {\n if (this.isScrolling) {\n clearTimeout(this.isScrolling)\n }\n\n this.isScrolling = setTimeout(() => {\n const scrollPosition = this.slider.scrollLeft\n const index = this.slider.sliderPositions.indexOf(scrollPosition)\n if (index >= 0) {\n this.switchTabs({ index, alreadyScrolled: true })\n this.panelElements[index].focus()\n }\n }, 100)\n }\n\n setButtonSelected() {\n const {\n buttonElements,\n panelElements,\n currentIndex,\n props: {\n copywriting: { tabs }\n }\n } = this\n\n if (!buttonElements) {\n return\n }\n\n buttonElements.forEach((tab, i) => {\n const { icon } = tabs[i]\n const nbIcon = tab.querySelector('nb-icon')\n\n tab.setAttribute('aria-selected', 'false')\n tab.querySelector('span').classList.remove('t-xs-700-caps-sl')\n tab.querySelector('span').classList.add('t-xs-500-caps-sl')\n tab.setAttribute('tabindex', '-1')\n\n if (nbIcon) {\n nbIcon.setAttribute('icon', icon)\n }\n })\n\n panelElements.forEach(tabpanel => {\n this.setChildrenNotFocusable(tabpanel, true)\n tabpanel.setAttribute('aria-hidden', true)\n tabpanel.setAttribute('tabindex', '-1')\n })\n\n buttonElements[currentIndex].setAttribute('aria-selected', 'true')\n buttonElements[currentIndex].querySelector('span').classList.remove('t-xs-500-caps-sl')\n buttonElements[currentIndex].querySelector('span').classList.add('t-xs-700-caps-sl')\n buttonElements[currentIndex].removeAttribute('tabindex')\n\n const activeIcon = tabs[currentIndex].icon_active\n const activeNbIcon = buttonElements[currentIndex].querySelector('nb-icon')\n\n if (activeNbIcon) {\n activeNbIcon.setAttribute('icon', activeIcon)\n }\n\n this.setChildrenNotFocusable(panelElements[currentIndex], false)\n panelElements[currentIndex].removeAttribute('aria-hidden')\n panelElements[currentIndex].setAttribute('tabindex', '0')\n }\n\n setChildrenNotFocusable(el, value = true) {\n const focusableChildrenElements = el.querySelectorAll('button, [href], [tabindex=\"0\"]')\n\n if (focusableChildrenElements) {\n focusableChildrenElements.forEach(element => {\n value ? element.setAttribute('tabindex', '-1') : element.removeAttribute('tabindex')\n })\n }\n }\n\n setBgImgHeight() {\n const bgImg = document.querySelector('.cb-bg-img')\n const header = document.querySelector('.hero-product-showcase-v3__header')\n const tabs = document.querySelector('.tabs')\n const tabsHeight = tabs ? tabs.offsetHeight : 0\n const defaultHeight = 350 + parseInt(tabsHeight, 10)\n\n bgImg.style.height = `${defaultHeight + header.offsetHeight}px`\n\n window.addEventListener('resize', () => {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = setTimeout(() => {\n this.setBgImgHeight()\n }, 250)\n })\n }\n\n handleClick(e) {\n this.switchTabs({ index: e.target.dataset.index, userAction: true })\n }\n\n keyNavTab(e) {\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n if (this.currentIndex > 0) {\n this.currentIndex--\n this.keyNavSwitchTab()\n }\n break\n case 'ArrowRight':\n e.preventDefault()\n if (this.currentIndex < this.buttonElements.length - 1) {\n this.currentIndex++\n this.keyNavSwitchTab()\n }\n break\n case 'Home':\n e.preventDefault()\n this.currentIndex = 0\n this.keyNavSwitchTab()\n break\n case 'End':\n e.preventDefault()\n this.currentIndex = this.buttonElements.length - 1\n this.keyNavSwitchTab()\n break\n default:\n break\n }\n }\n\n keyNavSwitchTab() {\n this.switchTabs({ index: this.currentIndex })\n this.buttonElements[this.currentIndex].focus()\n }\n\n bindEvent() {\n this.unbindEvent()\n\n if (this.buttonElements) {\n this.buttonElements.forEach(element => {\n element.addEventListener('click', this.boundHandleClick)\n })\n }\n\n if (this.tabs) {\n this.tabs.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNavTab)\n }\n }\n\n unbindEvent() {\n if (this.buttonElements) {\n this.buttonElements.forEach(element => {\n element.removeEventListener('click', element.boundHandleClick)\n })\n }\n\n if (this.tabs) {\n this.tabs.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNavTab)\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n window.removeEventListener('resize', () => {\n this.resizeTimer = null\n })\n }\n}\n\ncustomElements.get('nb-hero-product-showcase-v3') ||\n customElements.define('nb-hero-product-showcase-v3', HeroProductShowcaseV3)\n\nexport default HeroProductShowcaseV3\n"],"names":["makeId","length","result","characters","i","charAt","Math","floor","random","removeEmptyValues","obj","key","undefined","stringifyForAttribute","data","escapeHtml","JSON","stringify","text","map","replace","m","DOMParser","sanitizeString","toString","createProps","attributes","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","parse","error","console","log","extract","refs","$ref","ref","dataset","refArray","match","getRefArray","name","index","BREAKPOINT_TABLET","EVENT_POPIN_KEY_DOWN","COLOR_WHITE_1000","CONTRAST_LIGHT","helper","is","innerWidth","vw","devicePixelRatio","window","mobile","mobile_tablet","tablet","desktop","retina","lt","getCurrency","config","padl","namespace","dataLayer","app","currency","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getPriceFormatter","async","napi","priceFormat","getProduct","sku","catalog","trimSku","getTechnologyName","productData","techno","technologies","substring","indexOf","isBundled","sales_multiple","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","unitQuantity","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","apiOverride","pageBuilderData","images","headline","description","api_override","image","icon","url","push","main","emitCustomEvent","eventName","customEvent","CustomEvent","detail","bubbles","cancelable","composed","dispatchEvent","raisedByPB","selectPromotion","args","event","eventData","cta_name","event_raised_by","ecommerce","Object","keys","id","creative","position","promotion_id","promotion_name","creative_slot","creative_name","gtmDataObject","productClick","list","productInfo","product","getProductInfo","productPayload","getProductPayload","actionField","internationalName","internationalId","category","unitPrice","legacyId","bundled","inStock","type","technology","item","split","pop","join","price","dimension44","toLowerCase","includes","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","eventAction","currencyCode","eventRaisedBy","click","products","getDataLayer","padlNamespace","isLoggedIn","user","COMMON_URL","ORGANIC_LOGO_IMG_EU","ORGANIC_LOGO_IMG_US","ORGANIC_LOGO_IMG_CA","ORGANIC_LOGO_IMG_BR","ORGANIC_LOGO_IMG_JP","ORGANIC_LOGO_IMG_BE","getFinalPrice","show_sleeve_price","showCapsulePrice","final_price","price_per_capsule","round","organicLogoImg","getMarketCode","market","toLocaleLowerCase","getOrganicLogo","getMaxIntensity","INTENSITY_MAX_OL","getCurrentVoltage","VOLTAGE_110","getColorModel","colorCategories","colorShade","code","cssColorCode","link","getVoltageSwitcher","colorVariants","voltage_list","currentVoltage","oppositeVoltages","voltage","label","oppositeVoltage","oppositeVoltageMachineName","oppositeVariation","machine","selected","VARIATION_PLP","VARIATION_PDP","VARIATION_SMALL","getMergedProductData","pageBuilderProductProps","pageBuilderProps","priceFormatter","options","variant","labels","strikethrough_price","additional_message","additional_message_icon","additional_message_link","longSku","unit_quantity","category_name","rangeData","label_range","short","variation","image_alt_text","pdpURLs","highlighted","dataTransformObjectProductType","getMergedProductCoffeeData","bundle_details","isBundledResult","option","intensity","capsuleProperties","max_intensity","show_capsule_price","getMergedProductMachineData","show_voltage","voltage_label","a11y_voltage_label","ratingsAndReviews","ratings","voltageData","colors","productColor","activeSku","max_colors","show_ratings","minimum_rating","getMergedProductGiftCardData","_","default_image","element","Error","Event","document","createEvent","initEvent","readEvent","e","SliderNatural","HTMLElement","constructor","__privateAdd","this","_waitForSliderToBeSized","_set","_getOption","_setProperties","_render","_renderButtons","_renderButton","_renderNav","_renderBullet","_renderCounter","_renderGradients","_renderSafariFix","_calculateItemsPerSlide","_getSliderPositions","_setCss","_setCssSlideWidth","_setCssSlideMinHeight","_setCssSliderGap","_setCssFlexAuto","_setCssPlaceholder","_setCssItemsPerSlide","_applyCenteredLayout","_updateStates","_updateStatesScroll","_setActiveButtons","_setActiveBullet","_setCounter","_setActiveSlides","_gotoDefaultPosition","_onScroll","_getOpacityParams","_setOpacity","_switchBullets","_onPrevClick","_onNextClick","_onNavClick","_dispatchReady","_bindEvent","_unbindEvent","contrast","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","boundPrevClick","__privateMethod","onPrevClick_fn","bind","boundNextClick","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","connectedCallback","slot","innerHTML","render_fn","call","testId","setProperties_fn","loops","waitForSliderToBeSized_fn","then","initSlider","dispatchReady_fn","catch","finally","wait","clearInterval","slidesElements","querySelectorAll","itemNumber","set_fn","item_width","items_per_slide","calculateItemsPerSlide_fn","setCssSlideWidth_fn","setCssItemsPerSlide_fn","setCssFlexAuto_fn","maxSlides","renderButtons_fn","renderNav_fn","renderCounter_fn","renderGradients_fn","applyCenteredLayout_fn","getSliderPositions_fn","getOpacityParams_fn","setOpacity_fn","updateStates_fn","bindEvent_fn","gotoDefaultPosition_fn","renderSafariFix_fn","updateSlider","instantly","goToSlide","parseInt","currentIndex","carousel","scrollTo","left","sliderPositions","behavior","disconnectedCallback","unbindEvent_fn","WeakSet","#waitForSliderToBeSized","Promise","resolve","reject","setInterval","offsetWidth","#set","value","normalisedValue","getOption_fn","convertToCamelCase","str","arr","low","s","k","toUpperCase","#getOption","isNaN","parseFloat","#setProperties","a11y_labels","container","querySelector","wrapper","viewportHelper","property","classList","add","buttonsContrast","setAttribute","setCssSlideMinHeight_fn","setCssSliderGap_fn","setCssPlaceholder_fn","#render","#renderButtons","prevButton","nextButton","remove","renderButton_fn","#renderButton","pos","renderInCounter","campaign","buttonContrast","isPrev","buttonEl","createElement","setAttributes","attrs","size","icon_right","campaign_creative","campaign_id","campaign_name","campaign_position","counter","prepend","append","#renderNav","nav","bullets","renderBullet_fn","appendChild","navElements","#renderBullet","#renderCounter","#renderGradients","gradientsWidth","setCss_fn","gradientsColor","#renderSafariFix","isSafari","agent","navigator","userAgent","test","safariFix","safariFixWidth","paddingCorrection","sliderGap","style","setProperty","#calculateItemsPerSlide","itemWidth","scrollWidth","#getSliderPositions","maxScroll","firstItemOffsetLeft","offsetLeft","forEach","#setCss","isRem","#setCssSlideWidth","itemWidthAuto","clientWidth","#setCssSlideMinHeight","slideMinHeight","#setCssSliderGap","#setCssFlexAuto","#setCssPlaceholder","placeholderBackground","#setCssItemsPerSlide","#applyCenteredLayout","#updateStates","setActiveButtons_fn","setActiveBullet_fn","setCounter_fn","setActiveSlides_fn","updateStatesScroll_fn","#updateStatesScroll","#setActiveButtons","#setActiveBullet","#setCounter","textContent","#setActiveSlides","tempIndex","removeAttribute","#gotoDefaultPosition","#onScroll","isScrolling","clearTimeout","setTimeout","carouselScrollLeft","scrollLeft","switchBullets_fn","#getOpacityParams","getComputedStyle","getPropertyValue","itemWidthAdjusted","#setOpacity","scrollX","itemX","percentage","opacityPercentage","finalOpacity","firstElementChild","#switchBullets","alreadyScrolled","#onPrevClick","#onNextClick","#onNavClick","target","#dispatchReady","#bindEvent","addEventListener","#unbindEvent","removeEventListener","customElements","get","define","EVENT_COLOR_CLICKED","fetcherService","fetcher","apiRatings","apiPriceFormat","getApiProduct","getOne","withRating","fetchOne","apiProduct","productCategories","productDetails","supercategories","categoryEncoded","getCategory","getProductCategories","overrides","pdp_urls","getValueObject","slides","productRatings","ratingEnabled","rating","getRating","getValueNumber","giftcard_price","merge","force","mergedProduct","empty","defaultValue","toFloat","ratingAverage","summary","decimal","toFixed","loadPriceFormat","getAll","productList","fetchedProduct","splice","formatPrice","_getCurrency","color","render","createEventListeners","handleClick","a11y_label","outerHTML","Colors","_apiProducts","_colors","_maxColors","updateMaxColors","fetchColors","hasColorData","every","hasAllProps","onColorChange","heading","renderColors","renderExtraColors","renderColor","extra_url","extra_title","extraColorsLength","max","clampColor","preparedColors","prepareColors","fetchColor","prevent","apiColor","cssCode","hasSKU","slice","colorItem","$event","CardLabels","super","direction","renderLabels","bgColor","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","_diff","elem","_getNodeType","node","nodeType","tagName","_getNodeContent","childNodes","domNodes","Array","prototype","templateNodes","count","parentNode","removeChild","cloneNode","replaceChild","templateContent","fragment","createDocumentFragment","templateHTML","parseFromString","body","onDestroy","renderImage","quick_view_plp","theme","img","renderClass","show_view","linkHref","trim","isPdp","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","renderLink","a11y_product_card","a11yProductName","renderHeadline","is_headline_hidden","renderLabelTechnology","label_technology","renderLabelRange","getStrikethroughPriceElement","component","fetchStrikethroughPrice","strikethroughPrice","html","getFormattedPrice","renderAddToCart","activeLongSku","contact_cta","hidePrice","rendererName","show_view_details","view_details_label","disableTracking","buttonSize","getButtonSize","cta_url","cta_label","contact_cta_text","contact_url_anchor","is_b2b","isArray","some","tech","checkForB2B","skuProp","activeLongSkuProp","disableTrackingProp","getComputedProps","b2bLoggedIn","remainingCases","b2bNotLoggedIn","rawPrice","VARIATION_CROSS_SELL","getCapsuleFeatures","acidity","bitterness","roastLevel","roast","getSkuQuickViewProp","popinId","skuData","componentType","mergedProductData","getMergedProductDataForComponentType","addToCartProps","getAddToCartProperties","isVariationOnPLP","getPlpQuickViewProps","getCrossSellQuickViewProps","matchedProduct","productPageBuilder","getAddToCartProps","commonProps","Number","label_capsules","capsule_price_label","capsule_price_syntax","show_sleeve","sleeve_syntax","number_of_sleeves","label_sleeves","label_sleeve","popin","popin_id","close","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","copywriting","sku_quick_view","Sku","isQuickViewPlp","boundOnPDPLinkClick","onPDPLinkClick","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","renderVisual","renderHeader","renderInformation","renderQuickView","renderPricing","renderAction","renderFooter","bindEvent","renderHeaderDefault","renderLogos","fair_trade","alt_fair_trade","is_organic","alt_organic","only_vertuo_next","alt_vertuo_next","is_rainforest","alt_rainforest","is_sustainable","alt_sustainable","is_q_certified_arabica","alt_q_certification_arabica","logos","renderVisualDefault","hasAttribute","sleevePrice","hasPricePerSleeve","renderInformationDefault","quick_view","tracking_list","tracking_position","colorsSkusList","renderPricingDefault","isPortrait","renderStrikethroughPrice","payload","display","renderPrice","finalPrice","renderActionDefault","actionSlot","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","Ze","handlePLPVariation","ti","handleCrossSellVariation","more_info","newQuickViewElement","getSkuQuickViewData","preventDefault","trackComponentInteraction","actionType","productType","component_name","action_type","item_id_event","item_name_event","item_category_event","item_technology_event","item_range_event","item_price_event","eventCategory","eventLabel","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","DISPLAY_COLOR_MAX","a11y_extra_color","getRatingDetails","itemStr","localStorage","getItem","Date","getTime","expiry","removeItem","getWithExpiry","setWithExpiry","setItem","isRated","reviewCount","renderRatings","ratingElementBlock","err","Deferred","promise","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","getBoundingClientRect","top","currentTime","initialTimestamp","performance","now","deltaScroll","resolveScrollDuration","viewportHeight","innerHeight","bodyHeight","clientHeight","abs","finalTimestamp","requestAnimationFrame","step","currentTimestamp","moveStep","reviewLink","boundOnColorClick","onColorClick","boundOnReviewLinkClick","onReviewLinkClick","a11y_energy_label","energy_level","level","renderEnergyLabel","renderInformationPDP","renderInformationPLP","showVoltage","review_cta","reviews_cta","ctaLabel","renderRatingsWithData","renderVoltage","formatter","newLabels","c","responsiveImages","standard","sliderData","slide_min_height","slider_gap","display_buttons","display_nav","display_counter","flex_auto","placeholder_background","display_gradients","gradients_color","gradients_width","overflow_opacity","HeroProductShowcaseV3","buttonElements","currentProducts","productsCached","boundHandleClick","boundSliderScroll","onSliderScroll","boundKeyNavTab","keyNavTab","hasTabs","resizeTimer","slider","switchTabs","setBgImgHeight","layout","background","padding_bottom","renderSubtitle","renderContent","renderOneOrMultipleTabs","tabs","panelElements","subtitle","title_image_m","title_image_d","title_image_alt","titleImage","renderOnePanel","renderTabs","renderPanels","a11y_label_tablist","renderedTabs","output","tab","renderTab","label_mobile","icon_active","active","_tab","renderPanel","products_number","userAction","setButtonSelected","goSlider","cleanedData","handlePromoClick","loadProducts","renderProducts","renderSliderWithProducts","totalProducts","renderedProducts","renderProduct","responses","tag","getSkuComponentByType","is_machine_b2b","elementProduct","message","lastScrollPosition","createSliderAdditionalCopies","getSliderPositions","getSliderWidth","bindSliderScroll","a11y_slider_previous_button","a11y_slider_next_button","a11y_goto_slide","navigation","prev","next","width","unbindSliderScroll","previousOverflowX","overflowX","focus","nbIcon","tabpanel","setChildrenNotFocusable","activeIcon","activeNbIcon","el","focusableChildrenElements","bgImg","header","tabsHeight","offsetHeight","defaultHeight","height","keyNavSwitchTab"],"mappings":"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"}