{"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        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        \"'\": '&#039;'\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, '&quot;').replace(/'/g, '&apos;')\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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"}