{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/helpers/src/dataLayer.js","../../../packages/helpers/src/cremaDataHelper.js","../../../packages/components/src/card-logos/cardLogos.js","../../../packages/components/src/energy-label/energyLabel.js","../../../packages/components/src/intensity/intensity.js","../../../packages/helpers/src/utils.ts","../../../packages/components/src/constants.mjs","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/components/src/plp-product-card/fragments/bundle.js","../../../packages/helpers/src/colors.helpers.js","../../../packages/components/src/plp-product-card/fragments/features.js","../../../packages/components/src/plp-product-card/fragments/lazyLoad.js","../../../packages/components/src/plp-product-card/fragments/price.js","../../../packages/helpers/src/getCurrency.js","../../../packages/helpers/src/catalog.js","../../../packages/components/src/plp-product-card/fragments/renderStrikethroughPrice.js","../../../packages/components/src/plp-product-card/fragments/sleeve.js","../../../packages/components/src/plp-product-card/fragments/priceWrapper.js","../../../packages/components/src/plp-product-card/fragments/priceCapsule.js","../../../packages/components/src/plp-product-card/fragments/priceA11y.js","../../../packages/components/src/plp-product-card/fragments/outOfStock.js","../../../packages/components/src/plp-product-card/fragments/addToCart.js","../../../packages/components/src/plp-product-card/fragments/ratings.js","../../../packages/components/src/slider/js/constants.js","../../../packages/components/src/slider/js/CarouselTouchPlugin.js","../../../packages/components/src/slider/js/CarouselCreamUiHack.js","../../../packages/components/src/slider/js/Carousel.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/components/src/slider/slider.js","../../../packages/components/src/plp-product-card/components/plp-product-card-image-slider.js","../../../packages/components/src/plp-product-card/fragments/header.js","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/plp-product-card/fragments/image.js","../../../packages/components/src/plp-product-card/fragments/slider.js","../../../packages/components/src/plp-product-card/fragments/subscription.js","../../../packages/components/src/colors/components/color/constants.mjs","../../../packages/components/src/sku/services/index.js","../../../packages/components/src/plp-product-card/plp-product-card.js","../../../packages/components/src/plp-product-card/fragments/labelTechnology.js","../../../packages/components/src/plp-product-card/fragments/labels.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/helpers/src/energy-label.helpers.js","../../../packages/components/src/plp-product-card/fragments/labelRange.js","../../../packages/components/src/plp-product-card/fragments/heading.js","../../../packages/components/src/plp-product-card/fragments/headline.js","../../../packages/helpers/src/intensity.helpers.js","../../../packages/components/src/plp-product-card/fragments/additionalMessage.js","../../../packages/components/src/plp-product-card/fragments/setCardTheme.js"],"sourcesContent":["const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n    const data = getData([...attributes])\n    const props = [...attributes]\n        .filter(attribute => attribute.nodeName !== 'data')\n        .reduce((all, attr) => {\n            return { ...all, [attr.nodeName]: attr.nodeValue }\n        }, {})\n\n    if (isNil(data)) {\n        return props\n    }\n\n    try {\n        return { ...props, ...JSON.parse(data.nodeValue) }\n    } catch (error) {\n        console.log('ERROR: No data', error, data?.nodeValue)\n    }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass 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>${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 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 { LOGO_IMG_MAP } from '@kissui/helpers/src/cremaDataHelper'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLogos extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        // individual props for each logo is there for retro compatibility\n        // logos is the prop that we should use going forward to add any logo\n        let { direction = 'row', logos } = this.props\n        let fair_trade\n        let alt_fair_trade\n        let is_organic\n        let alt_organic\n        let only_vertuo_next\n        let alt_vertuo_next\n        let is_rainforest\n        let alt_rainforest\n        let is_sustainable\n        let alt_sustainable\n        let is_q_certified_arabica\n        let alt_q_certification_arabica\n\n        this.classList.add(\n            `${direction === 'column' ? 'direction-column' : 'direction-' + direction}`\n        )\n\n        let logos_list = []\n        if (logos == null) {\n            fair_trade = this.props?.fair_trade\n            alt_fair_trade = this.props?.alt_fair_trade\n            is_organic = this.props?.is_organic\n            alt_organic = this.props?.alt_organic\n            only_vertuo_next = this.props?.only_vertuo_next\n            alt_vertuo_next = this.props?.alt_vertuo_next\n            is_rainforest = this.props?.is_rainforest\n            alt_rainforest = this.props?.alt_rainforest\n            is_sustainable = this.props?.is_sustainable\n            alt_sustainable = this.props?.alt_sustainable\n            is_q_certified_arabica = this.props?.is_q_certified_arabica\n            alt_q_certification_arabica = this.props?.alt_q_certification_arabica\n        } else if (logos.length === undefined) {\n            // Logos exists but is not an array, this is the old format\n            fair_trade = logos?.fair_trade\n            alt_fair_trade = logos?.alt_fair_trade\n            is_organic = logos?.is_organic\n            alt_organic = logos?.alt_organic\n            only_vertuo_next = logos?.only_vertuo_next\n            alt_vertuo_next = logos?.alt_vertuo_next\n            is_rainforest = logos?.is_rainforest\n            alt_rainforest = logos?.alt_rainforest\n            is_sustainable = logos?.is_sustainable\n            alt_sustainable = logos?.alt_sustainable\n            is_q_certified_arabica = logos?.is_q_certified_arabica\n            alt_q_certification_arabica = logos?.alt_q_certification_arabica\n        } else if (logos.length) {\n            logos_list = [...logos]\n        }\n\n        // here we fill logos with logos taken from individual props\n        ;[\n            [fair_trade, 'fair_trade', alt_fair_trade, logos_list],\n            [is_organic, 'is_organic', alt_organic, logos_list],\n            [only_vertuo_next, 'only_vertuo_next', alt_vertuo_next, logos_list],\n            [is_rainforest, 'is_rainforest', alt_rainforest, logos_list],\n            [is_sustainable, 'is_sustainable', alt_sustainable, logos_list],\n            [\n                is_q_certified_arabica,\n                'is_q_certified_arabica',\n                alt_q_certification_arabica,\n                logos_list\n            ]\n        ].forEach(param => this.appendLogo.apply(this, param))\n\n        this.innerHTML = logos_list\n            .map(logo => `<img src=\"${LOGO_IMG_MAP[logo.name]}\" alt=\"${logo.alt}\" loading=\"lazy\">`)\n            .join('')\n    }\n\n    appendLogo(param, name, alt, list) {\n        if (!!param && !this.hasLogo(list, name)) {\n            list.push({ name, alt })\n        }\n    }\n\n    hasLogo(logosList, logoName) {\n        return logosList.some(logo => logo.name === logoName)\n    }\n}\n\ncustomElements.get('nb-card-logos') || customElements.define('nb-card-logos', CardLogos)\n\nexport default CardLogos\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass EnergyLabel extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.level = ''\n        this.levelPlus = ''\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        const { a11y_label, level } = this.props\n\n        if (a11y_label === '' || level === '') {\n            return ''\n        }\n\n        this.classList.add(`level_${level}`)\n\n        switch (level) {\n            case 'g':\n                this.level = 'G'\n                break\n            case 'f':\n                this.level = 'F'\n                break\n            case 'e':\n                this.level = 'E'\n                break\n            case 'd':\n                this.level = 'D'\n                break\n            case 'c':\n                this.level = 'C'\n                break\n            case 'b':\n                this.level = 'B'\n                break\n            case 'a4':\n                this.level = 'A'\n                break\n            case 'a3':\n                this.level = 'A'\n                this.levelPlus = '+'\n                break\n            case 'a2':\n                this.level = 'A'\n                this.levelPlus = '++'\n                break\n            default:\n                this.level = 'A'\n                this.levelPlus = '+++'\n                break\n        }\n\n        this.innerHTML = `\n            <mark>\n                ${this.level}\n                ${this.levelPlus !== '' ? `<sup>${this.levelPlus}</sup>` : ''}\n                <span class=\"sr-only\">${a11y_label} ${this.level}${this.levelPlus}</span>\n            </mark>\n        `\n    }\n}\n\ncustomElements.get('nb-energy-label') || customElements.define('nb-energy-label', EnergyLabel)\n\nexport default EnergyLabel\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass Intensity extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        const { intensity_label = 'Intensity', a11y_intensity_max, max_intensity } = this.props\n        const intensity = parseInt(this.props.intensity)\n\n        if (!intensity || isNaN(intensity)) {\n            return ''\n        }\n\n        const a11yIntensityMax = a11y_intensity_max?.replace('{max_intensity}', max_intensity)\n\n        this.innerHTML = `\n            <p>\n                <span class=\"sr-only\">${intensity_label} ${intensity} ${a11yIntensityMax}</span>\n                <div class=\"t-xs-500-sl\" aria-hidden=\"true\">${intensity_label}</div>\n                ${this.renderIntensityMin(intensity)}\n                <div class=\"t-xs-700-sl\" aria-hidden=\"true\">${intensity}</div>\n                ${this.renderIntensityMax(intensity)}\n            </p>\n        `\n    }\n\n    renderIntensityMin(intensity) {\n        const min_intensity = 0\n\n        return new Array(Math.max(intensity, 0) - min_intensity)\n            .fill('<span class=\"bar filled\"></span>')\n            .join('')\n    }\n\n    renderIntensityMax(intensity) {\n        let { max_intensity } = this.props\n        if (!max_intensity || max_intensity === 'undefined') {\n            max_intensity = 14\n        }\n\n        return new Array(parseInt(max_intensity) - Math.min(intensity, parseInt(max_intensity)))\n            .fill('<span class=\"bar\"></span>')\n            .join('')\n    }\n}\n\ncustomElements.get('nb-intensity') || customElements.define('nb-intensity', Intensity)\n\nexport default Intensity\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    ESC: 27,\n    SPACE: 32,\n    ENTER: 13,\n    TAB: 9\n}\n\nexport function capitalize(s = '') {\n    return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n    const arr = str.match(/[a-z]+|\\d+/gi)\n    if (!arr) { return str }\n    return arr.map((m, i) => {\n        let low = m.toLowerCase()\n        if (i !== 0) {\n            low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n        }\n        return low\n    }).join(\"\")\n}\n\nexport function slug(s = '') {\n    return s\n        .toLowerCase()\n        .trim()\n        .replace(/\\s+/g, '-') // Replace spaces with -\n        .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n        .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n    return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n    return target + '%'\n}\n\nexport function parseHTML(str: string) {\n    const tmp = document.implementation.createHTMLDocument('')\n    tmp.body.innerHTML = str\n    return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n    const tmp = document.implementation.createHTMLDocument('')\n    tmp.body.innerHTML = str\n    return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n    var result = ''\n    var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n    var charactersLength = characters.length\n    for (var i = 0; i < length; i++) {\n        result += characters.charAt(Math.floor(Math.random() * charactersLength))\n    }\n    return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n    const findText = [\n        'Default campaign ID (tracking missing in Page Builder export)',\n        'Default campaign name (tracking missing in Page Builder export)',\n        'promoname', \n        'promoid', \n        'promocreative', \n        'undefined'\n    ];\n    \n    for (let key in obj) {\n        const value = obj[key];\n        \n        if (value === null || value === undefined || value === '') {\n            delete obj[key];\n            continue;\n        }\n        \n        if (typeof value === 'string') {\n            for (const text of findText) {\n                if (value.includes(text)) {\n                    delete obj[key];\n                    break;\n                }\n            }\n        }\n    }\n    \n    return obj;\n}\n\nexport function makeHash(str: string) {\n    var hash = 0,\n        i,\n        chr\n    if (!str) {\n        return hash\n    }\n    for (i = 0; i < str.length; i++) {\n        chr = str.charCodeAt(i)\n        hash = (hash << 5) - hash + chr\n        hash |= 0 // Convert to 32bit integer\n    }\n    return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n    let linkHash = link\n    let linkNoHash = link\n    if (link.indexOf('#') !== -1) {\n        linkNoHash = link.replace('#', '')\n    } else {\n        linkHash = '#' + link\n    }\n\n    return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n    const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n    const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n    const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n    const isOldIOS = () => {\n        var agent = window.navigator.userAgent,\n            start = agent.indexOf('OS ')\n        if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n            return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n        }\n        return false\n    }\n\n    const inViewPort = (attribute: string, value: any) => {\n        node.setAttribute(attribute, value)\n\n        const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n        if (url) {\n            const img = new Image()\n            img.src = url\n            img.onload = cb\n            img.onerror = () => {\n                cb()\n                node.classList.add(CLASSNAME_ON_ERROR)\n                throw new Error(`Image ${url} cannot be loaded`)\n            }\n\n            return\n        }\n\n        cb()\n    }\n\n    if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n        inViewPort(attribute, value)\n    } else {\n        if ('IntersectionObserver' in window) {\n            node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n            let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n                entries.forEach(function (entry) {\n                    if (entry.isIntersecting) {\n                        inViewPort(attribute, value)\n                        lazyBackgroundObserver.unobserve(entry.target)\n                    }\n                })\n            })\n            lazyBackgroundObserver.observe(node)\n        } else {\n            inViewPort(attribute, value)\n        }\n    }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n    const isOldIOS = () => {\n        var agent = window.navigator.userAgent,\n            start = agent.indexOf('OS ')\n        if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n            return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n        }\n        return false\n    }\n\n    if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n        cb()\n    } else {\n        if ('IntersectionObserver' in window) {\n            let lazyBackgroundObserver = new IntersectionObserver(\n                function (entries) {\n                    entries.forEach(function (entry) {\n                        if (entry.isIntersecting) {\n                            cb()\n                            lazyBackgroundObserver.unobserve(entry.target)\n                        }\n                    })\n                },\n                { rootMargin: '150% 0px' }\n            )\n            lazyBackgroundObserver.observe(node)\n        }\n    }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n    let timer: number\n    return function (event: T) {\n        if (timer) {\n            window.clearTimeout(timer)\n        }\n        timer = window.setTimeout(func, time, event)\n    }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n    let ua = window.navigator.userAgent,\n        isIE = /MSIE|Trident/.test(ua)\n\n    return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n    src,\n    callback = null,\n    async = false,\n    defer = false,\n    module = false,\n    id = ''\n}: {\n    src: string;\n    callback: null | GlobalEventHandlers[\"onload\"]\n    module: boolean,\n    defer: boolean,\n    async: boolean,\n    id: string\n}) => {\n    const script = document.createElement('script')\n    script.type = module ? 'module' : 'text/javascript'\n    script.src = src\n    id ? (script.id = id) : false // add id attribute only if passed\n    if (typeof callback === 'function') {\n        script.onload = callback\n    }\n    script.async = async\n    script.defer = defer\n    document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n    const script = document.createElement('link')\n    script.rel = 'stylesheet'\n    script.href = src\n    document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n    const observer = new IntersectionObserver(handler)\n    observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n    let curIdx = 0\n\n    while (txt) {\n        const stIdx = txt.indexOf(stChr, curIdx)\n        if (stIdx === -1) {\n            break\n        }\n        const enIdx = txt.indexOf(enChr, stIdx + 1)\n        if (enIdx === -1) {\n            break\n        }\n        const hashId = txt.substring(stIdx + stChr.length, enIdx)\n        if (vars[hashId] != null) {\n            txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n            curIdx = stIdx\n        } else {\n            curIdx = enIdx\n        }\n    }\n    return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n    const container = elementScope.querySelector<HTMLElement>(containerSelector)\n    if (!container) {\n        return\n    }\n\n    const items = container.querySelectorAll<HTMLElement>(el)\n    let max = -1\n\n    for (let i = 0; i < [...items].length; i++) {\n        const item = [...items][i]\n        let h = item.offsetHeight\n        max = h > max ? h : max\n    }\n\n    if (max <= 0) {\n        return\n    }\n\n    for (let i = 0; i < [...items].length; i++) {\n        const item = [...items][i]\n        item.style.height = `${max}px`\n    }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n    return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n    const map = {\n        '&': '&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","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n    default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n    us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n    uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566',\n    kr: 'https://apps.apple.com/kr/app/%EB%84%A4%EC%8A%A4%ED%94%84%EB%A0%88%EC%86%8C-%EB%B6%80%ED%8B%B0%ED%81%AC/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n    'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n    const lt = (ref: number) => {\n        return window.innerWidth < ref\n    }\n\n    return {\n        get is() {\n            const { innerWidth: vw, devicePixelRatio } = window\n            return {\n                mobile: vw < BREAKPOINT_M,\n                mobile_tablet: vw < BREAKPOINT_TABLET,\n                tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n                desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n                retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n            }\n        },\n        lt\n    }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export 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 { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst bundlePopinID = 'bundle-popin-id'\nlet bundlePopinContent = ''\nlet label_close\n\nexport const renderBundlePopinLink = (\n    { type, bundle_details, bundled, sku, position, range },\n    component\n) => {\n    if (\n        type === 'capsule' &&\n        bundle_details &&\n        bundle_details.popin_link_text &&\n        bundled === true\n    ) {\n        bundlePopinContent = `<nb-bundle-details\n                main_sku='${sku}'\n                description='${bundle_details.description}'\n                other_skus='${bundle_details.other_skus}'\n                other_skus_quantity= '${bundle_details.other_skus_quantity}'\n                range='${range}'\n                position='${position}'>\n            </nb-bundle-details>`\n\n        component.variation = 'white'\n\n        label_close = bundle_details.popin_label_close\n        return `<nb-link class=\"cn_card__cta__bundle\" size=\"large\" color=\"gold\" label=\"${bundle_details.popin_link_text}\"></nb-link>`\n    }\n    return ''\n}\n\nexport const openBundlePopin = component => {\n    renderPopinBundleDetail(component)\n    component.bundlePopIn = document.getElementById(bundlePopinID)\n    component.appendChild(component.bundlePopIn)\n\n    setAttributes(component.bundlePopIn, {\n        variation: 'before',\n        bgcolor: 'white',\n        size: 'L',\n        padding: 'false',\n        label_close: label_close,\n        content: bundlePopinContent\n    })\n\n    component.bundlePopIn.classList.add('nb-popin--bundle')\n\n    dispatchEvent({\n        eventName: EVENT_POPIN_OPEN,\n        args: { id: bundlePopinID }\n    })\n}\n\nconst renderPopinBundleDetail = component => {\n    if (document.getElementById(bundlePopinID) != null) return\n    let popin = document.createElement('nb-popin')\n    popin = component.appendChild(popin)\n    popin.setAttribute('id', bundlePopinID)\n    popin.setAttribute('content', '')\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","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport function renderFeatures({ features = [] }) {\n    if (features.length === 0) {\n        return ''\n    }\n\n    return `<div class=\"cn_card__features\">${features.map(renderFeature).join('')}</div>`\n}\n\nfunction renderFeature({ icon, text, heading = '', description = '' }) {\n    const desc = text || (heading ? `${heading} ${description}` : '')\n    if (!desc) {\n        return ''\n    }\n    const data = stringifyForAttribute({ icon, label: desc, classname: 't-xs-500' })\n    return `<nb-icon-text data=\"${data}\"></nb-icon-text>`\n}\n","import { lazyLoad } from '@kissui/helpers/src/utils'\n\nexport const initLazyLoad = (props, component) => {\n    const { image = '' } = props\n    let width = '150'\n    const el = component.querySelector('img.cn_card__image__single')\n    if (!el) {\n        return\n    }\n    const getWidth = el.getAttribute('data-imwidth')\n    if (getWidth) {\n        width = getWidth\n    }\n    const imPolicy = `?impolicy=product&imwidth=${width}`\n\n    lazyLoad(el, 'src', `${image + imPolicy}`, image + imPolicy)\n}\n","export const renderPrice = ({ price, giftcard_price, type, hidePrice, subscription = {} }) => {\n    if (!price || (type === 'giftcard' && !giftcard_price) || hidePrice) {\n        return ''\n    }\n    const { from = '', custom_price = '' } = subscription\n    return `\n        ${from ? `<p class=\"t-sm-400\">${from}</p>` : ''}\n        <h4 class=\"cn_card__priceWrapper--current t-md-700-sl\"><span>${\n            custom_price || price\n        }</span></h4>`\n}\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 { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nexport const renderStrikethroughPrice = async strikethroughPrice => {\n    if (!strikethroughPrice) return ''\n    let finalStrikethroughPrice = await getFormattedPrice(strikethroughPrice)\n\n    return `${`<p class=\"cn_card__strikethroughPrice t-sm-400\">${finalStrikethroughPrice}</p>`}`\n}\n","import { interpolate } from '@kissui/helpers/src/utils'\n\nexport const renderShowSleeve = props => {\n    const {\n        sales_multiple,\n        label_sleeve,\n        label_sleeves,\n        show_sleeve = false,\n        sleeve_syntax = '{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})',\n        number_of_sleeves,\n        label_capsules,\n        type,\n        bundled,\n        unit_quantity,\n        unitQuantity\n    } = props\n\n    const numberOfSleeves = number_of_sleeves\n    const sleeveLabel = numberOfSleeves > 1 && label_sleeves ? label_sleeves : label_sleeve\n    const quantity = bundled === false ? sales_multiple : unit_quantity || unitQuantity || 0\n    const html = content => {\n        content = interpolate(\n            content,\n            {\n                numberOfSleeves,\n                sleeveLabel,\n                quantity,\n                label_capsules,\n                label_sleeve\n            },\n            '{',\n            '}'\n        )\n        return `<p class=\"cn_card__priceWrapper--items t-xs-500-sl showSleeve\">${content}</p>`\n    }\n    let labelContent\n\n    if (show_sleeve && type === 'capsule') {\n        if (numberOfSleeves && label_sleeve && label_capsules) {\n            labelContent = sleeve_syntax\n        } else {\n            return ''\n        }\n        return html(labelContent)\n    }\n    return ''\n}\n","import { renderAddToCart } from './addToCart'\nimport { renderOutOfStock } from './outOfStock'\nimport { renderPrice } from './price'\nimport { renderA11yPrice } from './priceA11y'\nimport { renderCapsulePrice } from './priceCapsule'\nimport { renderStrikethroughPrice } from './renderStrikethroughPrice'\nimport { renderShowSleeve } from './sleeve'\n\nexport async function renderPriceWrapper(props) {\n    const { in_stock, strikethrough_price, hide_add_to_cart = false } = props\n\n    const showOutOfStock = in_stock != null && !in_stock\n\n    if (hide_add_to_cart === true) {\n        return ''\n    }\n\n    return `\n        <div class=\"cn_card__priceWrapper\">\n            <div class=\"cn_card__priceInnerWrapper\">\n                ${strikethrough_price ? await renderStrikethroughPrice(strikethrough_price) : ''}\n                ${renderPrice(props)}\n                ${!showOutOfStock ? renderShowSleeve(props) : ''}\n                ${!showOutOfStock ? renderCapsulePrice(props) : ''}\n                ${renderA11yPrice(props)}\n                ${showOutOfStock ? renderOutOfStock(props) : ''}\n            </div>\n            ${renderAddToCart(props)}\n        </div>`\n}\n","import { interpolate } from '@kissui/helpers/src/utils'\n\nexport const renderCapsulePrice = props => {\n    const {\n        show_capsule_price = false,\n        price_per_capsule,\n        capsule_price_label,\n        capsule_price_syntax = '{capsule_price_label}: {price_per_capsule}'\n    } = props\n\n    if (!show_capsule_price) {\n        return ''\n    }\n\n    const html = content => {\n        content = interpolate(\n            content,\n            {\n                capsule_price_label,\n                price_per_capsule\n            },\n            '{',\n            '}'\n        )\n        return `<p class=\"cn_card__priceWrapper--items t-xs-500-sl capsulePrice\">${content}</p>`\n    }\n\n    return html(capsule_price_syntax)\n}\n","export const renderA11yPrice = ({\n    type,\n    price,\n    price_per_capsule,\n    a11y_price = 'euros per sleeve',\n    a11y_capsule_price = 'Capsule price',\n    sleeve_variation_pdp = 'false'\n}) => {\n    return `<span class=\"sr-only\">\n      ${\n          sleeve_variation_pdp === 'true'\n              ? type === 'capsule'\n                  ? `${a11y_capsule_price}: ${price_per_capsule}`\n                  : ''\n              : `${price} ${a11y_price}`\n      }\n    </span>`\n}\n","export const renderOutOfStock = props => {\n    const { label_outofstock } = props.shop_similar\n\n    if (label_outofstock === '') {\n        return ''\n    }\n    return `<p class=\"cn_card__priceWrapper--items t-xs-500-sl\">${label_outofstock}</p>`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nexport const renderAddToCart = props => {\n    const {\n        category_name = '',\n        type,\n        sku,\n        longSku = '',\n        position,\n        giftcard_price,\n        variation = 'plp',\n        quantity_selector,\n        hidePrice,\n        url,\n        view_details_label = 'View details'\n    } = props\n\n    let buttonSize = 'large'\n    if (variation === 'plp') {\n        buttonSize = viewportHelper.is.mobile ? 'small' : 'large'\n    }\n\n    if (type === 'giftcard' && giftcard_price) {\n        const giftCardData = {\n            price: giftcard_price,\n            sku: sku,\n            add_to_cart: buttonSize,\n            quantity_selector: quantity_selector\n        }\n        return `<nb-add-gift-card data=\"${stringifyForAttribute(giftCardData)}\"></nb-add-gift-card>`\n    }\n\n    if (hidePrice) {\n        return `<nb-cta link=\"${url}\" variation=\"primary\">${view_details_label}</nb-cta>`\n    }\n\n    return `\n        <nb-add-to-cart\n            sku=\"${sku}\"\n            longSku=\"${longSku}\"\n            buttonSize=\"${buttonSize}\"\n            showPrice\n            range='${category_name}'\n            position='${position}'\n        ></nb-add-to-cart>\n    `\n}\n","export const renderRatings = ({ sku, minimum_rating = 0 }, refElement) => {\n    if (!window.napi.ratings) {\n        return ''\n    }\n    window.napi\n        .ratings()\n        .summary(sku)\n        .then(ratingsResult => {\n            if (\n                ratingsResult &&\n                ratingsResult.ratingAverage > 0 &&\n                ratingsResult.ratingAverage > minimum_rating\n            ) {\n                return ratingsResult\n            }\n            return ''\n        })\n        .then(ratings => {\n            if (!ratings) {\n                return ''\n            }\n            const ratingData = {\n                stars: ratings ? parseFloat(ratings.ratingAverage.toFixed(2)) : 0\n            }\n            return ratingData\n        })\n        .then(ratingData => {\n            if (ratingData) {\n                const elem = document.createElement('nb-rating')\n                elem.setAttribute('stars', ratingData ? ratingData.stars : 0)\n                refElement.querySelector('nb-loader').replaceWith(elem)\n            } else {\n                refElement.querySelector('nb-loader').remove()\n            }\n        })\n}\n","export const root = 'carousel'\nexport const wrapper = 'wrapper'\nexport const container = 'container'\nexport const item = 'item'\nexport const next = 'next'\nexport const prev = 'prev'\nexport const hidden = 'hidden'\nexport const bulletActive = 'active'\nexport const dragRatio = 0.1\n","import { dragRatio } from './constants'\n\n/**\n * Allow touch gesture on the carousel\n */\nclass CarouselTouchPlugin {\n    constructor(carousel) {\n        this._carousel = carousel\n\n        // Disable dragging image effect\n        this._carousel._container.addEventListener('dragstart', e => e.preventDefault())\n        this._carousel._container.addEventListener('touchstart', e => this.startDrag(e), {\n            passive: true\n        })\n        this._carousel._container.addEventListener('mousedown', e => this.startDrag(e))\n        this._carousel._container.addEventListener('touchstart', e => this.startDrag(e), {\n            passive: true\n        })\n\n        window.addEventListener('mousemove', e => this.drag(e), { passive: false })\n        window.addEventListener('touchmove', e => this.drag(e), { passive: false })\n\n        window.addEventListener('mouseup', () => this.endDrag())\n        window.addEventListener('touchend', () => this.endDrag())\n        window.addEventListener('touchcancel', () => this.endDrag())\n\n        this.translateFactor = 150\n    }\n\n    /**\n     * Start moving slide when touch\n     * @param {MouseEvent|TouchEvent} e\n     */\n    startDrag(e) {\n        // Touch and more than one finger, probably a zoom, not a swipe.\n        if (e.touches && e.touches.length > 1) {\n            return\n        }\n\n        if (e.touches) {\n            e = e.touches[0]\n        }\n\n        this._origin = { x: e.screenX, y: e.screenY }\n        this._width = this._carousel.containerWidth\n    }\n\n    /**\n     * Start moving slide when touch\n     * @param {MouseEvent|TouchEvent} e\n     */\n    drag(e) {\n        if (!this._origin) {\n            return\n        }\n\n        const point = e.touches ? e.touches[0] : e\n        const translate = {\n            x: point.screenX - this._origin.x,\n            y: point.screenY - this._origin.y\n        }\n\n        this._lastTranslate = translate\n\n        const offsetCurrent = this._carousel._currentIndex * this._carousel._widthSlide\n        const offsetNew = (this.translateFactor * translate.x) / this._width\n        const translateDelta = offsetCurrent - offsetNew\n        this._carousel.translate(translateDelta)\n    }\n\n    /**\n     * Prevent to drag the page when swiping\n     * @param {MouseEvent|TouchEvent} e\n     * @param {Object} translate\n     * @param {Number} translate.x\n     * @param {Number} translate.y\n     */\n    preventMobileYTranslate(e, translate) {\n        if (!e.touches) {\n            return\n        }\n\n        if (e.touches && Math.abs(translate.x) > Math.abs(translate.y)) {\n            e.preventDefault()\n            e.stopPropagation()\n        } else if (e.touches && Math.abs(translate.y) > Math.abs(translate.x)) {\n            e.preventDefault()\n            e.stopPropagation()\n        }\n    }\n\n    /**\n     * @param {MouseEvent|TouchEvent} e\n     */\n    endDrag() {\n        if (!this._origin || !this._lastTranslate) {\n            this._origin = null\n            this._lastTranslate = null\n            return\n        }\n\n        // If drag delta is above dragRatio, we will move right or left\n        const dragDelta = this._lastTranslate.x / this._carousel.carouselWidth\n\n        if (Math.abs(dragDelta) > dragRatio) {\n            const slideDirection = this._lastTranslate.x < 0 ? 'next' : 'prev'\n            this._carousel[slideDirection]()\n        }\n        // Return to current element\n        else {\n            this._carousel.goToItem(this._carousel._currentIndex)\n        }\n\n        this._origin = null\n        this._lastTranslate = null\n    }\n}\n\nexport default CarouselTouchPlugin\n","/**\n * Allow touch gesture on the carousel\n */\nclass CarouselCreamUiHack {\n    constructor(carousel) {\n        this._carousel = carousel\n\n        new MutationObserver(mutations => {\n            mutations.forEach(function (mutation) {\n                if (!mutation || !mutation.oldValue || !mutation.classList) {\n                    return\n                }\n\n                const oldState = mutation.classList.contains('has-overlay-absolute')\n                const newState = document.body.classList.contains('has-overlay')\n                const closeAddToCart = oldState && !newState\n\n                if (!closeAddToCart) {\n                    return\n                }\n\n                this._carousel.goToItem(this._carousel._currentIndex)\n            })\n        }).observe(document.body, {\n            attributes: true,\n            attributeFilter: ['class'],\n            attributeOldValue: true\n        })\n    }\n}\n\nexport default CarouselCreamUiHack\n","import { root, wrapper, container, item, next, prev, hidden, bulletActive } from './constants'\nimport CarouselTouchPlugin from './CarouselTouchPlugin'\nimport CarouselCreamUiHack from './CarouselCreamUiHack'\n\nclass Carousel {\n    /**\n     * This callback type is called `requestCallback` and is displayed as a global symbol.\n     *\n     * @callback moveCallback\n     * @param {Number} index\n     */\n\n    /**\n     * @param {HTMLElement} element\n     * @param {Object} options\n     * @param {Number} [options.slidesToScroll=1] options.slidesToScroll of element do slide\n     * @param {Number} [options.slidesVisible=1] options.slidesVisible of element to display\n     * @param {Number} [options.spaceBetween=0] options.spaceBetween space between slides\n     * @param {Boolean} [options.navigationButton=true] options.navigationButton show navigation button\n     * @param {Boolean} [options.loop=true] options.loop loop at the end of the carousel\n     * @param {Boolean} [options.pagination=true] options.pagination display pagination\n     * @param {String} [options.pagination_variation'] 'stepper' --> enables an stepper on the slider (e.g. current-slide/total-number-of-slides)\n     * @param {Boolean} [options.nav_centered=false] options.nav_centered display centered navigation next and prev buttons below the slider\n     */\n    constructor(element, options = {}) {\n        this._element = element\n        this._slides = [].slice.call(element.children)\n        const _index = options.index || 0\n\n        this._options = Object.assign(\n            {},\n            {\n                slidesToScroll: 1,\n                slidesVisible: 1,\n                spaceBetween: 0,\n                navigationButton: true,\n                loop: true,\n                navigationAsSlider: false,\n                pagination: true,\n                hookGetRightBoundary: null,\n                hookSlideChange: null,\n                hookMove: null,\n                hookNext: null,\n                hookPrevious: null,\n                pagination_variation: null,\n                nav_centered: false\n            },\n            options\n        )\n\n        this.moveCallbacks = []\n        this._ratio = this._slides.length / this._options.slidesVisible\n\n        this.buildIHM()\n        new CarouselCreamUiHack(this)\n        if (!this.hasPagination()) {\n            return\n        }\n        new CarouselTouchPlugin(this)\n        this.goToItem(_index)\n    }\n\n    /**\n     * @returns {HTMLElement}\n     */\n    get element() {\n        return this._element\n    }\n\n    /**\n     * @returns {number & Number}\n     */\n    get navigationAsSlider() {\n        return this._options.navigationAsSlider\n    }\n\n    /**\n     * @returns {number & Number}\n     */\n    get slidesToScroll() {\n        return this._options.slidesToScroll\n    }\n\n    /**\n     * @returns {number}\n     */\n    get slidesVisible() {\n        return this._options.slidesVisible\n    }\n\n    /**\n     * @returns {number}\n     */\n    get slidesTotal() {\n        return this._slides.length\n    }\n\n    /**\n     * @returns {boolean & Boolean}\n     */\n    get navigationButton() {\n        return this._options.navigationButton\n    }\n\n    /**\n     * @returns {string}\n     */\n    get navigationVariation() {\n        return this._options.navigation_variation\n    }\n\n    /**\n     * @returns {string}\n     */\n    get navigationSize() {\n        return this._options.navigation_size\n    }\n\n    /**\n     * @returns {boolean & Boolean}\n     */\n    get loop() {\n        return this._options.loop\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n    get pagination() {\n        return this._options.pagination\n    }\n\n    /**\n     * @returns {number}\n     */\n    get containerWidth() {\n        return this._container.offsetWidth\n    }\n\n    /**\n     * @returns {number}\n     */\n    get carouselWidth() {\n        return this._root.offsetWidth\n    }\n\n    /**\n     * @returns {number}\n     */\n    get wrapperWidth() {\n        return this._wrapper.offsetWidth\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n    get paginationVariation() {\n        return this._options.pagination_variation\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n    get nav_centered() {\n        return this._options.nav_centered\n    }\n\n    /**\n     * Get slide width from container wrapper width and slides count\n     *\n     * @param {Number} wrapperWidth\n     * @returns {Number} slide width\n     */\n    getSlideWidth(wrapperWidth) {\n        const { slidesVisible, spaceBetween } = this._options\n        return (wrapperWidth + parseInt(spaceBetween)) / slidesVisible\n    }\n\n    /**\n     * Refactor carousel to add the elements needs\n     */\n    buildIHM() {\n        this._root = this.createElement('div', root)\n        this._container = this.createElement('div', container)\n        this._wrapper = this.createElement('div', wrapper)\n        this._children = this._slides.map(child => {\n            const element = this.createElement('div', item)\n            element.appendChild(child)\n            this._container.appendChild(element)\n            return element\n        })\n        this._wrapper.appendChild(this._container)\n        this._root.appendChild(this._wrapper)\n        this._element.appendChild(this._root)\n\n        this.setWrapperStyle()\n\n        if (!this.hasPagination()) {\n            return\n        }\n\n        if (this.navigationButton) {\n            this.createNavigation()\n        }\n\n        if (this.pagination) {\n            this.createPagination()\n        }\n    }\n\n    /**\n     * Set elements sizes\n     */\n    setWrapperStyle() {\n        const wrapperWidth = this.wrapperWidth\n        const widthSlide = this.getSlideWidth(wrapperWidth)\n        const widthContainer = widthSlide * this._children.length\n\n        this.setContainerWidth(widthContainer)\n        this.setWrapperWidth(wrapperWidth)\n\n        for (const slide of this._children) {\n            this.setSlideWidth(slide, widthSlide)\n        }\n\n        this._widthContainer = widthContainer\n        this._widthSlide = widthSlide\n        this._widthWrapper = wrapperWidth\n    }\n\n    /**\n     * Fix width for each slide\n     * @param {object} slide\n     * @param {number} widthSlide\n     */\n    setSlideWidth(slide, widthSlide) {\n        slide.style.width = `${widthSlide - this._options.spaceBetween}px`\n        if (this._options.spaceBetween) {\n            slide.style.marginRight = `${this._options.spaceBetween}px`\n        }\n    }\n\n    /**\n     * Fix width for container\n     * @param {Number} width\n     */\n    setContainerWidth(width) {\n        this._container.style.width = `${width}px`\n    }\n\n    /**\n     * Fix width for wrapper\n     * @param {Number} width\n     */\n    setWrapperWidth(width) {\n        this._wrapper.style.width = `${width}px`\n    }\n\n    /**\n     * Prevent transition\n     */\n    disableTransition() {\n        this._container.style.transition = 'none'\n    }\n\n    /**\n     * Enable transition\n     */\n    enableTransition() {\n        this._container.style.transition = ''\n    }\n\n    translate(delta) {\n        this._container.style.left = `${-delta}px`\n    }\n\n    /**\n     * Create element\n     * @param {String} tag name\n     * @param {String} className\n     * @returns {HTMLElement}\n     */\n    createElement(tag, className) {\n        let div = document.createElement(tag)\n        div.setAttribute('class', className)\n        return div\n    }\n\n    /**\n     * Create two button prev/next\n     */\n    createNavigation() {\n        const sliderWidth = this.getSlideWidth(this.wrapperWidth)\n        const prevButton = this.createNavigationButton(\n            'prev',\n            '24/symbol/chevron-left',\n            'a11y_slider_previous_button',\n            sliderWidth\n        )\n        const nextButton = this.createNavigationButton(\n            'next',\n            '24/symbol/chevron-right',\n            'a11y_slider_next_button',\n            sliderWidth\n        )\n\n        this.addNavigationListeners(prevButton, nextButton)\n\n        // Note : now navigation is always outside to avoid been cut by overflow\n        let mainContainer = this._root.parentElement\n\n        mainContainer.appendChild(prevButton)\n        mainContainer.appendChild(nextButton)\n\n        this.onMove(carousel => {\n            const max = carousel._currentIndex + this.slidesVisible\n\n            if (!this.loop) {\n                if (carousel._currentIndex <= 0) {\n                    prevButton.classList.add(hidden)\n                } else {\n                    prevButton.classList.remove(hidden)\n                }\n\n                if (this._slides.length === max) {\n                    nextButton.classList.add(hidden)\n                } else {\n                    nextButton.classList.remove(hidden)\n                }\n\n                if (this._options.hookMove) {\n                    this._options.hookMove(nextButton)\n                }\n            }\n        })\n    }\n\n    createNavigationButton(type, icon, label, sliderWidth) {\n        const button = this.createElement('nb-cta', type === 'prev' ? prev : next)\n        button.setAttribute('variation', 'navigation')\n        button.setAttribute('contrast', this.navigationVariation)\n        button.setAttribute('size', this.navigationSize)\n        button.setAttribute('icon_right', icon)\n        button.setAttribute('label', label)\n\n        if (this.navigationAsSlider) {\n            button.style.width = sliderWidth + 'px'\n        }\n\n        return button\n    }\n\n    addNavigationListeners(prevButton, nextButton) {\n        nextButton.addEventListener('click', () => this.next())\n        prevButton.addEventListener('click', () => this.prev())\n\n        nextButton.addEventListener('keydown', e => {\n            if (e.key === 'Enter' || e.key === 'Space') this.next()\n        })\n        prevButton.addEventListener('keydown', e => {\n            if (e.key === 'Enter' || e.key === 'Space') this.prev()\n        })\n    }\n\n    getSlideNotVisible() {\n        return this._children.length - (this.slidesVisible - 1)\n    }\n\n    hasPagination() {\n        return this.getSlideNotVisible() > 1\n    }\n\n    /**\n     * Create pagination Bullets\n     */\n    createPaginationBullets() {\n        const paginationBullets = document.createElement('nav')\n\n        const buttons = []\n        for (let i = 0; i < this.getSlideNotVisible(); i = i + this.slidesToScroll) {\n            let span = document.createElement('span')\n            span.innerText = (i + 1).toString()\n\n            let button = document.createElement('button')\n            button.addEventListener('click', () => this.goToItem(i))\n            button.appendChild(span)\n\n            paginationBullets.appendChild(button)\n            buttons.push(button)\n        }\n\n        const selectButton = index => {\n            let activeButton = buttons[index / this.slidesToScroll]\n\n            if (!activeButton) {\n                return\n            }\n\n            buttons.forEach(button => button.classList.remove(bulletActive))\n            activeButton.classList.add(bulletActive)\n        }\n\n        selectButton(this._currentIndex)\n        this.onMove(() => selectButton(this._currentIndex))\n\n        this._root.parentElement.parentElement.appendChild(paginationBullets)\n    }\n\n    /**\n     * Create pagination pagination_variation\n     */\n    createPaginationStepper() {\n        const paginationStepper = document.createElement('nav')\n        paginationStepper.classList.add('t-sm-500')\n\n        let spanTotal = document.createElement('div')\n        spanTotal.innerText = this.slidesTotal - this.slidesVisible + 1\n        spanTotal.classList.add('totalPages')\n\n        let slash = document.createElement('div')\n        slash.innerText = ' / '\n\n        let spanCurrent = document.createElement('div')\n        spanCurrent.classList.add('currentPage')\n\n        paginationStepper.appendChild(spanCurrent)\n        paginationStepper.appendChild(slash)\n        paginationStepper.appendChild(spanTotal)\n\n        this.onMove(() => (spanCurrent.innerText = this._currentIndex + 1))\n        // simplified aria strategy, no extra props needed, keep it simple :)\n        this.onMove(() =>\n            paginationStepper.setAttribute(\n                'aria-label',\n                spanCurrent.innerText + slash.innerHTML + spanTotal.innerHTML\n            )\n        )\n\n        this._root.parentElement.parentElement.appendChild(paginationStepper)\n    }\n\n    /**\n     * Create pagination\n     */\n    createPagination() {\n        /**\n         * 1. Less than 5 slides create always bullets\n         */\n        if (this.slidesTotal <= 5) {\n            this.createPaginationBullets()\n        } else {\n            /**\n             * 2. More than 5 slides:\n             */\n            /**\n             * 2.1 If pagination_variation prop set to true create pagination_variation\n             */\n            if (this.paginationVariation === 'stepper') {\n                this.createPaginationStepper()\n                console.info('paginationVariation >> enabled')\n            } else {\n                /**\n                 * 2.2 If pagination_variation prop set to false create bullets\n                 */\n                this.createPaginationBullets()\n                console.info('bullets enabled')\n            }\n        }\n    }\n\n    next() {\n        let next = this._currentIndex + this.slidesToScroll\n\n        if (this._options.hookNext) {\n            next = this._options.hookNext(next)\n        }\n\n        this.goToItem(next)\n    }\n\n    prev() {\n        let prev = this._currentIndex - this.slidesToScroll\n\n        if (this._options.hookPrevious) {\n            prev = this._options.hookPrevious(prev)\n        }\n\n        this.goToItem(prev)\n    }\n\n    /**\n     * Move carousel to targeted slide\n     * @param {Number} index\n     */\n    goToItem(index) {\n        this.hackUi()\n\n        const incomingIndex = this.getOverflowingIndex(index)\n\n        let translateX = incomingIndex * this._widthSlide\n\n        if (this._options.hookSlideChange) {\n            translateX = this._options.hookSlideChange(incomingIndex, translateX)\n        }\n\n        this.translate(translateX)\n        this._currentIndex = incomingIndex\n        this.indexHasChange()\n    }\n\n    /**\n     * TODO : what was this for ?\n     * Hack Cream ui fix\n     * @returns {void}\n     */\n    hackUi() {\n        const $html = document.querySelector('html')\n        if (\n            $html.classList.contains('has-overlay-absolute') ||\n            $html.classList.contains('has-overlay')\n        ) {\n            return\n        }\n    }\n\n    /**\n     * Check if incoming slide is contained in the boundaries\n     * In loop mode, returns either first or last index\n     *\n     * @returns {number}\n     */\n    getOverflowingIndex(index) {\n        const reachedLeftBoundary = this.getLeftBoundary(index)\n        const reachedRightBoundary = this.getRightBoundary(index)\n\n        const lastIndex = this._children.length - this._options.slidesVisible\n\n        if (reachedLeftBoundary) {\n            return this.loop ? lastIndex : 0\n        }\n        if (reachedRightBoundary) {\n            return this.loop ? 0 : lastIndex\n        }\n\n        return index\n    }\n\n    /**\n     * Detect when it's going out of left side\n     * @param index\n     * @returns {boolean}\n     */\n    getLeftBoundary(index) {\n        return index < 0\n    }\n\n    /**\n     * Detect when it's going out of right side\n     * @param {Number} index\n     * @returns {boolean|boolean}\n     */\n    getRightBoundary(index) {\n        // Bigger or if element is not existing\n        const overflowingIndex = index >= this._children.length\n\n        const incomingSlideIndex = this.currentIndex + this.slidesVisible\n        const existingSlide = this._children[incomingSlideIndex] !== undefined\n        const goingToNextSlide = index > this.currentIndex\n\n        let boundaryReached = overflowingIndex || (goingToNextSlide && !existingSlide)\n\n        if (this._options.hookGetRightBoundary) {\n            boundaryReached = this._options.hookGetRightBoundary(boundaryReached, index)\n        }\n\n        return boundaryReached\n    }\n\n    /**\n     * Get max availbale width from rendered slides\n     * @param {Array} slides\n     * @returns {Number} max width\n     */\n    _getMaxSlideWidth(slides) {\n        return slides.reduce((width, slide) => Math.max(width, slide.offsetWidth), 0)\n    }\n\n    /**\n     * Add cb after the slide change\n     * @param {moveCallback} cb\n     */\n    onSlideChange(cb) {\n        this.onMove(cb)\n    }\n\n    /**\n     * Add cb after the slide change\n     * @param {moveCallback} cb\n     */\n    onMove(cb) {\n        this.moveCallbacks.push(cb)\n    }\n\n    /**\n     * Trigger the callback\n     */\n    indexHasChange() {\n        this.moveCallbacks.forEach(cb => cb(this))\n        this.activateItems()\n    }\n\n    activateItems() {\n        const max = this._currentIndex + this.slidesVisible\n        let t = 0\n        this._slides.map((item, index) => {\n            item.classList.remove('active')\n            item.parentElement.classList.remove('activeParent')\n            item.parentElement.classList.remove('currentCenteredSlide')\n\n            const video = item.querySelector('video')\n            if (video) {\n                video.pause()\n            }\n\n            if (index >= this._currentIndex && index < max) {\n                item.classList.add('active')\n                item.parentElement.classList.add('activeParent')\n\n                if (t === 1) {\n                    item.parentElement.classList.add('currentCenteredSlide')\n                    if (video) {\n                        video.play()\n                    }\n                }\n\n                t++\n            }\n        })\n    }\n\n    setClass(className) {\n        this._element.classList.add(className)\n    }\n\n    unsetClass(className) {\n        this._element.classList.remove(className)\n    }\n\n    get currentIndex() {\n        return this._currentIndex\n    }\n}\n\nexport default Carousel\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            ...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        let ecommerceData = {\n            promotion_id: id,\n            promotion_name: name,\n            creative_slot: position,\n            creative_name: creative\n        }\n        ecommerceData = removeEmptyValues(ecommerceData)\n        eventData.ecommerce = ecommerceData\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        let ecommerceData = {\n            promotion_id: id,\n            promotion_name: name,\n            creative_slot: position,\n            creative_name: creative\n        }\n        ecommerceData = removeEmptyValues(ecommerceData)\n        eventData.ecommerce = ecommerceData\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\nexport const isGtmTrackingExists = trackingData => {\n    window.gtmDataObject = window.gtmDataObject || []\n\n    return window.gtmDataObject.some(\n        event =>\n            event.event === trackingData.event &&\n            event.ecommerce?.creative_slot === trackingData.campaign.position &&\n            event.ecommerce?.promotion_id === trackingData.campaign.id &&\n            event.ecommerce?.promotion_name === trackingData.campaign.name &&\n            event.ecommerce?.creative_name === trackingData.campaign.creative\n    )\n}\n","import CarouselLib from './js/Carousel'\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport { makeId } from '@kissui/helpers/src/utils'\nimport { itemDisplay } from '@kissui/helpers/src/gtmEvents'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_SLIDE_CHANGE } from '@kissui/components'\n\nclass Slider extends HTMLElement {\n    constructor() {\n        super()\n        this._slider = null\n        this.randomId = null\n    }\n\n    static get observedAttributes() {\n        return [\n            'navigation_as_slider',\n            'slides_to_scroll',\n            'slides_visible',\n            'pagination',\n            'pagination_variation',\n            'nav_centered'\n        ]\n    }\n\n    connectedCallback() {\n        this.slot = this.innerHTML\n        this.props = createProps(this.attributes)\n        this.randomId = this.props.testId ? this.props.testId : `slider_${makeId(5)}`\n        this.render()\n    }\n\n    createProps() {\n        return [...this.attributes].reduce(\n            (all, attribute) => ({ ...all, [attribute.nodeName]: attribute.nodeValue }),\n            {}\n        )\n    }\n\n    render() {\n        this.innerHTML = `<div class=\"slider ${this.randomId}\">${this.slot}</div>`\n        this.loadSlider()\n    }\n\n    loadSlider() {\n        const {\n            navigation_as_slider = 'false',\n            indexSlider = 0,\n            slides_loop = 'true',\n            slides_visible = 4,\n            slides_to_scroll = 1,\n            navigation = 'true',\n            pagination = 'true',\n            space_between = 0,\n            navigation_variation = 'dark',\n            navigation_size = '48',\n            pagination_variation = 'stepper',\n            nav_centered = 'false'\n        } = this.props\n\n        const el = this.querySelector(`.${this.randomId}`)\n        const options = {\n            index: parseInt(indexSlider),\n            slidesToScroll: parseInt(slides_to_scroll),\n            slidesVisible: parseInt(slides_visible),\n            spaceBetween: space_between,\n            loop: slides_loop === 'true',\n            navigationAsSlider: navigation_as_slider === 'true',\n            navigationButton: navigation === 'true',\n            pagination: pagination === 'true',\n            navigation_variation,\n            navigation_size,\n            pagination_variation,\n            nav_centered\n        }\n        this._slider = new CarouselLib(el, options)\n        this._slider.setClass('first')\n        this._slider.onSlideChange(this.handleClick.bind(this))\n    }\n\n    handleClick() {\n        dispatchEvent({\n            eventName: EVENT_SLIDE_CHANGE,\n            args: { slideIndex: this._slider.currentIndex }\n        })\n\n        this.toggleClasses()\n        // GTM 'itemDisplay' event\n        itemDisplay({ rootElement: ['nb-slider'] })\n    }\n\n    toggleClasses() {\n        const isFirst = this._slider.currentIndex === 0\n        const isLast =\n            this._slider.slidesTotal === this._slider.currentIndex + this._slider.slidesVisible\n\n        this._slider.unsetClass('last')\n        this._slider.unsetClass('first')\n\n        if (isFirst) {\n            this._slider.setClass('first')\n        } else if (isLast) {\n            this._slider.setClass('last')\n        }\n    }\n}\n// Registers custom element\ncustomElements.get('nb-slider') || customElements.define('nb-slider', Slider)\n\nexport default Slider\n","import './plp-product-card-image-slider.scss'\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport { lazyLoad, setAttributes } from '@kissui/helpers/src/utils'\nimport '../../slider'\n\nclass PlpProductCardImageSlider extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        const { slides, image_alt_text } = this.props\n\n        let nbSlider = document.createElement('nb-slider')\n        setAttributes(nbSlider, {\n            slides_to_scroll: '1',\n            slides_visible: '1',\n            navigation: 'true',\n            navigation_variation: 'highlight',\n            navigation_size: '32',\n            pagination: 'true'\n        })\n\n        let nbLoader = document.createElement('nb-loader')\n        setAttributes(nbLoader, { icon: 'loading' })\n        this.appendChild(nbLoader)\n\n        const imWidth = '600'\n        slides.forEach(slide => {\n            const url = `${slide.url}?impolicy=product&imwidth=${imWidth}`\n            let image = document.createElement('img')\n            image.setAttribute('alt', image_alt_text)\n            image.setAttribute('title', image_alt_text)\n            image.setAttribute('data-src', url)\n            nbSlider.appendChild(image)\n        })\n\n        this.appendChild(nbSlider)\n        slides.forEach(slide => {\n            const url = `${slide.url}?impolicy=product&imwidth=${imWidth}`\n            let image = nbSlider.querySelector(`img[data-src=\"${url}\"]`)\n\n            lazyLoad(image, 'src', url, url)\n        })\n    }\n}\n\ncustomElements.get('nb-product-card-image-slider') ||\n    customElements.define('nb-product-card-image-slider', PlpProductCardImageSlider)\n\nexport default PlpProductCardImageSlider\n","import renderImage from './image'\nimport renderImageOrSlider from './slider'\nimport { VARIATION_PDP } from '@kissui/components/src/sku/constants'\n\nexport function renderHeader(\n    { type, show_slider, slides, image, image_alt_text, plp_type },\n    viewportHelper,\n    imwidth\n) {\n    if (image === undefined || image === '' || plp_type === VARIATION_PDP) {\n        return ''\n    }\n\n    const hasSliderActivated =\n        !viewportHelper.is.mobile && show_slider && slides && slides.length > 1\n\n    const isMachineWithSlider = (type === 'machine' || plp_type === 'machine') && hasSliderActivated\n\n    if (isMachineWithSlider) {\n        return renderImageOrSlider(slides, image_alt_text)\n    }\n\n    return renderImage(image, image_alt_text, null, imwidth)\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","export default function renderImage(imgUrl, image_alt_text, url, imwidth = 150) {\n    if (!imgUrl) {\n        return ''\n    }\n\n    return `<div class=\"cn_card__image\">\n            ${url ? `<a href=\"${url}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">` : ''}\n                <img class=\"cn_card__image__single\" src=${imgUrl} alt=\"${image_alt_text}\" data-imwidth=\"${imwidth}\" />\n            ${url ? '</a>' : ''}\n            </div>`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport default function renderImageOrSlider(slides, image_alt_text) {\n    if (!slides || slides.length <= 0) {\n        return ''\n    }\n\n    return `<div class=\"cn_card__image\">\n                <nb-product-card-image-slider\n                    data='${stringifyForAttribute({ slides })}'\n                    image_alt_text=${image_alt_text}>\n                </nb-product-card-image-slider>\n            </div>`\n}\n","import { stringifyForAttribute, escapeHtml } from '@kissui/helpers/src/utils'\nimport { renderPrice } from './price'\nexport function renderSubscription(props) {\n    const { subscription } = props\n\n    if (subscription === undefined) {\n        return ''\n    }\n    return `\n        <div class=\"cn_card__subscriptionWrapper\">\n            ${renderPrice(props)}\n            ${subscriptionText(props)}\n            ${buttonStyle(props)}\n        </div>\n\n    `\n}\n\nexport const subscriptionText = props => {\n    const { subscription } = props\n    const priceClass = 't-xs-500-sl'\n    return `<p class=${priceClass}>${subscription.text}</p>`\n}\n\nexport const buttonStyle = props => {\n    const {\n        popin_id,\n        view_details_label = 'View details',\n        category_name = '',\n        sku,\n        longSku = '',\n        position,\n        button_style,\n        button_text,\n        tracking_position = '',\n        tracking_list = '',\n        button_url = '',\n        campaign,\n        tabbed_component\n    } = props\n    let buttonSize = 'large'\n    const {\n        id = '',\n        name = '',\n        position: campaign_position = '',\n        creative = ''\n    } = JSON.parse(campaign)\n\n    if (button_style === 'link-page') {\n        return `\n            ${createButton({\n                link_url: `${button_url}`,\n                classList: 'cn_card__linkToPage',\n                variation: 'primary',\n                longSku,\n                button_text,\n                id,\n                name,\n                tracking_position,\n                tracking_list,\n                campaign_position,\n                creative,\n                tabbed_component,\n                view_details_label\n            })}\n        `\n    } else if (button_style === 'add-to-cart') {\n        return `\n        <nb-add-to-cart\n            sku=\"${sku}\"\n            longSku=\"${longSku}\"\n            buttonSize=\"${buttonSize}\"\n            showPrice\n            range='${category_name}'\n            position='${position}'\n        ></nb-add-to-cart>\n            `\n    } else if (button_style === 'b2b-contact-form') {\n        return `\n            ${createButton({\n                classList: 'cn_card__openContactForm',\n                variation: 'tertiary',\n                longSku,\n                id,\n                name,\n                campaign_position,\n                creative,\n                tabbed_component,\n                button_text,\n                view_details_label\n            })}\n        `\n    }\n\n    const contentHtml = `<nb-machine-details data=\"${stringifyForAttribute(props)}\" />`\n\n    const skuData = {\n        internationalId: props.sku,\n        internationalName: props.name,\n        type: props.type,\n        technology: props.technology,\n        category: props.category,\n        rawPrice: props.rawPrice\n    }\n\n    return `\n        ${createButton({\n            classList: 'cn_card__viewDetails',\n            popin_id,\n            longSku,\n            tracking_list,\n            tracking_position,\n            variation: 'primary',\n            id,\n            name,\n            campaign_position,\n            creative,\n            tabbed_component,\n            button_text,\n            view_details_label,\n            skuData\n        })}\n\n        <nb-popin\n            id=\"${popin_id}\"\n            variation=\"before\"\n            bgcolor=\"highlight\"\n            size=\"L\"\n            padding=\"false\"\n            label_close=\"Close\"\n            content=\"${escapeHtml(contentHtml)}\">\n        </nb-popin>\n    `\n}\n\nfunction createButton(options) {\n    const {\n        link_url,\n        classList,\n        popin_id,\n        longSku,\n        tracking_list,\n        tracking_position,\n        variation,\n        id,\n        name,\n        campaign_position,\n        creative,\n        tabbed_component,\n        button_text,\n        view_details_label,\n        skuData\n    } = options\n\n    return `\n            <nb-cta\n                ${link_url ? `link=\"${link_url}\"` : ''}\n                class=\"${classList}\"\n                ${popin_id ? `popin_id=\"${popin_id}\"` : ''}\n                ${longSku ? `long_sku=\"${longSku}\"` : ''}\n                ${tracking_list ? `tracking_list=\"${tracking_list}\"` : ''}\n                ${tracking_position ? `tracking_position=\"${tracking_position}\"` : ''}\n                variation=\"${variation}\"\n                ${id ? `campaign_id=\"${id}\"` : ''}\n                ${name ? `campaign_name=\"${name}\"` : ''}\n                ${campaign_position ? `campaign_position=\"${campaign_position}\"` : ''}\n                ${creative ? `campaign_creative=\"${creative}\"` : ''}\n                ${tabbed_component ? `tabbed_component=\"${tabbed_component}\"` : ''}\n                ${skuData ? `sku_data='${JSON.stringify(skuData)}'` : ''}\n            >\n                ${button_text || view_details_label}\n            </nb-cta>\n        `\n}\n","export const EVENT_COLOR_CLICKED = 'EVENT_COLOR_CLICKED'\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","import '@kissui/components/src/card-labels'\nimport '@kissui/components/src/card-logos'\nimport '@kissui/components/src/energy-label'\nimport '@kissui/components/src/intensity'\n\nimport { setAttributes } from '@kissui/helpers/src/utils'\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\n\nimport renderAdditionalMessage from './fragments/additionalMessage'\nimport { openBundlePopin, renderBundlePopinLink } from './fragments/bundle'\n\nimport { renderEnergyLabel } from '@kissui/helpers/src/energy-label.helpers'\nimport { renderColors } from '@kissui/helpers/src/colors.helpers'\nimport { renderFeatures } from './fragments/features'\nimport { renderHeading } from './fragments/heading'\nimport renderHeadline from './fragments/headline'\n\nimport { renderIntensity } from '@kissui/helpers/src/intensity.helpers'\nimport renderLabelRange from './fragments/labelRange'\nimport { renderLabels } from './fragments/labels'\nimport renderLabelTechnology from './fragments/labelTechnology'\nimport { initLazyLoad } from './fragments/lazyLoad'\nimport { renderPriceWrapper } from './fragments/priceWrapper'\nimport { renderRatings } from './fragments/ratings'\nimport { setCardTheme } from './fragments/setCardTheme'\n\nimport './components/plp-product-card-image-slider'\nimport { renderHeader } from './fragments/header'\nimport { renderSubscription } from './fragments/subscription'\n\nimport { EVENT_COLOR_CLICKED } from '@kissui/components/src/colors/components/color/constants.mjs'\nimport { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getProduct, getPriceFormatter, getCurrency } from '@kissui/helpers/src/catalog'\n\nimport { handlePromoClick, productClick } from '@kissui/helpers/src/gtmEvents'\nimport {\n    B2B_CONTACT_FORM_POPIN_ID,\n    EVENT_POPIN_OPEN,\n    B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO\n} from '@kissui/components'\n\nimport { apiOverride } from '@kissui/components/src/sku/services'\n\nclass PlpProductCard extends HTMLElement {\n    async connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n        this.boundOnColorClick = this.onColorClick.bind(this)\n        this.boundOpenPopin = this.onOpenPopin.bind(this)\n        await this.render()\n        initLazyLoad(this.props, this)\n    }\n\n    async render() {\n        const {\n            additional_message_icon,\n            additional_message,\n            category_name = '',\n            giftcard_price,\n            hide_header,\n            image,\n            intensity,\n            label_technology,\n            label_range,\n            labels = [],\n            plp_type,\n            position,\n            rating_enabled = false,\n            show_ratings = false,\n            sku,\n            src_page,\n            type,\n            orientation,\n            imwidth\n        } = this.props\n\n        if (type === 'giftcard' && !giftcard_price) {\n            return null\n        }\n        if (hide_header || !image) {\n            this.classList.add('hide-header')\n        }\n\n        if (labels.length) {\n            this.classList.add('has-labels')\n        }\n\n        if (orientation === 'landscape') {\n            this.classList.add('cn_card--landscape')\n        }\n\n        this.innerHTML = `\n            ${renderHeader(this.props, viewportHelper, imwidth)}\n            ${renderLabels(this.props)}\n            ${renderLogos(this.props, this)}\n            ${renderEnergyLabel(this.props)}\n            <div class=\"cn_card__content\">\n                ${renderLabelTechnology(label_technology)}\n                ${renderLabelRange(label_range)}\n\n                ${renderHeading(this.props, viewportHelper)}\n                ${\n                    show_ratings && rating_enabled\n                        ? `<div class=\"cn_card__rating\"><nb-loader></nb-loader></div>`\n                        : ''\n                }\n\n                ${renderHeadline(this.props)}\n\n                ${type === 'machine' ? renderColors(this.props, viewportHelper) : ''}\n                ${type === 'machine' ? renderFeatures(this.props) : ''}\n\n                ${type === 'capsule' ? renderBundlePopinLink(this.props, this) : ''}\n                ${type === 'capsule' ? renderIntensity(intensity, this.props) : ''}\n\n                ${await renderPriceWrapper(this.props)}\n\n                ${type === 'machine' ? renderSubscription(this.props) : ''}\n\n                ${renderAdditionalMessage(additional_message_icon, additional_message)}\n            </div>\n        `\n\n        setAttributes(this, {\n            'data-product-item-id': sku,\n            'data-product-section': category_name,\n            'data-product-position': position,\n            'data-src-page': src_page,\n            'data-plp-type': plp_type\n        })\n        setCardTheme(this.props, this)\n        this.bundlePopinLink = this.querySelector('.cn_card__cta__bundle button')\n\n        this.classList.add('cn_card')\n        this.bindEvent()\n\n        if (show_ratings && rating_enabled) {\n            renderRatings(this.props, this.querySelector('.cn_card__rating'))\n        }\n    }\n\n    async onPDPLinkClick() {\n        const productIndex = this.getAttribute('tracking_position') || 0\n        await productClick(productIndex, this, this.props.longSku)\n    }\n\n    onColorClick(e) {\n        const event = readEvent(e)\n        if (!event.sku) {\n            return\n        }\n\n        this.props.sku = event.sku\n\n        this.template = '<nb-loader></nb-loader>'\n\n        const newLabels = this.props.colors?.find(c => c.sku === this.props.sku)?.labels\n\n        Promise.all([getPriceFormatter(), getProduct(this.props.sku)])\n            .then(([formatter, payload]) => {\n                if (!payload || !formatter) {\n                    return\n                }\n\n                const { name, legacyId, id, images, responsiveImages, price, pdpURLs } = payload\n\n                this.props = {\n                    ...this.props,\n                    name,\n                    sku: legacyId || '',\n                    longSku: id || '',\n                    image: responsiveImages?.standard || images?.icon || '',\n                    image_alt_text: name || '',\n                    price: formatter.short(getCurrency(), price),\n                    activeSku: legacyId || '',\n                    url: pdpURLs?.desktop || '',\n                    labels: newLabels,\n                    ...apiOverride(payload, this.props)\n                }\n\n                this.render()\n            })\n            .catch(() => {\n                console.error(`getProduct fail on sku ${this.props.sku}`)\n            })\n    }\n\n    onOpenPopin() {\n        const { button_text, campaign, name } = this.props\n        handlePromoClick({ campaign, cta_name: `CTA - ${button_text}` })\n\n        const skuArgs = {\n            id: B2B_CONTACT_FORM_POPIN_ID,\n            srcComponent: B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO,\n            productName: name\n        }\n\n        dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: skuArgs })\n    }\n\n    bindEvent() {\n        this.linkElements = []\n        this.unbindEvent()\n        this.linkElements = this.querySelectorAll(`a[href]`)\n        this.addEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n        if (this.linkElements.length) {\n            Array.from(this.linkElements).forEach(linkElement => {\n                linkElement.addEventListener('click', this.boundOnPDPLinkClick)\n            })\n        }\n        if (this.bundlePopinLink) {\n            this.boundBundlePopinLinkClick = openBundlePopin.bind(null, this)\n            this.bundlePopinLink.addEventListener('click', this.boundBundlePopinLinkClick)\n        }\n\n        this.contactBtn = this.querySelector(`nb-cta.cn_card__openContactForm`)\n        if (this.contactBtn) {\n            this.contactBtn.addEventListener('click', this.boundOpenPopin)\n        }\n    }\n\n    unbindEvent() {\n        this.removeEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n        if (this.linkElements?.length) {\n            Array.from(this.linkElements).forEach(linkElement => {\n                linkElement.removeEventListener('click', this.boundOnPDPLinkClick)\n            })\n            this.linkElements = []\n        }\n        if (this.bundlePopinLink) {\n            this.bundlePopinLink.removeEventListener('click', this.boundBundlePopinLinkClick)\n        }\n        if (this.contactBtn) {\n            this.contactBtn.removeEventListener('click', this.boundOpenPopin)\n        }\n    }\n\n    disconnectedCallback() {\n        this.unbindEvent()\n    }\n}\n\ncustomElements.get('nb-plp-product-card') ||\n    customElements.define('nb-plp-product-card', PlpProductCard)\n\nexport default PlpProductCard\n","export default function renderLabelTechnology(label_technology) {\n    return `${\n        label_technology ? `<p class=\"cn_card__technology t-xs-700\">${label_technology}</p>` : ''\n    }`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nexport const renderLabels = ({ labels = [] }) => {\n    if (labels.length === 0) {\n        return ''\n    }\n\n    const data = stringifyForAttribute({ labels })\n\n    return `<nb-card-labels data='${data}' direction=\"${\n        viewportHelper.is.mobile ? 'row' : 'column'\n    }\"></nb-card-labels>`\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 { 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 default function renderLabelRange(label_range) {\n    return `${label_range ? `<p class=\"cn_card__range t-xs-500\">${label_range}</p>` : ''}`\n}\n","import { SRC_PAGE_PDP } from '@kissui/components'\n\nexport const renderHeading = (\n    { url, a11y_product_card = '', name = '', label_decaffeinato, src_page = '' },\n    viewportHelper\n) => {\n    const decaffeinatoRegExp = new RegExp(label_decaffeinato, 'ig')\n    const hasDecaffeinato =\n        label_decaffeinato && label_decaffeinato !== '' && decaffeinatoRegExp.test(name)\n\n    a11y_product_card = a11y_product_card.replace('{productName}', name)\n\n    if (hasDecaffeinato) {\n        name = name.replace(decaffeinatoRegExp, '').trim()\n    } else {\n        label_decaffeinato = ''\n    }\n\n    const headingLevel = src_page === SRC_PAGE_PDP ? 'h1' : 'h3'\n\n    return `${\n        url\n            ? `<${headingLevel} class='cn_card__title h-lg-700'><a href=\"${url}\" target=\"_self\" title=\"${a11y_product_card}\" aria-label=\"${a11y_product_card}\">`\n            : `<${headingLevel} class='cn_card__title h-lg-700'>`\n    }\n${name}\n${\n    label_decaffeinato\n        ? `<span class='${\n              viewportHelper.is.mobile ? 't-xs-700-sl' : 't-md-700-sl'\n          }'>${label_decaffeinato}</span>`\n        : ''\n}\n${url ? `</a></${headingLevel}>` : `</${headingLevel}>`}`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nexport default function renderHeadline({ headline = '', is_headline_hidden = false }) {\n    return `${\n        headline === '' || (is_headline_hidden && viewportHelper.is.mobile)\n            ? ''\n            : `<p class=\"cn_card__text t-sm-400\">${headline}</p>`\n    }`\n}\n","export const renderIntensity = (intensity, options) => {\n    if (intensity === 0 || isNaN(parseInt(intensity))) {\n        return ''\n    }\n\n    const { intensity_label = '', max_intensity, a11y_intensity_max = '' } = options\n\n    return `<nb-intensity\n        intensity=\"${intensity}\"\n        ${max_intensity ? `max_intensity=\"${max_intensity}\"` : ''}\n        a11y_intensity_max=\"${a11y_intensity_max}\"\n        intensity_label=\"${intensity_label}\">\n    </nb-intensity>`\n}\n","export default function renderAdditionalMessage(additional_message_icon, additional_message) {\n    if (!additional_message) {\n        return ''\n    }\n    return `<p class=\"cn_card__additionalMessage t-sm-500-sl\">\n        <nb-icon\n            icon=\"${additional_message_icon}\"\n            class=\"additionalMsgIcon\"\n        ></nb-icon> ${additional_message}</p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { SRC_PAGE_PLP, PLP_TYPE_COFFEE } from '@kissui/components'\n\nexport const setCardTheme = (props, component) => {\n    const { src_page, plp_type } = props\n    if (src_page === SRC_PAGE_PLP) {\n        if (plp_type === PLP_TYPE_COFFEE) {\n            // PLP COFFEE\n            viewportHelper.is.mobile\n                ? component.setAttribute('theme', 'landscape')\n                : component.setAttribute('theme', 'portrait')\n        } else {\n            // PLP MACHINE OR ACCESSORY\n            component.setAttribute('theme', 'portrait')\n        }\n    } else {\n        // PDP\n        component.setAttribute('theme', 'pdp')\n    }\n}\n"],"names":["createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","CardLabels","HTMLElement","constructor","super","this","labels","connectedCallback","render","direction","classList","add","length","innerHTML","renderLabels","map","label","name","bgColor","color","join","customElements","get","define","getMarketCode","dataLayer","window","padlNamespace","app","market","toLocaleLowerCase","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","VERTUONEXT_LOGO_IMG","RAINFOREST_LOGO_IMG","SUSTAINABILITY_LOGO_IMG","Q_CERTIFICATION_ARABICA_LOGO_IMG","DESIGN_AWARD_2021_IMG","LOGO_IMG_MAP","fair_trade","is_organic","organicLogoImg","getOrganicLogo","only_vertuo_next","is_q_certified_arabica","is_rainforest","is_sustainable","is_design_award_2021","CardLogos","alt_fair_trade","alt_organic","alt_vertuo_next","alt_rainforest","alt_sustainable","alt_q_certification_arabica","logos","logos_list","undefined","forEach","param","appendLogo","apply","logo","alt","list","hasLogo","push","logosList","logoName","some","EnergyLabel","level","levelPlus","a11y_label","Intensity","intensity_label","a11y_intensity_max","max_intensity","intensity","parseInt","isNaN","a11yIntensityMax","replace","renderIntensityMin","renderIntensityMax","Array","Math","max","min_intensity","fill","min","removeEmptyValues","findText","key","value","text","includes","lazyLoad","node","url","inViewPort","setAttribute","cb","img","Image","src","onload","onerror","Error","test","navigator","userAgent","agent","start","indexOf","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","interpolate","txt","vars","stChr","enChr","curIdx","stIdx","enIdx","hashId","substring","stringifyForAttribute","escapeHtml","stringify","m","DOMParser","setAttributes","element","attrs","BREAKPOINT_TABLET","EVENT_POPIN_OPEN","helper","is","innerWidth","vw","devicePixelRatio","mobile","mobile_tablet","tablet","desktop","retina","lt","ref","dispatchEvent","eventName","args","event","CustomEvent","detail","bubbles","Event","document","createEvent","initEvent","bundlePopinID","label_close","bundlePopinContent","openBundlePopin","component","renderPopinBundleDetail","bundlePopIn","getElementById","appendChild","variation","bgcolor","size","padding","content","id","popin","createElement","DISPLAY_COLOR_MAX","renderFeature","icon","heading","description","desc","classname","renderPrice","price","giftcard_price","type","hidePrice","subscription","from","custom_price","getCurrency","config","padl","namespace","currency","getPriceFormatter","async","napi","priceFormat","getProduct","sku","catalog","trimSku","renderStrikethroughPrice","strikethroughPrice","priceFormatter","html","short","getFormattedPrice","renderShowSleeve","sales_multiple","label_sleeve","label_sleeves","show_sleeve","sleeve_syntax","number_of_sleeves","label_capsules","bundled","unit_quantity","unitQuantity","numberOfSleeves","sleeveLabel","quantity","labelContent","renderPriceWrapper","in_stock","strikethrough_price","hide_add_to_cart","showOutOfStock","show_capsule_price","price_per_capsule","capsule_price_label","capsule_price_syntax","renderCapsulePrice","renderA11yPrice","a11y_price","a11y_capsule_price","sleeve_variation_pdp","label_outofstock","shop_similar","renderOutOfStock","category_name","longSku","position","quantity_selector","view_details_label","buttonSize","viewportHelper","add_to_cart","renderAddToCart","hidden","bulletActive","CarouselTouchPlugin","carousel","_carousel","_container","addEventListener","e","preventDefault","startDrag","passive","drag","endDrag","translateFactor","touches","_origin","x","screenX","y","screenY","_width","containerWidth","point","translate","_lastTranslate","translateDelta","_currentIndex","_widthSlide","preventMobileYTranslate","abs","stopPropagation","dragDelta","carouselWidth","slideDirection","goToItem","CarouselCreamUiHack","MutationObserver","mutations","mutation","oldValue","oldState","contains","newState","body","attributeFilter","attributeOldValue","Carousel","options","_element","_slides","slice","call","children","_index","index","_options","Object","assign","slidesToScroll","slidesVisible","spaceBetween","navigationButton","loop","navigationAsSlider","pagination","hookGetRightBoundary","hookSlideChange","hookMove","hookNext","hookPrevious","pagination_variation","nav_centered","moveCallbacks","_ratio","buildIHM","hasPagination","slidesTotal","navigationVariation","navigation_variation","navigationSize","navigation_size","offsetWidth","_root","wrapperWidth","_wrapper","paginationVariation","getSlideWidth","_children","child","setWrapperStyle","createNavigation","createPagination","widthSlide","widthContainer","setContainerWidth","setWrapperWidth","slide","setSlideWidth","_widthContainer","_widthWrapper","style","width","marginRight","disableTransition","transition","enableTransition","delta","left","tag","className","div","sliderWidth","prevButton","createNavigationButton","nextButton","addNavigationListeners","mainContainer","parentElement","onMove","remove","button","next","prev","getSlideNotVisible","createPaginationBullets","paginationBullets","buttons","i","span","innerText","toString","selectButton","activeButton","createPaginationStepper","paginationStepper","spanTotal","slash","spanCurrent","info","hackUi","incomingIndex","getOverflowingIndex","translateX","indexHasChange","$html","querySelector","reachedLeftBoundary","getLeftBoundary","reachedRightBoundary","getRightBoundary","lastIndex","overflowingIndex","incomingSlideIndex","currentIndex","existingSlide","goingToNextSlide","boundaryReached","_getMaxSlideWidth","slides","onSlideChange","activateItems","t","item","video","pause","play","setClass","unsetClass","emitCustomEvent","customEvent","cancelable","composed","raisedByPB","selectPromotion","eventData","cta_name","event_raised_by","ecommerce","keys","creative","ecommerceData","promotion_id","promotion_name","creative_slot","creative_name","gtmDataObject","productClick","productInfo","product","getProductInfo","productPayload","getProductPayload","actionField","internationalName","internationalId","category","unitPrice","legacyId","technologies","inStock","technology","split","pop","dimension44","toLowerCase","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","eventAction","currencyCode","eventRaisedBy","click","products","Slider","_slider","randomId","observedAttributes","slot","testId","result","characters","charAt","floor","random","makeId","loadSlider","navigation_as_slider","indexSlider","slides_loop","slides_visible","slides_to_scroll","navigation","space_between","el","CarouselLib","handleClick","bind","slideIndex","toggleClasses","itemTypes","itemDisplay","rootElement","isFirst","isLast","PlpProductCardImageSlider","image_alt_text","nbSlider","nbLoader","image","renderHeader","show_slider","plp_type","imwidth","hasSliderActivated","imgUrl","renderImage","renderImageOrSlider","subscriptionText","buttonStyle","popin_id","button_style","button_text","tracking_position","tracking_list","button_url","campaign","tabbed_component","campaign_position","createButton","link_url","contentHtml","skuData","rawPrice","EVENT_COLOR_CLICKED","apiOverride","productData","pageBuilderData","images","headline","api_override","main","PlpProductCard","boundOnPDPLinkClick","onPDPLinkClick","boundOnColorClick","onColorClick","boundOpenPopin","onOpenPopin","initLazyLoad","getWidth","getAttribute","imPolicy","additional_message_icon","additional_message","hide_header","label_technology","label_range","rating_enabled","show_ratings","src_page","orientation","renderLogos","a11y_energy_label","energy_level","renderEnergyLabel","renderLabelRange","renderHeading","a11y_product_card","label_decaffeinato","decaffeinatoRegExp","RegExp","hasDecaffeinato","trim","headingLevel","is_headline_hidden","renderHeadline","colors","max_colors","a11y_extra_color","activeSku","extra_url","extra_title","renderColors","features","renderFeatures","renderBundlePopinLink","bundle_details","range","popin_link_text","other_skus","other_skus_quantity","popin_label_close","renderIntensity","renderSubscription","renderAdditionalMessage","setCardTheme","bundlePopinLink","bindEvent","renderRatings","minimum_rating","refElement","ratings","summary","then","ratingsResult","ratingAverage","stars","parseFloat","toFixed","ratingData","elem","replaceWith","productIndex","readEvent","template","newLabels","c","Promise","formatter","payload","responsiveImages","pdpURLs","standard","catch","cleanedData","handlePromoClick","srcComponent","productName","linkElements","unbindEvent","querySelectorAll","linkElement","boundBundlePopinLinkClick","contactBtn","removeEventListener","disconnectedCallback"],"mappings":"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"}