{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/constants.mjs","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/sku/fragments/heading.js","../../../packages/helpers/src/catalog.js","../../../packages/helpers/src/getCurrency.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/helpers/src/dataLayer.js","../../../packages/components/src/sku/fragments/addToCart.js","../../../packages/components/src/sku/fragments/additionalMessage.js","../../../packages/helpers/src/cremaDataHelper.js","../../../packages/components/src/sku-coffee/services/index.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.coffee.dto.js","../../../services/plp/services.js","../../../packages/components/src/sku/services/index.js","../../../packages/components/src/sku-quick-view/shared-quick-view-types.ts","../../../packages/components/src/sku-quick-view/shared-quick-view.ts","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.machine.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.giftCard.dto.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/components/src/sku/sku.js","../../../packages/components/src/sku/fragments/setCardTheme.js","../../../packages/components/src/sku/fragments/labels.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/quickView.js","../../../packages/components/src/sku/fragments/price.js","../../../packages/components/src/sku-accessory/sku-accessory.js","../../../packages/helpers/src/assets/js/eventBus.js","../../../packages/components/src/cta/cta.js","../../../packages/components/src/img/js/constants.js","../../../packages/components/src/img/img.js","../../../packages/components/src/link/link.js","../../../packages/helpers/src/assets/js/viewportTracking.js","../../../packages/helpers/src/assets/js/zoneTracking.js","../../../packages/components/src/container/container.js","../../../packages/components/src/chip/chip.js","../../../packages/helpers/src/assets/js/scopedKeyboardNav.js","../../../packages/components/src/dropdown/dropdown.js","../../../packages/helpers/src/assets/js/productTracking.js","../../../packages/components/src/add-to-cart/addToCart.js","../../../packages/components/src/plp-sticky-bar/plp-sticky-bar.js","../../../packages/helpers/src/swipeEvents.ts","../../../packages/components/src/popin/components/overlay.js","../../../packages/components/src/popin/popin.js","../../../packages/components/src/card-logos/cardLogos.js","../../../packages/components/src/slider-menu/js/constants.js","../../../packages/components/src/slider-menu/js/SliderMenuLib.js","../../../packages/components/src/slider-menu/slider-menu.js","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/helpers/src/refs.helpers.js","../../../packages/helpers/src/impolicy.js","../../../packages/components/src/navigation-bubbles/components/bubble/js/constants.js","../../../packages/components/src/navigation-bubbles/components/bubble/bubble.js","../../../packages/helpers/src/intersection-observer.service.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/navigation-bubbles/data/constants.js","../../../packages/components/src/navigation-bubbles/navigation-bubbles.js","../../../packages/components/src/navigation-bubbles/services/events.manager.js","../../../services/plp-data/src/prod/index.js","../../../packages/apps/src/plp-core/config/experiments.ts","../../../packages/apps/src/plp-core/config/constants.js","../../../packages/apps/src/plp-core/store/plp.data.js","../../../packages/apps/src/plp-core/store/plp.actions.js","../../../services/crema-service/src/Store.ts","../../../services/crema-service/src/CremaService.ts","../../../packages/apps/src/plp-core/store/plp.events.js","../../../packages/apps/src/plp-core/helpers/tracking.js","../../../packages/apps/src/plp-core/store/index.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.mobileDropDown.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.content.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.footer.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-popin.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-cta.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-links.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-sort.js","../../../packages/apps/src/plp-core/components/filter/_plp.filter.main.js","../../../packages/components/src/sticky/sticky.service.js","../../../packages/apps/src/plp-core/components/navigation/plp.bar.js","../../../packages/apps/src/plp-core/components/navigation/_plp.navigation.main.js","../../../packages/apps/src/plp-core/components/results/plp.results-chip.js","../../../packages/apps/src/plp-core/components/results/plp.results-header.js","../../../packages/apps/src/plp-core/components/plp.product.js","../../../packages/apps/src/plp-core/components/results/_plp.results.main.js","../../../packages/apps/src/plp-core/components/products/_plp.products.main.js","../../../packages/apps/src/plp-core/components/products/plp.category-products.js","../../../packages/apps/src/plp-core/plp.app.js","../../../packages/apps/src/plp-core/models/Category.js","../../../packages/apps/src/plp-accessory/models/accessory.category.js","../../../packages/apps/src/plp-core/models/Product.js","../../../packages/apps/src/plp-accessory/models/accessory.product.js","../../../packages/apps/src/plp-core/models/NavigationLinks.js","../../../packages/apps/src/plp-core/models/NavigationBubbles.js","../../../packages/apps/src/plp-core/models/MainDTO.js","../../../packages/apps/src/plp-accessory/dataTransform/plp-accessory.dto.js","../../../packages/apps/src/plp-core/filter/filter.js","../../../packages/apps/src/plp-core/filter/types/DefaultFilterChipType.js","../../../packages/apps/src/plp-core/filter/createFilter.js","../../../packages/apps/src/plp-accessory/dataTransform/plp-accessory.filters.dto.js","../../../packages/apps/src/plp-accessory/dataTransform/plp-accessory.sort.dto.js","../../../packages/apps/src/plp-core/store/plp.states.js","../../../packages/apps/src/plp-accessory/plp-accessory.component.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 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","export class NespressoElement extends HTMLElement {\n    constructor() {\n        super()\n        this.template = ''\n    }\n\n    connectedCallback() {\n        this.props = this._createProps()\n        this.onStart?.()\n        this.loadTemplate()\n        this.onReady?.()\n    }\n\n    /**\n     * Load the attributes and create the props object\n     * @returns {any}\n     * @private\n     */\n    _createProps(forceAttributes = null) {\n        const attributes = forceAttributes || this.attributes\n\n        const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n        let props\n        try {\n            props = [...attributes].reduce((all, attr) => {\n                return { ...all, [attr.nodeName]: attr.nodeValue }\n            }, {})\n\n            const data = getData([...attributes])\n\n            if (data === undefined || data === null) {\n                return props\n            }\n\n            return { ...props, ...JSON.parse(data.nodeValue) }\n        } catch (error) {\n            console.log(this.nodeName, 'ERROR: No data', error)\n        }\n    }\n\n    /**\n     * Render by DOM diff\n     */\n    render(force = false) {\n        if (force) {\n            // todo review the performance of this\n            this.innerHTML = ''\n        }\n        /**\n         * Convert a template string into HTML DOM nodes\n         * @param  {String} str The template string\n         * @return {Node}       The template HTML\n         */\n        const _stringToHTML = str => {\n            const parser = new DOMParser()\n            const doc = parser.parseFromString(str, 'text/html')\n            return doc.body\n        }\n\n        /**\n         * Compare the template to the UI and make updates\n         * @param  {Node} template The template HTML\n         * @param  {Node} elem     The UI HTML\n         */\n        const _diff = (template, elem) => {\n            /**\n             * Get the type for a node\n             * @param  {Node}   node The node\n             * @return {String}      The type\n             */\n            const _getNodeType = node => {\n                if (node.nodeType === 3) {\n                    return 'text'\n                }\n                if (node.nodeType === 8) {\n                    return 'comment'\n                }\n                return node.tagName.toLowerCase()\n            }\n\n            /**\n             * Get the content from a node\n             * @param  {Node}   node The node\n             * @return {String}      The type\n             */\n            const _getNodeContent = node => {\n                if (node.childNodes && node.childNodes.length > 0) {\n                    return null\n                }\n                return node.textContent\n            }\n\n            // Get arrays of child nodes\n            const domNodes = Array.prototype.slice.call(elem.childNodes)\n            const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n            // If extra elements in DOM, remove them\n            var count = domNodes.length - templateNodes.length\n            if (count > 0) {\n                for (; count > 0; count--) {\n                    domNodes[domNodes.length - count].parentNode.removeChild(\n                        domNodes[domNodes.length - count]\n                    )\n                }\n            }\n\n            // Diff each item in the templateNodes\n            templateNodes.forEach(function (node, index) {\n                // If element doesn't exist, create it\n                if (!domNodes[index]) {\n                    elem.appendChild(node.cloneNode(true))\n                    return\n                }\n\n                // If element is not the same type, replace it with new element\n                if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n                    domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n                    return\n                }\n\n                // If content is different, update it\n                const templateContent = _getNodeContent(node)\n                if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n                    domNodes[index].textContent = templateContent\n                }\n\n                // If target element should be empty, wipe it\n                if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n                    domNodes[index].innerHTML = ''\n                    return\n                }\n\n                // If element is empty and shouldn't be, build it up\n                // This uses a document fragment to minimize reflows\n                if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n                    const fragment = document.createDocumentFragment()\n                    _diff(node, fragment)\n                    domNodes[index].appendChild(fragment)\n                    return\n                }\n\n                // If there are existing child elements that need to be modified, diff them\n                if (node.childNodes.length > 0) {\n                    _diff(node, domNodes[index])\n                }\n            })\n        }\n\n        // todo - add support to reactivity\n        // this.template(this.state)\n        const templateHTML = _stringToHTML(this.template)\n        _diff(templateHTML, this)\n    }\n\n    /**\n     * Set the HTML to be used in the template\n     * @param {String} html The HTML to use\n     *\n     * This function is overwritten by the extended class to set the HTML\n     *\n     */\n    loadTemplate(template = '', force = false) {\n        this.template = template === '' ? this.template : `${template}`\n        this.render(force)\n    }\n\n    disconnectedCallback() {\n        this.onDestroy?.()\n    }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n    customElements.define('nb-nespresso-element', NespressoElement)\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n    const lt = (ref: number) => {\n        return window.innerWidth < ref\n    }\n\n    return {\n        get is() {\n            const { innerWidth: vw, devicePixelRatio } = window\n            return {\n                mobile: vw < BREAKPOINT_M,\n                mobile_tablet: vw < BREAKPOINT_TABLET,\n                tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n                desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n                retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n            }\n        },\n        lt\n    }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    ESC: 27,\n    SPACE: 32,\n    ENTER: 13,\n    TAB: 9\n}\n\nexport function capitalize(s = '') {\n    return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n    const arr = str.match(/[a-z]+|\\d+/gi)\n    if (!arr) { return str }\n    return arr.map((m, i) => {\n        let low = m.toLowerCase()\n        if (i !== 0) {\n            low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n        }\n        return low\n    }).join(\"\")\n}\n\nexport function slug(s = '') {\n    return s\n        .toLowerCase()\n        .trim()\n        .replace(/\\s+/g, '-') // Replace spaces with -\n        .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n        .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n    return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n    return target + '%'\n}\n\nexport function parseHTML(str: string) {\n    const tmp = document.implementation.createHTMLDocument('')\n    tmp.body.innerHTML = str\n    return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n    const tmp = document.implementation.createHTMLDocument('')\n    tmp.body.innerHTML = str\n    return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n    var result = ''\n    var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n    var charactersLength = characters.length\n    for (var i = 0; i < length; i++) {\n        result += characters.charAt(Math.floor(Math.random() * charactersLength))\n    }\n    return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n    const findText = [\n        'Default campaign ID (tracking missing in Page Builder export)',\n        'Default campaign name (tracking missing in Page Builder export)',\n        'promoname', \n        'promoid', \n        'promocreative', \n        'undefined'\n    ];\n    \n    for (let key in obj) {\n        const value = obj[key];\n        \n        if (value === null || value === undefined || value === '') {\n            delete obj[key];\n            continue;\n        }\n        \n        if (typeof value === 'string') {\n            for (const text of findText) {\n                if (value.includes(text)) {\n                    delete obj[key];\n                    break;\n                }\n            }\n        }\n    }\n    \n    return obj;\n}\n\nexport function makeHash(str: string) {\n    var hash = 0,\n        i,\n        chr\n    if (!str) {\n        return hash\n    }\n    for (i = 0; i < str.length; i++) {\n        chr = str.charCodeAt(i)\n        hash = (hash << 5) - hash + chr\n        hash |= 0 // Convert to 32bit integer\n    }\n    return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n    let linkHash = link\n    let linkNoHash = link\n    if (link.indexOf('#') !== -1) {\n        linkNoHash = link.replace('#', '')\n    } else {\n        linkHash = '#' + link\n    }\n\n    return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n    const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n    const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n    const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n    const isOldIOS = () => {\n        var agent = window.navigator.userAgent,\n            start = agent.indexOf('OS ')\n        if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n            return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n        }\n        return false\n    }\n\n    const inViewPort = (attribute: string, value: any) => {\n        node.setAttribute(attribute, value)\n\n        const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n        if (url) {\n            const img = new Image()\n            img.src = url\n            img.onload = cb\n            img.onerror = () => {\n                cb()\n                node.classList.add(CLASSNAME_ON_ERROR)\n                throw new Error(`Image ${url} cannot be loaded`)\n            }\n\n            return\n        }\n\n        cb()\n    }\n\n    if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n        inViewPort(attribute, value)\n    } else {\n        if ('IntersectionObserver' in window) {\n            node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n            let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n                entries.forEach(function (entry) {\n                    if (entry.isIntersecting) {\n                        inViewPort(attribute, value)\n                        lazyBackgroundObserver.unobserve(entry.target)\n                    }\n                })\n            })\n            lazyBackgroundObserver.observe(node)\n        } else {\n            inViewPort(attribute, value)\n        }\n    }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n    const isOldIOS = () => {\n        var agent = window.navigator.userAgent,\n            start = agent.indexOf('OS ')\n        if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n            return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n        }\n        return false\n    }\n\n    if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n        cb()\n    } else {\n        if ('IntersectionObserver' in window) {\n            let lazyBackgroundObserver = new IntersectionObserver(\n                function (entries) {\n                    entries.forEach(function (entry) {\n                        if (entry.isIntersecting) {\n                            cb()\n                            lazyBackgroundObserver.unobserve(entry.target)\n                        }\n                    })\n                },\n                { rootMargin: '150% 0px' }\n            )\n            lazyBackgroundObserver.observe(node)\n        }\n    }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n    let timer: number\n    return function (event: T) {\n        if (timer) {\n            window.clearTimeout(timer)\n        }\n        timer = window.setTimeout(func, time, event)\n    }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n    let ua = window.navigator.userAgent,\n        isIE = /MSIE|Trident/.test(ua)\n\n    return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n    src,\n    callback = null,\n    async = false,\n    defer = false,\n    module = false,\n    id = ''\n}: {\n    src: string;\n    callback: null | GlobalEventHandlers[\"onload\"]\n    module: boolean,\n    defer: boolean,\n    async: boolean,\n    id: string\n}) => {\n    const script = document.createElement('script')\n    script.type = module ? 'module' : 'text/javascript'\n    script.src = src\n    id ? (script.id = id) : false // add id attribute only if passed\n    if (typeof callback === 'function') {\n        script.onload = callback\n    }\n    script.async = async\n    script.defer = defer\n    document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n    const script = document.createElement('link')\n    script.rel = 'stylesheet'\n    script.href = src\n    document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n    const observer = new IntersectionObserver(handler)\n    observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n    let curIdx = 0\n\n    while (txt) {\n        const stIdx = txt.indexOf(stChr, curIdx)\n        if (stIdx === -1) {\n            break\n        }\n        const enIdx = txt.indexOf(enChr, stIdx + 1)\n        if (enIdx === -1) {\n            break\n        }\n        const hashId = txt.substring(stIdx + stChr.length, enIdx)\n        if (vars[hashId] != null) {\n            txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n            curIdx = stIdx\n        } else {\n            curIdx = enIdx\n        }\n    }\n    return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n    const container = elementScope.querySelector<HTMLElement>(containerSelector)\n    if (!container) {\n        return\n    }\n\n    const items = container.querySelectorAll<HTMLElement>(el)\n    let max = -1\n\n    for (let i = 0; i < [...items].length; i++) {\n        const item = [...items][i]\n        let h = item.offsetHeight\n        max = h > max ? h : max\n    }\n\n    if (max <= 0) {\n        return\n    }\n\n    for (let i = 0; i < [...items].length; i++) {\n        const item = [...items][i]\n        item.style.height = `${max}px`\n    }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n    return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n    const map = {\n        '&': '&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 VARIATION_PLP = 'plp'\nexport const VARIATION_PDP = 'pdp'\nexport const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_SMALL = 'small'\n","import { VARIATION_PDP } from '@kissui/components/src/sku/constants'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nconst isPdp = variation => variation === VARIATION_PDP\n\nconst getHeadingLevel = ({ variation }) => (isPdp(variation) ? 'h1' : 'h3')\n\nconst renderLink = ({ url, a11y_product_card = '', name = '', name_custom = '' }) => {\n    const a11yProductName = a11y_product_card.replace('{productName}', name)\n    const productName = name_custom !== '' ? name_custom : name\n\n    return `<a href=\"${url}\" target=\"_self\" title=\"${a11yProductName}\" aria-label=\"${a11yProductName}\">${productName}</a>`\n}\n\nexport const renderHeading = props => {\n    const { url, name = '', name_custom = '' } = props\n\n    if (!name) {\n        return ''\n    }\n\n    const finalName = name_custom !== '' ? name_custom : name\n    const result = []\n    const headingLevel = getHeadingLevel(props)\n\n    result.push(\n        `<${headingLevel} class=\"cb-heading ${\n            viewportHelper.is.mobile ? 't-md-700-sl' : 'h-lg-700'\n        }\">`\n    )\n\n    if (url && !isPdp(props.variation)) {\n        result.push(renderLink(props))\n    } else {\n        result.push(`${finalName}`)\n    }\n\n    result.push(`</${headingLevel}>`)\n\n    return result.join('')\n}\n","import { 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","export const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n    return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n    return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n    if (!strikethrough_price) {\n        return ''\n    }\n\n    fetchStrikethroughPrice(strikethrough_price)\n        .then(payload => {\n            const element = getStrikethroughPriceElement(component)\n            if (!element) {\n                return\n            }\n\n            element.innerHTML = payload\n        })\n        .catch(e => {\n            console.error(`Error: Component SKU - Strike Through Price  - ${e}`)\n\n            const element = getStrikethroughPriceElement(component)\n            if (!element) {\n                return\n            }\n\n            element.style.display = 'none'\n        })\n\n    return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","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 viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n    VARIATION_PLP,\n    VARIATION_SMALL,\n    VARIATION_CROSS_SELL,\n    VARIATION_PDP\n} from '@kissui/components/src/sku/constants'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst getButtonSize = variation => {\n    switch (variation) {\n        case VARIATION_PLP:\n            return viewportHelper.is.mobile ? 'small' : 'large'\n        case VARIATION_SMALL:\n            return 'small'\n        default:\n            return 'large'\n    }\n}\n\nfunction getComputedProps(activeSku, activeLongSku, sku, longSku, disableTracking) {\n    const skuProp = activeSku || sku\n    const activeLongSkuProp = activeLongSku || longSku\n    const disableTrackingProp = disableTracking && `disableTracking=true`\n\n    return { skuProp, activeLongSkuProp, disableTrackingProp }\n}\n\nexport const renderAddToCart = props => {\n    const {\n        activeLongSku,\n        activeSku,\n        category_name = '',\n        contact_cta = {},\n        hidePrice,\n        longSku = '',\n        position,\n        rendererName = '',\n        show_view_details = false,\n        sku,\n        url,\n        variation = VARIATION_PLP,\n        view_details_label = 'View details',\n        technologies = [],\n        disableTracking = false\n    } = props\n\n    const buttonSize = getButtonSize(variation)\n    let cta_url = url,\n        cta_label = view_details_label,\n        contact_cta_text = contact_cta.contact_cta_text || '',\n        contact_url_anchor = contact_cta.contact_url_anchor || '',\n        is_b2b = checkForB2B(technologies)\n\n    // CONTACT US BUTTON\n    const { skuProp, activeLongSkuProp, disableTrackingProp } = getComputedProps(\n        activeSku,\n        activeLongSku,\n        sku,\n        longSku,\n        disableTracking\n    )\n\n    function b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label) {\n        //CONTACT US BUTTON[ hidePrice = true]\n        const linkAttribute = contact_url_anchor ? `link=\"${cta_url}\"` : ''\n\n        return `<nb-cta ${linkAttribute} variation=\"primary\" data-disabletracking=\"true\">${cta_label}</nb-cta>`\n    }\n\n    function b2bLoggedIn({\n        skuProp,\n        activeLongSkuProp,\n        buttonSize,\n        category_name,\n        position,\n        rendererName,\n        variation,\n        disableTrackingProp\n    }) {\n        return `\n                    <nb-add-to-cart\n                        sku=\"${skuProp}\"\n                        longSku=\"${activeLongSkuProp}\"\n                        buttonSize=\"${buttonSize}\"\n                        showPrice\n                        range='${category_name}'\n                        position='${position}'\n                        rendererName='${rendererName}'\n                        tracking_no_impression=\"${variation === VARIATION_PDP}\"\n                        ${disableTrackingProp}\n                    >\n                    </nb-add-to-cart>\n                `\n    }\n\n    function remainingCases(cta_url, cta_label) {\n        //VIEW DETAILS BUTTON [ hidePrice = false]\n        return `<nb-cta link=\"${cta_url}\" variation=\"primary\">${cta_label}</nb-cta>`\n    }\n\n    if (hidePrice || show_view_details) {\n        if (\n            is_b2b &&\n            (variation === VARIATION_PDP || variation === VARIATION_CROSS_SELL) &&\n            !isLoggedIn()\n        ) {\n            cta_url = contact_url_anchor\n            cta_label = contact_cta_text\n\n            return b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label)\n        } else if (is_b2b && variation === VARIATION_PDP && isLoggedIn()) {\n            return b2bLoggedIn({\n                skuProp,\n                activeLongSkuProp,\n                buttonSize,\n                category_name,\n                position,\n                rendererName,\n                variation,\n                disableTrackingProp\n            })\n        }\n\n        return remainingCases(cta_url, cta_label)\n    }\n\n    // ADD TO CART BUTTON\n    return `\n            <nb-add-to-cart\n                sku=\"${skuProp}\"\n                longSku=\"${activeLongSkuProp}\"\n                buttonSize=\"${buttonSize}\"\n                showPrice\n                range='${category_name}'\n                position='${position}'\n                rendererName='${rendererName}'\n                tracking_no_impression=\"${variation === VARIATION_PDP}\"\n                ${disableTrackingProp}\n            ></nb-add-to-cart>\n        `\n}\n\nfunction checkForB2B(technologies) {\n    return Array.isArray(technologies) && technologies.some(tech => tech.includes('pro'))\n}\n","export const renderAdditionalMessage = ({\n    additional_message_icon,\n    additional_message,\n    additional_message_link\n}) => {\n    if (!additional_message && !additional_message_link) {\n        return ''\n    }\n\n    let additionalMessageFinal = ''\n\n    if (additional_message) {\n        let renderIcon = ''\n        if (additional_message_icon) {\n            renderIcon = `<nb-icon icon=\"${additional_message_icon}\" class=\"additionalMsgIcon\"></nb-icon>`\n        }\n\n        additionalMessageFinal = `<p class=\"cb-warn t-sm-500-sl\">\n            ${renderIcon}\n            ${additional_message}</p>`\n    }\n\n    const hasAdditionalMessageLink =\n        additional_message_link && additional_message_link.link && additional_message_link.label\n\n    if (!hasAdditionalMessageLink) {\n        return additionalMessageFinal\n    }\n\n    return (\n        additionalMessageFinal +\n        `<nb-link\n            link='${additional_message_link.link}'\n            color=\"${additional_message_link.color}\"\n            size=\"${additional_message_link.size}\"\n            seo_label=\"${additional_message_link.seo_label}\">\n            ${additional_message_link.label}\n        </nb-link>`\n    )\n}\n","import { 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 { INTENSITY_MAX_OL, INTENSITY_MAX_VL } from '@kissui/components'\n\nexport const getMaxIntensity = ({ technologies }) =>\n    technologies.indexOf('original') !== -1 ? INTENSITY_MAX_OL : INTENSITY_MAX_VL\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n    product,\n    pageBuilderProductProps,\n    pageBuilderProps,\n    priceFormatter,\n    currency\n) => {\n    const { bundle_details } = pageBuilderProductProps\n    const { options } = pageBuilderProps\n    const { show_sleeve_price } = options\n\n    const isBundledResult = isBundled(product)\n\n    const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n        show_sleeve_price,\n        product,\n        isBundled\n    )\n\n    const option = {\n        bundled: isBundledResult,\n        intensity: product.capsuleProperties?.intensity || product.intensity || null,\n        max_intensity: getMaxIntensity(product),\n        price_per_capsule: price_per_capsule\n            ? priceFormatter.short(currency, price_per_capsule)\n            : null,\n        show_capsule_price: showCapsulePrice\n    }\n\n    if (show_sleeve_price) {\n        option.price = priceFormatter.short(currency, final_price)\n    }\n\n    if (bundle_details) {\n        option.bundle_details = bundle_details\n    }\n\n    return option\n}\n","import {\n    getVertuoNext,\n    getOrganicEu,\n    getRainforest,\n    getLabels,\n    getProductHighlight,\n    getFairTrade,\n    getSustainability,\n    isRange,\n    getCategoryRegEx,\n    RANGE_CATEGORY_NAME,\n    getArabica\n} from '@kissui/helpers/src/cremaDataHelper'\n\n/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nexport async function getMergedPLPData(plpData) {\n    const { data } = plpData\n    if (!data) {\n        return []\n    }\n\n    const eCommerceData = data.configuration.eCommerceData\n\n    addLabels(eCommerceData)\n\n    addProductAttribute(\n        eCommerceData,\n        getFairTrade,\n        (prod, category) => (prod.fairTrade = category.name)\n    )\n    addProductAttribute(eCommerceData, getProductHighlight, prod => (prod.highlighted = true))\n    addProductAttribute(eCommerceData, getVertuoNext, prod => (prod.onlyVertuoNext = true))\n    addProductAttribute(eCommerceData, getOrganicEu, prod => (prod.organicEu = true))\n    addProductAttribute(eCommerceData, getRainforest, prod => (prod.rainforest = true))\n    addProductAttribute(eCommerceData, getSustainability, prod => (prod.sustainability = true))\n    addProductAttribute(eCommerceData, getArabica, prod => (prod.arabica = true))\n\n    addSubSegments(eCommerceData)\n\n    return eCommerceData.categories\n}\n\nfunction addSubSegments(eCommerceData) {\n    const { categories, productGroups, products } = eCommerceData\n    // should be forEach if nothing returned/assigned\n    categories.forEach(category => {\n        const hasSegment = category.subCategories.length > 0 && isRange(category)\n        if (hasSegment) {\n            category.segments = category.subCategories.map(categoryId => {\n                const segment = categories.find(subCategory => subCategory.id === categoryId)\n                if (segment && isSubsegment(categories, segment)) {\n                    segment.products = getProductsData(productGroups, segment.id, products)\n                    segment.isSegment = true\n                }\n                return segment\n            })\n        }\n\n        category.products = getProductsData(productGroups, category.id, products)\n    })\n}\n\nexport function getProductsData(productGroups, categoryId, products) {\n    let result = []\n    try {\n        const currentCategory = productGroups.find(category => category.categoryId === categoryId)\n\n        if (!currentCategory) {\n            return result\n        }\n\n        const { productIds } = currentCategory\n        return productIds.map(productId => {\n            const product = products.find(product => product.id === productId)\n            return product\n        })\n    } catch (e) {\n        //generally an anti pattern to only log the error, with no try catch the result would be the same\n        console.log(e)\n    }\n\n    return result\n}\n\n/**\n * adds labels property to products containing each label's category data (JSON parsed description property) assigned to it\n * labels are categories that have the label base category as parent\n * to apply a label on a given product, the label has to contain the product\n * this function has to clean the productGroups as well by removing the label ones\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addLabels(eCommerceData) {\n    const { categories, productGroups, products } = eCommerceData\n    const labels = getLabels(categories)\n    const labelGroups = getLabelGroups(productGroups, labels)\n    labelGroups.forEach(group => {\n        const label = labels.find(label => label.id === group.categoryId)\n        group.productIds.forEach(productId => {\n            const prod = products.find(product => product.id === productId)\n            prod.labels = prod.labels || []\n            prod.labels.push(label.description)\n        })\n    })\n    //removing label categories from productGroups\n    labelGroups.forEach(labelGroup => {\n        const indexToRemove = productGroups.findIndex(\n            productGroup => productGroup.categoryId === labelGroup.categoryId\n        )\n        productGroups.splice(indexToRemove, 1)\n    })\n}\n\n/**\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a the category on a given product, the category's productGroup has to contain the product\n * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addProductAttribute(eCommerceData, categoryFetcher, assignHandler) {\n    const { categories, productGroups, products } = eCommerceData\n    const category = categoryFetcher(categories)\n    if (!category) {\n        return\n    }\n    const categoryGroup = getCategoryGroup(productGroups, category)\n    if (!categoryGroup) {\n        return\n    }\n    categoryGroup.productIds.forEach(productId => {\n        const prod = products.find(product => product.id === productId)\n        if (categoryFetcher === getArabica) {\n            console.log('addProductAttribute', prod)\n        }\n        assignHandler(prod, category)\n    })\n    const indexToRemove = productGroups.findIndex(\n        productGroup => productGroup.categoryId === categoryGroup.categoryId\n    )\n    productGroups.splice(indexToRemove, 1)\n}\n\n/**\n * retrieve all the productGroup that are labels\n * @param {productGroup[]} productGroups\n * @param {category[]} labels\n */\nfunction getLabelGroups(productGroups, labels) {\n    return productGroups.filter(group => labels.some(label => label.id === group.categoryId))\n}\n\n/**\n * retrieve the productGroup which correspond to a category\n * @param {productGroup[]} productGroups\n * @param {category} fairTrade\n */\nfunction getCategoryGroup(productGroups, category) {\n    return productGroups.find(group => category.id === group.categoryId)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isSubsegment(categories, category) {\n    /*category.superCategories.some(superCategoryId => {\n        const superCategoryData = categories.find(categoryToFind => categoryToFind.id === superCategoryId)\n    })*/\n    const result = category.superCategories.some(superCategory =>\n        getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n    )\n    return result\n}\nexport function getFinalPrice(show_sleeve_price, product, isBundled) {\n    let showCapsulePrice = show_sleeve_price\n    let final_price\n    let price_per_capsule\n\n    const bundled = isBundled(product)\n\n    if (product.type === 'capsule' && !bundled) {\n        final_price = product.price * product.salesMultiple\n        // this isn't necessary in prod but the mock price formatter needs it\n        final_price = Math.round(final_price * 100) / 100\n        price_per_capsule = product.price\n    } else {\n        showCapsulePrice = false\n        final_price = product.price\n    }\n\n    return { showCapsulePrice, final_price, price_per_capsule }\n}\n","import {\n    ECAPI_TYPE_ACCESSORY,\n    ECAPI_TYPE_CAPSULE,\n    ECAPI_TYPE_GIFT_CARD,\n    ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getSkuComponentByType = ({ type, is_machine_b2b }) => {\n    let result = 'nb-sku'\n\n    if (type === ECAPI_TYPE_CAPSULE) {\n        result = 'nb-sku-coffee'\n    } else if (type === ECAPI_TYPE_MACHINE && is_machine_b2b) {\n        result = 'nb-sku-machine-b2b'\n    } else if (type === ECAPI_TYPE_MACHINE) {\n        result = 'nb-sku-machine'\n    } else if (type === ECAPI_TYPE_ACCESSORY) {\n        result = 'nb-sku-accessory'\n    } else if (type === ECAPI_TYPE_GIFT_CARD) {\n        result = 'nb-sku-gift-card'\n    }\n\n    return result\n}\n\nexport const apiOverride = (productData, pageBuilderData) => {\n    if (!productData || !pageBuilderData) {\n        return {}\n    }\n\n    const { images, name, headline, description } = productData\n    const { api_override } = pageBuilderData\n\n    if (!api_override) {\n        return {}\n    }\n\n    return {\n        image: api_override.image || images?.icon || images?.url || images?.push || images?.main,\n        name: api_override.name || name,\n        headline: api_override.headline || headline,\n        description: api_override.description || description\n    }\n}\n","export const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_PLP = 'plp'\n\nexport interface CapsuleFeaturesInputType {\n    acidity?: number | null\n    bitterness?: number | null\n    body?: number | null\n    intensity?: number | null\n    roastLevel?: number | null\n}\n\nexport interface CapsuleFeatureType {\n    value: number | null\n}\n\nexport interface CapsuleFeaturesOutputType {\n    acidity: CapsuleFeatureType\n    bitterness: CapsuleFeatureType\n    body: CapsuleFeatureType\n    intensity: CapsuleFeatureType\n    roast: CapsuleFeatureType\n}\n\nexport type QuickViewProductType = {\n    modelType: string\n    id: string\n    legacyId: string\n    internationalId: string\n    name: string\n    urlFriendlyName: string\n    internationalName: string\n    headline: string\n    rootCategory: string\n    category: string\n    supercategories: string[]\n    mobileImages: {\n        modelType: string\n        icon: string\n        main: string\n    }\n    responsiveImages: {\n        standard: string\n    }\n    pdpURLs: {\n        opr: string\n        desktop: string\n        mobile: string\n    }\n    unitQuantity: number\n    salesMultiple: number\n    maxOrderQuantity: number\n    technologies: string[]\n    comingSoon: boolean\n    unit_quantity: number\n    productSelections: string[]\n    type: string\n    priceDisplay: string\n    isOrderable: boolean\n    bundled: boolean\n    capsuleProperties: {\n        intensity: number\n        bitterness: number\n        acidity: number\n        roastLevel: number\n    }\n    capsuleProductAromatics: string[]\n    aromaticProfileDescription: string\n    roastingDescription: string\n    capsuleCupSizes: string[]\n    capsuleCupSizesDetails: {\n        id: string\n        name: string\n        capacityLabel: string\n    }[]\n    capsuleAromatics: {\n        id: string\n        name: string\n    }[]\n    decaffeinated: boolean\n}\n\n//Confirmed this props are not available in Product Type\nexport type ProductNewPropsType = {\n    currency: string\n    pdpURLs: {\n        desktop: string\n        mobile: string\n    }\n    responsiveImages: {\n        standard: string\n    }\n    supercategories: string[]\n    productSelections: string[]\n    capsuleProperties?: CapsuleFeaturesInputType\n    capsuleProductAromatics: string[]\n    unitPrice: number\n    cupSizesDetails?: {\n        icon: string\n        label: string\n        size: string\n        capacityLabel: string | null\n        category: {\n            id: string\n            name: string\n            description: string | null\n            icon: {\n                url: string\n                altText: string\n            }\n            detailsIcon: {\n                url: string\n                altText: string\n            }\n            url: string | null\n            capacityLabel: string | null\n            rangeLink: string | null\n            subCategories: []\n            superCategories: string[]\n        }\n    }[]\n    category_name: string\n    url: string\n}\n\n// This is the Product Type signature Combined\nexport type ProductPropsType = QuickViewProductType & ProductNewPropsType\n\nexport type AddToCartPropsType = {\n    sku?: string\n    longSku?: string\n    category_name?: string\n    price?: string\n    strikethrough_price?: number\n    hidePrice?: boolean\n    type?: string\n    price_per_capsule?: number | string\n    show_capsule_price?: boolean\n    label_capsules?: string\n    capsule_price_label?: string\n    capsule_price_syntax?: string\n    show_sleeve_price?: boolean\n    show_sleeve?: boolean\n    sleeve_syntax?: string\n    number_of_sleeves?: number\n    label_sleeves?: string\n    label_sleeve?: string\n    technologies: string[]\n    sales_multiple?: number\n    unitQuantity?: number\n    unit_quantity?: number\n    bundled?: boolean\n    url?: string\n}\n\nexport type PageBuilderProductPropsType = {\n    sku: string\n    highlighted: boolean\n    labels: {\n        bgColor: string\n        color: string\n        name: string\n    }[]\n    strikethrough_price: string\n    variant: {\n        is_capsule: boolean\n        number_of_sleeves: number\n        number_of_capsules: string\n        bundle_details: {\n            popin_link_text: string\n            popin_label_close: string\n            description: string\n            other_skus: string\n            other_skus_quantity: string\n        }\n        logos: {\n            fair_trade: boolean\n            alt_fair_trade: string\n            is_organic: boolean\n            alt_organic: string\n            only_vertuo_next: boolean\n            alt_vertuo_next: string\n            is_rainforest: boolean\n            alt_rainforest: string\n            is_sustainable: boolean\n            alt_sustainable: string\n            is_q_certified_arabica: boolean\n            alt_q_certification_arabica: string\n        }\n        sku_timer: {\n            launch_date: string\n            remaining_days: string\n            remaining_day: string\n            label: string\n            a11y_label: string\n        }\n        ingredients: {\n            heading: string\n            description: string\n        }\n    }\n}\n\nexport type PageBuilderPropsType = {\n    quick_view_plp?: {\n        popin?: {\n            close?: string\n        }\n        cup_sizes?: {\n            heading: string\n            unit_is_oz: boolean\n            items: string[]\n        }\n        aromatic_profile?: {\n            heading: string\n            items: string[]\n        }\n        link?: {\n            label: string\n            url: string\n        }\n        levels?: {\n            a11y_level_of: string\n            acidity_label: string\n            bitterness_label: string\n            roastiness_label: string\n            body_label: string\n        }\n    }\n    campaign?: {\n        id?: string\n        name?: string\n        creative?: string\n        position?: string\n    }\n    tracking_position: string\n    tracking_list: string\n    capsuleProperties?: CapsuleFeaturesInputType\n    price_per_capsule?: number | string\n    show_capsule_price?: boolean\n    label_capsules?: string\n    capsule_price_label?: string\n    capsule_price_syntax?: string\n    show_sleeve_price?: boolean\n    show_sleeve?: boolean\n    sleeve_syntax?: string\n    number_of_sleeves?: number\n    label_sleeves?: string\n    label_sleeve?: string\n    technologies: string[]\n    sales_multiple?: number\n    unit_quantity?: number\n    bundled?: boolean\n    pdpURLs: {\n        desktop: string\n        mobile: string\n    }\n    intensity_label: string\n    products: {\n        sku: string\n        longSku: string\n        price: number\n        strikethrough_price: number\n        hidePrice: boolean\n        url: string\n    }[]\n    priceFormatter: {\n        formatPrice: (price: number) => string\n    }\n    currency: string\n    options: {\n        intensity_label: string\n        show_sleeve: boolean\n        label_sleeve: string\n        label_sleeves: string\n        label_capsules: string\n        sleeve_syntax: string\n        show_sleeve_price: boolean\n        capsule_price_label: string\n        capsule_price_syntax: string\n        a11y_intensity_max: string\n        label_decaffeinato: string\n        is_headline_hidden: boolean\n        sizes_title: string\n        notes_title: string\n        enabledExperiments: string[]\n    }\n    copywriting: {\n        sku_quick_view: {\n            more_info: string\n            a11y_more_info: string\n            popin: {\n                close: string\n            }\n            cup_sizes: {\n                heading: string\n                unit_is_oz: boolean\n                items: string[]\n            }\n            aromatic_profile: {\n                heading: string\n                items: string[]\n            }\n            link: {\n                label: string\n            }\n        }\n        aromatic_profile: {\n            heading: string\n            items: string[]\n        }\n    }\n}\n\nexport type SkuType = {\n    tracking_list: string\n    tracking_position: string\n    id: string\n    sku: string\n    longSku: string\n    name: string\n    name_custom: string\n    available: boolean\n    description: string | null\n    hidePrice: boolean\n    image_alt_text: string\n    inStock: boolean\n    internationalId: string\n    internationalName: string\n    legacyId: string\n    maxOrderQuantity: number | null\n    packagingType: string | null\n    price: string\n    pushRatingEnabled: boolean\n    ranges: string[]\n    salesMultiple: number\n    technologies: string[]\n    type: string\n    unitQuantity: number\n    url: string\n    labels: []\n    category_name: string\n    category: {\n        id: string\n        name: string\n        description: string | null\n        icon: {\n            url: string\n            altText: string | null\n        }\n        detailsIcon: string | null\n        url: string | null\n        capacityLabel: string | null\n        rangeLink: string | null\n        subCategories: []\n        superCategories: string[]\n    }\n    highlighted: boolean\n    strikethrough_price: string\n    view_details_label: string\n    headline: string\n    cupSizes: string[]\n    cupSizesDetails: {\n        icon: string\n        label: string\n        size: string\n        capacityLabel: string | null\n        category: {\n            id: string\n            name: string\n            description: string | null\n            icon: {\n                url: string\n                altText: string | null\n            }\n            detailsIcon: string | null\n            url: string | null\n            capacityLabel: string | null\n            rangeLink: string | null\n            subCategories: []\n            superCategories: string[]\n        }\n    }[]\n    flavors: string[]\n    in_stock: boolean\n    sales_multiple: number\n    bundled: boolean\n    logos: []\n    is_headline_hidden: boolean\n    a11y_price: string\n    a11y_product_card: string\n    label_sleeve: string\n    label_sleeves: string\n    label_capsules: string\n    intensity: number\n    a11y_intensity_max: string\n    label_decaffeinato: string\n    show_sleeve_price: boolean\n    show_sleeve: boolean\n    price_per_capsule: number | string\n    final_price: string | null\n    capsule_price_label: string\n    capsule_price_syntax: string\n    sleeve_syntax: string\n    perSleeveLabel: string\n    number_of_sleeves: number\n    number_of_capsules: string\n    show_capsule_price: boolean\n    sort_price: number\n    bundle_details: any\n    quick_view_plp: {\n        show_view: boolean\n        quick_view_text: string\n        popin: {\n            close: string\n        }\n        cup_sizes: {\n            heading: string\n            unit_is_oz: boolean\n            items: string[]\n        }\n        aromatic_profile: {\n            heading: string\n            items: string[]\n        }\n        link: {\n            label: string\n        }\n        levels: {\n            a11y_level_of: string\n            acidity_label: string\n            bitterness_label: string\n            roastiness_label: string\n            body_label: string\n        }\n    }\n    hasPricePerSleeve: boolean\n    sleevePrice: string\n    rendererName: string\n    position: number\n    rawPrice: number\n    variation: string\n    intensity_label: string\n    campaign: {\n        id: string\n        name: string\n        creative: string\n        position: string\n    }\n    capsuleProductAromatics: string[]\n    copywriting: {\n        heading: string\n        sku_quick_view: {\n            more_info: string\n            a11y_more_info: string\n            popin: {\n                close: string\n            }\n            cup_sizes: {\n                heading: string\n                unit_is_oz: false\n                items: string[]\n            }\n            aromatic_profile: {\n                heading: string\n                items: string[]\n            }\n            link: {\n                label: string\n            }\n        }\n        aromatic_profile: {\n            heading: string\n            items: string[]\n        }\n    }\n    options: {\n        intensity_label: string\n        show_sleeve: boolean\n        label_sleeve: string\n        label_sleeves: string\n        label_capsules: string\n        sleeve_syntax: string\n        show_sleeve_price: boolean\n        capsule_price_label: string\n        capsule_price_syntax: string\n        a11y_intensity_max: string\n        label_decaffeinato: string\n        is_headline_hidden: boolean\n        sizes_title: string\n        notes_title: string\n        enabledExperiments: string[]\n    }\n    products: {\n        sku: string\n        longSku: string\n        price: number\n        strikethrough_price: number\n        hidePrice: boolean\n        url: string\n    }[]\n    priceFormatter: {\n        formatPrice: (price: number) => string\n    }\n    currency: string\n}\n\nexport type MergedProductType = {\n    intensity_label: string\n    capsuleProductAromatics?: string[]\n    pdpURLs?: {\n        desktop: string\n        mobile: string\n    }\n}\n\nexport type AddToCardPropertiesType = SkuType & MergedProductType\n\ntype CupSizeType = {\n    icon: string\n    label: string\n    size: string\n    capacityLabel: string | null\n    category: {\n        id: string\n        name: string\n        description: string | null\n        icon: {\n            url: string\n            altText: string\n        }\n        detailsIcon: {\n            url: string\n            altText: string\n        }\n        url: string | null\n        capacityLabel: string | null\n        rangeLink: string | null\n        subCategories: []\n        superCategories: string[]\n    }\n}[]\n\nexport type QuickViewPropsType = {\n    popin: {\n        popin_id: string\n        close?: string\n        footer: boolean\n    }\n    product: MergedProductType\n    intensity: {\n        intensity_label?: string\n        a11y_intensity_max: string\n    }\n    cup_sizes: {\n        heading: string\n        unit_is_oz: boolean\n        items?: [] | CupSizeType\n    }\n    aromatic_profile: {\n        heading: string\n        items: string[]\n    }\n    link: {\n        label: string\n        url?: string\n    }\n    levels: any\n    pricing: {\n        add_to_cart: AddToCartPropsType & {\n            position: string\n            variation: string\n            url: string\n            view_details_label: string\n            rendererName: string\n        }\n        showSleeve: any\n        showCapsulePrice: any\n    }\n    campaign: any\n}\n","import { getMergedProductData } from '@kissui/page-builder-sections/src/cross-sell-natural/dataTransform'\n\nimport {\n    CapsuleFeaturesInputType,\n    CapsuleFeaturesOutputType,\n    ProductPropsType,\n    AddToCartPropsType,\n    SkuType,\n    ProductNewPropsType,\n    MergedProductType,\n    AddToCardPropertiesType,\n    QuickViewPropsType,\n    VARIATION_PLP,\n    VARIATION_CROSS_SELL\n} from './shared-quick-view-types'\n\nexport const getCapsuleFeatures = ({\n    acidity = null,\n    bitterness = null,\n    body = null,\n    intensity = null,\n    roastLevel = null\n}: CapsuleFeaturesInputType = {}): CapsuleFeaturesOutputType => ({\n    acidity: { value: acidity },\n    bitterness: { value: bitterness },\n    body: { value: body },\n    intensity: { value: intensity },\n    roast: { value: roastLevel }\n})\n\nexport const getSkuQuickViewData = async (\n    product: ProductPropsType,\n    popinId: string,\n    skuData: SkuType,\n    componentType: string\n) => {\n    const { tracking_position, tracking_list } = skuData\n\n    const handlePLPVariation = () => {\n        if (!product) return\n        let quickViewElement = document.createElement('nb-sku-quick-view')\n        quickViewElement.setAttribute(\n            'data',\n            JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n        )\n        quickViewElement.setAttribute('id', popinId)\n        quickViewElement.setAttribute('tracking_no_impression', 'true')\n        quickViewElement.setAttribute('tracking_position', tracking_position)\n        quickViewElement.setAttribute('tracking_list', tracking_list)\n        quickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n        quickViewElement.setAttribute('listname_text', skuData?.copywriting?.heading)\n        document.body.appendChild(quickViewElement)\n    }\n\n    const handleCrossSellVariation = () => {\n        const { sku_quick_view } = skuData.copywriting\n        if (!sku_quick_view.more_info) return ''\n\n        const quickViewElement = document.querySelector(\n            `nb-sku-quick-view > nb-popin[id=\"${popinId}\"]`\n        )?.parentElement\n\n        if (quickViewElement) quickViewElement.remove()\n\n        let newQuickViewElement = document.createElement('nb-sku-quick-view')\n        newQuickViewElement.setAttribute(\n            'data',\n            JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n        )\n        newQuickViewElement.setAttribute('tracking_no_impression', 'true')\n        newQuickViewElement.setAttribute('tracking_position', tracking_position)\n        newQuickViewElement.setAttribute('tracking_list', tracking_list)\n        newQuickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n        newQuickViewElement.setAttribute('listname_text', skuData?.copywriting?.heading)\n        document.body.appendChild(newQuickViewElement)\n    }\n\n    const variationHandlers: { [key: string]: () => void | string } = {\n        [VARIATION_PLP]: handlePLPVariation,\n        [VARIATION_CROSS_SELL]: handleCrossSellVariation\n    }\n\n    const handleVariation = variationHandlers[componentType]\n    if (handleVariation) {\n        handleVariation()\n    }\n}\n\nexport const getSkuQuickViewProp = (\n    popinId: string,\n    product: ProductPropsType,\n    skuData: SkuType,\n    componentType: string\n) => {\n    let mergedProductData = getMergedProductDataForComponentType(product, skuData, componentType)\n    let addToCartProps = getAddToCartProperties(componentType, skuData, mergedProductData)\n\n    return isVariationOnPLP(componentType)\n        ? getPlpQuickViewProps(popinId, skuData, mergedProductData, addToCartProps)\n        : getCrossSellQuickViewProps(popinId, product, skuData, mergedProductData, addToCartProps)\n}\n\nconst getMergedProductDataForComponentType = (\n    product: ProductPropsType,\n    skuData: SkuType,\n    componentType: string\n) => {\n    switch (componentType) {\n        case VARIATION_PLP:\n            return {\n                ...skuData,\n                ...product,\n                ...getCapsuleFeatures(product?.capsuleProperties)\n            }\n        case VARIATION_CROSS_SELL: {\n            const matchedProduct =\n                skuData.products?.find(\n                    productPageBuilder => productPageBuilder.sku === product?.legacyId\n                ) || {}\n            return getMergedProductData(\n                product,\n                matchedProduct,\n                skuData,\n                skuData?.priceFormatter,\n                skuData?.currency\n            )\n        }\n        default:\n            return {}\n    }\n}\n\nexport const getAddToCartProperties = (\n    componentType: string,\n    skuData: SkuType,\n    mergedProductData: MergedProductType\n): AddToCartPropsType => {\n    const data: AddToCardPropertiesType = isVariationOnPLP(componentType)\n        ? skuData\n        : (mergedProductData as AddToCardPropertiesType)\n    return getAddToCartProps(data, componentType)\n}\n\nexport const getAddToCartProps = (\n    data: AddToCardPropertiesType,\n    componentType: string\n): AddToCartPropsType => {\n    const commonProps: AddToCartPropsType = {\n        sku: data.sku,\n        longSku: data.longSku,\n        category_name: data.category_name,\n        price: data.price ?? 0,\n        strikethrough_price: Number(data.strikethrough_price),\n        hidePrice: data.hidePrice,\n        technologies: data.technologies || [],\n        url: data.url || ''\n    }\n\n    if (isVariationOnPLP(componentType)) {\n        return {\n            ...commonProps,\n            type: data.type,\n            price_per_capsule: data.price_per_capsule,\n            show_capsule_price: data.show_capsule_price,\n            label_capsules: data.label_capsules,\n            capsule_price_label: data.capsule_price_label,\n            capsule_price_syntax: data.capsule_price_syntax,\n            show_sleeve_price: data.show_sleeve_price,\n            show_sleeve: data.show_sleeve,\n            sleeve_syntax: data.sleeve_syntax,\n            number_of_sleeves: data.number_of_sleeves,\n            label_sleeves: data.label_sleeves,\n            label_sleeve: data.label_sleeve,\n            technologies: data.technologies || [],\n            sales_multiple: data.sales_multiple,\n            unit_quantity: data.unitQuantity,\n            bundled: data.bundled,\n            url: data.url || ''\n        }\n    }\n\n    return commonProps\n}\n\nexport const getPlpQuickViewProps = (\n    popinId: string,\n    skuData: SkuType,\n    mergedProductData: MergedProductType,\n    addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n    return {\n        popin: {\n            popin_id: popinId,\n            close: skuData?.quick_view_plp?.popin?.close,\n            footer: true\n        },\n        product: {\n            ...mergedProductData\n        },\n        intensity: {\n            intensity_label: mergedProductData?.intensity_label,\n            a11y_intensity_max: 'max of {max_intensity}'\n        },\n        cup_sizes: {\n            ...skuData?.quick_view_plp?.cup_sizes,\n            items: skuData?.cupSizesDetails\n        },\n        aromatic_profile: {\n            ...skuData?.quick_view_plp?.aromatic_profile,\n            items: skuData?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n        },\n        link: {\n            ...skuData?.quick_view_plp?.link,\n            url: skuData?.url\n        },\n        levels: {\n            ...skuData?.quick_view_plp?.levels\n        },\n        pricing: {\n            add_to_cart: {\n                ...addToCartProps,\n                position: '',\n                variation: 'small',\n                url: '',\n                view_details_label: 'View details',\n                rendererName: ''\n            },\n            showSleeve: {},\n            showCapsulePrice: {}\n        },\n        campaign: skuData.campaign\n    }\n}\n\nexport const getCrossSellQuickViewProps = (\n    popinId: string,\n    product: ProductNewPropsType,\n    skuData: SkuType,\n    mergedProductData: MergedProductType,\n    addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n    const props: QuickViewPropsType = {\n        popin: {\n            popin_id: popinId,\n            close: skuData?.copywriting?.sku_quick_view?.popin?.close,\n            footer: true\n        },\n        product: {\n            ...mergedProductData\n        },\n        intensity: {\n            intensity_label: skuData?.options?.intensity_label,\n            a11y_intensity_max: 'max of {max_intensity}'\n        },\n        cup_sizes: {\n            ...skuData?.copywriting?.sku_quick_view?.cup_sizes,\n            items: product?.cupSizesDetails\n        },\n        aromatic_profile: {\n            ...skuData?.copywriting?.sku_quick_view?.aromatic_profile,\n            items: product?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n        },\n        link: {\n            ...skuData?.copywriting?.sku_quick_view?.link,\n            url: mergedProductData?.pdpURLs?.desktop\n        },\n        levels: {\n            ...skuData?.quick_view_plp?.levels\n        },\n        pricing: {\n            add_to_cart: {\n                ...addToCartProps,\n                position: '',\n                variation: 'small',\n                url: '',\n                view_details_label: 'View details',\n                rendererName: ''\n            },\n            showSleeve: {},\n            showCapsulePrice: {}\n        },\n        campaign: {}\n    }\n    return props\n}\nconst isVariationOnPLP = (componentType: string) => componentType === VARIATION_PLP\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n    ECAPI_TYPE_ACCESSORY,\n    ECAPI_TYPE_CAPSULE,\n    ECAPI_TYPE_GIFT_CARD,\n    ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n    product,\n    pageBuilderProductProps,\n    pageBuilderProps,\n    priceFormatter,\n    currency\n) => {\n    const { options } = pageBuilderProps\n    const {\n        variant = {},\n        labels = [],\n        strikethrough_price,\n        additional_message,\n        additional_message_icon,\n        additional_message_link,\n        contact_cta\n    } = pageBuilderProductProps || {}\n\n    // lists header props not coming from this.props\n    let data = {\n        sku: product.internationalId,\n        technologies: product.technologies,\n        longSku: product.id,\n        name: product.name,\n        headline: sanitizeString(product.headline),\n        sales_multiple: product.salesMultiple,\n        unit_quantity: product.unitQuantity,\n        type: product.type,\n        category_name: product.rangeData?.name || '',\n        label_range: product.rangeData?.name || '',\n        price: product.price ? priceFormatter.short(currency, product.price) : null,\n        rawPrice: product.price,\n        strikethrough_price: strikethrough_price || '',\n        variation: VARIATION_PLP,\n        image_alt_text: product.name,\n        image: product.images?.icon || product.images?.push || product.images?.main,\n        additional_message: additional_message || '',\n        additional_message_icon: additional_message_icon || '',\n        additional_message_link: additional_message_link || {},\n        contact_cta: contact_cta || {},\n        ...apiOverride(product, pageBuilderProductProps)\n    }\n\n    if (labels && labels.length) {\n        data.labels = labels\n    }\n\n    if (product.highlighted) {\n        data.highlighted = product.highlighted\n    }\n\n    let dataTransformObjectProductType = {}\n    if (product.type === ECAPI_TYPE_CAPSULE) {\n        dataTransformObjectProductType = getMergedProductCoffeeData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps,\n            priceFormatter,\n            currency\n        )\n    } else if (product.type === ECAPI_TYPE_MACHINE) {\n        dataTransformObjectProductType = getMergedProductMachineData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps\n        )\n    } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n        dataTransformObjectProductType = getMergedProductAccessoryData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps\n        )\n    } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n        dataTransformObjectProductType = getMergedProductGiftCardData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps\n        )\n    }\n\n    return {\n        ...product,\n        ...options,\n        ...variant,\n        ...data,\n        ...dataTransformObjectProductType\n    }\n}\n","export const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n    const { strikethrough_price, variant = {} } = pageBuilderProductProps\n    const { ratingsAndReviews } = product\n\n    // lists header props not coming from this.props\n    const options = {\n        ratings: ratingsAndReviews\n    }\n\n    if (variant?.colors) {\n        options.colors = variant.colors\n        options.activeSku = product.internationalId\n        options.max_colors = 99\n    }\n\n    options.strikethrough_price = strikethrough_price || ''\n    options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n    options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n    return options\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n    const { variant = {} } = pageBuilderProductProps\n\n    return {\n        image: variant && variant.default_image\n    }\n}\n","export const dispatchEvent = ({ eventName, args, element }) => {\n    // Use the provided element or fallback to window if available\n    if (!element) {\n        if (typeof window !== 'undefined') {\n            element = window\n        } else {\n            throw new Error(\n                '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n            )\n        }\n    }\n\n    let event\n    if (args) {\n        event = new CustomEvent(eventName, { detail: args, bubbles: true })\n    } else {\n        if (typeof Event === 'function') {\n            event = new Event(eventName)\n        } else {\n            event = document.createEvent('Event')\n            event.initEvent(eventName, true, true)\n        }\n    }\n    element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n    if (!e.detail) {\n        return\n    }\n    return e.detail\n}\n","export 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 { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { renderLabels } from './fragments/labels'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\nimport { renderImage } from './fragments/image'\nimport { renderHeading } from './fragments/heading'\nimport { renderHeadline } from './fragments/headline'\nimport { renderLabelTechnology } from './fragments/labelTechnology'\nimport { renderLabelRange } from './fragments/labelRange'\nimport { renderQuickView } from './fragments/quickView'\nimport { renderStrikethroughPrice } from './fragments/strikethroughPrice'\nimport { renderPrice } from './fragments/price'\nimport { renderAddToCart } from './fragments/addToCart'\nimport { renderAdditionalMessage } from './fragments/additionalMessage'\nimport { setCardTheme } from './fragments/setCardTheme'\nimport { getSkuQuickViewData } from '@kissui/components/src/sku-quick-view/shared-quick-view'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getTechnologyName, getProduct } from '@kissui/helpers/src/catalog'\nimport { trackComponentInteraction, productClick } from '@kissui/helpers/src/gtmEvents'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nclass Sku extends NespressoElement {\n    constructor() {\n        super()\n        this.type = 'default'\n        this.popinId = ''\n        this.isQuickViewPlp = false\n        this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n        this.boundOnQuickViewOpen = this.onQuickViewOpen.bind(this)\n        this.clickMethod = this.boundOnPDPLinkClick\n    }\n\n    loadTemplate() {\n        this.classList.add('nb-sku')\n        this.classList.add(`nb-sku__${this.type}`)\n        setCardTheme(this.props, this)\n\n        Object.assign(this.props, this.getSleevePrice(this.props))\n        Object.assign(this.props, this.checkHiddenPriceForLoggedInUser(this.props))\n\n        const { quick_view_plp = {} } = this.props\n        this.isQuickViewPlp = quick_view_plp?.show_view || false\n        this.clickMethod = this.isQuickViewPlp\n            ? this.boundOnQuickViewOpen\n            : this.boundOnPDPLinkClick\n\n        this.template = `${this.renderVisual()}\n                          ${this.renderHeader()}\n                          <div class=\"cb-content\">\n                              ${this.renderInformation()}\n                              ${this.isQuickViewPlp ? this.renderQuickView() : ''}\n                              <div class=\"cb-shop\">\n                                  <div class=\"cb-price\">\n                                      ${this.renderPricing()}\n                                  </div>\n                                  ${this.renderAction()}\n                              </div>\n                              ${this.renderFooter()}\n                          </div>`\n\n        this.render()\n    }\n\n    onReady() {\n        const { activeSku, sku } = this.props\n        this.setAttribute('data-product-short-sku', activeSku || sku)\n        this.bindEvent()\n    }\n\n    renderHeaderDefault() {\n        return `${renderLabels(this.props, this)}${renderLogos(this.props, this)}`\n    }\n\n    renderHeader() {\n        return this.renderHeaderDefault()\n    }\n\n    renderVisualDefault() {\n        const theme = this.hasAttribute('portrait') ? 'portrait' : 'landscape'\n        return renderImage(this.props, theme)\n    }\n\n    getSleevePrice({ number_of_sleeves, price }) {\n        let hasPricePerSleeve = true\n        let sleevePrice\n        if (number_of_sleeves === '1') {\n            sleevePrice = price\n        } else {\n            hasPricePerSleeve = false\n        }\n        return { hasPricePerSleeve, sleevePrice }\n    }\n\n    checkHiddenPriceForLoggedInUser({ hidePrice, show_view_details }) {\n        return {\n            hidePrice: isLoggedIn() ? false : hidePrice,\n            show_view_details: isLoggedIn() ? false : show_view_details\n        }\n    }\n\n    renderVisual() {\n        return this.renderVisualDefault()\n    }\n\n    renderInformationDefault() {\n        return `${renderLabelTechnology(this.props)}\n        ${renderLabelRange(this.props)}\n        ${renderHeading(this.props)}\n        ${renderHeadline(this.props)}`\n    }\n\n    renderInformation() {\n        return this.renderInformationDefault()\n    }\n\n    renderQuickView() {\n        return renderQuickView(this.props)\n    }\n\n    renderPricingDefault() {\n        const isPortrait = this.hasAttribute('portrait')\n\n        const pricingWithClass = `\n        ${renderStrikethroughPrice(this.props, this)}\n        <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n            ${renderPrice(this.props)}\n        </div>`\n\n        return pricingWithClass\n    }\n\n    renderPricing() {\n        return this.renderPricingDefault()\n    }\n\n    renderActionDefault() {\n        return renderAddToCart(this.props, false, this)\n    }\n\n    renderAction() {\n        const actionSlot = this.querySelector('[slot=\"action\"]')?.outerHTML\n        if (actionSlot) {\n            return actionSlot\n        }\n        return this.renderActionDefault()\n    }\n\n    renderFooterDefault() {\n        return renderAdditionalMessage(this.props)\n    }\n\n    renderFooter() {\n        return this.renderFooterDefault()\n    }\n\n    async onPDPLinkClick() {\n        const productIndex = this.getAttribute('tracking_position') || 0\n        const list = this.getAttribute('tracking_list') || ''\n\n        await productClick(productIndex, list, this.props.longSku)\n    }\n\n    renderSkuQuickView(product) {\n        this.popinId = `plp-quick-view`\n\n        let quickViewElement = document.querySelector(`#${this.popinId}`)\n        if (quickViewElement) {\n            quickViewElement.remove()\n        }\n\n        getSkuQuickViewData(product, this.popinId, this.props, VARIATION_PLP)\n    }\n\n    async onQuickViewOpen(e) {\n        e.preventDefault()\n\n        const { sku } = this.props\n        if (!sku) {\n            return\n        }\n\n        try {\n            const product = await getProduct(sku)\n\n            this.renderSkuQuickView(product)\n            trackComponentInteraction({\n                creative: this.props.campaign?.creative,\n                actionType: 'pdp quick view',\n                internationalId: product.internationalId,\n                internationalName: product.internationalName,\n                productType: product.type,\n                technology: getTechnologyName(product),\n                category: product.category,\n                rawPrice: product.price,\n                eventAction: 'PDP Quick View'\n            })\n            dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: this.popinId } })\n        } catch (e) {\n            console.error(`getProduct fail on sku ${sku}`)\n        }\n        return false\n    }\n\n    bindEvent() {\n        this.unbindEvent()\n        const showQuickView = this.props.quick_view_plp?.show_view\n        const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n        if (!quickViewTextExists) {\n            this.classList.add('sku-hover')\n        }\n\n        if (showQuickView && this.props.variation === VARIATION_PLP) {\n            const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n            elements.forEach(element => {\n                element.addEventListener('click', this.clickMethod)\n            })\n\n            // to avoid adding click event to the button inside the sku card\n            this.addStopPropagationEvent('nb-add-to-cart')\n            this.addStopPropagationEvent('nb-cta')\n        }\n    }\n\n    unbindEvent() {\n        const showQuickView = this.props.quick_view_plp?.show_view\n        const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n        if (showQuickView && this.props.variation === VARIATION_PLP) {\n            const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n            elements.forEach(element => {\n                element.removeEventListener('click', this.clickMethod)\n            })\n\n            this.removeStopPropagationEvent('nb-add-to-cart')\n            this.removeStopPropagationEvent('nb-cta')\n        }\n    }\n\n    addStopPropagationEvent(selector) {\n        const element = this.querySelector(selector)\n        if (element) {\n            element.addEventListener('click', this.stopPropagationHandler)\n        }\n    }\n\n    removeStopPropagationEvent(selector) {\n        const element = this.querySelector(selector)\n        if (element) {\n            element.removeEventListener('click', this.stopPropagationHandler)\n        }\n    }\n\n    stopPropagationHandler(event) {\n        event.stopPropagation()\n    }\n\n    disconnectedCallback() {\n        this.unbindEvent()\n    }\n}\n\ncustomElements.get('nb-sku') || customElements.define('nb-sku', Sku)\n\nexport default Sku\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\n\nexport const setCardTheme = ({ variation, type }, component) => {\n    // PDP\n    if (variation === VARIATION_PDP) {\n        component.setAttribute('pdp', 'true') // Used by CSS to increase font-size, etc.\n    }\n\n    // COFFEE on PLP on MOBILE\n    if (variation === VARIATION_PLP && type === ECAPI_TYPE_CAPSULE && viewportHelper.is.mobile) {\n        component.setAttribute('landscape', 'true')\n        return\n    }\n\n    component.setAttribute('portrait', 'true')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\n/**\n * Display labels\n * @param {Object[]} labels - List of labels\n * @param {string} labels[].name - Text\n * @param {string} labels[].bgColor - Background\n * @param {string} labels[].color - Font color\n * @param {HTMLElement} component - Apply css on component\n * @returns {String} - Render of labels\n */\nexport const renderLabels = ({ labels = [] }, component = null) => {\n    if (!component || !labels || !labels.length) {\n        return ''\n    }\n\n    if (component && labels.length) {\n        component.classList.add('has-labels')\n    }\n\n    const direction = viewportHelper.is.mobile ? 'row' : 'column'\n    const data = stringifyForAttribute({ labels })\n\n    return `<nb-card-labels data=\"${data}\" direction=\"${direction}\"></nb-card-labels>`\n}\n","import { 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 './image.scss'\n\nexport const renderImage = (\n    { url, image_alt_text, image, quick_view_plp = {} },\n    theme = 'portrait'\n) => {\n    if (!image) {\n        return ''\n    }\n\n    let img = `<nb-img file=\"${image}\"\n        description=\"${image_alt_text}\"\n        aspect_ratio=\"${theme === 'portrait' ? '16/9' : '1/1'}\"\n        object_fit=\"contain\"\n        force_height=\"${theme === 'portrait' ? '160' : '120'}\">\n    </nb-img>`\n\n    const renderClass = url ? '' : 'class=\"cursor-default\"'\n\n    if (url || quick_view_plp?.show_view) {\n        const linkHref = url || 'javascript:void(0)'\n        img = `<a ${renderClass.trim()} href=\"${linkHref}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">${img}</a>`\n    }\n\n    return `<div class=\"cb-image\">\n                ${img}\n            </div>`\n}\n","export const renderLabelTechnology = ({ label_technology }) => {\n    if (!label_technology) {\n        return ''\n    }\n\n    return `<p class=\"cb-technology t-xs-700-sl\">${label_technology}</p>`\n}\n","export const renderLabelRange = ({ label_range }) => {\n    if (!label_range) {\n        return ''\n    }\n\n    return `<p class=\"cb-range t-xs-500-sl\">${label_range}</p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nexport const renderHeadline = ({ headline = '', is_headline_hidden = false }) => {\n    if ((is_headline_hidden && viewportHelper.is.mobile) || !headline) {\n        return ''\n    }\n\n    return `<p class=\"cb-text t-sm-400-sl\">${headline}</p>`\n}\n","import { getTechnologyName } from '@kissui/helpers/src/catalog'\n\nexport const renderQuickView = ({\n    sku,\n    quick_view,\n    tracking_list,\n    tracking_position,\n    campaign_creative,\n    internationalId,\n    internationalName,\n    type,\n    technologies,\n    category,\n    rawPrice,\n    colors\n}) => {\n    if (!quick_view || !quick_view.label || !quick_view.popin_id) {\n        return ''\n    }\n\n    const skuData = JSON.stringify({\n        internationalId: internationalId,\n        internationalName: internationalName,\n        type: type,\n        technology: getTechnologyName({ technologies }),\n        category: category,\n        rawPrice: rawPrice\n    })\n    let colorsSkusList = []\n    if (typeof colors !== 'undefined') {\n        colors.map(color => {\n            colorsSkusList.push(color.sku)\n        })\n    }\n\n    return `<nb-link\n        color=\"gold\"\n        size=\"large\"\n        sku_colors=\"${colorsSkusList}\"\n        popin_id=\"${quick_view.popin_id}\"\n        sku='${sku}'\n        sku_data='${skuData}'\n        campaign_creative='${campaign_creative}'\n        tracking_list='${tracking_list}'\n        tracking_position='${tracking_position}'>${quick_view.label}</nb-link>`\n}\n","import { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\nexport const renderPrice = ({\n    price,\n    hidePrice,\n    giftcard_price,\n    price_per_capsule,\n    show_sleeve_price,\n    type\n}) => {\n    if ((!price && !giftcard_price) || hidePrice) {\n        return ''\n    }\n    let finalPrice = null\n    if (!show_sleeve_price && price_per_capsule) {\n        finalPrice = price_per_capsule\n    } else {\n        finalPrice = price\n    }\n    if (type !== ECAPI_TYPE_CAPSULE) {\n        finalPrice = price\n    }\n\n    return `<p class=\"cb-price-current\"><span>${finalPrice || giftcard_price}</span></p>`\n}\n","import Sku from '@kissui/components/src/sku'\n\nclass SkuAccessory extends Sku {\n    constructor() {\n        super()\n        this.type = 'accessory'\n    }\n}\n\ncustomElements.get('nb-sku-accessory') || customElements.define('nb-sku-accessory', SkuAccessory)\n\nexport default SkuAccessory\n","class EventBus {\n    constructor() {\n        this._bus = document.createElement('div')\n    }\n\n    register(event, callback) {\n        this._bus.addEventListener(event, callback)\n    }\n\n    remove(event, callback) {\n        this._bus.removeEventListener(event, callback)\n    }\n\n    fire(event, detail = {}) {\n        this._bus.dispatchEvent(new CustomEvent(event, { detail }))\n    }\n}\n\nif (!bus) {\n    var bus = new EventBus()\n}\n\nexport default bus\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport EventBus from '@kissui/helpers/src/assets/js/eventBus'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport {\n    handlePromoClick,\n    productImpression,\n    trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_POPIN_OPEN, EVENT_QS_OPEN, TIME_SLOW } from '@kissui/components'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Cta extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.market = getMarketCode()\n        this.language = getLangCode()\n    }\n\n    static get observedAttributes() {\n        return ['slot', 'quantity']\n    }\n\n    connectedCallback() {\n        this.props = {\n            ...createProps(this.attributes),\n            disableTracking: this.hasAttribute('data-disabletracking')\n        }\n\n        this.boundHandleClick = this.handleClick.bind(this)\n        this.slot = this.innerHTML.replace(/\\n*$/, '').trim()\n        this.render()\n    }\n\n    render() {\n        const {\n            add_to_cart = '',\n            aria_label,\n            aria_label_after,\n            aria_label_before,\n            contrast,\n            icon_left = '',\n            icon_right = '',\n            label_update,\n            label,\n            link_new_tab = false,\n            long_sku = '',\n            seo_label = '',\n            size = '48',\n            tracking_list = '',\n            tracking_position = '',\n            transparent = 'false',\n            variation\n        } = this.props\n        let { link } = this.props\n\n        const slot = this.slot ? this.slot : label\n\n        const element = document.createElement(link ? 'a' : 'button')\n\n        if (tracking_position && tracking_list && long_sku) {\n            productImpression(tracking_position, tracking_list, long_sku)\n        }\n\n        if (link) {\n            link = link.replace('{market}', this.market)\n            link = link.replace('{lang}', this.language)\n\n            element.setAttribute('href', link)\n        }\n\n        if (link && link_new_tab) {\n            element.setAttribute('target', '_blank')\n        }\n        // Todo : can we get rid of this title attr ? at least when it's a button, not a link ?\n        if (seo_label && link) {\n            element.setAttribute('title', seo_label)\n        }\n\n        if (aria_label) {\n            element.setAttribute('aria-label', aria_label)\n        } else if (aria_label_before || aria_label_after) {\n            const ariaLabel = [aria_label_before, slot, aria_label_after]\n                .filter(value => !!value)\n                .join(' ')\n            ariaLabel && element.setAttribute('aria-label', ariaLabel)\n        }\n\n        if (variation !== 'navigation') {\n            element.classList.add(`button--cta`)\n        }\n        element.classList.add(`button--${variation}`)\n        if (contrast) {\n            if (transparent === 'true') {\n                element.classList.add(`button--${contrast}--transparent`)\n            } else {\n                element.classList.add(`button--${contrast}`)\n            }\n        }\n        if (size) {\n            let textClass = 't-md-400-sl'\n            switch (size) {\n                case '32':\n                    textClass = 't-xs-500-sl'\n                    break\n                case '40':\n                    textClass = 't-sm-400-sl'\n                    break\n            }\n            element.classList.add(`size--${size}`, textClass)\n        }\n\n        if ((variation === 'primary' || variation === 'tertiary') && add_to_cart !== '') {\n            this.setAttribute('add_to_cart', add_to_cart)\n            this.setAttribute('quantity', '0')\n            add_to_cart === 'small'\n                ? element.classList.add('addToCart--small')\n                : element.classList.add('addToCart--large')\n        }\n\n        icon_left && this.setAttribute('icon_left', icon_left)\n        icon_right && this.setAttribute('icon_right', icon_right)\n\n        element.innerHTML = `\n                ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n                <span>${slot}</span>\n                ${\n                    variation === 'primary' && add_to_cart !== '' && label_update !== ''\n                        ? `<span class=\"update\">${label_update}</span>`\n                        : ''\n                }\n                ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n        `\n        this.innerHTML = element.outerHTML\n\n        this.removeListeners()\n        this.addListeners()\n    }\n\n    handleClick() {\n        if (this.props.disableTracking === false) {\n            this.track()\n        }\n\n        const { event_id = '', popin_id = '', qs_id = '' } = this.props\n\n        if (event_id) {\n            EventBus.fire(event_id, {})\n        }\n        if (popin_id) {\n            this.popin(popin_id)\n        }\n        if (qs_id) {\n            this.openQuantitySelector(qs_id)\n        }\n    }\n\n    popin(popin_id) {\n        dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n    }\n\n    openQuantitySelector(qs_id) {\n        dispatchEvent({ eventName: EVENT_QS_OPEN, args: { id: qs_id } })\n    }\n\n    track() {\n        const {\n            campaign_id = '',\n            campaign_name = '',\n            campaign_position = '',\n            campaign_creative = '',\n            campaign_instance_index = '',\n            tracking_list,\n            label,\n            popin_id = '',\n            tracking_slot_prefix = '',\n            sku_data = ''\n        } = this.props\n\n        const campaign = {\n            id: campaign_id,\n            name: campaign_name,\n            position: campaign_position,\n            creative: campaign_creative\n        }\n\n        const ctaOrPopin = popin_id ? 'POPIN' : 'CTA'\n        const slot = this.slot ? this.slot : label\n        const slotContent = `${tracking_slot_prefix}${slot}`\n        const instanceIndex = campaign_instance_index ? ` - ${campaign_instance_index}` : ''\n        const tabbedComponentStatus = JSON.parse(this.props?.tabbed_component ?? 'false')\n\n        let cta_name_value = tabbedComponentStatus\n            ? `${ctaOrPopin + instanceIndex} - ${\n                  this.props.long_sku.split('/')[2]\n              } - ${slotContent}`\n            : `${ctaOrPopin + instanceIndex} - ${slotContent}`\n\n        handlePromoClick({\n            campaign,\n            cta_name: cta_name_value\n        })\n\n        if (popin_id && sku_data) {\n            const product = JSON.parse(sku_data)\n            const componentName =\n                tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n            trackComponentInteraction({\n                creative: this.props.campaign_creative ?? '',\n                actionType: componentName.toLowerCase() + ' quick view',\n                internationalId: product.internationalId,\n                internationalName: product.internationalName,\n                productType: product.type,\n                technology: product.technology,\n                category: product.category,\n                rawPrice: product.rawPrice,\n                eventAction: componentName + ' Quick View'\n            })\n        }\n    }\n\n    attributeChangedCallback(name) {\n        if (name === 'slot') {\n            this.render()\n        }\n        if (name === 'quantity') {\n            this.classList.add('updated')\n            setTimeout(() => {\n                this.classList.remove('updated')\n            }, TIME_SLOW)\n        }\n    }\n\n    addListeners() {\n        this.addEventListener('click', this.boundHandleClick)\n    }\n\n    removeListeners() {\n        this.removeEventListener('click', this.boundHandleClick)\n    }\n\n    disconnectedCallback() {\n        this.removeListeners()\n    }\n}\n\ncustomElements.get('nb-cta') || customElements.define('nb-cta', Cta)\n\nexport default Cta\n","/**\n * We removed duplicated values to improve the performances\n * Here are original values :\n * small: 16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288, 300, 360, 384, 450, 480, 600\n * medium: 180, 240, 270, 360, 450, 480, 512, 540, 600, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500, 1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n * large: 640, 720, 800, 960, 1024, 1080, 1200, 1280, 1440, 1536, 1600, 1920, 2048, 2160, 2400, 2560, 2880, 3072, 3200, 3840, 4096\n * product: 45, 50, 58, 60, 65, 90, 100, 120, 130, 135, 150, 174, 180, 195, 200, 230, 232, 240, 260, 300, 360, 400, 450, 460, 480, 600, 690, 720, 800, 900, 960, 1200\n *\n * Useful documentation:\n * IT documentation on IM Policy (Image Manager Policy) profiles and resolutions: https://dsu-confluence.nestle.biz/x/XAYoC\n * Our IM Policy documentation: https://dsu-confluence.nestle.biz/x/zQjrCg\n * Our IM Policy study on page builder sections: https://dsu-confluence.nestle.biz/x/1tb3Cg\n */\n\nexport const LAZYLOAD_CUSTOM = 'custom'\nexport const LAZYLOAD_NATIVE = 'native'\n\nexport const PROFILES = [\n    {\n        name: 'small',\n        sizes: [\n            16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288,\n            300, 360, 384, 450, 480, 600\n        ]\n    },\n    {\n        name: 'medium',\n        sizes: [\n            270, 512, 540, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500,\n            1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n        ]\n    },\n    {\n        name: 'large',\n        sizes: [640, 1280, 1920, 2160, 2560, 2880, 3072, 3840, 4096]\n    },\n    {\n        name: 'product',\n        sizes: [\n            45, 50, 58, 60, 65, 90, 100, 130, 135, 174, 195, 200, 230, 232, 260, 300, 400, 460, 690\n        ]\n    }\n]\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport { PROFILES, LAZYLOAD_CUSTOM, LAZYLOAD_NATIVE } from './js/constants'\n\n/** IMAGE COMPONENT\n * Important prerequisite!\n * For the ImPolicy and CLS we need to assume that the width of the component is set by the parent component\n *\n * IM Policy annoying behaviour:\n * Also IM Policy is returning in some cases more than 2x images (based in device pixel density auto detection e.g. Iphone 11 pro returns x3)\n * We don't want this behaviour so we need to force x1 by adding an extra param &imdensity=1\n *\n * @Params\n * - file: path of your image\n * - description: img alt description. If empty, set alt='image' to avoid A11y errors + aria-hidden=\"true\" because we assume it's a decorative image\n *   (we don't use alt='' because if void it does not allow the error message to be displayed, not creating :before and :after pseudo element on img)\n * - aspect_ratio: (default 1:1) is managing the CLS including a blinking animation\n * - force_width: use this if for any reason you need to force the image width to ask to akamai (e.g. image cropped on both sides like in card-lifestyle tablet)\n * - force_height: use this if in the layout you cannot rely on width but in height\n * - lazyload: (default custom / native / no) is managing fadein animation + error message\n * - impolicy: (default true) is checking automatically the right profile and 'real' end resolution\n * - placeholder_color_light: (default black_100) is the lighter color for CLS animation\n * - placeholder_color_dark: (default black_250) is the darker color for CLS animation\n * - object-fit: (default: cover) use 'contain' instead (applys object-fit: contain on img) if you want to image to be displayed always fully\n *   like in sku component, where the product image have different original aspect_ratio, we want to display always the full product\n */\n\nclass Img extends HTMLElement {\n    constructor() {\n        super()\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n        this.#initLazyLoad()\n    }\n\n    #initLazyLoad() {\n        if (this.lazyload !== LAZYLOAD_CUSTOM) {\n            return\n        }\n        const callbackSuccess = () => {\n            this.classList.remove('loading')\n        }\n\n        lazyLoad(this.firstElementChild, 'src', `${this.file}`, this.file, { callbackSuccess })\n    }\n\n    render() {\n        const {\n            file = '',\n            description = '',\n            lazyload = LAZYLOAD_CUSTOM,\n            fetchpriority = ''\n        } = this.props\n\n        if (file === '') {\n            return\n        }\n\n        // Set properties used elsewhere in component\n        this.lazyload = lazyload\n        this.file = file + this.#setImPolicyQuery()\n\n        this.#setCssProperties()\n        this.classList.add('nb-img')\n        this.innerHTML = `\n            <img\n                ${this.lazyload === LAZYLOAD_CUSTOM ? 'src=\"\"' : `src=\"${this.file}\"`}\n                ${description !== '' ? `alt=\"${description}\"` : 'alt=\"image\" aria-hidden=\"true\"'}\n                ${this.lazyload === LAZYLOAD_NATIVE ? 'loading=\"lazy\"' : ''}\n                ${fetchpriority !== '' ? `fetchpriority=${fetchpriority}` : ''}\n                class=\"loading\"\n             />`\n        // Get this element's first class\n        this.parentClass = this.getAttribute('class').split(' ')[0]\n\n        // Add that previous class + a suffix to its first child\n        if (this.parentClass !== '') {\n            this.firstElementChild.classList.add(this.parentClass + '-content')\n        }\n    }\n\n    #setImPolicyQuery() {\n        const { aspect_ratio, force_width, force_height, impolicy = true } = this.props\n\n        if (impolicy === 'false') {\n            return ''\n        }\n\n        let width = this.offsetWidth\n\n        if (force_width && force_width !== '') {\n            width = Number(force_width)\n        }\n\n        if (force_height && force_height !== '') {\n            const [w, h] = aspect_ratio.split('/')\n            width = Math.round((Number(force_height) * w) / h)\n        }\n\n        let finalWidth = this.#getRetinaWidth(width)\n\n        const impolicy_profil = this.#getImpolicyProfile(finalWidth)\n\n        return `?impolicy=${impolicy_profil}&imwidth=${finalWidth}&imdensity=1`\n    }\n\n    #getRetinaWidth(width) {\n        const { devicePixelRatio } = window\n        return devicePixelRatio > 1 ? width * 2 : width\n    }\n\n    #getImpolicyProfile(width) {\n        const { exactFound, closests } = this.#getClosests(width)\n\n        if (exactFound) {\n            return exactFound.name\n        } else {\n            let tempDiff = closests[0].diff\n            let closest = null\n            closests.forEach(item => {\n                if (item.diff <= tempDiff) {\n                    tempDiff = item.diff\n                    closest = item\n                }\n            })\n            return closest.name\n        }\n    }\n\n    #getClosests(width) {\n        let exactFound = null\n        let closests = []\n        PROFILES.every(profile => {\n            const found = profile.sizes.find(el => el >= width)\n\n            if (found) {\n                if (found === width) {\n                    exactFound = profile\n                    return false\n                }\n\n                closests.push({ name: profile.name, diff: found - width })\n            }\n\n            return true\n        })\n        return { exactFound, closests }\n    }\n\n    #setCssProperties() {\n        const {\n            aspect_ratio,\n            object_fit,\n            placeholder_color_light,\n            placeholder_color_dark,\n            error_message\n        } = this.props\n\n        this.#setCssProperty('--image-aspect-ratio', aspect_ratio)\n        this.#setCssProperty('--image-object-fit', object_fit)\n        this.#setCssProperty('--image-placeholder-color-light', placeholder_color_light)\n        this.#setCssProperty('--image-placeholder-color-dark', placeholder_color_dark)\n        this.#setCssProperty('--image-placeholder-error-text', '\"' + error_message + '\"')\n    }\n\n    #setCssProperty(name, value) {\n        if (!value || value === '\"undefined\"') {\n            return\n        }\n\n        this.style.setProperty(name, value)\n    }\n}\n\ncustomElements.get('nb-img') || customElements.define('nb-img', Img)\n\nexport default Img\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport {\n    handlePromoClick,\n    productClick,\n    trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN, EVENT_QUICKVIEW_OPEN } from '../constants.mjs'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Link extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n        this.boundHandleClick = this.handleClick.bind(this)\n        this.market = getMarketCode()\n        this.language = getLangCode()\n    }\n\n    connectedCallback() {\n        this.props = {\n            ...createProps(this.attributes),\n            disableTracking: this.hasAttribute('data-disabletracking')\n        }\n        this.render()\n        this.setClassHelper()\n        this.bindEvents()\n    }\n\n    render() {\n        const {\n            size = 'large',\n            color = 'gold',\n            link = '',\n            icon_right = '',\n            icon_left = '',\n            image = '',\n            image_alt = ''\n        } = this.props\n\n        // Todo : can we get rid of this setAttributes, it's only needed because stories are using data\n        size && this.setAttribute('size', size)\n        color && this.setAttribute('color', color)\n        image && this.setAttribute('image', image)\n        image_alt && this.setAttribute('image_alt', image_alt)\n        icon_left && this.setAttribute('icon_left', icon_left)\n        icon_right && this.setAttribute('icon_right', icon_right)\n\n        if (link === '') {\n            this.renderButton()\n        } else {\n            this.renderLink()\n        }\n\n        this.link = this.firstElementChild\n    }\n\n    renderLink() {\n        const {\n            label,\n            seo_label = '',\n            tracking_label = '',\n            link_new_tab = 'false',\n            a11y_label_new_tab = '',\n            icon_right = '',\n            image = '',\n            image_alt = '',\n            icon_left = '',\n            selected = '',\n            phantom = ''\n        } = this.props\n        let { link } = this.props\n\n        const slot = this.slot ? this.slot : label\n\n        if (link) {\n            link = link.replace('{market}', this.market)\n            link = link.replace('{lang}', this.language)\n        }\n\n        this.innerHTML = `\n        <a\n            href=\"${link}\"\n            ${link_new_tab === 'true' ? 'target=\"_blank\"' : ''}\n            ${\n                link_new_tab === 'true' && a11y_label_new_tab !== ''\n                    ? `aria-description='${a11y_label_new_tab}'`\n                    : ''\n            }\n            ${tracking_label && `tracking_label='${tracking_label}'`}\n            ${seo_label ? `title=\"${seo_label}\"` : ''}\n            ${slot ? `aria-label=\"${slot}\"` : ''}\n            ${selected === 'true' ? 'aria-current=\"true\"' : ''}\n            ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n        >\n            ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n            ${image && `<img src='${image}' alt='${image_alt}'/>`}\n            <span>${slot}</span>\n            ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n        </a>`\n    }\n\n    renderButton() {\n        const {\n            label,\n            tracking_label = '',\n            icon_right = '',\n            icon_left = '',\n            selected = '',\n            image = '',\n            image_alt = '',\n            phantom = ''\n        } = this.props\n\n        const slot = this.slot ? this.slot : label\n\n        this.innerHTML = `\n        <button\n            ${tracking_label && `tracking_label='${tracking_label}'`}\n            ${selected === 'true' ? 'aria-selected=\"true\"' : ''}\n            ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n        >\n            ${image && `<img src='${image}' alt='${image_alt}'/>`}\n            ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n            <span>${slot}</span>\n            ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n        </button>`\n    }\n\n    setClassHelper() {\n        const { size = 'large', cta_link_type = 'false' } = this.props\n        let sizeClass = ''\n\n        switch (size) {\n            case 'xsmall':\n                sizeClass = 't-2xs-500-sl'\n                break\n            case 'small':\n                sizeClass = 't-xs-500-sl'\n                break\n            case 'medium':\n                sizeClass = 't-sm-400-sl'\n                break\n            case 'large':\n                sizeClass = 't-sm-700-sl'\n                break\n            default:\n                sizeClass = 't-sm-700-sl'\n                break\n        }\n\n        if (cta_link_type === 'true') {\n            sizeClass = 't-sm-700-sl'\n            this.setAttribute('underline', 'false')\n        }\n\n        this.querySelector('a, button').classList.add(sizeClass)\n    }\n\n    handleClick() {\n        if (this.props.disableTracking === false) {\n            this.track()\n        }\n\n        const {\n            popin_id = '',\n            sku = '',\n            tracking_position = '',\n            tracking_list = '',\n            sku_colors\n        } = this.props\n\n        if (popin_id && sku) {\n            this.quickView(popin_id, sku, tracking_position, tracking_list, sku_colors)\n            return\n        }\n\n        if (popin_id) {\n            this.popin(popin_id)\n        }\n    }\n\n    popin(popin_id) {\n        dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n    }\n\n    quickView(popin_id, sku, tracking_position, tracking_list, colors) {\n        const { sku_data } = this.props\n\n        dispatchEvent({\n            eventName: EVENT_QUICKVIEW_OPEN,\n            args: {\n                sku_colors: colors,\n                id: popin_id,\n                sku: sku,\n                tracking_position: tracking_position,\n                tracking_list: tracking_list\n            }\n        })\n\n        if (sku_data) {\n            const product = JSON.parse(sku_data)\n            const componentName =\n                tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n            trackComponentInteraction({\n                creative: this.props.campaign_creative ?? '',\n                actionType: componentName.toLowerCase() + ' quick view',\n                internationalId: product.internationalId,\n                internationalName: product.internationalName,\n                productType: product.type,\n                technology: product.technology,\n                category: product.category,\n                rawPrice: product.rawPrice,\n                eventAction: componentName + ' Quick View'\n            })\n        }\n    }\n\n    track() {\n        const {\n            campaign_id = '',\n            campaign_name = '',\n            campaign_position = '',\n            campaign_creative = '',\n            campaign_instance_index = '',\n            label,\n            popin_id = '',\n            long_sku = '',\n            tracking_list = '',\n            tracking_position = ''\n        } = this.props\n\n        const campaign = {\n            id: campaign_id,\n            name: campaign_name,\n            position: campaign_position,\n            creative: campaign_creative\n        }\n\n        const linkOrPopin = popin_id ? 'POPIN' : 'LINK'\n        const slot = this.slot ? this.slot : label\n        // value 0 is accepted as we need to pass the index\n        const instanceIndex =\n            campaign_instance_index || campaign_instance_index === 0\n                ? ` - ${campaign_instance_index}`\n                : ''\n\n        if (tracking_list && tracking_position) {\n            productClick(tracking_position, tracking_list, long_sku)\n        } else {\n            handlePromoClick({\n                campaign,\n                cta_name: `${linkOrPopin + instanceIndex} - ${slot.trim()}`\n            })\n        }\n    }\n\n    bindEvents() {\n        this.unbindEvents()\n        this.link.addEventListener('click', this.boundHandleClick)\n    }\n\n    unbindEvents() {\n        this.link.removeEventListener('click', this.boundHandleClick)\n    }\n\n    disconnectedCallback() {\n        this.unbindEvents()\n    }\n}\n\ncustomElements.get('nb-link') || customElements.define('nb-link', Link)\n\nexport default Link\n","import { viewPromotion } from '@kissui/helpers/src/gtmEvents'\n\nexport default class {\n    constructor(node, data) {\n        this.observer = new IntersectionObserver(\n            IntersectionObserverEntry => this.onChange(IntersectionObserverEntry),\n            { threshold: [0], rootMargin: '0% 0%' }\n        )\n\n        this.el = node\n        this.data = data\n\n        if (!(this.el instanceof Element)) {\n            return\n        }\n\n        this.observer.observe(this.el)\n    }\n\n    /**\n     * Check if element are in the viewport\n     * @param {Array} observables\n     * @param {HTMLElement} observables.target\n     * @param {Boolean} observables.isIntersecting\n     */\n    onChange(observables) {\n        observables.forEach(observable => {\n            if (!observable.isIntersecting) {\n                return\n            }\n\n            this.track(observable)\n            this.observer.unobserve(observable.target)\n        })\n    }\n\n    track() {\n        // This line is needed to make the code compatible with Safari <=13\n        if ('requestIdleCallback' in window) {\n            window.requestIdleCallback(() => this.runTrack())\n        } else {\n            window.setTimeout(() => this.runTrack(), 1)\n        }\n    }\n\n    runTrack() {\n        if (!this.data['id'] || this.data['id'] === null || this.data['id'] === '') {\n            return\n        }\n        viewPromotion({ ...this.data })\n    }\n}\n","import Viewport from './viewportTracking'\nimport { viewPromotion } from '@kissui/helpers/src/gtmEvents'\nimport { isObjectEmpty, removeEmptyValues } from '@kissui/helpers/src/utils'\n\nexport default function (node, campaign) {\n    const tracking = new ZoneTracking(node, campaign)\n\n    return {\n        destroy: () => {\n            if (!tracking.getIom().hasIntersectionObserver()) {\n                tracking.destroy()\n            }\n        }\n    }\n}\n\nclass ZoneTracking extends Viewport {\n    constructor(node, data) {\n        super(node)\n        this.data = data\n    }\n\n    runTrack() {\n        const cleanedData = removeEmptyValues(this.data)\n        if (cleanedData && !isObjectEmpty(cleanedData)) {\n            viewPromotion({ ...cleanedData })\n        }\n    }\n}\n","import zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nclass Container extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n    }\n\n    connectedCallback() {\n        this.props = [...this.attributes].reduce((all, attr) => {\n            return { ...all, [attr.nodeName]: attr.nodeValue }\n        }, {})\n        this.render()\n        this.initTracking()\n        this.initLazyLoad()\n    }\n\n    initTracking() {\n        const {\n            campaign_id = null,\n            campaign_name = null,\n            campaign_position = null,\n            campaign_creative = null\n        } = this.props\n        zoneTracking(this, {\n            id: campaign_id,\n            name: campaign_name,\n            position: campaign_position,\n            creative: campaign_creative\n        })\n    }\n\n    initLazyLoad() {\n        const el = this.querySelector('.cb-bg-img')\n        if (!el) {\n            return\n        }\n\n        const url = this.getBgImgUrl()\n        if (!url) {\n            return\n        }\n\n        const { lazy_load } = this.props\n        if (lazy_load === 'false') {\n            el.setAttribute('style', `background-image: url(${url})`)\n            return\n        }\n\n        lazyLoad(\n            el,\n            'style',\n            `background-image: url(${url}); ${el.getAttribute('style') || ''}`,\n            url\n        )\n    }\n\n    getBgImgUrl() {\n        const {\n            background_mobile = '',\n            background_tablet = '',\n            background_desktop = '',\n            background_retina = ''\n        } = this.props\n\n        let url = ''\n        if (viewportHelper.is.mobile && background_mobile) {\n            url = background_mobile\n        } else if (viewportHelper.is.tablet && background_tablet) {\n            url = background_tablet\n        } else if ((viewportHelper.is.retina || viewportHelper.is.tablet) && background_retina) {\n            url = background_retina\n        } else if (\n            (viewportHelper.is.desktop || viewportHelper.is.retina || viewportHelper.is.tablet) &&\n            background_desktop\n        ) {\n            url = background_desktop\n        }\n\n        return url\n    }\n\n    render() {\n        const {\n            styles = '',\n            contrast,\n            background_color = '',\n            classname = '',\n            element_class = '',\n            slot\n        } = this.props\n\n        // Fix for undefined contrast (contrast is needed for background-color to work)\n        let contrastDefault = 'light'\n        if (contrast === 'undefined') {\n            this.setAttribute('contrast', contrastDefault)\n        } else {\n            contrastDefault = contrast\n        }\n\n        this.innerHTML = `\n            <section\n                class=\"${classname}\"\n                contrast=\"${contrastDefault}\"\n                style=\"${styles}\"\n            >\n                ${background_color || this.hasBgImage() ? this.renderBg() : ''}\n                <div class=\"cb-inner ${element_class}\">\n                    ${slot}\n                </div>\n            </section>`\n    }\n\n    hasBgImage() {\n        const { background_mobile: m, background_desktop: d, background_retina: r } = this.props\n        return !!m || !!d || !!r\n    }\n\n    renderBg() {\n        const { background_color = '' } = this.props\n\n        return `<div class=\"cb-bg-color ${background_color ? background_color : ''}\">\n        </div>${this.hasBgImage() ? '<div class=\"cb-bg-img\"></div>' : ''}`\n    }\n}\n\ncustomElements.get('nb-container') || customElements.define('nb-container', Container)\n\nexport default Container\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { makeHash } from '@kissui/helpers/src/utils'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nclass Chip extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n        this.checkbox = null\n    }\n\n    static get observedAttributes() {\n        return ['disabled', 'checked']\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.computedSlot = this.computeSlot()\n        this.render()\n        this.initTracking()\n    }\n\n    initTracking() {\n        const { campaign_id, campaign_name, campaign_creative, campaign_position } = this.props\n\n        const link = this.querySelector('label')\n\n        if (link) {\n            link.onclick = () => {\n                selectPromotion({\n                    cta_name: this.computedSlot,\n                    id: campaign_id,\n                    name: campaign_name,\n                    creative: campaign_creative,\n                    position: campaign_position\n                })\n            }\n        }\n    }\n\n    computeSlot() {\n        const { content } = this.props\n        return (this.slot ? this.slot : content).trim()\n    }\n\n    render() {\n        const {\n            icon = '',\n            color = '',\n            background_image = '',\n            filter_label_AA = 'filter',\n            rounded = 'true',\n            checked = 'false',\n            disabled = 'false',\n            id,\n            type = 'checkbox'\n        } = this.props\n\n        const slot = this.computedSlot\n        let style = ''\n\n        const checkedAttr = checked === 'true' ? 'checked' : ''\n        const disabledAttr = disabled === 'true' ? 'disabled' : ''\n        const inputId = 'chip-checkbox-' + (id || makeHash(slot))\n\n        this.innerHTML = `\n            <input type='${type}' name='options' id='${inputId}' aria-label='${slot} ${filter_label_AA}' ${checkedAttr} ${disabledAttr}>\n            <label style='${style}' for='${inputId}'>\n                ${\n                    icon &&\n                    `<nb-icon icon='${icon}'></nb-icon>\n                `\n                }\n                ${\n                    color &&\n                    `<div class='chip-color' style='background:${color}'></div>\n                `\n                }\n                ${\n                    background_image &&\n                    `<div class='chip-image ${\n                        rounded === 'true' ? 'rounded' : ''\n                    }' style='background-image:url(\"${background_image}\")'></div>\n                `\n                }\n                <span class=\"t-2xs-700-sl\" aria-hidden=\"true\" phantom=\"${slot}\">${slot}</span>\n            </label>\n        `\n\n        this.checkbox = this.getElementsByTagName('input')[0]\n    }\n\n    attributeChangedCallback(name, _, newValue) {\n        if (!this.checkbox) {\n            return\n        }\n\n        if (name === 'disabled') {\n            this.checkbox.disabled = newValue === 'true'\n        } else if (name === 'checked') {\n            this.checkbox.checked = newValue === 'true'\n        }\n    }\n}\n\ncustomElements.get('nb-chip') || customElements.define('nb-chip', Chip)\n\nexport default Chip\n","export function recursiveSwitchAriaHidden(elem, componentOpenState) {\n    const parent = elem.parentNode\n    const body = document.getElementsByTagName('body')[0]\n\n    if (parent === body) {\n        return\n    }\n\n    const brothers = parent.children\n    for (const brother of brothers) {\n        if (brother !== elem) {\n            componentOpenState\n                ? brother.setAttribute('aria-hidden', componentOpenState)\n                : brother.removeAttribute('aria-hidden')\n        }\n    }\n    recursiveSwitchAriaHidden(parent, componentOpenState)\n}\n\nexport function focusin(e, el, loop) {\n    if (!el.contains(e.target)) {\n        if (el.lastFocused === el.firstFocusable) {\n            loop ? el.lastFocusable.focus() : el.firstFocusable.focus()\n        } else {\n            loop ? el.firstFocusable.focus() : el.lastFocusable.focus()\n        }\n    } else {\n        el.lastFocused = e.target\n    }\n}\n\nexport function setFirstAndLastFocusable(el) {\n    const focusable = el.querySelectorAll('button, [href], input, select, textarea, [tabindex=\"0\"]')\n    el.firstFocusable = focusable[0]\n    el.lastFocusable = focusable[focusable.length - 1]\n    el.lastFocused = el.firstFocusable\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n    recursiveSwitchAriaHidden,\n    setFirstAndLastFocusable,\n    focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport { EVENT_SORT_BY_CHANGE, EVENT_POPIN_KEY_DOWN } from '@kissui/components'\n\nclass Dropdown extends HTMLElement {\n    constructor() {\n        super()\n        this.isOpen = false\n        this.selected = null\n        this.buttonElement = null\n        this.onClickOutside = this.onClickOutside.bind(this)\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.classList.add('nb-dropdown')\n        this.render()\n    }\n\n    render() {\n        this.buttonElement = null\n        const { label = '', aa_description } = this.props\n        let { options = [], element_id, element_name } = this.props\n\n        // Accept Selected and Checked as option setter\n        options = options.map(option => {\n            const payload = { ...option }\n            payload.checked = payload.checked || payload.selected\n\n            return payload\n        })\n\n        this.unbindEvent()\n\n        this.innerHTML = `\n            <button\n                class='nb-dropdown__button'\n                aria-haspopup=\"listbox\"\n                aria-expanded=\"${this.isOpen}\"\n                aria-label=\"${label} ${options && this.renderSelected()}\"\n                ${aa_description !== '' ? `aria-description=\"${aa_description}\"` : ''}>\n                    <span class=\"nb-dropdown__button__label t-sm-700-sl\">${label}</span>\n                    <span class=\"nb-dropdown__button__value t-xs-500-sl\"\n                    ${element_id ? `name=\"${element_id}\"` : ''}\n                    value=\"${options && this.renderSelected()}\">\n                    </span>\n                </button>\n            <div class=\"nb-dropdown__menu\" ${element_name ? `id=\"${element_name}\"` : ''}>\n                <div role=\"listbox\">\n                    <ul>\n                        ${options && options.length > 0 && this.renderOptions()}\n                    </ul>\n                </div>\n            </div>\n        `\n        this.buttonElement = this.querySelector('.nb-dropdown__button')\n        this.buttonElementValue = this.querySelector('.nb-dropdown__button__value')\n        this.dropdownMenu = this.querySelector('.nb-dropdown__menu > div')\n        this.selectedOption = this.querySelector('button[aria-selected=true]')\n        if (!this.selected) {\n            this.selected = options[0]\n        }\n        setFirstAndLastFocusable(this.dropdownMenu)\n        this.bindEvent()\n    }\n\n    // Render <BUTTON> tags for the custom select, <BUTTON> is better than <RADIOBUTTONS> for keyboard navigation users in this case\n    renderOptions() {\n        const {\n            label,\n            aa_listbox_description,\n            aa_select_description,\n            icon_option,\n            options = []\n        } = this.props\n        return options\n            .map(option => {\n                return `<li>\n                    <button\n                        data-id=\"${option.id}\"\n                        data-selectedlabel=\"${option.label}\"\n                        class=\"${viewportHelper.is.mobile ? 't-sm-400-sl' : 't-xs-500-sl'}\"\n                        role=\"option\"\n                        aria-label='${label + ' ' + option.label}'\n                        value='${option.id ?? option.label}'\n                        aria-selected='${option.checked}'\n                        ${option.link ? `data-link='${option.link}'` : ''}\n                        ${\n                            option.checked\n                                ? aa_listbox_description !== undefined &&\n                                  `aria-description=\"${aa_listbox_description}\"`\n                                : aa_select_description !== undefined &&\n                                  `aria-description=\"${aa_select_description}\"`\n                        }>\n                    ${icon_option && `<nb-icon icon='${icon_option}'></nb-icon>`} ${option.label}\n                    </button>\n                </li>`\n            })\n            .join('')\n    }\n\n    // Render the selected option to display in the main button of the PLP Filter Bar\n    renderSelected() {\n        const { options = [] } = this.props\n        const currentOption = options.find(\n            option => option.checked === true || option.selected === true\n        )\n        return `${currentOption?.label || options[0]?.label}`\n    }\n\n    bindEvent() {\n        this.boundHandleClick = this.handleClick.bind(this)\n        this.boundHandleLabelClick = this.handleLabelClick.bind(this)\n        this.boundHandleMobileClose = this.handleMobileClose.bind(this)\n        this.boundFocus = this.focus.bind(this)\n        this.boundFocusin = this.focusin.bind(this)\n        this.boundKeyNav = this.keyNav.bind(this)\n\n        this.buttonElement.addEventListener('click', this.boundHandleClick)\n        this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n            item.addEventListener('click', this.boundHandleLabelClick)\n        })\n        this.dropdownMenu.addEventListener('click', this.boundHandleMobileClose)\n        window.addEventListener('click', this.onClickOutside)\n    }\n\n    unbindEvent() {\n        if (!this.buttonElement) {\n            return\n        }\n        this.buttonElement.removeEventListener('click', this.boundHandleClick)\n        this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n            item.removeEventListener('click', this.boundHandleLabelClick)\n        })\n        this.dropdownMenu.removeEventListener('click', this.boundHandleMobileClose)\n        window.removeEventListener('click', this.onClickOutside)\n        document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n    }\n\n    handleClick() {\n        this.toogleDropdown(!this.isOpen)\n    }\n\n    handleMobileClose() {\n        this.toogleDropdown(false)\n    }\n\n    onClickOutside(e) {\n        if (this.isOpen && !this.contains(e.target)) {\n            this.toogleDropdown(false)\n        }\n    }\n\n    handleLabelClick(e) {\n        this.isOpen = false\n\n        // Unpress active button\n        if (this.selectedOption) {\n            this.selectedOption.setAttribute('aria-selected', 'false')\n        }\n\n        /*\n        * TODO CHECK WITH THOMAS\n        const activeButton = this.querySelector('button[aria-pressed=true]')\n        const activeLink = activeButton.getAttribute('data-link')\n        if (activeLink) {\n            window.location.href = activeLink\n            return null\n        }\n        activeButton.setAttribute('aria-pressed', 'false')\n        * */\n\n        // Activate pressed option\n        this.selectedOption = e.target\n        this.selectedOption.setAttribute('aria-selected', 'true')\n\n        // Reset all checked attributes to false / Destroy the object and build it again\n        this.props.options = this.props.options.map(option => ({ ...option, checked: false }))\n\n        // Get the id from the clicked button's data-id attribute\n        const selectedOptionId = this.selectedOption.dataset.id\n\n        // Find the option using the selected button's data-id\n        this.selected = this.props.options.find(option => option.id === selectedOptionId)\n\n        if (!this.selected) {\n            // Handle the error as needed maybe set the first item as checked.\n            this.selected = this.props.options[0]\n        }\n\n        this.selected.checked = true\n        e.target.closest('.nb-dropdown').classList.add('nb-dropdown--is-filled')\n\n        this.reRender()\n\n        this.toogleDropdown(false)\n\n        dispatchEvent({\n            eventName: EVENT_SORT_BY_CHANGE,\n            args: { options: this.props.options, selected: this.selected },\n            element: this\n        })\n    }\n\n    reRender() {\n        const { label, aa_listbox_description, aa_select_description } = this.props\n        this.buttonElementValue.setAttribute('value', this.selectedOption.dataset.selectedlabel)\n        this.buttonElement.setAttribute('aria-label', label + ' ' + this.renderSelected())\n        this.dropdownMenu.querySelectorAll('button').forEach(item => {\n            item.setAttribute('aria-description', aa_select_description)\n        })\n        this.selectedOption.setAttribute('aria-description', aa_listbox_description)\n    }\n\n    setSelected(value, dispatchChange = false) {\n        const { options = [] } = this.props\n        const tmpSelected = options.find(option => option.value === value)\n        if (tmpSelected) {\n            this.selected.checked = false\n            this.selected = tmpSelected\n            this.selected.checked = true\n        }\n\n        if (this.selectedOption) {\n            this.selectedOption.setAttribute('aria-selected', 'false')\n        }\n\n        this.dropdownMenu.querySelectorAll('button').forEach(item => {\n            if (item.value === this.selected.label) {\n                this.selectedOption = item\n                this.selectedOption.setAttribute('aria-selected', 'true')\n            }\n        })\n\n        this.classList.add('nb-dropdown--is-filled')\n\n        if (this.selectedOption) {\n            this.reRender()\n        }\n\n        if (dispatchChange) {\n            dispatchEvent({\n                eventName: EVENT_SORT_BY_CHANGE,\n                args: { options, selected: this.selected },\n                element: this\n            })\n        }\n    }\n\n    toogleDropdown(value) {\n        value ? this.open() : this.close()\n        this.isOpen = !this.isOpen\n\n        // Open and Close shared actions\n        this.switchAriaModal()\n        this.buttonElement.setAttribute('aria-expanded', this.isOpen)\n    }\n\n    switchAriaModal() {\n        // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n        this.dropdownMenu.setAttribute('aria-modal', this.isOpen)\n        // So we need to set aria-hidden=false to all brothers and brothers of parent until body\n        recursiveSwitchAriaHidden(this.dropdownMenu, this.isOpen)\n    }\n\n    open() {\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instanciate it only when we open or close and then we remove it on focusin\n        this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n        document.addEventListener('focusin', this.boundFocusin)\n        document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n        this.buttonElement.classList.add('isOpen')\n        this.openingSource = document.activeElement\n    }\n\n    close() {\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instantiate it only when we open or close and then we remove it on focusin\n        this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n        document.removeEventListener('focusin', this.boundFocusin)\n        document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n        this.buttonElement.classList.remove('isOpen')\n        this.buttonElement.setAttribute('aria-expanded', false)\n    }\n\n    focus() {\n        this.dropdownMenu.removeEventListener('transitionend', this.boundFocus)\n        if (this.isOpen && this.selectedOption) {\n            this.selectedOption.focus()\n            this.dropdownMenu.lastFocused = this.selectedOption\n        } else {\n            this.buttonElement.focus()\n        }\n    }\n\n    focusin(e) {\n        const loop = false\n        focusin(e, this.dropdownMenu, loop)\n    }\n\n    keyNav(e) {\n        switch (e.key) {\n            case 'Escape':\n                this.toogleDropdown(false)\n                break\n            case 'ArrowUp':\n                e.preventDefault()\n                this.prevOption()\n                break\n            case 'ArrowDown':\n                e.preventDefault()\n                this.nextOption()\n                break\n            case 'Home':\n            case 'PageUp':\n                e.preventDefault()\n                this.firstOption()\n                break\n            case 'End':\n            case 'PageDown':\n                e.preventDefault()\n                this.lastOption()\n                break\n            default:\n                break\n        }\n    }\n\n    prevOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n            const prevSibling = this.dropdownMenu.lastFocused.previousElementSibling\n            prevSibling.focus()\n            this.dropdownMenu.lastFocused = prevSibling\n        }\n    }\n\n    nextOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n            const nextSibling = this.dropdownMenu.lastFocused.nextElementSibling\n            nextSibling.focus()\n            this.dropdownMenu.lastFocused = nextSibling\n        }\n    }\n\n    firstOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n            this.dropdownMenu.firstFocusable.focus()\n            this.dropdownMenu.lastFocused = this.dropdownMenu.firstFocusable\n        }\n    }\n\n    lastOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n            this.dropdownMenu.lastFocusable.focus()\n            this.dropdownMenu.lastFocused = this.dropdownMenu.lastFocusable\n        }\n    }\n\n    disconnectedCallback() {\n        this.unbindEvent()\n    }\n}\n\ncustomElements.get('nb-dropdown') || customElements.define('nb-dropdown', Dropdown)\n\nexport default Dropdown\n","import Viewport from './viewportTracking'\nimport { parseHTML, capitalize } from '../../utils'\nimport { productImpression } from '@kissui/helpers/src/gtmEvents'\n\nexport default function (node, productData, currency, range, position) {\n    const tracking = new ProductTracking(node, productData, currency, range, position)\n\n    return {\n        destroy: () => {\n            if (!tracking.getIom().hasIntersectionObserver()) {\n                tracking.destroy()\n            }\n        }\n    }\n}\n\nclass ProductTracking extends Viewport {\n    constructor(node, data, currency, range, position) {\n        super(node)\n        this.node = node\n        this.data = data\n        this.currency = currency\n        this.range = range\n        this.position = position\n    }\n\n    async runTrack() {\n        // Remove impressionOnScoll event - from Analytics team (Luigi, Yahor)\n        const noImpression =\n            this.node.closest('[tracking_no_impression]')?.getAttribute('tracking_no_impression') ||\n            false\n        const productIndex =\n            this.node.closest('[tracking_position]')?.getAttribute('tracking_position') || 0\n        const list = this.node.closest('[tracking_list]')?.getAttribute('tracking_list') || ''\n\n        if (noImpression !== 'true') {\n            await productImpression(productIndex, list, this.data.id)\n        }\n    }\n\n    async getPLPCategory(categoryId) {\n        return (await window.getPLPData()).data.configuration.eCommerceData.categories.find(\n            category => category.id === categoryId\n        )\n    }\n\n    async getCategoriesWithPlpData(productData) {\n        const TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n        const isTechnologyCategory = categoryId =>\n            categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) !== -1\n\n        const getTechnologyName = categoryId =>\n            categoryId.substr(\n                categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) +\n                    TECHNOLOGY_CATEGORY_IDENTIFIER.length\n            )\n\n        const categories = [\n            ...(productData.cupSizes || []),\n            ...(productData.flavors || []),\n            ...(productData.ranges || []),\n            ...(productData.technologies || [])\n        ]\n\n        const categoryNames = await Promise.all(\n            categories.map(async categoryId => {\n                const categoryData = await this.getPLPCategory(categoryId)\n\n                if (!categoryData && isTechnologyCategory(categoryId)) {\n                    return getTechnologyName(categoryId)\n                }\n\n                return categoryData.name\n            })\n        )\n\n        return categoryNames.join('|')\n    }\n\n    async getCategories(productData) {\n        if (!productData) {\n            return ''\n        }\n\n        if (window.getPLPData) {\n            return this.getCategoriesWithPlpData(productData)\n        }\n\n        return Promise.all(\n            productData.supercategories.map(superCategory =>\n                window.napi.catalog().getCategory(superCategory)\n            )\n        ).then(categories => {\n            const dimension55 = []\n            for (const category of categories) {\n                const code = category.code\n                if (!code) {\n                    return\n                }\n                if (\n                    ~code.indexOf('-cupSize-') ||\n                    ~code.indexOf('-range-') ||\n                    ~code.indexOf('capsule-aromatic-') ||\n                    ~code.indexOf('machine-keyFeature-') ||\n                    ~code.indexOf('machine-color-') ||\n                    ~code.indexOf('accessory-collection-') ||\n                    ~code.indexOf('accessory-hero-month')\n                ) {\n                    dimension55.push(category.name.toLowerCase())\n                }\n            }\n            return dimension55.join('|')\n        })\n    }\n\n    buildGTMProductObject(productData, dimension55) {\n        let category\n        if (productData.type === 'capsule') {\n            category = 'capsules'\n        } else if (productData.type === 'accessory') {\n            category = 'accessories'\n        } else if (productData.type === 'machine') {\n            category = 'machines'\n        }\n\n        let dimension56 = null\n        if (productData.technologies) {\n            dimension56 = productData.technologies\n                .map(technology => capitalize(technology.split('/')[2]))\n                .join('|||')\n        }\n\n        let dimension130 = ''\n        if (productData.productSelections != null) {\n            dimension130 = productData.productSelections.join('|')\n        }\n\n        const impressionsOnScrollData = {\n            brand: 'Nespresso',\n            category,\n            dimension43: 'false',\n            dimension44: 'false',\n            dimension53: productData.legacyId,\n            dimension54: parseHTML(productData.name)[0].textContent,\n            dimension55,\n            dimension56,\n            dimension57: this.isBundled(productData) ? 'bundled' : 'single',\n            dimension130,\n            id: productData.internationalId,\n            name: parseHTML(productData.internationalName)[0].textContent,\n            price: productData.price\n        }\n        if (this.range) {\n            impressionsOnScrollData.list = this.range\n        }\n        if (this.position) {\n            impressionsOnScrollData.position = parseInt(this.position)\n        }\n        return impressionsOnScrollData\n    }\n\n    /**\n     * Guess if it's bundled even if the 'bundled' property is missing (ecapi VS PLP Data)\n     */\n    isBundled(productData) {\n        let result = productData.salesMultiple === 1 && productData.unitQuantity > 1\n\n        if (productData.bundled) {\n            result = productData.bundled\n        } else if (productData.salesMultiple > 1 && productData.unitQuantity === 1) {\n            result = false\n        }\n\n        return result\n    }\n}\n","import productTracking from '@kissui/helpers/src/assets/js/productTracking'\nimport { getProduct } from '@kissui/helpers/src/catalog'\n\nclass AddToCart extends HTMLElement {\n    static addToCartCounter = 0\n\n    connectedCallback() {\n        this.sku = (this.getAttribute('sku') || '').trim()\n        this.range = this.getAttribute('range')\n        this.position = this.getAttribute('position')\n        this.longSku = (this.getAttribute('longSku') || '').trim()\n        this.buttonSize = this.getAttribute('buttonSize') || 'small' // large or small\n        this.rendererName = this.getAttribute('rendererName') || 'default'\n        this.elementID = `addToCart${AddToCart.addToCartCounter++}`\n        this.disableTracking = this.getAttribute('disableTracking') || false\n\n        this.render()\n\n        if (!this.isWindowNapiActive()) {\n            return\n        }\n\n        window.napi\n            .getConfig()\n            .then(() => {\n                this.pushButton()\n            })\n            .catch(e => console.error(e))\n\n        if (!this.disableTracking) {\n            this.tracking()\n                .then(() => {})\n                .catch(e => console.error(e))\n        }\n    }\n\n    render() {\n        this.innerHTML = `<div class=\"cb-AddToCart\" id=\"${this.elementID}\">\n                <button class='AddToBagButtonLarge'>\n                    <span class='AddToBagButtonLarge__label'>+</span>\n                </button>\n            </div>`\n    }\n\n    isWindowNapiActive() {\n        return !!window.napi\n    }\n\n    pushButton() {\n        if (!document.getElementById(this.elementID)) {\n            return\n        }\n\n        const buttonSize = this.buttonSize\n\n        window.ui = window.ui || []\n        window.ui.push({\n            id: this.elementID,\n            module: 'AddToBagButton',\n            configuration: { props: { productId: this.longSku, buttonSize } },\n            ecommerceData: { activated: true }\n        })\n    }\n\n    async tracking() {\n        if (!this.isWindowNapiActive()) {\n            return Promise.resolve()\n        }\n\n        const data = await this.getProductData()\n        const currency = window[window.config.padl.namespace].dataLayer.app.app.currency\n        productTracking(this, data, currency, this.range, this.position)\n    }\n\n    getSkuKey(sku) {\n        return sku.indexOf('prod/') !== -1 ? 'id' : 'legacyId'\n    }\n\n    async getProductData() {\n        let plpData = null\n        if (window.getPLPData != null) {\n            plpData = await window.getPLPData()\n        }\n        if (plpData) {\n            const skuKey = this.getSkuKey(this.sku)\n            const allKeys = [skuKey, 'internationalId', 'id', 'legacyId']\n            let currentKeyIndex = 0\n            let data = null\n\n            while (!data && currentKeyIndex < allKeys.length - 1) {\n                const key = allKeys[currentKeyIndex]\n\n                data = plpData.data.configuration.eCommerceData.products.find(\n                    product => product[key] === this.sku\n                )\n\n                currentKeyIndex++\n            }\n\n            return data\n        } else if (this.isWindowNapiActive()) {\n            return await getProduct(this.longSku)\n        }\n\n        console.error('Error: napi is not found.')\n    }\n}\n\ncustomElements.get('nb-add-to-cart') || customElements.define('nb-add-to-cart', AddToCart)\n\nexport default AddToCart\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { stringifyForAttribute, escapeHtml } from '@kissui/helpers/src/utils'\nimport { BROWSER_CONTEXT } from '../constants.mjs'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst SLIDER_CHIPS_ID = 'slider_natural_chips'\n\nclass PlpStickyBar extends HTMLElement {\n    constructor() {\n        super()\n        this.boundReinitSlider = this.reinitSlider.bind(this)\n        this.boundLinkClick = this.linkClick.bind(this)\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n\n        this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n        this.render()\n\n        this.dropdownButtons = this.querySelectorAll(`.nb-dropdown__menu button`)\n        if (this.dropdownButtons) {\n            this.dropdownButtons.forEach(item => {\n                item.addEventListener('click', this.boundLinkClick)\n            })\n        }\n    }\n\n    render() {\n        const { navigation = [], navigation_bubbles = '' } = this.props\n        this.classList.add('nb-plp-sticky-bar')\n\n        this.innerHTML = `<div class='cb-restrict'>\n            ${this.renderLinksSelect(navigation)}\n            ${this.renderChipsSlider(navigation_bubbles)}\n        </div>`\n\n        this.dropdown = this.querySelector('nb-dropdown')\n        this.navigationBubble = this.querySelector('nb-navigation-bubbles')\n\n        // We set aria-hidden on this whole component because it has no sense to manage twice the features for SR and keyboard navigations\n        // Those features (bubble anchor + dropdown page switch) are already managed by the non sticky components\n        this.setAttribute('aria-hidden', 'true')\n    }\n\n    renderLinksSelect(links) {\n        if (viewportHelper.is.mobile || !links || links.length <= 1) {\n            return ''\n        }\n\n        const data = links.map(e => {\n            e.checked = e.selected\n            return e\n        })\n\n        return `\n            <nb-dropdown\n                data='${stringifyForAttribute({ icon_option: '16/symbol/check', options: data })}'\n            ></nb-dropdown>\n        `\n    }\n\n    renderChipsSlider(bubbles) {\n        const { a11y_slider_previous_button = '', a11y_slider_next_button = '' } = this.props\n\n        return `<nb-navigation-bubbles\n                slider_id='${SLIDER_CHIPS_ID}'\n                a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n                a11y_slider_next_button=\"${a11y_slider_next_button}\"\n                sticky='true' data='${escapeHtml(bubbles)}'\n                selected_nav_link_label=\"${\n                    this.props.selected_nav_link_label || ''\n                }\"></nb-navigation-bubbles>`\n    }\n\n    forceSliderWidth() {\n        // This is needed for Chip Slider, I don't understand why the width is too much\n        // So we set it hardly in JS (only when dropdown is in the layout)\n        if (this.dropdown) {\n            const dropdownWidth = this.dropdown.offsetWidth\n            const stickyBarWidth = this.querySelector('.cb-restrict').offsetWidth\n            const navigationBubbleWidth = stickyBarWidth - dropdownWidth\n\n            this.navigationBubble.style.setProperty(\n                'width',\n                `${navigationBubbleWidth / BROWSER_CONTEXT}rem`\n            )\n        }\n    }\n\n    reinitSlider(e) {\n        const { id } = readEvent(e)\n        if (id !== SLIDER_CHIPS_ID) {\n            return\n        }\n        this.forceSliderWidth()\n        e.target.initSlider()\n    }\n\n    linkClick(event) {\n        event.preventDefault()\n        // We need to redefine click on dropdown links because these are buttons\n        const link = event.currentTarget.getAttribute('data-link')\n        if (link) {\n            window.location.href = link\n        }\n\n        const textContent = event.currentTarget.getAttribute('value')\n        customEvent({\n            eventAction: 'PLP Content Tab',\n            eventLabel: textContent\n        })\n    }\n\n    disconnectedCallback() {\n        this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n        if (this.dropdownButtons) {\n            this.dropdownButtons.forEach(item => {\n                item.removeEventListener('click', this.boundLinkClick)\n            })\n        }\n    }\n}\n\ncustomElements.get('nb-plp-sticky-bar') || customElements.define('nb-plp-sticky-bar', PlpStickyBar)\n\nexport default PlpStickyBar\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n\n// scrollElement has been added as an optional parameter in order to avoid scrolling to fire a swipe\nconst swipeEvents = (window: Window & typeof globalThis, document: Document, stopEl?: HTMLElement) => {\n    if (window.nwcSwipeEvents) {\n        return\n    }\n    window.nwcSwipeEvents = true\n\n    // patch CustomEvent to allow constructor creation (IE/Chrome)\n    // if (typeof window.CustomEvent !== 'function') {\n    //     window.CustomEvent = function(event, params) {\n    //         params = params || {bubbles: false, cancelable: false, detail: undefined}\n    //\n    //         let evt = document.createEvent('CustomEvent')\n    //         evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n    //         return evt\n    //     }\n    //\n    //     window.CustomEvent.prototype = window.Event.prototype\n    // }\n\n    document.addEventListener('touchstart', handleTouchStart, false)\n    document.addEventListener('touchmove', handleTouchMove, false)\n    document.addEventListener('touchend', handleTouchEnd, false)\n\n    let xDown: null | number = null\n    let yDown: null | number = null\n    let xDiff: null | number = null\n    let yDiff: null | number = null\n    let timeDown: null | number = null\n    let startEl: HTMLElement | null = null\n\n    // Variables added for checkScrollConditions\n    let scrollTopArray: number[] = []\n    let scrollLeftArray: number[] = []\n\n    /**\n     * Avoid swipe up or down events to fire by checking the scrollTop position of the optional param scrollEl (scrollable zone)\n     * @param {string} direction - 'up' ,'down', 'left', 'right'\n     * @returns {boolean}\n     */\n    function checkScrollCondition(direction: \"up\" |\"down\" | \"left\" | \"right\", e: TouchEvent) {\n        if (stopEl === undefined) {\n            return true\n        }\n\n        let el = e.target as HTMLElement\n        let result = true\n        let i = 0\n        while (el !== stopEl && result) {\n            if (isScrollable(el)) {\n                switch (direction) {\n                    case 'up':\n                        result = scrollTopArray[i] === el.scrollHeight - el.clientHeight\n                        break\n                    case 'down':\n                        result = scrollTopArray[i] === 0\n                        break\n                    case 'left':\n                        result = scrollLeftArray[i] === el.scrollWidth - el.clientWidth\n                        break\n                    case 'right':\n                        result = scrollLeftArray[i] === 0\n                        break\n                    default:\n                        result = true\n                }\n            }\n            el = el.parentNode as HTMLElement\n            i++\n        }\n        return result\n    }\n\n    function memorizeStartElScrollPositions(el: HTMLElement) {\n        if (stopEl === undefined || !stopEl.contains(el)) {\n            return\n        }\n        scrollTopArray = []\n        scrollLeftArray = []\n        while (el !== stopEl) {\n            scrollTopArray.push(el.scrollTop)\n            scrollLeftArray.push(el.scrollLeft)\n            el = el.parentNode as HTMLElement\n        }\n    }\n\n    function isScrollable(el: HTMLElement) {\n        return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth\n    }\n\n    /**\n     * Fires swiped event if swipe detected on touchend\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchEnd(e: TouchEvent) {\n        // if the user released on a different target, cancel!\n        if (startEl !== e.target) {\n            return\n        }\n\n        // Calculate the data-swipe-threshold to be a percentage of the viewport\n        const defaultVertical = window.innerHeight * 0.25 // 25% of the viewport\n        const defaultHorizontal = window.innerWidth * 0.5 // 50% of the viewport\n\n        let swipeThresholdVertical =\n            getNearestAttribute(startEl!, 'data-swipe-threshold', defaultVertical)\n\n        let swipeThresholdHorizontal =\n            getNearestAttribute(startEl!, 'data-swipe-threshold', defaultHorizontal)\n\n        let swipeTimeout = getNearestAttribute(startEl!, 'data-swipe-timeout', 500) // default 500ms\n        let timeDiff = Date.now() - timeDown!\n        let eventType = ''\n        let changedTouches = e.changedTouches || e.touches || []\n\n        if (Math.abs(xDiff!) > Math.abs(yDiff!)) {\n            // most significant\n            if (Math.abs(xDiff!) > swipeThresholdHorizontal && timeDiff < swipeTimeout) {\n                if (xDiff! > 0) {\n                    if (checkScrollCondition('left', e)) {\n                        eventType = 'swiped-left'\n                    }\n                } else {\n                    if (checkScrollCondition('right', e)) {\n                        eventType = 'swiped-right'\n                    }\n                }\n            }\n        } else if (Math.abs(yDiff!) > swipeThresholdVertical && timeDiff < swipeTimeout) {\n            if (yDiff! > 0) {\n                if (checkScrollCondition('up', e)) {\n                    eventType = 'swiped-up'\n                }\n            } else {\n                if (checkScrollCondition('down', e)) {\n                    eventType = 'swiped-down'\n                }\n            }\n        }\n\n        if (eventType !== '') {\n            let eventData = {\n                dir: eventType.replace(/swiped-/, ''),\n                touchType: (changedTouches[0] as Touch & { touchType: string })?.touchType ?? 'direct', // This is a non standard feature used only by safari\n                xStart: xDown!,\n                xEnd: (changedTouches[0] || {}).clientX || -1,\n                yStart: yDown!,\n                yEnd: (changedTouches[0] || {}).clientY || -1\n            }\n\n            // fire `swiped` event event on the element that started the swipe\n            startEl!.dispatchEvent(\n                new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData })\n            )\n\n            // fire `swiped-dir` event on the element that started the swipe\n            startEl!.dispatchEvent(\n                new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData })\n            )\n        }\n\n        // reset values\n        xDown = null\n        yDown = null\n        timeDown = null\n    }\n\n    /**\n     * Records current location on touchstart event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchStart(e: TouchEvent) {\n        const target = e.target as HTMLElement\n        // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n        if (target.getAttribute('data-swipe-ignore') === 'true') {\n            return\n        }\n\n        startEl = target\n        memorizeStartElScrollPositions(startEl)\n\n        timeDown = Date.now()\n        xDown = e.touches[0].clientX\n        yDown = e.touches[0].clientY\n        xDiff = 0\n        yDiff = 0\n    }\n\n    /**\n     * Records location diff in px on touchmove event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchMove(e: TouchEvent) {\n        if (!xDown || !yDown) {\n            return\n        }\n\n        let xUp = e.touches[0].clientX\n        let yUp = e.touches[0].clientY\n\n        xDiff = xDown - xUp\n        yDiff = yDown - yUp\n    }\n\n    /**\n     * Gets attribute off HTML element or nearest parent\n     * @param {object} el - HTML element to retrieve attribute from\n     * @param {string} attributeName - name of the attribute\n     * @param {any} defaultValue - default value to return if no match found\n     * @returns {any} attribute value or defaultValue\n     */\n    function getNearestAttribute(el: HTMLElement, attributeName: string | number, defaultValue: number) {\n        // walk up the dom tree looking for attributeName\n        while (el && el !== document.documentElement) {\n            let attributeValue = el.getAttribute(String(attributeName))\n\n            if (attributeValue) {\n                return parseInt(attributeValue, 10)\n            }\n\n            el = el.parentNode as HTMLElement\n        }\n\n        return defaultValue\n    }\n}\n\nexport default swipeEvents\n","import './overlay.scss'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_CLOSE, TIME_INSTANT, TIME_SLOW } from '@kissui/components'\n\nconst open = popin_id => {\n    const overlay = document.createElement('DIV')\n    overlay.classList.add('nb-overlay')\n    overlay.addEventListener('click', () => {\n        dispatchEvent({ eventName: EVENT_POPIN_CLOSE, args: { id: popin_id } })\n    })\n    document.body.appendChild(overlay)\n    setTimeout(() => {\n        overlay.classList.add('fadein')\n    }, TIME_INSTANT)\n}\n\nconst close = () => {\n    if (!document.getElementsByClassName('nb-overlay').length) {\n        return\n    }\n    const overlay = document.getElementsByClassName('nb-overlay')[0]\n    overlay.classList.remove('fadein')\n    setTimeout(() => {\n        overlay.remove()\n    }, TIME_SLOW)\n}\n\nexport default { open, close }\n","import swipeEvents from '@kissui/helpers/src/swipeEvents'\nimport createProps, { parseBool } from '@kissui/helpers/src/props.helpers'\nimport {\n    recursiveSwitchAriaHidden,\n    setFirstAndLastFocusable,\n    focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport {\n    TIME_FAST,\n    EVENT_POPIN_OPENED,\n    EVENT_POPIN_CLOSED,\n    EVENT_VIDEO_TOGGLE,\n    EVENT_POPIN_OPEN,\n    EVENT_POPIN_CLOSE,\n    EVENT_POPIN_KEY_DOWN,\n    EVENT_SWIPED_DOWN\n} from '@kissui/components'\nimport Overlay from './components/overlay'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst STATE_OPEN = 'isOpen'\nconst SCROLL_LOCK = 'scroll-lock'\n\nclass Popin extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.ariaModal = null\n        this.isVideo = null\n\n        this.boundOpen = this.open.bind(this)\n        this.boundClose = this.close.bind(this)\n        this.boundEscapeClose = this.escapeClose.bind(this)\n        this.boundFocus = this.focus.bind(this)\n        this.boundFocusin = this.focusin.bind(this)\n    }\n\n    connectedCallback() {\n        this.style.display = 'none'\n        this.props = createProps(this.attributes)\n\n        if (!this.id) {\n            this.id = this.props.id\n        }\n\n        if (!this.content && !this.slot) {\n            this.slot = this.innerHTML\n        }\n\n        this.ariaModal = false\n        this.isVideo = false\n        this.render()\n    }\n\n    attributeChangedCallback(name, oldValue, newValue) {\n        this.props = createProps(this.attributes)\n\n        if (name === 'content') {\n            this.props.content = newValue\n        }\n    }\n\n    static get observedAttributes() {\n        return ['content']\n    }\n\n    disconnectedCallback() {\n        if (!this.hasEvent) {\n            return\n        }\n        this.unbindEvent()\n    }\n\n    render() {\n        if (this.hasEvent) {\n            this.unbindEvent()\n        }\n        const {\n            heading = '',\n            subheading = '',\n            bgcolor = 'highlight',\n            size = 'M',\n            label_close = 'Close',\n            image = '',\n            image_alt = '',\n            variation = 'before',\n            content = '',\n            heading_class = viewportHelper.is.mobile ? 't-sm-700-sl' : 'h-lg-700',\n            heading_id = 'popin-heading'\n        } = this.props\n        const slot = content || this.slot\n\n        if (slot === '') {\n            this.bindEvent()\n            this.classList.remove(STATE_OPEN)\n            this.isOpen = false\n            return false\n        }\n        this.checkIsVideo(slot)\n        this.setAttribute('size', this.isVideo ? 'L' : size)\n\n        // FYI : The role is dialog, not alertdialog (only used for alerts / warnings ...)\n        this.setAttribute('role', 'dialog')\n        this.setAttribute('aria-hidden', 'true')\n        this.setAttribute('bgcolor', bgcolor)\n        this.setAttribute('variation', variation)\n\n        // Be careful to not remove the title div, even if empty, because it holds on purpose the top gradient for scroll effect\n        this.innerHTML = `\n            <nb-cta\n                variation=\"navigation\"\n                ${bgcolor === 'white' ? `contrast=\"highlight\"` : `contrast=\"light\"`}\n                icon_right=\"24/symbol/close\"\n                label=\"${label_close}\"></nb-cta>\n            <div class=\"wrapper\">\n                ${\n                    heading &&\n                    `<div class=\"title\" >\n                        ${\n                            heading &&\n                            `<h2 id=\"${heading_id}\" class=\"${heading_class}\">${heading}</h2>`\n                        }\n                    </div>`\n                }\n                ${\n                    subheading &&\n                    `<div class=\"subtitle\">\n                            ${subheading && `<p class=\"t-sm-500\">${subheading}</p>`}\n                    </div>`\n                }\n\n                <div class=\"content t-sm-400\" tabindex=\"-1\">\n                    ${\n                        image &&\n                        `<div class=\"popin-header-img\"><img loading=\"lazy\" src=\"${image}\" alt=\"${image_alt}\" title=\"${image_alt}\" width=\"300\" height=\"225\" /></div>`\n                    }\n                    ${slot}\n                </div>\n                ${this.renderFooter()}\n            </div>\n            ${this.isVideo && viewportHelper.is.mobile ? '<div class=\"swipeOverlay\"></div>' : ''}\n        `\n\n        // Expected css to be downloaded\n        setTimeout(() => {\n            this.style.display = 'inherit'\n        }, 100)\n\n        // Set the first and last focusable elements\n        setFirstAndLastFocusable(this)\n\n        this.buttonElement = this.querySelector('button')\n        this.bindEvent()\n    }\n\n    renderFooter() {\n        const { footer } = this.props\n        return parseBool(footer) ? '<footer></footer>' : ''\n    }\n\n    checkIsVideo(slot) {\n        const tempEl = document.createElement('div')\n        tempEl.innerHTML = slot\n        if (tempEl.children.length === 1 && tempEl.children[0].tagName === 'NB-VIDEO') {\n            this.isVideo = true\n            this.setAttribute('video', 'true')\n        }\n    }\n\n    addLock() {\n        document.getElementsByTagName('html')[0].classList.add(SCROLL_LOCK)\n        Overlay.open(this.id)\n    }\n\n    removeLock() {\n        // In case we have popin inside a popin we shouldn't remove the scroll_lock\n        const parentPopin = this.parentNode.closest('nb-popin')\n        if (!parentPopin) {\n            document.getElementsByTagName('html')[0].classList.remove(SCROLL_LOCK)\n        }\n        Overlay.close()\n    }\n\n    switchAriaModal() {\n        this.ariaModal = !this.ariaModal\n        // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n        this.setAttribute('aria-modal', this.ariaModal)\n        // So we need to set aria-hidden=false to all ancestors of parent until body\n        recursiveSwitchAriaHidden(this, this.ariaModal)\n    }\n\n    async open(e) {\n        const event = readEvent(e)\n        if (event.id !== this.id) {\n            return\n        }\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instantiate it only when we open or close and then we remove it on focusin\n        this.addEventListener('transitionend', this.boundFocus)\n        document.addEventListener('focusin', this.boundFocusin)\n        this.openingSource = document.activeElement\n\n        this.addLock()\n        this.switchAriaModal()\n        this.setAttribute('aria-hidden', 'false')\n        this.isOpen = !this.isOpen\n\n        // event variable already contains ID and other args sent along with dispatch event\n        dispatchEvent({\n            eventName: EVENT_POPIN_OPENED,\n            args: event\n        })\n\n        await new Promise(resolve => {\n            setTimeout(() => {\n                this.classList.add(STATE_OPEN)\n                resolve()\n            }, TIME_FAST)\n        })\n    }\n\n    close(event) {\n        event.cancelBubble = true\n        if (event.stopPropagation) {\n            event.stopPropagation()\n        }\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instantiate it only when we open or close, and then we remove it on focusin\n        this.addEventListener('transitionend', this.boundFocus)\n        document.removeEventListener('focusin', this.boundFocusin)\n        this.removeLock()\n        if (this.isVideo) {\n            const openVideoPopin = this.closest('.has-open-video')\n            if (openVideoPopin) {\n                openVideoPopin.classList.remove('has-open-video')\n            }\n        }\n        this.switchAriaModal()\n        this.setAttribute('aria-hidden', 'true')\n        this.isOpen = !this.isOpen\n        this.classList.remove(STATE_OPEN)\n\n        dispatchEvent({\n            eventName: EVENT_POPIN_CLOSED,\n            args: { id: this.id }\n        })\n    }\n\n    focus() {\n        this.removeEventListener('transitionend', this.boundFocus)\n        if (this.isOpen) {\n            this.buttonElement.focus()\n        } else {\n            this.openingSource.focus()\n        }\n    }\n\n    focusin(e) {\n        focusin(e, this, true)\n    }\n\n    escapeClose(e) {\n        if (e.key === 'Escape' && this.isOpen) {\n            this.close(e)\n        }\n    }\n\n    swipeDown(e) {\n        if (this.isOpen) {\n            this.close(e)\n        }\n    }\n\n    swipeOverlayTogglePlayPause() {\n        dispatchEvent({\n            eventName: EVENT_VIDEO_TOGGLE,\n            args: { id: this.id }\n        })\n    }\n\n    bindEvent() {\n        this.hasEvent = true\n        this.buttonElement != null && this.buttonElement.addEventListener('click', this.boundClose)\n        window.addEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n        window.addEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n        document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n\n        if (viewportHelper.is.mobile) {\n            swipeEvents(window, document, this)\n            this.boundSwipeDown = this.swipeDown.bind(this)\n            document.addEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n            if (this.isVideo) {\n                this.swipeOverlay = this.querySelector('.swipeOverlay')\n                this.boundSwipeOverlayTogglePlayPause = this.swipeOverlayTogglePlayPause.bind(this)\n                this.swipeOverlay.addEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n            }\n        }\n    }\n\n    unbindEvent() {\n        this.hasEvent = false\n        this.buttonElement != null &&\n            this.buttonElement.removeEventListener('click', this.boundClose)\n        window.removeEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n        window.removeEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n        document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n        if (this.boundSwipeDown) {\n            document.removeEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n            this.boundSwipeDown = null\n        }\n        if (this.boundSwipeOverlayTogglePlayPause) {\n            this.swipeOverlay.removeEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n            this.boundSwipeOverlayTogglePlayPause = null\n        }\n    }\n}\n\ncustomElements.get('nb-popin') || customElements.define('nb-popin', Popin)\n\nexport default Popin\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","export const root = 'pn-ProductNav'\nexport const container = 'pn-ProductNavContents'\nexport const slidesContainer = 'pn-ProductContainer'\nexport const item = 'pn-ProductNavLinkWrapper'\nexport const next = 'pnAdvancerRight'\nexport const prev = 'pnAdvancerLeft'\nexport const pnIndicator = 'pn-ProductNavIndicator'\nexport const link_plp_category_padding_x = 10\nexport const TRANSITION_FAST = 300\n\nexport const colours = {\n    0: '#000000',\n    1: '#000000',\n    2: '#99813D',\n    3: '#40FEFF',\n    4: '#14CC99',\n    5: '#00BAFF',\n    6: '#0082B2',\n    7: '#B25D7A',\n    8: '#00FF17',\n    9: '#006B49',\n    10: '#00B27A',\n    11: '#996B3D',\n    12: '#CC7014',\n    13: '#40FF8C',\n    14: '#FF3400',\n    15: '#ECBB5E',\n    16: '#ECBB0C',\n    17: '#B9D912',\n    18: '#253A93',\n    19: '#125FB9'\n}\n","import * as constants from './constants'\nimport { colours, link_plp_category_padding_x, TRANSITION_FAST } from './constants'\nimport { makeId } from '@kissui/helpers/src/utils'\n\nclass SliderMenu {\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 {Boolean} [options.navigationButton=true] options.navigationButton show navigation button\n     */\n\n    constructor(element, options = {}) {\n        this.boundNextClick = this.onNextClick.bind(this)\n        this.boundPrevClick = this.onPrevClick.bind(this)\n        this.boundLinkClick = this.onLinkClick.bind(this)\n        this.boundTouchEnd = this.onTouchEnd.bind(this)\n        this.disableAutoScroll = options.disableAutoScroll === 'true' || false\n        this._entriesBounds = null\n\n        return new Promise(resolve => {\n            this._element = element\n            this._slides = [].slice.call(element.children)\n            this._options = Object.assign(\n                {},\n                {\n                    id: 'uuid',\n                    last_known_scroll_position: 0,\n                    ticking: false,\n                    navBarTravelDirection: '',\n                    navBarTravelling: false,\n                    navBarTravelDistance: 150,\n                    scrollAmount: 220\n                },\n                options\n            )\n\n            this.buildIHM()\n            resolve(this)\n\n            // Wait for CSS animation before setting the indicator\n            setTimeout(() => {\n                this.setOverflowAttribute()\n                this.initializeIndicatorPosition()\n            }, 0)\n        })\n    }\n\n    /**\n     * @returns {HTMLElement}\n     */\n    get element() {\n        return this._element\n    }\n\n    // MAIN BUILDER\n    buildIHM() {\n        this._root = this.createElement('nav', constants.root)\n        this._container = this.createElement('ul', constants.container)\n        this._pnIndicator = null\n        this._containerSlidesContent = null\n\n        if (this.hasContainer()) {\n            this._containerSlidesContent = this.createElement('div', constants.slidesContainer)\n        }\n\n        this.wrapItems()\n        this._root.appendChild(this._container)\n\n        if (this._containerSlidesContent) {\n            this._element.appendChild(this._containerSlidesContent)\n        }\n\n        // Insert the slider between Arrows for accessibility keyboard navigation\n        this._element.insertBefore(this._root, this._element.childNodes[2])\n\n        this.createIndicator()\n    }\n\n    hasContainer() {\n        if (document.querySelector('.slider-container')) return true\n\n        return false\n    }\n\n    wrapItems() {\n        const keys = []\n        this._slides.map(child => {\n            const randId = makeId(5)\n\n            if (this.hasContainer()) {\n                if (child.classList.contains('slider-container')) {\n                    if (child.children) {\n                        if (child.children.length) {\n                            ;[...child.children].forEach((el, i) => {\n                                if (i !== 0) {\n                                    el.style.display = 'none'\n                                }\n\n                                el.id = keys[i]\n\n                                this._containerSlidesContent.appendChild(el)\n                            })\n                        }\n                    }\n                    child.remove()\n                }\n            }\n\n            if (!child.classList.contains('pn-Advancer')) {\n                const item = this.createElement('div', constants.item)\n                item.appendChild(child)\n                item.setAttribute('data-inner-content-id', randId)\n                keys.push(randId)\n\n                this._container.appendChild(item)\n            }\n        })\n    }\n\n    createElement(tag, className) {\n        let div = document.createElement(tag)\n        div.setAttribute('class', className)\n        return div\n    }\n\n    // COMPONENT ROOT \"ELEMENT\" COMPOSER\n    createIndicator() {\n        this.elements = []\n        this._pnIndicator = this.createElement('div', constants.pnIndicator)\n        this._container.appendChild(this._pnIndicator)\n\n        this.elements = Array.from(this._container.querySelectorAll('nb-link a'))\n        // Handle setting the currently active link\n        this.elements.forEach(element => {\n            element.addEventListener('click', this.boundLinkClick)\n        })\n\n        const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n        if (pnAdvancerLeft) {\n            pnAdvancerLeft.addEventListener('click', this.boundPrevClick)\n        }\n\n        const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n        if (pnAdvancerRight) {\n            pnAdvancerRight.addEventListener('click', this.boundNextClick)\n        }\n\n        if (this._root) {\n            this._container.addEventListener('touchend', this.boundTouchEnd)\n        }\n    }\n\n    onLinkClick(e) {\n        this.goToElement(e.currentTarget)\n    }\n\n    goToSlide(index) {\n        this.goToElement(this._slides[index])\n    }\n\n    showContent(id) {\n        const slidesContainer = document.querySelector(`.${constants.slidesContainer}`)\n\n        if (slidesContainer.children) {\n            ;[...slidesContainer.children].forEach(el => (el.style.display = 'none'))\n        }\n\n        document.getElementById(id).style.display = 'block'\n    }\n\n    goToElement(element) {\n        if (this.hasContainer()) {\n            const contentId = element\n                .closest('[data-inner-content-id]')\n                .getAttribute('data-inner-content-id')\n\n            this.showContent(contentId)\n        }\n\n        this.deselectAllLinkBut(element)\n        element.setAttribute('aria-current', 'true')\n\n        if (!element || !this._entriesBounds) {\n            return\n        }\n\n        let distance = 0\n\n        for (const entry of this._entriesBounds) {\n            if (entry.target.getAttribute('data-href') === element.getAttribute('data-href')) {\n                break\n            } else {\n                distance = distance + entry.boundingClientRect.width + link_plp_category_padding_x\n            }\n        }\n\n        if (!this.disableAutoScroll) {\n            this._root.scroll({ left: distance, behavior: 'smooth' })\n        }\n    }\n\n    deselectAllLinkBut(element) {\n        this.elements.forEach(el => {\n            if (el !== element) {\n                el.setAttribute('aria-current', 'false')\n            }\n        })\n    }\n\n    sideScroll(element, direction, speed, distance, step) {\n        this.setOverflowAttribute()\n\n        let scrollAmount = 0\n        let slideTimer = setInterval(function () {\n            if (direction === 'left') {\n                element.scrollLeft -= step\n            } else {\n                element.scrollLeft += step\n            }\n            scrollAmount += step\n            if (scrollAmount >= distance) {\n                window.clearInterval(slideTimer)\n            }\n        }, speed)\n        return { slideTimer }\n    }\n\n    onPrevClick() {\n        this.sideScroll(this._root, 'left', 25, this._options.scrollAmount, 10)\n        setTimeout(() => {\n            this.setOverflowAttribute()\n        }, TRANSITION_FAST)\n    }\n\n    onNextClick() {\n        this.sideScroll(this._root, 'right', 25, this._options.scrollAmount, 10)\n        setTimeout(() => {\n            this.setOverflowAttribute()\n        }, TRANSITION_FAST)\n    }\n\n    onTouchEnd() {\n        this.setOverflowAttribute()\n    }\n\n    initializeIndicatorPosition() {\n        const selected = this._root.querySelector('[aria-current=\"true\"]')\n\n        // Set the indicator\n        if (selected) {\n            this.moveIndicator(selected, colours[0])\n        }\n    }\n\n    determineOverflow(content, container) {\n        let containerMetrics = container.getBoundingClientRect()\n        let containerMetricsRight = Math.floor(containerMetrics.right)\n        let containerMetricsLeft = Math.floor(containerMetrics.left)\n\n        let contentMetrics = content.getBoundingClientRect()\n        let contentMetricsRight = Math.floor(contentMetrics.right)\n        let contentMetricsLeft = Math.floor(contentMetrics.left)\n\n        if (\n            containerMetricsLeft > contentMetricsLeft &&\n            containerMetricsRight < contentMetricsRight\n        ) {\n            return 'both'\n        } else if (contentMetricsLeft < containerMetricsLeft) {\n            return 'left'\n        } else if (contentMetricsRight > containerMetricsRight) {\n            return 'right'\n        } else {\n            return 'none'\n        }\n    }\n\n    moveIndicator(item, color) {\n        if (!this._pnIndicator) {\n            return\n        }\n\n        let textPosition = item.getBoundingClientRect()\n        let container = this._container.getBoundingClientRect().left\n        let distance = textPosition.left - container\n\n        this._pnIndicator.style.transform =\n            'translateX(' +\n            (distance + this._container.scrollLeft + link_plp_category_padding_x) +\n            'px) scaleX(' +\n            (textPosition.width - link_plp_category_padding_x * 2) * 0.01 +\n            ')'\n\n        this._root.scrollLeft = Math.floor(\n            distance + this._container.getBoundingClientRect().left / 2\n        )\n\n        if (color) {\n            this._pnIndicator.style.backgroundColor = color\n        }\n    }\n\n    onResize() {\n        this.setOverflowAttribute()\n        this.initializeIndicatorPosition()\n    }\n\n    clearListeners() {\n        this.elements.forEach(element => {\n            element.removeEventListener('click', this.boundLinkClick)\n        })\n\n        if (typeof document !== 'undefined') {\n            const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n            if (pnAdvancerLeft) {\n                pnAdvancerLeft.removeEventListener('click', this.boundPrevClick)\n            }\n\n            const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n            if (pnAdvancerRight) {\n                pnAdvancerRight.removeEventListener('click', this.boundNextClick)\n            }\n        }\n    }\n\n    kill() {\n        this.clearListeners()\n    }\n\n    setOverflowAttribute() {\n        this._element.setAttribute(\n            'data-overflowing',\n            this.determineOverflow(this._container, this._root)\n        )\n\n        this.observe()\n    }\n\n    observe() {\n        if (!('IntersectionObserver' in window)) {\n            return false\n        }\n\n        this._entriesBounds = []\n\n        // Using IntersectionObserver to prevent reflow while getting boundingClientRect\n        const observer = new IntersectionObserver(\n            entries => {\n                for (const entry of entries) {\n                    this._entriesBounds.push({\n                        target: entry.target,\n                        intersection:\n                            entry.boundingClientRect.right <=\n                                window.innerWidth - link_plp_category_padding_x &&\n                            entry.boundingClientRect.left >= link_plp_category_padding_x,\n                        boundingClientRect: entry.boundingClientRect\n                    })\n                }\n\n                observer.disconnect()\n            },\n            { root: this._container }\n        )\n\n        this._slides.map(element => observer.observe(element))\n    }\n\n    isInViewport(element) {\n        if (!this._entriesBounds) {\n            return false\n        }\n\n        const entry = this._entriesBounds.find(entryBound => element === entryBound.target)\n\n        return entry.intersection\n    }\n}\n\nexport default SliderMenu\n","import SliderMenuLib from './js/SliderMenuLib'\nimport { debounce, makeId } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { customEvent, itemDisplay } from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_SLIDE_CHANGE, EVENT_SLIDER_READY } from '@kissui/components'\n\nclass SliderMenu extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n        this.navBarTravelling = true\n        this.disableAutoScroll = false\n        this.navBarTravelDirection = ''\n        this.navBarTravelDistance = 200\n        this.randomId = null\n        this.sliderMenu = null\n        this.boundOnResize = this.onResize.bind(this)\n        this.onLoad = this.onLoad.bind(this)\n        this.debouncedOnResize = debounce(this.boundOnResize, 250)\n    }\n\n    static get observedAttributes() {\n        return ['navBarTravelling', 'navBarTravelDirection', 'navBarTravelDistance']\n    }\n\n    render() {\n        const navigation = this.getAttribute('navigation') === 'true' ? true : ''\n        const a11y_slider_previous_button = this.getAttribute('a11y_slider_previous_button') || ''\n        const a11y_slider_next_button = this.getAttribute('a11y_slider_next_button') || ''\n\n        this.innerHTML = `\n            <div id=\"pnProductNav-${this.randomId}\" class=\"pn-ProductNavWrapper ${this.randomId}\">\n                ${\n                    navigation &&\n                    `<nb-cta id=\"pnAdvancerLeft-${this.randomId}\"\n                        class=\"pn-Advancer pn-AdvancerLeft\"\n                        variation=\"navigation\"\n                        contrast=\"highlight\"\n                        size=\"32\"\n                        icon_right=\"24/symbol/chevron-left\"\n                        label=\"${a11y_slider_previous_button}\"></nb-cta>`\n                }\n                ${this.slot}\n                ${\n                    navigation &&\n                    `<nb-cta id=\"pnAdvancerRight-${this.randomId}\"\n                        class=\"pn-Advancer pn-AdvancerRight\"\n                        variation=\"navigation\"\n                        contrast=\"highlight\"\n                        size=\"32\"\n                        icon_right=\"24/symbol/chevron-right\"\n                        label=\"${a11y_slider_next_button}\"></nb-cta>`\n                }\n                <span id=\"pnIndicator-${this.randomId}\"\n                    class=\"pn-ProductNavIndicator\">\n                </span>\n            </div>\n\n            `\n        this.loadSwiper()\n    }\n\n    connectedCallback() {\n        this.randomId = this.getAttribute('testId')\n            ? this.getAttribute('testId')\n            : `swiperMenu_${makeId(5)}`\n        this.navBarTravelling = this.getAttribute('navBarTravelling') || this.navBarTravelling\n        this.navBarTravelDirection =\n            this.getAttribute('navBarTravelDirection') || this.navBarTravelDirection\n        this.navBarTravelDistance =\n            this.getAttribute('navBarTravelDistance') || this.navBarTravelDistance\n        this.disableAutoScroll = this.getAttribute('disable_auto_scroll') || ''\n\n        this.render()\n        window.addEventListener('resize', this.debouncedOnResize)\n    }\n\n    loadSwiper() {\n        let navBarTravelDirection = this.navBarTravelDirection\n        let navBarTravelDistance = this.navBarTravelDistance\n\n        this.sliderMenu = new SliderMenuLib(this.querySelector('.' + this.randomId), {\n            id: this.randomId,\n            index: this.index,\n            navBarTravelDirection: navBarTravelDirection,\n            navBarTravelDistance: navBarTravelDistance,\n            disableAutoScroll: this.disableAutoScroll\n        })\n\n        this.sliderMenu.then(() => {\n            this.classList.add('is-show')\n\n            dispatchEvent({\n                eventName: EVENT_SLIDER_READY,\n                args: { className: this.randomId },\n                element: this\n            })\n        })\n\n        // Updates slider menu to follow semantics, accessibility\n        const productNavLinkWrappers = document.querySelectorAll('.pn-ProductNavLinkWrapper')\n        productNavLinkWrappers.forEach(div => {\n            const li = document.createElement('li')\n            li.classList.add('pn-ProductNavLinkWrapper')\n            while (div.firstChild) {\n                li.appendChild(div.firstChild)\n            }\n            div.parentNode.replaceChild(li, div)\n        })\n    }\n\n    handleClick() {\n        dispatchEvent({ eventName: EVENT_SLIDE_CHANGE })\n\n        // GTM 'itemDisplay' event\n        itemDisplay({ rootElement: ['nb-slider-menu'] })\n    }\n\n    onLoad() {\n        this.sliderMenu.then(slider => slider.onLoad())\n    }\n\n    onResize() {\n        this.sliderMenu.then(slider => slider.onResize())\n    }\n\n    onNavigationClick(e) {\n        let name = ''\n\n        if (\n            e.target &&\n            e.target.closest('.link') &&\n            e.target.closest('.link').getAttribute('tracking_label')\n        ) {\n            name = e.target.closest('.link').getAttribute('tracking_label')\n        }\n\n        customEvent({ eventAction: 'PLP Content Tab', eventLabel: name })\n    }\n\n    disconnectedCallback() {\n        window.removeEventListener('resize', this.debouncedOnResize)\n        this.sliderMenu.then(slider => slider.kill())\n    }\n}\n\ncustomElements.get('nb-slider-menu') || customElements.define('nb-slider-menu', SliderMenu)\n\nexport default SliderMenu\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { makeId, setAttributes, convertToCamelCase } from '@kissui/helpers/src/utils'\nimport { isSafari } from '@kissui/helpers/src/useragent.helpers'\nimport { CONTRAST_LIGHT } from '@kissui/components'\nimport { getOppositeContrast } from '@kissui/helpers/src/contrast.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { BROWSER_CONTEXT, EVENT_SLIDER_READY } from '../constants.mjs'\n\nconst MAX_LOOP_TO_INIT = 50 // max 5 seconds\n\nclass SliderNatural extends HTMLElement {\n    constructor() {\n        super()\n        // Default options\n        this.contrast = CONTRAST_LIGHT\n        this.defaultPosition = 0\n        this.displayButtons = true\n        this.displayNav = true\n        this.displayCounter = false\n        this.displayGradients = false\n        this.itemsPerSlide = 1\n        this.overflow = true\n        this.overflowOpacity = 0.25\n        this.flexAuto = false\n        // Events\n        this.boundPrevClick = this.#onPrevClick.bind(this)\n        this.boundNextClick = this.#onNextClick.bind(this)\n        this.boundNavClick = this.#onNavClick.bind(this)\n        this.boundScroll = this.#onScroll.bind(this)\n    }\n\n    connectedCallback() {\n        this.slot = this.innerHTML\n        this.props = createProps(this.attributes)\n        this.#render()\n\n        // We need an id for event dispatcher\n        if (!this.id || this.id === 'undefined') {\n            this.id = this.props.testId ? this.props.testId : `slider_natural_${makeId(5)}`\n        }\n\n        this.#setProperties()\n\n        this.loops = 0\n        this.#waitForSliderToBeSized()\n            .then(() => {\n                this.initSlider()\n                this.#dispatchReady()\n            })\n            .catch(e => {\n                console.error(e)\n            })\n            .finally(() => {\n                if (this.wait) {\n                    clearInterval(this.wait)\n                    this.wait = null\n                }\n            })\n    }\n\n    #waitForSliderToBeSized() {\n        return new Promise((resolve, reject) => {\n            this.wait = setInterval(() => {\n                if (this.carousel.offsetWidth > 0) {\n                    return resolve()\n                }\n\n                this.loops += 1\n                if (this.loops === MAX_LOOP_TO_INIT) {\n                    return reject(\n                        'Error: slider width is ZERO even after 5s, cannot finish slider init'\n                    )\n                }\n            }, 100)\n        })\n    }\n\n    #set(key, value) {\n        const normalisedValue = this.#getOption(value)\n        if (normalisedValue !== undefined) {\n            this[convertToCamelCase(key)] = normalisedValue\n        }\n    }\n\n    #getOption(value) {\n        if (!isNaN(value)) {\n            return parseFloat(value)\n        } else if (value === 'true') {\n            return true\n        } else if (value === 'false') {\n            return false\n        } else {\n            return value\n        }\n    }\n\n    #setProperties() {\n        const { options, a11y_labels } = this.props\n\n        // Create refs to html elements\n        this.container = this.querySelector('.container')\n        this.wrapper = this.querySelector('.wrapper')\n        this.carousel = this.querySelector('ul')\n\n        // Set slider properties\n        this.currentIndex = 0\n        this.a11y_labels = a11y_labels\n        if (viewportHelper.is.mobile) {\n            this.options = options.mobile\n        } else if (viewportHelper.is.tablet) {\n            this.options = options.tablet\n        } else {\n            this.options = options.desktop\n        }\n\n        // Set options\n        for (const property in this.options) {\n            this.#set(property, this.options[property])\n        }\n\n        // If counter is displayed we force buttons and pagination to false\n        if (this.displayCounter) {\n            this.displayNav = this.displayButtons = false\n        }\n\n        // Overflow needs a class\n        if (this.overflow) {\n            this.container.classList.add('overflow')\n        }\n\n        // Contrast needs an attribute\n        this.buttonsContrast = getOppositeContrast(this.contrast)\n        this.setAttribute('contrast', this.contrast)\n\n        // Set CSS properties for non dynamic options\n        this.#setCssSlideMinHeight()\n        this.#setCssSliderGap()\n        this.#setCssPlaceholder()\n    }\n\n    /** Public Method **/\n    initSlider() {\n        // Get an updated number of items (if async we run again)\n        this.slidesElements = this.querySelectorAll('.nn-carousel > li:not(.safari-fix)')\n        this.itemNumber = this.slidesElements.length\n\n        // For asynchronous initSlider() we need to reset first itemWidth and itemPerSlide to get the original values before other calculations\n        this.#set('item_width', this.options['item_width'])\n        this.#set('items_per_slide', this.options['items_per_slide'])\n\n        // If itemsPerSlide is 'auto' we need to calculate it's real value based on itemWidth or scrollWidth / itemNumber\n        // We also need to set the CSS --item-width variable to handle the calculation correctly\n        if (this.itemsPerSlide === 'auto') {\n            this.#calculateItemsPerSlide()\n        }\n        this.#setCssSlideWidth()\n        this.#setCssItemsPerSlide()\n        this.#setCssFlexAuto()\n\n        // Other properties that can be set only after the rest\n        this.maxSlides = this.itemNumber - this.itemsPerSlide\n\n        // Finish rendering\n        this.#renderButtons()\n        this.#renderNav()\n        this.#renderCounter()\n        this.#renderGradients()\n\n        // Init methods in this order !\n        this.#applyCenteredLayout()\n        this.#getSliderPositions()\n        this.#getOpacityParams()\n        this.#setOpacity()\n        this.#updateStates()\n        this.#bindEvent()\n        this.#gotoDefaultPosition()\n\n        // Render this safariFix at the end because we don't want the extra li to be considered in sliderElements\n        this.#renderSafariFix()\n    }\n\n    #render() {\n        this.innerHTML = `<div class=\"container\"><div class=\"wrapper\"><ul class=\"nn-carousel\">${this.slot}</ul></div></div>`\n    }\n\n    #renderButtons() {\n        // Important: if maxSlides <= 0 it means we don't have scroll, so we don't need buttons\n        const hasNoButton = !this.displayButtons || this.maxSlides <= 0\n        if (hasNoButton) {\n            // Needed if we reinit\n            if (this.prevButton && this.nextButton) {\n                this.prevButton.remove()\n                this.nextButton.remove()\n            }\n            return\n        }\n\n        // Check if button exists already (for async content in order to avoid creating two occurrences)\n        if (!this.prevButton) {\n            this.prevButton = this.#renderButton('prev')\n        }\n        if (!this.nextButton) {\n            this.nextButton = this.#renderButton('next')\n        }\n    }\n\n    #renderButton(pos, renderInCounter = false) {\n        const { creative = '', id = '', name = '', position = '' } = this.props.campaign ?? {}\n        const buttonContrast = renderInCounter ? this.contrast : this.buttonsContrast\n        const isPrev = pos === 'prev'\n\n        const buttonEl = document.createElement('nb-cta')\n        buttonEl.classList.add(pos)\n        setAttributes(buttonEl, {\n            variation: 'navigation',\n            contrast: buttonContrast,\n            size: '48',\n            icon_right: isPrev ? '24/symbol/chevron-left' : '24/symbol/chevron-right',\n            label: this.a11y_labels[pos],\n            campaign_creative: creative,\n            campaign_id: id,\n            campaign_name: name,\n            campaign_position: position\n        })\n        if (!renderInCounter) {\n            isPrev ? this.container.prepend(buttonEl) : this.container.append(buttonEl)\n        } else {\n            isPrev ? this.counter.prepend(buttonEl) : this.counter.append(buttonEl)\n        }\n        return buttonEl\n    }\n\n    #renderNav() {\n        if (!this.displayNav || this.maxSlides === 0) {\n            // Needed if we reinit\n            if (this.nav) {\n                this.nav.remove()\n            }\n            return\n        }\n\n        // Check if nav exists already (for async content in order to avoid creating two occurrences)\n        if (this.nav) {\n            this.nav.remove()\n        }\n\n        const nav = document.createElement('nav')\n\n        let bullets = ''\n        for (let i = 0; i <= this.maxSlides; i++) {\n            bullets += this.#renderBullet(i)\n        }\n\n        nav.innerHTML = `${bullets}`\n\n        this.appendChild(nav)\n        this.nav = this.querySelector('nav')\n        this.navElements = this.querySelectorAll('nav button')\n    }\n\n    #renderBullet(index) {\n        return `<button data-item='${index}' aria-label='${this.a11y_labels.nav} ${index}'><span></span></button>`\n    }\n\n    #renderCounter() {\n        if (!this.displayCounter || this.maxSlides === 0) {\n            // Needed if we reinit\n            if (this.counter) {\n                this.counter.remove()\n            }\n            return\n        }\n\n        // Check if counter exists already (for async content in order to avoid creating two occurrences)\n        if (this.counter) {\n            this.counter.remove()\n        }\n\n        this.counter = document.createElement('div')\n        this.counter.classList.add('counter')\n        this.counter.classList.add('t-sm-500')\n        this.counter.setAttribute('aria-hidden', 'true')\n\n        this.counter.innerHTML = `<span class='current'>${this.currentIndex + 1}</span>\n        <span>/</span>\n        <span>${this.maxSlides + 1}</span>`\n\n        this.prevButton = this.#renderButton('prev', true)\n        this.nextButton = this.#renderButton('next', true)\n\n        this.appendChild(this.counter)\n    }\n\n    #renderGradients() {\n        if (!this.displayGradients || this.overflow) {\n            return\n        }\n\n        if (this.gradientsWidth) {\n            this.#setCss('--gradients-width', this.gradientsWidth, true)\n        }\n\n        if (this.gradientsColor) {\n            this.#setCss('--gradients-color', this.gradientsColor)\n            this.#setCss('--gradients-color-transparent', this.gradientsColor + '00')\n        }\n\n        this.container.classList.add('hasGradients')\n    }\n\n    #renderSafariFix() {\n        // In safari, both Desktop and iOS, the scroll doesn't reach the end, because the scroll-padding on the right side seems to not been taken into account\n        // Same bug is happening in Chrome on iOS (seems to use Safari webkit rendering)\n        // The fix is to render an extra <li> with the size equal to the scroll-padding\n        if (!this.overflow || !isSafari()) {\n            return\n        }\n\n        // Check if safariFix exists already (for async content in order to avoid creating two occurences)\n        if (!this.safariFix) {\n            this.safariFix = document.createElement('li')\n            this.safariFix.classList.add('safari-fix')\n            this.safariFix.setAttribute('aria-hidden', true)\n            this.carousel.appendChild(this.safariFix)\n        }\n\n        const safariFixWidth = (this.paddingCorrection - this.sliderGap) / BROWSER_CONTEXT\n        this.safariFix.style.setProperty('width', safariFixWidth + 'rem')\n    }\n\n    #calculateItemsPerSlide() {\n        // For asynchronous slider content, if initSlider() is called twice, we need to remove first this class\n        this.carousel.classList.remove('no-slides')\n\n        let itemWidth = this.itemWidth\n\n        // If itemWidth is not provided or 'auto', we need to calculate an average width for items that doesn't have fixed width\n        if (this.itemWidth === undefined || this.itemWidth === 'auto') {\n            itemWidth =\n                (this.carousel.scrollWidth - this.sliderGap * (this.itemNumber - 1)) /\n                this.itemNumber\n        }\n\n        this.itemsPerSlide = Math.floor(this.carousel.offsetWidth / itemWidth)\n        // TODO: the fix below doesn't work, needs to be resolved.\n        // const isLastElementSingle =\n        //     this.slidesElements[this.slidesElements.length - 2].offsetWidth +\n        //         this.slidesElements[this.slidesElements.length - 1].offsetWidth >\n        //     this.carousel.offsetWidth\n\n        // this.itemsPerSlide = isLastElementSingle\n        //     ? 0\n        //     : Math.floor(this.carousel.offsetWidth / itemWidth)\n    }\n\n    #getSliderPositions() {\n        this.sliderPositions = []\n        this.maxScroll = this.carousel.scrollWidth - this.carousel.offsetWidth\n\n        if (this.slidesElements.length === 0) {\n            return\n        }\n\n        // We need to manage the first item initial position in case the slides are\n        // visible on each side (equivalent to scroll-padding CSS of ul.nn-carousel)\n        const firstItemOffsetLeft = this.slidesElements[0].offsetLeft\n\n        this.querySelectorAll('.nn-carousel > li:not(.safari-fix)').forEach(element => {\n            this.sliderPositions.push(element.offsetLeft - firstItemOffsetLeft)\n        })\n    }\n\n    #setCss(name, value, isRem = false) {\n        this.style.setProperty(name, isRem ? value / BROWSER_CONTEXT + 'rem' : value)\n    }\n\n    #setCssSlideWidth() {\n        if (this.itemWidth === 'auto') {\n            const itemWidthAuto =\n                (this.container.clientWidth - (this.itemsPerSlide - 1) * this.sliderGap) /\n                (this.itemsPerSlide || 1)\n            this.#setCss('--item-width', itemWidthAuto, true)\n        } else if (this.itemWidth) {\n            this.#setCss('--item-width', this.itemWidth, true)\n        }\n    }\n\n    #setCssSlideMinHeight() {\n        if (this.slideMinHeight === 'auto') {\n            this.#setCss('--slide-min-height', 'auto')\n        } else if (this.slideMinHeight !== undefined) {\n            this.#setCss('--slide-min-height', this.slideMinHeight, true)\n        }\n    }\n\n    #setCssSliderGap() {\n        if (this.sliderGap || this.sliderGap === 0) {\n            this.#setCss('--slider-gap', this.sliderGap, true)\n        }\n    }\n\n    #setCssFlexAuto() {\n        if (this.flexAuto) {\n            this.carousel.classList.add('flex-auto')\n        }\n    }\n\n    #setCssPlaceholder() {\n        if (this.placeholderBackground) {\n            this.#setCss('--placeholder-background', this.placeholderBackground)\n        }\n    }\n\n    #setCssItemsPerSlide() {\n        this.#setCss('--items-per-slide', this.itemsPerSlide)\n    }\n\n    #applyCenteredLayout() {\n        if (this.maxSlides > 0) {\n            return\n        }\n        // If maxSlides is 0 or negative, it means that we have less items than needed to fulfill the carousel width\n        // So to center the items (for example the bubbles when only 3) we need to apply a justify-content: center fix\n        this.carousel.classList.add('no-slides')\n    }\n\n    /** Public Method **/\n    updateSlider(index, instantly = false) {\n        this.#getSliderPositions()\n        this.goToSlide(parseInt(index), instantly)\n    }\n\n    #updateStates() {\n        this.#setActiveButtons()\n        this.#setActiveBullet()\n        this.#setCounter()\n        this.#setActiveSlides()\n    }\n\n    #updateStatesScroll(index) {\n        this.#setActiveButtons(index)\n        this.#setCounter()\n    }\n\n    #setActiveButtons(currentIndex) {\n        if ((!this.displayButtons || this.maxSlides <= 0) && !this.displayCounter) {\n            return\n        }\n\n        // First we remove all hide classes (because with pagination we can move from more than 2 slides)\n        this.prevButton.classList.remove('hide')\n        this.nextButton.classList.remove('hide')\n\n        // Then we reset hide class on the right button\n        if (this.currentIndex === 0) {\n            this.prevButton.classList.add('hide')\n        } else if (this.currentIndex === this.maxSlides || currentIndex === this.maxSlides) {\n            this.nextButton.classList.add('hide')\n        }\n    }\n\n    #setActiveBullet() {\n        if (!this.displayNav || this.maxSlides <= 0) {\n            return\n        }\n\n        this.navElements.forEach(item => {\n            item.classList.remove('active')\n        })\n\n        this.navElements[this.currentIndex].classList.add('active')\n    }\n\n    #setCounter() {\n        if (!this.displayCounter || this.maxSlides === 0) {\n            return\n        }\n\n        if (!this.displayCounter) {\n            return\n        }\n\n        this.counter.querySelector('.current').textContent = parseInt(this.currentIndex + 1)\n    }\n\n    #setActiveSlides() {\n        // If we have no items overflowing on each side, we don't need to manage disabled slides\n        if (!this.overflow) {\n            return\n        }\n\n        this.slidesElements.forEach(element => {\n            element.setAttribute('aria-disabled', 'true')\n        })\n\n        let tempIndex = parseInt(this.currentIndex)\n        for (let i = 0; i < this.itemsPerSlide; i++) {\n            if (this.slidesElements[tempIndex + i]) {\n                this.slidesElements[tempIndex + i].removeAttribute('aria-disabled')\n            }\n        }\n    }\n\n    /** Public Method **/\n    goToSlide(index, instantly = false) {\n        if (index !== undefined) {\n            this.currentIndex = index\n        }\n\n        // If index is over maxSlides, it means we reached out the end of scroll, so we don't need to update states anymore\n        if (index < this.maxSlides) {\n            this.#updateStates()\n        }\n\n        // We scroll to the right position (scrollTo duration is approx 750ms)\n        this.carousel.scrollTo({\n            left: this.sliderPositions[parseInt(this.currentIndex, 10)],\n            behavior: instantly ? 'auto' : 'smooth'\n        })\n    }\n\n    #gotoDefaultPosition() {\n        if (this.defaultPosition === 0 || this.defaultPosition > this.maxSlides + 1) {\n            return\n        }\n        this.goToSlide(this.defaultPosition, true)\n    }\n\n    #onScroll() {\n        // Clear our timeout throughout the scroll\n        if (this.isScrolling) {\n            clearTimeout(this.isScrolling)\n        }\n\n        this.#setOpacity()\n\n        // Set a timeout to run after scrolling ends\n        this.isScrolling = setTimeout(() => {\n            // Update the expected scroll positions again as sometimes they are initially incorrect\n            this.#getSliderPositions()\n\n            const carouselScrollLeft = Math.round(this.carousel.scrollLeft)\n\n            // Ideal use case (exact pixel value)\n            let index = this.sliderPositions.indexOf(carouselScrollLeft)\n\n            // Sometimes the scrollLeft value can be +1 or -1 pixels. If the position is not found\n            // then the index will be -1. In this case, try searching the list of positions to see\n            // if the scroll position is one pixel left or right of the expected position (hence\n            // using -1 and +1 in the indexOf() call below)\n            if (index === -1) {\n                index = this.sliderPositions.indexOf(carouselScrollLeft - 1)\n            }\n            if (index === -1) {\n                index = this.sliderPositions.indexOf(carouselScrollLeft + 1)\n            }\n\n            // For items with flexible width (flex_auto) the last position of the scroll can not match an exact SliderPositions\n            if (carouselScrollLeft === this.maxScroll) {\n                index = this.maxSlides\n            }\n\n            if (index >= 0) {\n                this.#switchBullets(index, true)\n            }\n\n            this.#updateStatesScroll(index)\n        }, 100)\n    }\n\n    #getOpacityParams() {\n        if (!this.overflow || !this.slidesElements.length) {\n            return\n        }\n        // Set properties used for slide opacity calculation in #setOpacity()\n        this.paddingCorrection = parseInt(\n            getComputedStyle(this.carousel).getPropertyValue('padding-left')\n        )\n\n        this.itemWidthAdjusted = this.slidesElements[0].offsetWidth + this.sliderGap\n    }\n\n    #setOpacity() {\n        if (!this.overflow) {\n            return\n        }\n        const scrollX = this.carousel.scrollLeft\n\n        this.slidesElements.forEach((item, index) => {\n            // Adjust item offsetLeft because of slider padding on each side\n            const itemOffsetLeft = item.offsetLeft - this.paddingCorrection\n            // Adjust item offsetLeft to add itemWidth + sliderGap\n            let itemX = itemOffsetLeft + this.itemWidthAdjusted\n\n            // Determine if we need to calculate left or right items\n            let percentage = 100\n\n            if (scrollX > itemX) {\n                // Avoid calculation if item is outside on left\n                percentage = 0\n            } else if (scrollX >= this.itemWidthAdjusted * index) {\n                // Do left calculations\n                percentage = Math.round(((itemX - scrollX) / this.itemWidthAdjusted) * 100)\n            } else if (scrollX < itemX - (1 + this.itemsPerSlide) * this.itemWidthAdjusted) {\n                // Avoid calculation if item is outside on right\n                percentage = 0\n            } else if (scrollX <= itemX - this.itemsPerSlide * this.itemWidthAdjusted) {\n                // Do right calculations\n                percentage = Math.round(\n                    (this.itemsPerSlide + 1) * 100 -\n                        ((itemX - scrollX) / this.itemWidthAdjusted) * 100\n                )\n            }\n\n            const opacityPercentage = percentage / 100\n            let finalOpacity =\n                Math.round(\n                    (opacityPercentage * (1 - this.overflowOpacity) + this.overflowOpacity) * 100\n                ) / 100\n\n            item.firstElementChild.style.setProperty('opacity', finalOpacity)\n        })\n    }\n\n    #switchBullets(index, alreadyScrolled = false) {\n        if (!this.slidesElements[index]) {\n            return\n        }\n\n        this.currentIndex = index\n\n        // only fires goToSlide if user clicks on pagination buttons\n        if (!alreadyScrolled) {\n            this.goToSlide()\n        } else {\n            this.#updateStates()\n        }\n    }\n\n    #onPrevClick() {\n        if (this.currentIndex > 0) {\n            this.currentIndex = this.currentIndex - 1\n            this.#updateStates()\n        }\n        this.goToSlide()\n    }\n\n    #onNextClick() {\n        if (this.currentIndex < this.maxSlides) {\n            this.currentIndex = this.currentIndex + 1\n            this.#updateStates()\n        }\n        this.goToSlide()\n    }\n\n    #onNavClick(e) {\n        this.currentIndex = parseInt(e.target.dataset.item)\n        this.#setActiveBullet()\n        this.#switchBullets(this.currentIndex)\n    }\n\n    #dispatchReady() {\n        dispatchEvent({\n            eventName: EVENT_SLIDER_READY,\n            args: { id: this.id },\n            element: this\n        })\n    }\n\n    #bindEvent() {\n        this.#unbindEvent()\n\n        this.carousel.addEventListener('scroll', this.boundScroll)\n        if (this.prevButton) {\n            this.prevButton.addEventListener('click', this.boundPrevClick)\n        }\n        if (this.nextButton) {\n            this.nextButton.addEventListener('click', this.boundNextClick)\n        }\n        if (this.navElements) {\n            this.navElements.forEach(element => {\n                element.addEventListener('click', this.boundNavClick)\n            })\n        }\n    }\n\n    #unbindEvent() {\n        this.carousel.removeEventListener('scroll', this.boundScroll)\n        if (this.prevButton) {\n            this.prevButton.removeEventListener('click', this.boundPrevClick)\n        }\n        if (this.nextButton) {\n            this.nextButton.removeEventListener('click', this.boundNextClick)\n        }\n        if (this.navElements) {\n            this.navElements.forEach(element => {\n                element.removeEventListener('click', this.boundNavClick)\n            })\n        }\n    }\n\n    disconnectedCallback() {\n        this.#unbindEvent()\n    }\n}\n\ncustomElements.get('nb-slider-natural') || customElements.define('nb-slider-natural', SliderNatural)\n\nexport default SliderNatural\n","import { CONTRAST_DARK, CONTRAST_LIGHT } from '@kissui/components'\n\nexport const getOppositeContrast = contrast => {\n    return contrast === CONTRAST_LIGHT ? CONTRAST_DARK : CONTRAST_LIGHT\n}\n","export const isIOS = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('OS ')\n    return (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1\n}\n\nexport const isMacOS = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('OS ')\n    return agent.indexOf('Mac') > -1 && start > -1\n}\n\nexport const isApple = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('OS ')\n    return (\n        (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1 || agent.indexOf('Mac') > -1) &&\n        start > -1\n    )\n}\n\nexport const isAndroid = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('Android ')\n    return start > -1\n}\n\nexport const isHuawei = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('HUAWEI'),\n        devices = navigator.userAgent.match(\n            /ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL/i\n        )\n    return start > -1 || devices !== null\n}\n\nexport const isSafari = () => {\n    // https://stackoverflow.com/questions/7944460/detect-safari-browser\n    // This includes Chrome on IOS which seems to be Safari, So it's fully OK !\n    const agent = window.navigator.userAgent\n    return /^((?!chrome|android).)*safari/i.test(agent)\n}\n\nexport const isWebInspector = () => {\n    // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n    // If we are in a web inspector, in our Nespresso context platform can be MacIntel or eventually Win32 for windows users\n    const platform = window.navigator.platform\n    return platform.indexOf('MacIntel') > -1 || platform.indexOf('Win32') > -1\n}\n","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n    const { ref } = $ref.dataset\n\n    // Check if ref is of type array\n    const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n    if (refArray !== null) {\n        return getRefArray(refs, $ref, refArray)\n    } else {\n        return { ...refs, [$ref.dataset.ref]: $ref }\n    }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n    if (refs[name] === undefined) {\n        refs[name] = []\n    }\n    refs[name][index] = $ref\n    return refs\n}\n\nexport default createRefs\n","import viewportHelper from './viewport.helpers'\n\n/**\n * Resize image on the fly by Akamai\n * https://dsu-confluence.nestle.biz/x/06kaCQ\n * https://dsu-confluence.nestle.biz/display/EUXUI/Performance?preview=/152742355/152761429/IMPoliciesExtract-31072020.docx\n * @param {''|'carouselBannerNarrowMedium'|'carouselBannerWide'|'horizontalBannerNarrow'|'landscapeRecipeDetails'|'large'|'medium'|'portraitRecipeDetails'|'productPdpMainDefault'|'productPdpMain'|'productPdpSafeZone'|'product'|'recipeCard'|'registrationTechChoiceMediumLarge'|'resize_crop'|'small'} policy - IM Policy coming from Akamaï\n * @param {24|150|320|640|1024|2048|5000} width - IM Width size of the image\n * @returns {string} - Rules apply in a query string parameter\n */\nexport const getImpolicy = (policy = 'product', width = 160) => {\n    const rules = []\n\n    if (policy) {\n        rules.push(`impolicy=${policy}`)\n    }\n\n    if (width) {\n        rules.push(`imwidth=${width}`)\n    }\n\n    return `?${rules.join('&')}`\n}\n\n/**\n * Ask the right resolution depending on breakpoint, returns the closest one\n * No need to give a retina resolution, Akamai will return Retina automatically (you need to give the normal resolution)\n * @param {''|'medium'} policy - IM Policy coming from Akamaï, default is medium because it have the largest batch of resolutions\n * @param {''|'375'} mobileWidth - Mobile image width to be served  | 375 default is full mobile screen width\n * @param {''|'1024'} tabletWidth - Tablet image width to be served | 1024 default is full tablet landscape screen width\n * @param {''|'1920'} desktopWidth - Desktop image width to be served | 1024 default is full tablet landscape screen width\n * @returns {string} - Rules to concatenate to your image url\n */\nexport const getResponsiveImpolicy = (\n    policy = 'medium',\n    mobileWidth = '375',\n    tabletWidth = '1024',\n    desktopWidth = '1920',\n    retinaWidth = '3840'\n) => {\n    if (viewportHelper.is.mobile) {\n        return getImpolicy(policy, mobileWidth)\n    } else if (viewportHelper.is.tablet) {\n        return getImpolicy(policy, tabletWidth)\n    } else if (viewportHelper.is.desktop) {\n        return getImpolicy(policy, desktopWidth)\n    } else {\n        return getImpolicy(policy, retinaWidth)\n    }\n}\n","export const STATE_DEFAULT = 'default'\nexport const STATE_SELECTED = 'selected'\nexport const STATE_DISABLED = 'disabled'\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport { lazyLoad, getHashLink } from '@kissui/helpers/src/utils'\nimport { getResponsiveImpolicy } from '@kissui/helpers/src/impolicy'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nimport { STATE_SELECTED, STATE_DISABLED } from './js/constants'\n\nclass Bubble extends HTMLElement {\n    constructor() {\n        super()\n        this.classList.add('nb-bubble')\n    }\n\n    static get observedAttributes() {\n        return ['state']\n    }\n\n    attributeChangedCallback(name) {\n        if (name === 'state') {\n            this.setState()\n        }\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n        this.refs = createRefs(this)\n        this.initLazyLoad()\n        this.initTracking()\n    }\n\n    initTracking() {\n        const { label, campaign } = this.props\n\n        const link = this.querySelector('a')\n\n        if (link) {\n            link.onclick = () => {\n                selectPromotion({\n                    cta_name: label,\n                    ...campaign\n                })\n            }\n        }\n    }\n\n    initLazyLoad() {\n        let { src = '', src_retina = '' } = this.props.visual\n        const { visual } = this.refs\n\n        // If src_retina is not provided by markets, then takes the src as default\n        if (src_retina === '') {\n            src_retina = src\n        }\n\n        src_retina += getResponsiveImpolicy('small', '144', '160', '80', '160')\n        src_retina += '&imdensity=1'\n\n        if (visual && src_retina) {\n            lazyLoad(visual, 'src', `${src_retina}`, src_retina)\n        }\n    }\n\n    render() {\n        const { label, link, state, a11y_scrollto = 'Scroll to' } = this.props\n        const { linkNoHash, linkHash } = getHashLink(link)\n\n        this.innerHTML = `\n            ${\n                state === STATE_DISABLED\n                    ? this.renderVisual()\n                    : `<a href=\"${linkHash}\" data-href=\"${linkNoHash}\" aria-label='${a11y_scrollto} ${label}'>\n                ${this.renderVisual()}\n            </a>`\n            }\n\n            ${this.renderLabel()}\n        `\n\n        this.link = this.querySelector('a')\n        this.label = this.querySelector('span')\n        state && this.setAttribute('state', state)\n        this.setTheme()\n    }\n\n    setState() {\n        const state = this.getAttribute('state')\n\n        if (state === STATE_SELECTED) {\n            this.link.setAttribute('aria-current', 'true')\n            this.label.classList.add('t-xs-700-sl')\n            this.label.classList.remove('t-xs-500-sl')\n        } else {\n            if (state !== STATE_DISABLED) {\n                this.link.removeAttribute('aria-current')\n            }\n\n            this.label.classList.remove('t-xs-700-sl')\n            this.label.classList.add('t-xs-500-sl')\n        }\n    }\n\n    setTheme() {\n        const { theme } = this.props\n\n        if (theme && theme !== '') {\n            this.style.setProperty('--placeholder-background', theme)\n        }\n    }\n\n    renderVisual() {\n        let { src = '', src_retina = '' } = this.props.visual\n        const { state } = this.props\n\n        if (src === '' && src_retina === '') {\n            return ''\n        }\n\n        // Image is decorative, we can have alt=\"\" and aria-hidden should be true\n        return `<img src=\"\" alt=\"\" aria-hidden=\"true\" data-ref=\"visual\" ${\n            state === STATE_DISABLED ? 'class=\"is-disabled\"' : ''\n        }/>`\n    }\n\n    renderLabel() {\n        const { label, state } = this.props\n\n        if (!label) {\n            return\n        }\n\n        return `<span class=\"t-xs-500-sl ${\n            state === STATE_DISABLED ? 'is-disabled' : ''\n        }\">${label}</span>`\n    }\n}\n\ncustomElements.get('nb-bubble') || customElements.define('nb-bubble', Bubble)\n\nexport default Bubble\n","/**\n * @typedef {Object} ObserverItem\n * @property {String} selector - target element selector\n * @property {Object} options - IntersectionObserver options\n * @property {Function} callback - function to call on threshold crossed\n */\n\nclass IntersectionObserverService {\n    constructor() {\n        this.observers = new Map()\n    }\n\n    /**\n     * Creates a Map of ObserverItem objects, unique for each selector provided.\n     * Each selector has its own configurable observer, target elements and callback.\n     * Observers can be individually unobserved / destroyed.\n     * @param {ObserverItem[]} observables\n     */\n    create(observables) {\n        observables.forEach(({ selector, callback, options }) => {\n            if (this.observers.has(selector)) {\n                console.warn(`Observer for selector \"${selector}\" already exists`)\n                return\n            }\n\n            const targets = document.querySelectorAll(selector)\n\n            if (targets.length === 0) {\n                console.warn(`No elements found for selector \"${selector}\"`)\n                return\n            }\n\n            const observer = new IntersectionObserver(callback, options)\n            targets.forEach(element => observer.observe(element))\n            this.observers.set(selector, { observer, targets })\n        })\n    }\n\n    /**\n     * Unobserve for specified selector\n     * @param {String} selector\n     */\n    unobserve(selector) {\n        const entry = this.observers.get(selector)\n\n        if (entry) {\n            const { observer, targets } = entry\n            targets.forEach(element => observer.unobserve(element))\n        } else {\n            console.warn(`No observer found for selector \"${selector}\"`)\n        }\n    }\n\n    /**\n     * Disconnect observer for specified selector\n     * @param {String} selector\n     */\n    destroy(selector) {\n        const entry = this.observers.get(selector)\n\n        if (entry) {\n            const { observer } = entry\n            observer.disconnect()\n            this.observers.delete(selector)\n        } else {\n            console.warn(`No observer found for selector \"${selector}\"`)\n        }\n    }\n\n    /**\n     * Disconnect all observers\n     */\n    destroyAll() {\n        this.observers.forEach(entry => {\n            entry.observer.disconnect()\n        })\n\n        this.observers.clear()\n    }\n}\n\nexport default IntersectionObserverService\n","export default class Deferred {\n    constructor() {\n        this.promise = new Promise((resolve, reject) => {\n            this.reject = reject\n            this.resolve = resolve\n        })\n    }\n}\n","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n    if (typeof scrollTo === \"number\") {\n        return scrollTo\n    }\n\n    const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n    if (scrollToElement === null && typeof scrollTo === \"string\") {\n        throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n    }\n\n    return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n    const viewportHeight = window.innerHeight\n    const bodyHeight = document.body.clientHeight\n\n    if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n        return Math.abs(\n            scrollDuration +\n            scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n        )\n    }\n    return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n    const { scrollDuration: baseScrollDuration = 300 } = options\n    const deferred = new Deferred()\n\n    let scrollPosition: number = 0;\n\n    try {\n        scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n    }\n    catch (error) {\n        console.error(error)\n        return\n    }\n\n    let currentTime = 0\n    const initialTimestamp = window.performance.now()\n    const initialScroll = window.scrollY\n    const deltaScroll = initialScroll - scrollPosition\n\n    const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n    const finalTimestamp = initialTimestamp + scrollDuration\n\n    function step() {\n        const currentTimestamp = window.performance.now()\n        if (currentTimestamp < finalTimestamp) {\n            currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n            currentTime = --currentTime * currentTime * currentTime + 1\n            const moveStep = deltaScroll * currentTime\n            window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n            window.requestAnimationFrame(step)\n        } else {\n            window.scrollTo(0, scrollPosition)\n            setTimeout(() => deferred.resolve(undefined), 125)\n        }\n        return deferred.promise\n    }\n\n    window.requestAnimationFrame(step)\n    return deferred.promise\n}\n\nexport default scrollTo\n","export const EVENT_NAVIGATION_SECTION_CHANGE = 'EVENT_NAVIGATION_SECTION_CHANGE'\n\n// In mobile / tablet / sticky  we need a dynamic number of slides as it's a variable width\n// This 'auto' value is valid with new slider-natural, it calculates the available space and set automatically the good itemsPerSlide\nexport const NB_SLIDES_MOBILE = 'auto'\nexport const NB_SLIDES_TABLET = 'auto'\nexport const NB_SLIDES_DESKTOP = 9\nexport const NB_SLIDES_STICKY = 'auto'\n\nexport const INTERSECTION_RATIOS_SECTION = [0.2, 0.8]\n\nexport const BUBBLE_MOBILE_WIDTH = '104'\nexport const BUBBLE_TABLET_DESKTOP_WIDTH = '112'\nexport const GRADIENT_WIDTH = '8'\n\nexport const SLIDER_CONFIG_DEFAULT = {\n    display_gradients: 'true',\n    display_nav: 'false',\n    overflow: 'false',\n    placeholder_background: 'transparent',\n    slide_min_height: 'auto',\n    slider_gap: '0'\n}\n","import { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport IntersectionObserverService from '@kissui/helpers/src/intersection-observer.service'\nimport createProps from '@kissui/helpers/src/props.helpers.js'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { getHashLink, stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { COLOR_WHITE_1000 } from '../constants.mjs'\nimport eventsManager from './services/events.manager'\n\nimport { BREAKPOINT_M } from '@kissui/components'\nimport {\n    BUBBLE_MOBILE_WIDTH,\n    BUBBLE_TABLET_DESKTOP_WIDTH,\n    EVENT_NAVIGATION_SECTION_CHANGE,\n    GRADIENT_WIDTH,\n    INTERSECTION_RATIOS_SECTION,\n    NB_SLIDES_DESKTOP,\n    NB_SLIDES_MOBILE,\n    NB_SLIDES_STICKY,\n    NB_SLIDES_TABLET,\n    SLIDER_CONFIG_DEFAULT\n} from './data/constants'\n\nclass NavigationBubbles extends HTMLElement {\n    constructor() {\n        super()\n        this.isMobile = window.innerWidth < BREAKPOINT_M\n        // Used to prevent observer to fire a section change event\n        // if navigation click already did it\n        this.isScrolling = false\n        this.scrollObserver = new IntersectionObserverService()\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.classList.add('nb-navigation-bubbles')\n        this.sticky = this.isSticky()\n        this.type = this.sticky ? 'Chip' : 'Bubble'\n        this.isCenteredItems = this.props.is_centered_items ? 'true' : 'false'\n        this.setAttribute('type', this.type.toLowerCase())\n        this.setAttribute('is-centered-items', this.isCenteredItems)\n        this.init()\n    }\n\n    isSticky() {\n        if (!this.props) {\n            return false\n        }\n        const { sticky = 'false' } = this.props\n        return sticky === 'true'\n    }\n\n    init() {\n        this.render()\n        this.refs = createRefs(this)\n        this.slider = this.querySelector('nb-slider-natural')\n        this.eventsListeners = eventsManager(this).createListeners(this.slider)\n        this.scrollObserver.create([\n            {\n                selector: '[data-id]',\n                callback: this.onSectionChange,\n                options: {\n                    threshold: INTERSECTION_RATIOS_SECTION,\n                    rootMargin: '-160px 0px 0px 0px'\n                }\n            }\n        ])\n    }\n\n    render() {\n        this.innerHTML = `${this.renderNavigation()}`\n    }\n\n    getSliderOptions() {\n        return {\n            flex_auto: this.sticky ? 'true' : 'false',\n            gradients_color: this.sticky ? COLOR_WHITE_1000 : undefined,\n            gradients_width: this.sticky ? GRADIENT_WIDTH : undefined,\n            ...SLIDER_CONFIG_DEFAULT\n        }\n    }\n\n    renderNavigation() {\n        const {\n            slider_id,\n            a11y_slider_previous_button,\n            a11y_slider_next_button,\n            a11y_goto_slide = 'Goto slide',\n            campaign\n        } = this.props\n\n        // Pass render function name by element type (Chip/Bubble)\n        const list = this.renderList(`render${this.type}`)\n\n        const sliderOptions = this.getSliderOptions()\n        const sliderData = {\n            options: {\n                mobile: {\n                    items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_MOBILE,\n                    item_width: this.sticky ? 'auto' : BUBBLE_MOBILE_WIDTH,\n                    display_buttons: 'false',\n                    ...sliderOptions\n                },\n                tablet: {\n                    items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_TABLET,\n                    item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n                    display_buttons: 'true',\n                    ...sliderOptions\n                },\n                desktop: {\n                    items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_DESKTOP,\n                    item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n                    ...sliderOptions\n                }\n            },\n            a11y_labels: {\n                prev: a11y_slider_previous_button,\n                next: a11y_slider_next_button,\n                nav: a11y_goto_slide\n            },\n            campaign\n        }\n\n        const slider = `<nb-slider-natural\n            id='${slider_id}'\n            data=\"${stringifyForAttribute(sliderData)}\"\n            data-ref=\"slider${this.type}\">\n            ${list}\n        </nb-slider-natural>`\n\n        if (this.sticky) {\n            return slider\n        }\n\n        return `<nb-container contrast=\"light\">${slider}</nb-container>`\n    }\n\n    renderList(renderFunction) {\n        const { bubbles = [] } = this.props\n\n        const output = bubbles\n            .map(bubble => ({ ...bubble, campaign: this.props.campaign || undefined }))\n            .map(bubble => this[renderFunction](bubble))\n            .join('')\n\n        return output\n    }\n\n    renderBubble(bubble) {\n        let { link, campaign } = bubble\n        if (!link) {\n            return null\n        }\n        const { linkNoHash } = getHashLink(link)\n\n        const bubbleWithCampaign = { ...bubble, campaign }\n\n        return `\n            <li>\n                <nb-bubble data=\"${stringifyForAttribute(\n                    bubbleWithCampaign\n                )}\" data-ref=\"bubbles[${linkNoHash}]\"></nb-bubble>\n            </li>\n        `\n    }\n\n    renderChip(chip) {\n        const { link } = chip\n        if (!link) {\n            return null\n        }\n        const { linkNoHash, linkHash } = getHashLink(link)\n\n        return `\n            <li>\n                <a href=\"${linkHash}\" data-href='${linkNoHash}' class=\"is-link\" tabindex=\"-1\" >\n                    <nb-chip\n                        background_image=\"${chip.visual.src}\"\n                        data-ref=\"chips[${linkNoHash}]\"\n                        rounded=\"false\"\n                        campaign_id=\"${chip.campaign?.id}\"\n                        campaign_name=\"${chip.campaign?.name}\"\n                        campaign_creative=\"${chip.campaign?.creative}\"\n                        campaign_position=\"${chip.campaign?.position}\"\n                    >\n                        ${chip.label}\n                    </nb-chip>\n                </a>\n            </li>\n        `\n    }\n\n    // Called from events-manager.js, coupled code\n    updateLayout() {\n        this.geometry = this.getGeometry()\n    }\n\n    updateBubbles(sectionId) {\n        const { bubbles = {} } = this.refs\n        for (const bubbleId in bubbles) {\n            const bubble = bubbles[bubbleId]\n            const state = bubbleId === sectionId ? 'selected' : 'default'\n            if (typeof bubble.setAttribute === 'function') {\n                bubble.setAttribute('state', state)\n            }\n        }\n    }\n\n    updateChips(sectionId) {\n        const { chips = {} } = this.refs\n        for (const chipId in chips) {\n            const chip = chips[chipId]\n            const isChecked = chipId === sectionId ? 'true' : 'false'\n            chip.setAttribute && chip.setAttribute('checked', isChecked)\n        }\n    }\n\n    async updateSlider(sectionId, _index) {\n        let index = _index\n        const slider = await this.refs.sliderChip\n        if (slider) {\n            if (typeof _index === 'undefined') {\n                const links = slider.querySelectorAll('a[data-href]')\n                links.forEach((link, i) => {\n                    if (link.getAttribute('data-href') === sectionId) {\n                        index = i\n                    }\n                })\n            }\n            if (index && slider && slider.goToSlide) {\n                slider.goToSlide(index)\n            }\n        }\n    }\n\n    emit(event) {\n        dispatchEvent({ element: this, ...event })\n    }\n\n    async scroll(link, index) {\n        this.isScrolling = true\n        const linkHref = link.getAttribute('data-href')\n        const target = linkHref\n        const { header, chips } = this.geometry\n\n        // When clicking on first anchor we force height to 0 because sticky bar is usually not displayed yet\n        const stickyBarHeight = index === 0 ? 0 : chips.height\n\n        const scrollPaddingTop = header.top + header.height + stickyBarHeight\n        const scrollOptions = { scrollPaddingTop }\n\n        await scrollTo(`[data-id=\"${target}\"]`, scrollOptions)\n        this.isScrolling = false\n\n        // After scrolling visually, we need to give focus to the section for keyboard navigation\n        const targetEl = document.querySelector(`[data-id=\"${target}\"]`)\n        targetEl.focus({ preventScroll: true })\n    }\n\n    track() {\n        //no-op as per https://nestle.atlassian.net/browse/DIGEX-12371?focusedCommentId=2903998\n    }\n\n    getGeometry() {\n        const $header = document.querySelector('.Header__top')\n        const $stickyBar = document.querySelector('nb-plp-sticky-bar')\n\n        const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n        const stickyBarRect = $stickyBar?.getBoundingClientRect() || { height: 0, y: 0 }\n\n        return {\n            header: { height: headerRect.height, top: headerRect.y },\n            chips: { height: stickyBarRect.height, top: stickyBarRect.y }\n        }\n    }\n\n    onSectionChange(entries) {\n        const entry = entries[0]\n\n        if (entry.isIntersecting && !this.isScrolling) {\n            const { id = '' } = entry.target.dataset\n\n            dispatchEvent({\n                eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n                args: { sectionId: id || entry.target.getAttribute('data-id') }\n            })\n        }\n    }\n\n    disconnectedCallback() {\n        eventsHelper.remove(this.eventsListeners)\n        this.scrollObserver.destroy('[data-id]')\n    }\n}\n\ncustomElements.get('nb-navigation-bubbles') ||\n    customElements.define('nb-navigation-bubbles', NavigationBubbles)\n\nexport default NavigationBubbles\n","// TODO move the responsabiliy of the links to the correct component\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport { EVENT_HEADER_POSITION_CHANGED, EVENT_SLIDER_READY } from '@kissui/components'\n\nimport { EVENT_NAVIGATION_SECTION_CHANGE } from '../data/constants'\n\nconst eventsManager = rootElement => {\n    const bindSliderLinksEvents = slider => {\n        // We need to wait for EVENT_SLIDER_READY before getting geometry for chips slider to have height\n        rootElement.geometry = rootElement.getGeometry()\n\n        const links = slider.querySelectorAll('a')\n\n        for (const [index, link] of links.entries()) {\n            link.addEventListener('click', onSliderLinkClick.bind(this, index))\n        }\n    }\n\n    const onSliderLinkClick = (index, $event) => {\n        $event.preventDefault()\n\n        const link = $event.target.closest('a')\n\n        if (link) {\n            dispatchEvent({\n                eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n                args: { sectionId: link.getAttribute('data-href'), index }\n            })\n\n            rootElement.scroll && rootElement.scroll(link, index)\n            window.location.hash = link.getAttribute('data-href')\n\n            let finalLabel = '',\n                plpListLabel = '',\n                bubbleLabel = ''\n            if (rootElement.closest('nb-plp-sticky-bar')) {\n                bubbleLabel = link.querySelector('nb-chip label span').textContent\n                plpListLabel = rootElement.props.selected_nav_link_label || ''\n            } else {\n                plpListLabel = rootElement.props.selected_nav_link_label || ''\n                if (link.nextElementSibling.textContent) {\n                    bubbleLabel = link.nextElementSibling.textContent\n                } else {\n                    bubbleLabel = link.getAttribute('aria-label')\n                }\n            }\n            finalLabel = plpListLabel ? `${plpListLabel} : ${bubbleLabel}` : `${bubbleLabel}`\n            rootElement.track(finalLabel)\n        }\n    }\n\n    const onSectionChange = $event => {\n        const { sectionId, index } = readEvent($event)\n\n        rootElement.updateBubbles && rootElement.updateBubbles(sectionId)\n        rootElement.updateChips && rootElement.updateChips(sectionId)\n        rootElement.updateSlider && rootElement.updateSlider(sectionId, index)\n    }\n\n    const createListeners = slider => {\n        const eventListeners = []\n\n        if (slider) {\n            eventListeners.push({\n                element: rootElement,\n                type: EVENT_SLIDER_READY,\n                listener: bindSliderLinksEvents.bind(this, slider),\n                options: { once: true }\n            })\n        }\n        eventListeners.push({\n            element: window,\n            type: EVENT_NAVIGATION_SECTION_CHANGE,\n            listener: onSectionChange\n        })\n        eventListeners.push({\n            element: window,\n            type: EVENT_HEADER_POSITION_CHANGED,\n            listener: rootElement.updateLayout.bind(rootElement)\n        })\n\n        eventsHelper.add(eventListeners)\n\n        return eventListeners\n    }\n\n    return { createListeners }\n}\n\nexport default eventsManager\n","import { getDataLayer } from '@kissui/helpers/src/dataLayer'\n\nexport async function setPLPDataProvider() {\n    window.getPLPData = window.getPLPData || getPLPData\n}\n\nexport async function getPLPData() {\n    return await window.plpData\n}\n\nexport async function market() {\n    return napi.market().read() // eslint-disable-line\n}\n\nexport function getCurrency() {\n    return getDataLayer().currency\n}\n\nexport async function getPriceFormatter() {\n    return napi.priceFormat() // eslint-disable-line\n}\n","const runningExperiments = new Set<string>()\n\nexport function runningExperiment(experiment: string): Boolean {\n    return runningExperiments.has(experiment)\n}\n\nexport function enableExperiment(experiment: string): void {\n    runningExperiments.add(experiment)\n    console.info('Running experiments:', ...runningExperiments.values())\n}\n\nexport function disableExperiment(experiment: string): void {\n    runningExperiments.delete(experiment)\n    console.info('Running experiments:', ...runningExperiments.values())\n}\n\n// List Current experiments\nexport const EXPLICIT_FILTERS = 'EXPLICIT_FILTERS'\n","// MAIN ID BLOCKS\nexport const FILTER_MAIN_BLOCK_ID = 'filtersPLP'\nexport const SORT_MENU_ID = 'plp-sort-menu'\nexport const SORT_MENU_MOBILE_ID = 'plp-sort-menu-mobile'\nexport const POPIN_ID = 'plp-filter-popin'\nexport const NAVIGATION_MAIN_BLOCK_ID = 'navigationPLP'\nexport const PRODUCTS_LIST_MAIN_BLOCK_ID = 'productsListPLP'\nexport const PRODUCTS_RESULTS_MAIN_BLOCK_ID = 'productsResultsPLP'\nexport const PRODUCTS_RESULTS_HEADER_ID = 'productsResultsHeaderPLP'\nexport const FILTER_BUTTON = 'plp-filter-cta'\nexport const CB_RESULTS_TOTAL_ID = 'cb-results-total-id'\nexport const MY_RECOMMENDATIONS_ID = 'my-recommendations'\n\n// URL variable\nexport const QUERY_URL_PARAMETER_FILTERS = 'filters'\nexport const QUERY_URL_PARAMETER_SORT = 'sort'\n","/**\n filtersPLP:\n navigationPLP\n productsListPLP\n productsResultsPLP\n\n data-request: not mutable // not to be changed\n data-response: mutable // changed by the component\n\n\n Don't:\n const dict = {\n  'foo': 1,\n  'bar': 2\n}\n\n Better:\n const dict = new Map([\n ['foo', 1],\n ['bar', 2]\n ])\n\n dict.get('foo');\n dict.set('foo', 2);\n dict.has('baz');\n dict.keys()\n\n */\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getPLPData, getPriceFormatter, market } from '@kissui/plp-data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { MY_RECOMMENDATIONS_ID } from '../config/constants'\n\n// todo cache data if not changes\nconst appData = {\n    _productsFlat: undefined,\n    sessionId: '',\n\n    init: async function (plpType) {\n        window.plpDataType = plpType\n        window.getPLPData = window.getPLPData || getPLPData\n        this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n        this.set('filtersSelected', [])\n        this.set('sortCurrent', {})\n        this.set('sortOptions', [])\n        this.set('options', {})\n\n        return window.getPLPData()\n    },\n\n    async reload() {\n        this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n        this.set('products', [])\n        this.set('filters', [])\n        this.set('filtersSelected', [])\n        this.set('options', {})\n\n        this._productsFlat = undefined\n\n        return window.getPLPData()\n    },\n\n    // review if this pattern about set & get it's ok (I don't think so, because should be unmutable)\n    set: function (key, value) {\n        this[key] = value\n    },\n    get: function (key) {\n        return this[key] || null\n    },\n    initPriceFormatter: function () {\n        return getPriceFormatter()\n    },\n    initCurrency: function () {\n        return market()\n    },\n    filters: [],\n    products: [],\n    productsList: function () {\n        return this.products\n    },\n\n    getProducts() {\n        if (this._productsFlat && this._productsFlat.length) {\n            return this._productsFlat\n        }\n\n        this._productsFlat = this.products.reduce((acc, product) => {\n            return acc.concat(product.products)\n        }, [])\n\n        return this._productsFlat\n    },\n\n    productsListFiltered: function ({ withSort = true } = {}) {\n        const selectedFilters = this.get('filtersSelected')\n        const filterPredicate = runningExperiment(EXPLICIT_FILTERS)\n            ? filterProductsByFilterType(selectedFilters)\n            : filterProductsByAllFilters(selectedFilters)\n        const filteredList = this.getProducts().filter(filterPredicate)\n        const sortCurrent = this.get('sortCurrent') ?? {}\n\n        return withSort ? sortProducts(filteredList, sortCurrent) : filteredList\n    },\n    productsFilteredCount: function () {\n        return this.productsListFiltered({ withSort: false }).length\n    },\n    /*\n     * todo: refactor this function\n     * fireAll should be true always, it's only true to performance improvement\n     * the solution should be in the subscription site, right now we are subscribe to all changes,\n     * but this is wrong should be subscribed only to some changes of the store using a seed/key\n     * */\n    filtersUpdate: function (filterSelection, fireAll = true) {\n        const filter = this.get('filters').find(f => f.key === filterSelection.key)\n\n        if (!filter) {\n            return\n        }\n\n        setFilterValue(\n            this.get('filtersSelected'),\n            filter,\n            filterSelection.value,\n            filterSelection.selected\n        )\n\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            this.filterChipsUpdate()\n        }\n\n        fireAll && this.fire()\n    },\n    filtersUpdateMultiple(key, valueSelections = Map()) {\n        const filter = this.get('filters').find(f => f.key === key)\n        const filtersSelected = this.get('filtersSelected')\n\n        valueSelections.forEach((selected, value) => {\n            const selectedCurrently = filtersSelected.find(\n                f => f.key === filter.key && filterValueIsEqual(f, value)\n            )\n\n            if (selectedCurrently && selected) return\n            setFilterValue(filtersSelected, filter, value, selected)\n        })\n\n        this.filterChipsUpdate()\n        this.fire()\n    },\n    filtersSelectedWithLabel: function () {\n        return this.get('filtersSelected').map(filter => {\n            const { key: filterKey, value: filterValue } = filter\n            const foundFilter = this.get('filters').find(f => f.key === filterKey)\n            const filterLabel = foundFilter?.values.find(v => v.value === filterValue)?.label\n            return {\n                categoryTitle: foundFilter?.title,\n                label: filterLabel,\n                key: filterKey,\n                value: filterValue\n            }\n        })\n    },\n    filtersSelectedCount: function () {\n        return this.get('filtersSelected')?.length ?? 0\n    },\n    // todo modify this flow because the serilized attributes shouldn't be necessary\n    filtersSelectedSerialized: function () {\n        const filters = [this.get('sortCurrent'), ...this.get('filtersSelected')]\n        return stringifyForAttribute(filters)\n    },\n    filtersReset: function () {\n        this.set('filtersSelected', [])\n        this.get('filters').forEach(filter => {\n            filter.values.forEach(value => {\n                value.selected = false\n                value.disabled = false\n            })\n        })\n        const sortCurrent = this.get('sortOptions')\n        sortCurrent?.length && this.set('sortCurrent', sortCurrent[0])\n\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            this.filterChipsUpdate()\n        }\n\n        this.fire()\n    },\n    filterChipsUpdate() {\n        const selectedFilters = this.get('filtersSelected')\n        const productsList = this.getProducts()\n        this.get('filters').forEach(filter => {\n            filter.values.forEach(filterChip => {\n                // hide product counts\n                filterChip.productCount = null\n\n                // maintain filter's presence when other filters in same group are selected\n                const withoutGroup = selectedFilters.filter(\n                    selected => selected.key !== filterChip.filterKey\n                )\n                const onlyFilterInGroup = [...withoutGroup, filterChip]\n                const predicate = filterProductsByFilterType(onlyFilterInGroup)\n                filterChip.disabled = !productsList.find(predicate)\n            })\n        })\n    },\n\n    observers: [],\n    subscribe: function (fn) {\n        this.observers.push(fn)\n    },\n    unsubscribe: function (fnToRemove) {\n        this.observers = this.observers.filter(fn => {\n            if (fn !== fnToRemove) {\n                return fn\n            }\n        })\n    },\n    fire: function () {\n        this.observers.forEach(fn => {\n            fn.call()\n        })\n    }\n}\n\nexport default appData\n\nfunction doesProductMatchFilter(product, filter) {\n    const filterValue = filter.value\n    const productPropValue = product[filter.filterKey || filter.key]\n    switch (typeof productPropValue) {\n        case 'string':\n            return productPropValue === filterValue\n        case 'number':\n            return JSON.parse(`[${filterValue}]`).includes(productPropValue)\n        default: {\n            if (filterValue === MY_RECOMMENDATIONS_ID) {\n                const recommendationProducts = appData.get('recommendation')?.products ?? []\n                return recommendationProducts.some(p => p.id === product.id)\n            }\n\n            // check array values or\n            // default to false for nullish values\n            return productPropValue?.includes(filterValue) || false\n        }\n    }\n}\n\nfunction groupFiltersByType(filters = []) {\n    /*\n        group selected filters by key, e.g.\n        {\n            intensity: [1, 2, 3],\n            collection: [a, b, c],\n        }\n    */\n    return filters.reduce((all, filter) => {\n        const filterKey = filter.key\n        const current = all[filterKey] || []\n        return {\n            ...all,\n            [filterKey]: [...current, filter]\n        }\n    }, {})\n}\n\nfunction filterProductsByFilterType(filters) {\n    const groups = groupFiltersByType(filters)\n    const types = Object.keys(groups)\n    return (product, index, products) => {\n        /*\n            does product match at least one filter in each group, e.g.\n            {\n                intensity: [1, 2, 3],\n                collection: [a, b, c],\n            }\n            matches\n            {\n                product: { intensity: 1 },\n                product: { collection: a },\n            }\n        */\n        return types.every(type => {\n            return !!groups[type].find(filter => {\n                return (\n                    doesProductMatchFilter(product, filter) &&\n                    products.findIndex(p => p.id === product.id) === index // Deduplicates\n                )\n            })\n        })\n    }\n}\n\nfunction filterProductsByAllFilters(filters = []) {\n    return (product, index, products) => {\n        return (\n            // check that the product matches every filter selected\n            filters.every(filter => {\n                return doesProductMatchFilter(product, filter)\n            }) && products.findIndex(p => p.id === product.id) === index // Deduplicates\n        )\n    }\n}\n\nfunction filterValueIsEqual(filterValue, value) {\n    return Array.isArray(filterValue.value)\n        ? filterValue.value.join(',') === value\n        : filterValue.value === value\n}\n\nfunction setFilterValue(filtersSelected, filter, value, selected) {\n    filter.values.forEach(filterValue => {\n        // todo refactor this function\n        let valueIsEqual = filterValueIsEqual(filterValue, value)\n        if (!valueIsEqual) {\n            return\n        }\n\n        filterValue.selected = selected\n        if (selected) {\n            filtersSelected.push({\n                key: filter.key,\n                value: value,\n                color: filterValue.color || null\n            })\n        } else {\n            filtersSelected.splice(\n                0,\n                filtersSelected.length,\n                ...filtersSelected.filter(\n                    fSelected => !(fSelected.key === filter.key && fSelected.value === value)\n                )\n            )\n        }\n    })\n}\n\nfunction createSorter({ key, order }) {\n    const isAscending = order === 'asc'\n\n    return (a, b) => {\n        if (a[key] < b[key]) {\n            return isAscending ? -1 : 1\n        }\n        if (a[key] > b[key]) {\n            return isAscending ? 1 : -1\n        }\n        return 0\n    }\n}\n\nfunction sortProducts(products, { key, order }) {\n    const sorter = createSorter({ key, order })\n    return [\n        ...products.filter(p => p.inStock).sort(sorter),\n        ...products.filter(p => !p.inStock).sort(sorter)\n    ]\n}\n","import { customEvent } from '@kissui/helpers/src/gtmEvents'\nimport zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { FILTER_MAIN_BLOCK_ID } from '../config/constants'\nimport appData from './plp.data'\n\nconst updateQueryStringParameter = (uri, key, value) => {\n    const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i')\n    const separator = uri.indexOf('?') !== -1 ? '&' : '?'\n    return uri.match(re)\n        ? uri.replace(re, '$1' + key + '=' + value + '$2')\n        : uri + separator + key + '=' + value\n}\n\nexport const updateUrlVariable = (variable, queryArray) => {\n    // we are removing the hash from the url\n    const [path] = window.location.href.split('#')\n    const value = encodeURIComponent(JSON.stringify(queryArray))\n    const url = updateQueryStringParameter(path, variable, value)\n    history.pushState(null, null, url)\n}\n\nexport const getUrlVariable = key => {\n    const queryString = window.location.search\n    const param = new URLSearchParams(queryString).get(key)\n\n    if (!param) {\n        return null\n    }\n\n    try {\n        return JSON.parse(decodeURIComponent(param))\n    } catch (err) {\n        console.error('plp.actions-getUrlVariable: url parsing failed')\n        return null\n    }\n}\n\nconst defaultTracking = 'none selected'\n\nconst getSortTracking = data => {\n    const { isSorted, sortKey, sortOrder } = data\n    return `sort:${isSorted ? `${sortOrder}|${sortKey}` : defaultTracking}`\n}\n\nconst getFilterTracking = data => {\n    const { isFiltered, filtersSelected } = data\n    return `characteristics:${\n        isFiltered\n            ? // unique array of filter keys\n              [...new Set(filtersSelected.map(filter => filter.key))].join(',')\n            : defaultTracking\n    }`\n}\n\nexport const trackInteraction = (data = {}) => {\n    const { isSorted, isFiltered } = data\n    const eventAction = 'PLP Filter click'\n\n    if (!isSorted && !isFiltered) {\n        customEvent({\n            eventAction,\n            eventLabel: defaultTracking\n        })\n        return\n    }\n\n    customEvent({\n        eventAction,\n        eventLabel: [getSortTracking(data), getFilterTracking(data)].join('|')\n    })\n}\n\nexport const trackLoad = () => {\n    const campaign = appData.get('campaign')\n    const node = window.document.getElementById(FILTER_MAIN_BLOCK_ID)\n    if (campaign) {\n        zoneTracking(node, campaign)\n    }\n}\n\nexport const cleanFilterDataXSS = (source, data) => {\n    const cleanData = []\n    data.forEach(item => {\n        source.forEach(sourceItem => {\n            if (sourceItem.key === item.key) {\n                sourceItem.values.forEach(value => {\n                    if (item.value === value.value) {\n                        cleanData.push({\n                            key: sourceItem.key,\n                            value: value.value,\n                            selected: true\n                        })\n                    }\n                })\n            }\n        })\n    })\n\n    return cleanData\n}\nexport const cleanSortDataXSS = (source, data) => {\n    return [...source].filter(item => item.key === data.key && item.order === data.order)\n}\n","import { signal } from '@preact/signals'\nimport type { ModuleData } from './CremaService'\n\ntype ModuleName = 'ProductsList' | 'ProductDetails' | 'HeaderNavigation'\n\ntype PageStore = {\n    [key: string]: string | undefined\n    pageHtml?: string\n}\n\ntype SignalStore = {\n    ProductsList: ModuleData\n    ProductDetails: ModuleData\n    HeaderNavigation: ModuleData\n}\n\ntype WindowCreamService = {\n    pageStores: Map<string, PageStore>\n    signalStore: SignalStore\n}\n\ndeclare global {\n    interface Window {\n        __crema_service__: WindowCreamService\n    }\n}\n\n// Stored on window to allow sharing between page builder sections\n// Ideally this would be replaced by loading this service as a shared bundle in future\nwindow.__crema_service__ = window.__crema_service__ || {\n    pageStores: new Map<string, PageStore>(),\n    signalStore: {\n        ProductsList: signal(undefined),\n        ProductDetails: signal(undefined),\n        HeaderNavigation: signal(undefined)\n    }\n}\n\nconst pageStores = window.__crema_service__.pageStores\nconst signalStore = window.__crema_service__.signalStore\n\nexport function clear() {\n    pageStores.clear()\n    signalStore.ProductsList.value = undefined\n    signalStore.ProductDetails.value = undefined\n    signalStore.HeaderNavigation.value = undefined\n}\n\nexport function getPageHtml(url: string): string | undefined {\n    const store = getStore(url)\n    return store.pageHtml\n}\n\nexport function setPageHtml(url: string, html: string): void {\n    const store = getStore(url)\n    store.pageHtml = html\n}\n\nexport function getModuleData(moduleName: ModuleName): ModuleData {\n    return signalStore[moduleName]\n}\n\nexport function setModuleData(moduleName: ModuleName, data: object | undefined): void {\n    signalStore[moduleName].value = data\n}\n\nfunction getStore(url: string): PageStore {\n    if (!pageStores.has(url)) {\n        pageStores.set(url, {})\n    }\n\n    return pageStores.get(url) as PageStore\n}\n","import { Signal, batch } from '@preact/signals'\n\nimport * as store from './Store'\n\nconst parser = new DOMParser()\n\nexport type ModuleData<T = any> = Signal<Record<PropertyKey, T> | undefined>\n\nexport type HeaderNavigationMenuItem = {\n    title: string,\n    link: {\n        url: string\n    }\n}\n\nexport async function loadFromUrl(url: string, cacheOnly: boolean = false): Promise<void> {\n    return batch(async () => {\n        let html = store.getPageHtml(url)\n\n        if (!html) {\n            try {\n                html = await fetchHtml(url)\n                store.setPageHtml(url, html)\n            } catch (error) {\n                console.debug('Failed to load HTML', error)\n                return\n            }\n        }\n\n        if (!cacheOnly) {\n            store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n            store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n            store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n        }\n    })\n}\n\nexport function loadFromPage(window: Window): void {\n    batch(() => {\n        const html = window.document.documentElement.innerHTML\n\n        store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n        store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n        store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n\n        // Only cache if we found either the PLP data or the PDP data\n        if (\n            store.getModuleData('HeaderNavigation').value &&\n            (store.getModuleData('ProductsList').value ||\n                store.getModuleData('ProductDetails').value)\n        ) {\n            store.setPageHtml(window.location.href, html)\n        }\n    })\n}\n\nexport function getProductsList(): ModuleData {\n    return store.getModuleData('ProductsList')\n}\n\nexport function getProductDetails(): ModuleData {\n    return store.getModuleData('ProductDetails')\n}\n\nexport function getHeaderNavigation(): ModuleData {\n    return store.getModuleData('HeaderNavigation')\n}\n\nfunction parseModuleData(html: string, moduleName: string): ModuleData | undefined {\n    try {\n        const moduleScript = parseHtml(html, moduleName)\n        return parseProductScript(moduleScript) as ModuleData\n    } catch (error) {\n        // Failed to parse module, but this could be expected if the module is not present\n        return undefined\n    }\n}\n\nasync function fetchHtml(url: string): Promise<string> {\n    console.debug('Fetching HTML from', url)\n    const response = await fetch(url)\n\n    if (!response.ok) {\n        throw new Error(`Failed to fetch from \"${url}\" - ${response.status}:${response.statusText}`)\n    }\n\n    const html = await response.text()\n\n    return html\n}\n\nfunction parseHtml(html: string, moduleName: string): string {\n    const document = parser.parseFromString(html, 'text/html')\n\n    const scripts = document.querySelectorAll('script')\n    for (const script of scripts) {\n        const content = script.textContent ?? ''\n        if (content.includes(`\"module\":\"${moduleName}\"`)) return content\n    }\n\n    throw new Error(`Failed to find module \"${moduleName}\"`)\n}\n\nfunction parseProductScript(script: string): object {\n    const lines = script.split('\\n')\n    for (const line of lines) {\n        const trimmed = line.trim()\n        if (trimmed.startsWith('window.ui.push(')) {\n            const jsonString = trimmed.replace('window.ui.push(', '').slice(0, -2)\n            return JSON.parse(jsonString)\n        }\n    }\n\n    throw new Error('Failed to find UI data in script')\n}\n","import appData from './plp.data'\nimport {\n    updateUrlVariable,\n    getUrlVariable,\n    trackInteraction,\n    cleanFilterDataXSS,\n    cleanSortDataXSS,\n    trackLoad\n} from './plp.actions'\nimport { QUERY_URL_PARAMETER_FILTERS, QUERY_URL_PARAMETER_SORT } from '../config/constants'\nimport { getTrackingData } from '../helpers/tracking'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { loadFromUrl, getProductsList, loadFromPage } from '@kissui/crema-service'\nimport { filterActionEvent, filterTrackingFromPlpFilters } from '@kissui/helpers/src/gtmEvents'\n\n// todo find a better way to do this\nlet plpData = {}\nlet appStates = {}\n// one solution is make promise inside of promise\nconst isSorted = data => {\n    return (\n        data.get('sortCurrent').key !== data.get('sortOptions')[0].key ||\n        data.get('sortCurrent').order !== data.get('sortOptions')[0].order\n    )\n}\n\nconst isFiltered = data => data.filtersSelectedCount() !== 0\n\nexport default {\n    onload: {\n        process: function (e, handlePostEvent) {\n            const { plpType, appStatesHandler } = e.detail.value\n\n            appStates = appStatesHandler\n\n            // initialize the store\n            const init = appData.init(plpType)\n            appData.set('plpType', plpType || null)\n            appData.set('innerWidth', window.innerWidth)\n            appData.set('innerHeight', window.innerHeight)\n\n            // get market data\n            const currency = appData.initCurrency()\n            const priceFormatter = appData.initPriceFormatter()\n\n            Promise.all([init, currency, priceFormatter])\n                .then(values => {\n                    plpData = values[0]\n                    appData.set('currency', values[1].currency)\n                    appData.set('priceFormatter', values[2])\n                    handlePostEvent(new CustomEvent('onloadSuccess'))\n                })\n                .catch(err => {\n                    console.error(err)\n                    handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n                })\n\n            if (runningExperiment(EXPLICIT_FILTERS)) {\n                loadFromPage(window)\n            }\n        }\n    },\n    onReload: {\n        async process(e, handlePostEvent) {\n            const { plpType, url } = e.detail.value\n\n            let data\n            try {\n                await loadFromUrl(url)\n                data = getProductsList().value\n            } catch (err) {\n                console.error(err)\n                return handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n            }\n\n            window.plpData = Promise.resolve({\n                techno: 'unknown', // Only used by mocks?\n                data\n            })\n\n            simulatePageChange(url)\n\n            try {\n                // Reinitialize the store\n                const [_data, currency, priceFormatter] = await Promise.all([\n                    appData.reload(plpType),\n                    appData.initCurrency(),\n                    appData.initPriceFormatter()\n                ])\n                plpData = _data // NOTE: Getting this from the appData is rather redundant\n                appData.set('plpType', plpType || null)\n                appData.set('innerWidth', window.innerWidth)\n                appData.set('innerHeight', window.innerHeight)\n                appData.set('currency', currency.currency)\n                appData.set('priceFormatter', priceFormatter)\n                handlePostEvent(new CustomEvent('onloadSuccess'))\n                appData.fire()\n            } catch (error) {\n                console.error(error)\n                handlePostEvent(new CustomEvent('onloadError', { detail: { error } }))\n            }\n        }\n    },\n    onloadSuccess: {\n        nextState: function (e) {\n            return appStates.onloadSuccess(e)\n        }\n    },\n    onloadError: {\n        nextState: function (e) {\n            return appStates.showError(e)\n        }\n    },\n    onMergeData: {\n        // triggered from plp.app.js\n        async process(e, handlePostEvent) {\n            const {\n                filtersService,\n                productService,\n                dataSortService,\n                pageBuilderProps,\n                recommendationService\n            } = e.detail.value\n\n            const recommendationInstance = recommendationService(pageBuilderProps)\n            const dataToMerge = productService(\n                plpData,\n                pageBuilderProps,\n                recommendationInstance?.recommendation\n            )\n\n            mergeData(dataToMerge)\n\n            // Here we merge the data in a lazy way, the first interation is the\n            // half-recommended data, missing the loading of products, which, since\n            // it comes from Martech, may take longer than the rest. Then, in order\n            // not to block the rest, while the spinner is displayed, the mergeData\n            // is loaded and processed again.\n            if (recommendationInstance?.readyToLoadProducts?.()) {\n                await recommendationInstance.loadProducts()\n                const newData = productService(\n                    plpData,\n                    pageBuilderProps,\n                    recommendationInstance?.recommendation\n                )\n                appData.set('recommendation', recommendationInstance.recommendation)\n                mergeData(newData)\n                appData.fire()\n            }\n\n            function mergeData(data = {}) {\n                mergeProductData(data, pageBuilderProps)\n                mergeFilters(data, { pageBuilderProps, dataSortService, filtersService })\n                setUrlOverrides()\n                handleExperiments()\n                trackLoad(pageBuilderProps)\n                handlePostEvent(new CustomEvent('switchProductsPage'))\n            }\n        }\n    },\n    switchProductsPage: {\n        nextState: function (e) {\n            if (isSorted(appData) || isFiltered(appData)) {\n                return appStates.readyForShowResults(e)\n            } else {\n                return appStates.readyForPlay(e)\n            }\n        }\n    },\n    onMergeDataError: {\n        nextState: function (e) {\n            return appStates.showError(e)\n        }\n    },\n    onFilter: {\n        process: (e, handlePostEvent) => {\n            const filtersSelected = appData.get('filtersSelected')\n\n            updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n            updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n                key: appData.get('sortCurrent').key,\n                order: appData.get('sortCurrent').order\n            })\n\n            handlePostEvent(new CustomEvent('switchProductsPage'))\n\n            // condition check to not send empty filter list, clear event is handled in different place\n            if (runningExperiment(EXPLICIT_FILTERS) && filtersSelected.length) {\n                filterActionEvent(\n                    'filter apply',\n                    ...filterTrackingFromPlpFilters(filtersSelected),\n                    null,\n                    e.detail.value\n                )\n            }\n        }\n    },\n    onSort: {\n        process: (e, handlePostEvent) => {\n            updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n            updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n                key: appData.get('sortCurrent').key,\n                order: appData.get('sortCurrent').order\n            })\n\n            handlePostEvent(new CustomEvent('switchProductsPage'))\n\n            trackInteraction({\n                isSorted: isSorted(appData),\n                isFiltered: isFiltered(appData),\n                sortKey: appData.get('sortCurrent').key,\n                sortOrder: appData.get('sortCurrent').order,\n                filtersSelected: appData.get('filtersSelected')\n            })\n        }\n    },\n    onloadFilter: {\n        process: function (e, handlePostEvent) {\n            handlePostEvent(new CustomEvent('onloadFilterSuccess', { detail: { e } }))\n            // handlePostEvent(new CustomEvent('onloadFilterError'))\n        }\n    },\n    onloadFilterSuccess: {\n        nextState: function (e) {\n            return appStates.readyForFilter(e)\n        }\n    },\n    onloadFilterError: {\n        nextState: function (e) {\n            return appStates.showError(e)\n        }\n    }\n}\n\nfunction simulatePageChange(url) {\n    try {\n        const urlObj = new URL(window.location)\n        urlObj.pathname = url\n        window.history.pushState({}, '', urlObj)\n        // TODO: Most likely need to trigger the matching tracking call for a page load\n    } catch (error) {\n        console.error('Failed to simulate page change', error)\n    }\n}\n\nfunction mergeProductData(data, pageBuilderProps) {\n    appData.set('enabledTechnologies', data.enabledTechnologies)\n    appData.set(\n        'currentTechnology',\n        data.enabledTechnologies\n            ?.filter(tech => tech.isSelected)[0]\n            ?.id?.split('/')\n            .at(-1) ?? null\n    )\n\n    appData.set('products', data.categories)\n    appData.set('translations', data.translations)\n    appData.set('nav_links', data.nav_links)\n    appData.set('bubbles', data.bubbles)\n    appData.set('hide_sort_and_filter', pageBuilderProps.options?.hide_sort_and_filter)\n    appData.set('options', pageBuilderProps.options)\n    appData.set('maxIntensity', data.maxIntensity)\n    appData.set('campaign', getTrackingData(pageBuilderProps))\n}\n\nfunction mergeFilters(data, { pageBuilderProps, dataSortService, filtersService }) {\n    const sort = dataSortService(pageBuilderProps)\n    const filters = filtersService(\n        appData.get('products'),\n        pageBuilderProps,\n        data.categoriesExtraData,\n        data.translations,\n        {\n            priceFormatter: appData.get('priceFormatter'),\n            currency: appData.get('currency')\n        }\n    )\n\n    appData.set('filters', filters)\n    appData.set('sortOptions', sort)\n    appData.set('sortCurrent', sort[0])\n}\n\nfunction setUrlOverrides() {\n    const urlFilters = getUrlVariable(QUERY_URL_PARAMETER_FILTERS)\n    if (urlFilters && urlFilters.length > 0) {\n        const filterData = cleanFilterDataXSS(appData.get('filters'), urlFilters)\n        if (filterData.length > 0) {\n            filterData.forEach((filter, index) => {\n                const isLast = index === filterData.length - 1\n                appData.filtersUpdate(filter, isLast)\n            })\n        }\n    }\n\n    const urlSort = getUrlVariable(QUERY_URL_PARAMETER_SORT)\n    if (urlSort) {\n        const sortData = cleanSortDataXSS(appData.get('sortOptions'), urlSort)\n        if (sortData.length > 0) {\n            appData.set('sortCurrent', sortData[0])\n        }\n    }\n}\n\nfunction handleExperiments() {\n    if (runningExperiment(EXPLICIT_FILTERS)) {\n        appData.filterChipsUpdate()\n\n        const notCurrentTech = appData\n            .get('enabledTechnologies')\n            .find(tech => tech.url !== window.location.pathname)\n        if (notCurrentTech) {\n            loadFromUrl(notCurrentTech.url, true)\n        }\n    }\n}\n","export function getTrackingData(pageBuilderProps) {\n    // Backward compatibility for when data was at root of object\n    const {\n        campaign_id,\n        campaign_name,\n        campaign_creative = null,\n        campaign_position\n    } = pageBuilderProps\n\n    if (!campaign_creative) {\n        const { campaign = null } = pageBuilderProps\n        return campaign\n    }\n\n    return {\n        id: campaign_id,\n        name: campaign_name,\n        position: campaign_position,\n        creative: campaign_creative\n    }\n}\n","import appEvents from './plp.events'\n\nexport default (customEventName, eventData, eventFn = null) => {\n    stateTransitionsManager(\n        new CustomEvent(customEventName, {\n            detail: {\n                value: eventData,\n                fn: eventFn\n            }\n        })\n    )\n}\n\nconst stateTransitionsManager = event => {\n    appEvents[event.type]?.process(event, handlePostEvent)\n}\n\nconst handlePostEvent = e => {\n    appEvents[e.type]?.nextState(e)\n}\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.mobileDropDown.scss'\nimport appData from '../../../store/plp.data'\nimport { SORT_MENU_MOBILE_ID, SORT_MENU_ID } from '../../../config/constants'\nimport { escapeHtml } from '@kissui/helpers/src/utils'\n\nclass PlpFilterPopinMobileDropdown extends NespressoElement {\n    #SORT_MENU_ID = SORT_MENU_MOBILE_ID\n\n    constructor() {\n        super()\n        this.formatSortSeparator = '::'\n        appData.subscribe(this.componentUpdated.bind(this))\n        this.boundOnSortChange = this.onSortChange.bind(this)\n    }\n\n    onStart() {\n        const data = document.getElementById(SORT_MENU_ID)?.getAttribute('data')\n        if (data) {\n            this.template = `\n                <nb-dropdown\n                    id=\"${this.#SORT_MENU_ID}\"\n                    data-testId=\"plp-sort-menu-mobile\"\n                    data=\"${escapeHtml(data)}\"></nb-dropdown>`\n        }\n    }\n\n    onReady() {\n        this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n        this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n    }\n\n    componentUpdated() {\n        const { key, order } = appData.get('sortCurrent')\n        this.sortButton?.setSelected(`${key}${this.formatSortSeparator}${order}`)\n    }\n\n    onSortChange(e) {\n        const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n        appData.set('sortCurrent', { key, order })\n    }\n\n    onDestroy() {\n        this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n        appData.unsubscribe(this.componentUpdated)\n    }\n}\n\ncustomElements.get('plp-filter-sort-mobile') ||\n    customElements.define('plp-filter-sort-mobile', PlpFilterPopinMobileDropdown)\n\nexport default PlpFilterPopinMobileDropdown\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.content.scss'\nimport '../plp.filterImports'\nimport appData from '../../../store/plp.data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../../config/experiments'\n\nclass PlpFilterPopinContent extends NespressoElement {\n    #filters = []\n\n    constructor() {\n        super()\n        appData.subscribe(this.onStoreChanges.bind(this))\n    }\n\n    onStoreChanges() {\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            // Force re-init if the filters have changed\n            if (this.#filters !== appData.get('filters')) {\n                this.onStart()\n                this.render(true)\n                this.onReady()\n            }\n        }\n\n        this.querySelectorAll('nb-chip').forEach(chip => {\n            chip.setAttribute(\n                'disabled',\n                '' + this.isDisabled(chip.dataset.filterKey, chip.dataset.filterValue)\n            )\n            chip.setAttribute(\n                'checked',\n                '' + this.isChecked(chip.dataset.filterKey, chip.dataset.filterValue)\n            )\n\n            if (runningExperiment(EXPLICIT_FILTERS)) {\n                const labelEl = chip.querySelector('label span')\n                const label = this.getLabel(chip.dataset.filterKey, chip.dataset.filterValue)\n                labelEl.textContent = label\n                labelEl.setAttribute('phantom', label)\n            }\n        })\n    }\n\n    onStart() {\n        this.#filters = appData.get('filters')\n\n        this.template =\n            this.#filters\n                ?.map(filter => {\n                    return `${filter.renderBefore()}\n                ${filter.values\n                    .map(value => {\n                        value.disabled = this.isDisabled(filter.key, value.value)\n                        return value.render()\n                    })\n                    .join('')}\n            ${filter.renderAfter()}`\n                })\n                .join('') ?? ''\n    }\n\n    onReady() {\n        this.querySelectorAll('nb-chip').forEach(chip => {\n            chip.addEventListener('change', this.handleChipEvent)\n        })\n    }\n\n    isDisabled = (type, value) =>\n        appData.productsListFiltered({ withSort: false }).filter(product => {\n            if (!product[type]) {\n                return false\n            }\n            if (typeof product[type] === 'string') {\n                return product[type] === value\n            } else if (typeof product[type] === 'number' && typeof value === 'number') {\n                return value === product[type]\n            } else if (typeof product[type] === 'number') {\n                return JSON.parse('[' + value + ']').includes(product[type])\n            } else {\n                return !!product[type].includes(value)\n            }\n        }).length === 0\n\n    isChecked = (key, value) =>\n        appData\n            .get('filtersSelected')\n            .filter(fSelected => fSelected.key === key && fSelected.value === value).length > 0\n\n    getLabel(key, value) {\n        let filterValue\n        appData.get('filters').some(item => {\n            if (item.key !== key) {\n                return false\n            }\n            filterValue = item.values.find(itemValue => {\n                if (typeof itemValue.value === 'string') {\n                    return itemValue.value === value\n                } else if (typeof itemValue.value === 'number' && typeof value === 'number') {\n                    return value === itemValue.value\n                } else if (typeof itemValue.value === 'number') {\n                    return JSON.parse('[' + value + ']').includes(itemValue.value)\n                } else {\n                    return !!itemValue.value.includes(value)\n                }\n            })\n            if (filterValue) {\n                return true\n            }\n        })\n\n        const count = filterValue?.productCount ? ` (${filterValue.productCount})` : ''\n        return `${filterValue.label}${count}`\n    }\n\n    onDestroy() {\n        appData.unsubscribe(this.onStoreChanges)\n\n        this.querySelectorAll('nb-chip').forEach(chip => {\n            chip.removeEventListener('change', this.handleChipEvent)\n        })\n    }\n\n    handleChipEvent(e) {\n        e.stopPropagation()\n\n        const filter = {\n            key: e.target.parentNode.dataset.filterKey,\n            value: e.target.parentNode.dataset.filterValue,\n            selected: e.target.checked, // todo only works for checkbox\n            label: e.target.parentNode.dataset.filterLabel\n        }\n\n        appData.filtersUpdate(filter)\n    }\n}\n\ncustomElements.get('plp-filter-popin-content') ||\n    customElements.define('plp-filter-popin-content', PlpFilterPopinContent)\n\nexport default PlpFilterPopinContent\n","import { EVENT_POPIN_CLOSE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.footer.scss'\nimport appData from '../../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst CATEGORY_IDENTIFIER = '/cat/'\n\nclass PlpFilterPopinFooter extends NespressoElement {\n    constructor() {\n        super()\n        appData.subscribe(this.componentUpdated.bind(this))\n    }\n\n    onStart() {\n        const translations = appData.translations\n        const { a11y_see_result_number_label } = this.props\n        this.template = `\n            <nb-link\n                class=\"nb-filter-popin-reset-all\"\n                size=\"large\"\n                color=\"black\"\n                style=\"visibility: hidden\"\n            >\n                ${translations['productlistrespblock.resetfilters.label']}\n            </nb-link>\n            <nb-cta\n                class=\"nb-filter-popin-see-results\"\n                variation=\"secondary\"\n                style=\"visibility: hidden\"\n                aria_label_after=\"${a11y_see_result_number_label}\"\n            >\n            </nb-cta>\n        `\n    }\n\n    getA11ySeeResultsText() {\n        const { see_result_number_label, see_result_number_label_one } = this.props\n        const productsFilteredCount = appData.productsFilteredCount()\n        const label =\n            productsFilteredCount === 1 ? see_result_number_label_one : see_result_number_label\n        return label?.replace('{resultsLength}', '' + productsFilteredCount)\n    }\n\n    onReady() {\n        this.componentUpdated()\n        this.querySelector('.nb-filter-popin-reset-all')?.addEventListener('click', () => {\n            const filtersTracking = this.filtersTracking()\n            customEvent({\n                event_GA4: true,\n                event: 'plp_filter',\n                action_type: 'filter clear',\n                filter_type: filtersTracking.types,\n                filter_values: filtersTracking.values\n            })\n            appData.filtersReset()\n            this.setAttribute('data-refresh', 'true')\n        })\n        this.querySelector('.nb-filter-popin-see-results')?.addEventListener('click', () => {\n            window.dispatchEvent(new CustomEvent(EVENT_POPIN_CLOSE))\n            const filtersTracking = this.filtersTracking()\n            customEvent({\n                event_GA4: true,\n                event: 'plp_filter',\n                action_type: 'filter apply',\n                filter_type: filtersTracking.types,\n                filter_values: filtersTracking.values\n            })\n        })\n    }\n\n    filtersTracking() {\n        let types = []\n        let values = []\n        const filtersSelected = appData.get('filtersSelected')\n        if (filtersSelected && filtersSelected.length) {\n            for (let i = 0; i < filtersSelected.length; i++) {\n                const filter = filtersSelected[i]\n                const value =\n                    filter.value.indexOf(CATEGORY_IDENTIFIER) > -1\n                        ? filter.value.substring(\n                              filter.value.indexOf(CATEGORY_IDENTIFIER) + CATEGORY_IDENTIFIER.length\n                          )\n                        : filter.value\n                if (types.indexOf(filter.key) > -1) {\n                    values[types.indexOf(filter.key)] += ',' + value\n                } else {\n                    types.push(filter.key)\n                    values.push(value)\n                }\n            }\n        }\n\n        return {\n            types: types.join('|'),\n            values: values.join('|')\n        }\n    }\n\n    componentUpdated() {\n        const productsFilteredCount = appData.productsFilteredCount()\n        const filtersSelectedCount = appData.filtersSelectedCount()\n\n        const btnReset = this.querySelector('.nb-filter-popin-reset-all')\n        const btnResult = this.querySelector('.nb-filter-popin-see-results')\n\n        btnReset.style.visibility =\n            filtersSelectedCount && filtersSelectedCount > 0 ? 'visible' : 'hidden'\n        btnResult.style.visibility =\n            productsFilteredCount && productsFilteredCount > 0 ? 'visible' : 'hidden'\n\n        btnResult.querySelector('span').textContent = this.getA11ySeeResultsText()\n        btnResult.querySelector('button').setAttribute('aria-label', this.getA11ySeeResultsText())\n    }\n\n    onDestroy() {\n        appData.unsubscribe(this.onStoreChanges)\n    }\n}\n\ncustomElements.get('plp-filter-popin-footer') ||\n    customElements.define('plp-filter-popin-footer', PlpFilterPopinFooter)\n\nexport default PlpFilterPopinFooter\n","import { BREAKPOINT_M, EVENT_POPIN_CLOSED } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport { FILTER_MAIN_BLOCK_ID, POPIN_ID } from '../../config/constants'\nimport appData from '../../store/plp.data'\nimport './plp.filter-popin.scss'\nimport './popin/plp.filter-popin.mobileDropDown'\nimport './popin/plp.filter-popin.content'\nimport './popin/plp.filter-popin.footer'\n\nclass PlpFilterPopin extends NespressoElement {\n    onStart() {\n        this.props = this._createProps(\n            document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n        )\n\n        const {\n            see_result_number_label = 'See {resultsLength} Results',\n            see_result_number_label_zero = 'No Result',\n            see_result_number_label_one = 'See One Result',\n            a11y_see_result_number_label = 'Close and validate filters'\n        } = this.props.copywriting || this.props\n        // todo: line above is backward compatibility fallback for coffee PLP projects without \"copywriting\"\n        //       Consider moving the backward compatibility into Coffee PLP DTO to avoid this in the code\n\n        const isMobile =\n            appData.innerWidth < BREAKPOINT_M\n                ? '<plp-filter-sort-mobile></plp-filter-sort-mobile>'\n                : ''\n\n        this.template = `\n                ${isMobile}\n                <div class=\"mobileShadow\">\n                    <header>\n                        <h2 class=\"t-sm-700-sl\">${appData.translations['productlistrespblock.filter.label']}</h2>\n                    </header>\n                    <section>\n                        <plp-filter-popin-content\n                        ></plp-filter-popin-content>\n                    </section>\n                    <footer>\n                        <plp-filter-popin-footer\n                            see_result_number_label=\"${see_result_number_label}\"\n                            see_result_number_label_zero=\"${see_result_number_label_zero}\"\n                            see_result_number_label_one=\"${see_result_number_label_one}\"\n                            a11y_see_result_number_label=\"${a11y_see_result_number_label}\"\n                        ></plp-filter-popin-footer>\n                    </footer>\n                </div>`\n    }\n\n    onReady() {\n        window.addEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n    }\n\n    onDestroy() {\n        window.removeEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n    }\n\n    eventPopinClsed(e) {\n        e.stopPropagation()\n        if (e.detail.id === POPIN_ID) {\n            handleAppEvent('onFilter')\n        }\n    }\n}\n\ncustomElements.get('plp-filter-popin') || customElements.define('plp-filter-popin', PlpFilterPopin)\n\nexport default PlpFilterPopin\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport './plp.filter-cta.scss'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilterCta extends NespressoElement {\n    bubbleElement = null\n\n    static get observedAttributes() {\n        return ['data-filter-counter']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal != null && newVal.length > 0 && newVal !== oldVal) {\n            if (name === 'data-filter-counter') {\n                this.updateBubbleCounter(newVal)\n            }\n        }\n    }\n\n    onStart() {\n        this.template = `<nb-cta id='plp-filter' size='40' variation='plpFilter' icon_right='24/symbol/filter'>${this.props.cta_filter_label}</nb-cta>`\n    }\n\n    onReady() {\n        document.getElementById('plp-filter').addEventListener('click', () => {\n            handleAppEvent('onloadFilter', {})\n            customEvent({\n                event_GA4: true,\n                event: 'plp_filter',\n                action_type: 'filter open'\n            })\n        })\n\n        this.buttonElement = this.querySelector('nb-cta button')\n        this.bubbleElement = document.createElement('div')\n        this.bubbleElement.classList.add('t-2xs-700-sl')\n        this.bubbleElement.classList.add('bubbleCounter')\n        this.bubbleElement.innerHTML = '0'\n        this.firstChild.firstChild.appendChild(this.bubbleElement)\n    }\n\n    updateBubbleCounter(counter) {\n        if (!this.bubbleElement) {\n            return null\n        }\n\n        this.bubbleElement.innerHTML = counter\n        counter === '0'\n            ? this.buttonElement.classList.remove('bubbleActive')\n            : this.buttonElement.classList.add('bubbleActive')\n    }\n}\n\ncustomElements.get('plp-filter-cta') || customElements.define('plp-filter-cta', PlpFilterCta)\n\nexport default PlpFilterCta\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport './plp.filter-links.scss'\nimport './plp.filter-links-slider.scss'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\n\nconst SLIDER_NAV_LINKS_ID = 'slider_natural_nav_links'\n\nclass PlpFilterLinks extends NespressoElement {\n    constructor() {\n        super()\n        this.boundReinitSlider = this.reinitSlider.bind(this)\n    }\n\n    onStart() {\n        this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n        const sliderData = {\n            options: {\n                mobile: {\n                    items_per_slide: 'auto',\n                    item_width: 'auto',\n                    slide_min_height: '40',\n                    slider_gap: '0',\n                    display_buttons: 'false',\n                    display_nav: 'false',\n                    overflow: 'false',\n                    flex_auto: 'true',\n                    display_gradients: 'true',\n                    gradients_color: '#FFFFFF',\n                    gradients_width: '8',\n                    placeholder_background: 'transparent'\n                },\n                tablet: {\n                    items_per_slide: 'auto',\n                    item_width: 'auto',\n                    slide_min_height: '80',\n                    slider_gap: '0',\n                    display_buttons: 'true',\n                    display_nav: 'false',\n                    overflow: 'false',\n                    flex_auto: 'true',\n                    display_gradients: 'true',\n                    gradients_color: '#FFFFFF',\n                    placeholder_background: 'transparent'\n                },\n                desktop: {\n                    items_per_slide: 'auto',\n                    item_width: 'auto',\n                    slide_min_height: '80',\n                    slider_gap: '0',\n                    display_buttons: 'true',\n                    display_nav: 'false',\n                    overflow: 'false',\n                    flex_auto: 'true',\n                    display_gradients: 'true',\n                    gradients_color: '#FFFFFF',\n                    placeholder_background: 'transparent'\n                }\n            },\n            a11y_labels: {\n                prev: this.props.a11y_slider_previous_button,\n                next: this.props.a11y_slider_next_button,\n                nav: 'Go to slide'\n            }\n        }\n\n        this.template = `<nb-slider-natural\n                            id='${SLIDER_NAV_LINKS_ID}'\n                            data=\"${stringifyForAttribute(sliderData)}\">\n                            ${this.renderLinksList()}\n                        </nb-slider-menu>`\n    }\n\n    renderLinksList() {\n        const { navigation = [] } = this.props\n\n        return navigation\n            .map(\n                ({\n                    link = '',\n                    icon_left = '',\n                    seo_label = '',\n                    tracking_label = '',\n                    label = '',\n                    selected = false\n                }) =>\n                    `<li><nb-link\n                            link='${link}'\n                            size='large'\n                            phantom='true'\n                            color='black'\n                            selected=${selected}\n                            ${seo_label && `seo_label='${seo_label}'`}\n                            ${tracking_label && `tracking_label='${tracking_label}'`}\n                            ${icon_left && `icon_left='${icon_left}'`}\n                    >${label}</nb-link></li>`\n            )\n            .join('')\n    }\n\n    reinitSlider(e) {\n        const { id } = readEvent(e)\n        if (id !== SLIDER_NAV_LINKS_ID) {\n            return\n        }\n        e.target.initSlider()\n    }\n\n    /*bindEvents() {\n        this.unbindEvents()\n        this.link.addEventListener('click', this.boundHandleClick)\n    }\n\n    unbindEvents() {\n        this.link.removeEventListener('click', this.boundHandleClick)\n    }*/\n\n    disconnectedCallback() {\n        this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n    }\n}\n\ncustomElements.get('plp-filter-links') || customElements.define('plp-filter-links', PlpFilterLinks)\n\nexport default PlpFilterLinks\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\n\nimport handleAppEvent from '../../store'\nimport appData from '../../store/plp.data'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { SORT_MENU_ID } from '../../config/constants'\nimport { FILTER_MAIN_BLOCK_ID } from '../../config/constants'\n\nclass PlpFilterSort extends NespressoElement {\n    #SORT_MENU_ID = SORT_MENU_ID\n\n    constructor() {\n        super()\n        this.formatSortSeparator = '::'\n        appData.subscribe(this.componentUpdated.bind(this))\n        this.boundOnSortChange = this.onSortChange.bind(this)\n    }\n\n    onStart() {\n        this.props = this._createProps(\n            document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n        )\n\n        const {\n            label_sort_by = 'Sort by',\n            aa_description_sort_by = 'You can select different sorting values from this listbox. To interact with this listbox press SPACE or ENTER key.',\n            aa_listbox_description_sort_by = 'You can navigate through the options using UP or DOWN arrows keys. To exit this listbox press ESCAPE key.',\n            aa_select_description_sort_by = 'To select this option press SPACE or ENTER key.',\n            label_close_sort_by = 'Close'\n        } = this.props\n\n        const options = appData.get('sortOptions').map(option => ({\n            label: option.label,\n            value: this._formatSortValue(option.key, option.order),\n            checked: option.checked\n        }))\n\n        if (appData.get('sortCurrent').key !== appData.get('sortOptions')[0].key) {\n            options.forEach(option => {\n                option.checked =\n                    option.value ===\n                    this._formatSortValue(\n                        appData.get('sortCurrent').key,\n                        appData.get('sortCurrent').order\n                    )\n            })\n        }\n\n        const data = {\n            label: label_sort_by,\n            aa_description: aa_description_sort_by,\n            aa_listbox_description: aa_listbox_description_sort_by,\n            aa_select_description: aa_select_description_sort_by,\n            icon_option: '16/symbol/check',\n            label_close: label_close_sort_by,\n            options: options\n        }\n\n        this.template = `<nb-dropdown id=\"${this.#SORT_MENU_ID}\" data='${stringifyForAttribute(\n            data\n        )}'/>`\n    }\n\n    onReady() {\n        this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n        this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n    }\n\n    componentUpdated() {\n        const { key, order } = appData.get('sortCurrent')\n        this.sortButton?.setSelected(this._formatSortValue(key, order))\n    }\n\n    onSortChange(e) {\n        const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n        appData.set('sortCurrent', { key, order })\n        handleAppEvent('onSort')\n    }\n\n    onDestroy() {\n        this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n        appData.unsubscribe(this.componentUpdated)\n    }\n\n    _formatSortValue(key, order) {\n        return `${key}${this.formatSortSeparator}${order}`\n    }\n}\n\ncustomElements.get('plp-filter-sort') || customElements.define('plp-filter-sort', PlpFilterSort)\n\nexport default PlpFilterSort\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nimport './_plp.filter.main.scss'\nimport './plp.filter-cta'\nimport './plp.filter-links'\nimport './plp.filter-sort'\nimport appData from '../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilter extends NespressoElement {\n    static get observedAttributes() {\n        return ['data-request', 'data-filter-counter']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal != null && newVal !== oldVal && newVal.length > 0) {\n            if (name === 'data-request') {\n                this.updateComponent()\n            } else if (name === 'data-filter-counter') {\n                document\n                    .getElementById('plp-filter-cta')\n                    .setAttribute('data-filter-counter', newVal)\n            }\n        }\n    }\n\n    onStart() {\n        this.props = this._createProps(this.parentElement.attributes)\n        this.classList.add('plp-filter')\n    }\n\n    updateComponent() {\n        const nav_links = appData.get('nav_links')\n        /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n       This change adds a fallback to work with both the cases. */\n        const campaign = {\n            id: this.props.campaign_id,\n            creative: this.props.campaign_creative,\n            name: this.props.campaign_name,\n            position: this.props.campaign_position\n        }\n\n        const HTML = `\n            <div class='plp-filter-restrict'>\n                <plp-filter-cta\n                    id=\"plp-filter-cta\"\n                    cta_filter_label=\"${\n                        this.props.copywriting?.cta_filter_label || this.props.cta_filter_label\n                    }\"\n                    data-filter-counter=\"0\"\n                ></plp-filter-cta>\n                <plp-filter-links\n                    data = '${stringifyForAttribute({\n                        navigation: nav_links,\n                        a11y_slider_previous_button: this.props.a11y_slider_previous_button,\n                        a11y_slider_next_button: this.props.a11y_slider_next_button,\n                        campaign: this.props.campaign || campaign\n                    })}'\n                ></plp-filter-links>\n                <plp-filter-sort></plp-filter-sort>\n            </div>`\n        this.loadTemplate(HTML)\n        this.filterLinks = this.querySelectorAll('nb-slider-natural nb-link a')\n        this.bindEvents()\n    }\n\n    linkClick({ textContent }) {\n        customEvent({\n            eventAction: 'PLP Content Tab',\n            eventLabel: textContent\n        })\n    }\n\n    bindEvents() {\n        this.unbindEvents()\n        if (this.filterLinks?.length) {\n            this.filterLinks.forEach(element => {\n                const textContent = element.querySelector('span').textContent\n                element.boundLinkClick = this.linkClick.bind(this, { textContent })\n                element.addEventListener('click', element.boundLinkClick)\n            })\n        }\n    }\n\n    unbindEvents() {\n        if (this.filterLinks?.length) {\n            this.filterLinks.forEach(element => {\n                element.removeEventListener('click', element.boundLinkClick)\n            })\n        }\n    }\n}\n\ncustomElements.get('plp-filter') || customElements.define('plp-filter', PlpFilter)\n\nexport default PlpFilter\n","/* eslint-disable */\n\nconst stickyService = () => {\n    let element = null\n    let elementHeight = 0\n    let stickyElementSelector = ''\n    let magicIndex = 2 // FFS\n\n    const initialize = (\n        $element,\n        $elementHeight = elementHeight,\n        $stickyElementSelector = stickyElementSelector,\n        $magicIndex = magicIndex\n    ) => {\n        element = $element\n        elementHeight = $elementHeight\n        stickyElementSelector = $stickyElementSelector\n        magicIndex = $magicIndex\n        element.setAttribute('sticky', 'false')\n        element.classList.add('nb-sticky-container')\n        updateSticky()\n        bindEvent()\n    }\n\n    const updateSticky = () => {\n        const sticky = element.getAttribute('sticky') || 'false'\n        let offsetElement = 0\n        let isReady = false\n        let parent = {}\n        for (var i = 0; i < element.parentElement.childNodes.length; i++) {\n            if (\n                element.parentElement.childNodes[i].tagName &&\n                element.parentElement.childNodes[i].tagName === element.tagName\n            ) {\n                parent = element.parentElement.childNodes[i + magicIndex]\n                if (parent) {\n                    // todo : why 80px here ? if it's header height it should take other banners in consideration ?\n                    offsetElement = parent.offsetTop - 80\n                    isReady = true\n                }\n            }\n            if (isReady) {\n                break\n            }\n        }\n        // todo review this flow, it's when the sticky element is the first of the list of childrens\n        if (isReady && offsetElement === 0) {\n            offsetElement = element.parentElement.offsetTop + element.parentElement.offsetHeight\n        }\n        const boundary = window.scrollY - offsetElement\n        const isSticky = boundary > 0\n\n        if ((sticky === 'true') !== isSticky) {\n            element.setAttribute('sticky', isSticky)\n            if (elementHeight > 0) {\n                document.body.style.paddingTop = isSticky ? elementHeight + 'px' : '0px'\n            }\n        }\n    }\n\n    const destroy = () => {\n        unbindEvent()\n    }\n\n    const bindEvent = () => {\n        window.addEventListener('scroll', updateSticky)\n    }\n\n    const unbindEvent = () => {\n        window.removeEventListener('scroll', updateSticky)\n    }\n\n    const updatePosition = (offset = 0) => {\n        let el = element\n        if (stickyElementSelector !== '') {\n            el = element.querySelector(stickyElementSelector)\n        }\n        if (!el) {\n            return\n        }\n\n        const $header = document.querySelector('.Header__top')\n        const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n        const header = { height: headerRect.height, top: headerRect.y }\n\n        const top = `${header.top + header.height + offset}px`\n        el.style.top = top\n\n        return 0\n    }\n\n    return { initialize, destroy, updatePosition }\n}\n\nconst service = stickyService()\n\nexport default service\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport appData from '../../store/plp.data'\n\nconst dataTransformNavLinks = navLinks => {\n    return navLinks ? stringifyForAttribute({ navigation: navLinks }) : ''\n}\n\nconst dataTransformNavigationBubbles = ({\n    bubbles,\n    // todo remove ity\n    // navigation_bubbles,\n    a11y_slider_previous_button,\n    a11y_slider_next_button,\n    campaign,\n    selected_nav_link_label\n}) => {\n    return bubbles\n        ? stringifyForAttribute({\n              a11y_slider_previous_button,\n              a11y_slider_next_button,\n              bubbles: bubbles,\n              customEventAction: 'PLP Content Tab',\n              campaign,\n              selected_nav_link_label\n          })\n        : ''\n}\n\nexport const render = (props, campaign) => {\n    const { a11y_slider_previous_button, a11y_slider_next_button } = props\n    const nav_links = appData.get('nav_links') || []\n    const bubbles = appData.get('bubbles') || []\n    const selected_nav_link = nav_links.find(nav_link => nav_link.selected)\n    const selected_nav_link_label = selected_nav_link?.label\n\n    const data_navigation_bubbles = dataTransformNavigationBubbles({\n        bubbles,\n        ...props,\n        campaign,\n        selected_nav_link_label\n    })\n\n    return `\n        <nb-navigation-bubbles data='${data_navigation_bubbles}'></nb-navigation-bubbles>\n        <nb-plp-sticky-bar\n            data=\"${dataTransformNavLinks(nav_links)}\"\n            a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n            a11y_slider_next_button=\"${a11y_slider_next_button}\"\n            navigation_bubbles=\"${data_navigation_bubbles}\"\n            selected_nav_link_label=\"${selected_nav_link_label}\"\n        ></nb-plp-sticky-bar>\n    `\n}\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport stickyService from '@kissui/components/src/sticky/sticky.service'\nimport * as navigationBar from './plp.bar'\nimport './_plp.navigation.main.scss'\n\n/*\nSpecs:\n- [✓] Add sticky bar height 180\n- [✓] Add sticky bar on mobile, height 132px\n- [✓] If there is products filtered, remove the sticky bar\n */\n\nclass PlpNavigation extends NespressoElement {\n    #isSticky = true\n\n    onStart() {\n        this.props = this._createProps(this.parentElement.attributes)\n\n        // attribute magic-index is used in the sticky service to override the element picked as the \"below the fold\" point :-(\n        const magicIndex = this.attributes.getNamedItem('magic-index')\n            ? Number(this.attributes.getNamedItem('magic-index').value)\n            : undefined\n\n        this.#isSticky && stickyService.initialize(this, 0, 'nb-plp-sticky-bar', magicIndex)\n    }\n\n    static get observedAttributes() {\n        return ['sticky', 'data-request']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal !== null && newVal !== oldVal && newVal.length) {\n            if (name === 'sticky') {\n                this.#isSticky && stickyService.updatePosition()\n            }\n            if (name === 'data-request') {\n                this.updateComponent()\n            }\n        }\n    }\n\n    updateComponent() {\n        /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n        This change adds a fallback to work with both the cases. */\n        const campaign = {\n            id: this.props.campaign_id,\n            creative: this.props.campaign_creative,\n            name: this.props.campaign_name,\n            position: this.props.campaign_position\n        }\n        const HTML = navigationBar.render(\n            this.props.copywriting ? this.props.copywriting : this.props,\n            this.props.campaign || campaign,\n            true\n        )\n        this.loadTemplate(HTML)\n    }\n\n    onDestroy() {\n        this.#isSticky && stickyService.destroy()\n    }\n}\n\ncustomElements.get('plp-navigation') || customElements.define('plp-navigation', PlpNavigation)\n\nexport default PlpNavigation\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\n\nclass PlpResultsChip extends NespressoElement {\n    onStart() {\n        const { a11y_label, color, icon_right, label, variation } = this.props\n\n        const colorHtml = color ? `<div class=\"chip-color\" style=\"background:${color}\"></div>` : ''\n\n        this.template = `\n            <nb-cta\n                icon_right=\"${icon_right}\"\n                variation=\"${variation}\"\n                size=\"32\"\n                aria_label=\"${a11y_label} ${label}\"\n             >\n                ${colorHtml}${label}\n             </nb-cta>\n        `\n    }\n    onReady() {\n        const { value, type, label } = this.props\n        this.addEventListener('click', () => {\n            appData.filtersUpdate({\n                key: type,\n                label: label,\n                selected: false,\n                value: value\n            })\n            this.remove()\n            handleAppEvent('onFilter')\n        })\n    }\n}\n\ncustomElements.get('plp-results-chip') || customElements.define('plp-results-chip', PlpResultsChip)\n\nexport default PlpResultsChip\n","import appData from '../../store/plp.data'\nimport './plp.results-chip'\nimport './plp.results-header.scss'\nimport { CB_RESULTS_TOTAL_ID } from '@kissui/apps/src/plp-core/config/constants'\n\nexport default (copywritingProps = {}) => {\n    const {\n        a11y_header_result_label_button = 'Reset filter',\n        a11y_header_result_label_reset = 'Filters',\n        a11y_header_result_label_results = 'With your filters activated, you have currently',\n        header_result_label = 'Currently shopping by',\n        header_result_label_reset = 'Reset all',\n        header_result_label_results = 'Results',\n        header_result_label_results_one = 'Result',\n        header_result_label_results_zero = 'Results'\n    } = copywritingProps\n\n    const total = appData.productsFilteredCount()\n    const filterLabels = appData.filtersSelectedCount() && appData.filtersSelectedWithLabel()\n    const getResultLabel = () => {\n        switch (total) {\n            case 0:\n                return header_result_label_results_zero\n            case 1:\n                return header_result_label_results_one\n            default:\n                return header_result_label_results\n        }\n    }\n\n    return `\n        <nb-container\n            element_class=\"plp-results-header\"\n            contrast=\"light\">\n            ${\n                filterLabels\n                    ? `<p class=\"t-sm-400-sl cb-title\">${header_result_label}\n                        <span class='sr-only'>&nbsp;${filterLabels\n                            .map(filter => `${filter.categoryTitle}, ${filter.label}, `)\n                            .join(' / ')}</span>\n                    </p>${filterLabels\n                        .map(\n                            filter =>\n                                `<plp-results-chip\n                            icon_right=\"24/symbol/close\"\n                            variation=\"secondary\"\n                            value=\"${filter.value}\"\n                            type=\"${filter.key}\"\n                            label=\"${filter.label}\"\n                            color=\"${filter.color || ''}\"\n                            a11y_label=\"${a11y_header_result_label_button}\"\n                        >${filter.label}</plp-results-chip>`\n                        )\n                        .join('')}`\n                    : ''\n            }\n            <nb-link\n                id=\"nb-plp-filter-results-reset-all\"\n                size=\"small\"\n                color=\"black\"\n                aria-label=\"${a11y_header_result_label_reset}\"\n            >\n                ${header_result_label_reset}\n            </nb-link>\n            <p class=\"t-xs-700-caps-sl cb-results\">\n                <span class=\"sr-only\">${a11y_header_result_label_results}</span>&nbsp;\n                <span id=\"${CB_RESULTS_TOTAL_ID}\">${total}</span> ${getResultLabel()}:\n            </p>\n        </nb-container>\n    `\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getSkuComponentByType } from '@kissui/components/src/sku/services'\nimport appData from '../store/plp.data'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nexport default (product, rendererName = '', list = '', index = 0) => {\n    const data = { ...product, ...{ rendererName } }\n    const position = index + 1\n\n    // tracking\n    data.position = position\n\n    // price\n    data.price = appData.priceFormatter.short(appData.currency, product.price)\n    data.rawPrice = product.price // need the raw price for tracking\n    if (data.sleevePrice) {\n        data.sleevePrice = appData.priceFormatter.short(appData.currency, product.sleevePrice)\n    }\n\n    // price per capsule\n    if (data.price_per_capsule) {\n        data.price_per_capsule = appData.priceFormatter.short(\n            appData.currency,\n            product.price_per_capsule\n        )\n    }\n\n    // Make the variation available to the SKU component to know where it is being displayed\n    data.variation = VARIATION_PLP\n    data.intensity_label =\n        appData.get('options')?.intensity_label ||\n        appData.translations['productlistrespblock.capsule.a11y.intensity']\n    data.campaign = appData.get('campaign')\n\n    const tag = getSkuComponentByType(data) // sku-coffee\n\n    return `<${tag}\n                tracking_list=\"${list}\"\n                tracking_position=\"${position}\"\n                id=\"${data.sku}\"\n                data=\"${stringifyForAttribute(data)}\"\n                ${data.highlighted ? `highlighted=\"${data.highlighted}\"` : ''}\n           ></${tag}>`\n}\n","import { filterActionEvent } from '@kissui/helpers/src/gtmEvents'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\nimport renderHeader from './plp.results-header'\nimport renderProduct from '../plp.product'\n\nclass PlpResults extends NespressoElement {\n    #headerSelector = 'nb-container[element_class=\"plp-results-header\"]'\n    #resetSelector = '#nb-plp-filter-results-reset-all'\n\n    onStart() {\n        this.props = this._createProps(this.parentElement.attributes)\n        this.shouldHideHeader = this.getAttribute('hide-header') === 'true'\n        this.productListBkp = []\n        this.classList.add('plp-results')\n    }\n\n    static get observedAttributes() {\n        return ['data-request']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal !== null && newVal !== oldVal && !!newVal.length) {\n            if (name === 'data-request') {\n                this.updateComponent()\n            }\n        }\n    }\n\n    updateComponent() {\n        const headerMarkup = this.shouldHideHeader ? '' : renderHeader(this.props)\n        if (this.arraysAreEqual(this.productListBkp, appData.productsListFiltered())) {\n            // The header needs to update, even when the results do not change\n            document.querySelector(this.#headerSelector).outerhtml = headerMarkup\n            this.bindEvents()\n            return\n        }\n\n        this.productListBkp = appData.productsListFiltered()\n        const hasFilters = appData.filtersSelectedCount() > 0\n        const isSorted = appData.get('sortCurrent')?.key !== appData.get('sortOptions')?.[0].key\n        const listName = `${hasFilters ? 'filtered plp' : ''}${isSorted && hasFilters ? ': ' : ''}${\n            isSorted ? 'manually ordered' : ''\n        }`\n\n        this.loadTemplate(\n            `\n            ${headerMarkup}\n            <nb-container element_class=\"plp-grid\" className=\"plp-grid--results-list\">\n                ${appData\n                    .productsListFiltered()\n                    .map((product, index) => {\n                        return renderProduct(product, 'results', listName || index)\n                    })\n                    .join('')}\n            </nb-container>\n        `,\n            true\n        )\n\n        this.bindEvents()\n    }\n\n    arraysAreEqual(a = [], b = []) {\n        return a.length !== b.length ? false : a.every((value, index) => value === b[index])\n    }\n\n    onDestroy() {\n        document.querySelector(this.#resetSelector)?.removeEventListener('click', this.resetClick)\n    }\n\n    bindEvents() {\n        document.querySelector(this.#resetSelector)?.addEventListener('click', this.resetClick)\n    }\n\n    resetClick() {\n        filterActionEvent('filter clear', '', '', 'clear all ext')\n        appData.filtersReset()\n        handleAppEvent('onFilter')\n    }\n}\n\ncustomElements.get('plp-results') || customElements.define('plp-results', PlpResults)\n\nexport default PlpResults\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport categoryProducts from './plp.category-products'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../config/experiments'\n\nclass PlpProducts extends NespressoElement {\n    static get observedAttributes() {\n        return ['data-request']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal !== null && newVal !== oldVal && newVal.length) {\n            if (name === 'data-request') {\n                this.updateComponent()\n            }\n        }\n    }\n\n    updateComponent() {\n        const categories = appData.get('products') ?? []\n        const HTML = categories.reduce((acc, category) => {\n            acc += categoryProducts(category)\n            return acc\n        }, '')\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            this.loadTemplate(HTML, true) // the DOM Diff, simply does not work\n        } else {\n            this.loadTemplate(HTML)\n        }\n    }\n}\n\ncustomElements.get('plp-products') || customElements.define('plp-products', PlpProducts)\n\nexport default PlpProducts\n","import './plp.category-products.scss'\nimport './plp.category-products-more-items-per-row.scss'\n\nimport renderProduct from '../plp.product'\n\nexport default props => {\n    const {\n        id = null,\n        background_retina,\n        background_desktop,\n        background_mobile,\n        background_tablet,\n        contrast = 'dark',\n        name = null,\n        description,\n        products = []\n    } = props\n\n    const renderHeading = () => {\n        return name ? `<h2 class=\"h-2xl-700 plp-category--title\">${name}</h2>` : ''\n    }\n\n    const renderDescription = () => {\n        return description ? `<p class=\"description t-md-400\">${description}</p>` : ''\n    }\n\n    // Tabindex=\"0\" is needed to make the anchors bubbles works for keyboard navigation\n    return `<div class=\"plp-category\" data-id=\"${id}\" tabindex=\"0\">\n                <nb-container\n                    classname=\"plp-category--header\"\n                    contrast=\"${contrast}\"\n                    background_retina=\"${background_retina}\"\n                    background_desktop=\"${background_desktop}\"\n                    background_mobile=\"${background_mobile}\"\n                    background_tablet=\"${background_tablet}\"\n                >\n                    <header>\n                        ${renderHeading()}\n                        <div class=\"plp-category--description\">\n                            ${renderDescription()}\n                        </div>\n                    </header>\n                </nb-container>\n                <nb-container classname=\"plp-category--products\" contrast=\"light\">\n                    <div class=\"plp-category--segment\">\n                        <div class=\"plp-category--side\"></div>\n                        <div class=\"plp-category--center\">\n                          <div class=\"plp-grid\">\n                            ${products\n                                .map((product, index) =>\n                                    renderProduct(product, undefined, name, index)\n                                )\n                                .join('')}\n                          </div>\n                        </div>\n                    </div>\n                </nb-container>\n            </div>`\n}\n","// import * as Turbo from \"@hotwired/turbo\"\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from './store'\n\nimport {\n    FILTER_MAIN_BLOCK_ID,\n    NAVIGATION_MAIN_BLOCK_ID,\n    PRODUCTS_LIST_MAIN_BLOCK_ID,\n    PRODUCTS_RESULTS_MAIN_BLOCK_ID\n} from './config/constants'\nimport { enableExperiment } from './config/experiments'\n\nimport './styles/plp.app.scss'\n\nclass PLPApp extends NespressoElement {\n    constructor() {\n        super()\n        this.dataTransformService = () => []\n        this.dataFiltersService = () => []\n        this.dataSortService = () => []\n        this.recommendationService = () => {}\n        this.appStates = {}\n        this.plpType = 'app'\n    }\n\n    static get observedAttributes() {\n        return ['data-loaded', 'data']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (\n            name === 'data' &&\n            oldVal !== null && // avoid during the first render\n            newVal !== null &&\n            newVal !== oldVal &&\n            !!newVal.length\n        ) {\n            this.connectedCallback()\n            return\n        }\n        const propChanged = name === 'data-loaded'\n        const valueChanged = newVal !== null && newVal !== oldVal && !!newVal.length\n\n        if (propChanged && valueChanged) {\n            handleAppEvent('onMergeData', {\n                dataSortService: this.dataSortService,\n                filtersService: this.dataFiltersService,\n                productService: this.dataTransformService,\n                recommendationService: this.recommendationService,\n                pageBuilderProps: this.props\n            })\n        }\n    }\n\n    defineTemplate() {\n        this.template = `\n            <plp-filter id=\"${FILTER_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-filter>\n            <plp-navigation id=\"${NAVIGATION_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-navigation>\n            <plp-products id=\"${PRODUCTS_LIST_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-products>\n            <plp-results id=\"${PRODUCTS_RESULTS_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-results>\n        `\n    }\n\n    onStart() {\n        const enabledExperiments = this.props.options?.enabledExperiments ?? []\n        enabledExperiments.forEach(experiment => enableExperiment(experiment))\n\n        handleAppEvent('onload', {\n            plpType: this.plpType,\n            appStatesHandler: this.appStates\n        })\n\n        this.classList.add('plp-app', `plp-app-${this.plpType}`)\n        const itemsPerRow = this.props.options?.items_per_row\n        if (itemsPerRow > '3') {\n            this.classList.add(`plp-row-${itemsPerRow}`)\n        }\n\n        this.defineTemplate()\n    }\n}\n\nexport default PLPApp\n","/* eslint-disable */\nexport default class Category {\n    _id = ''\n    _name = ''\n    _description = ''\n    _products = []\n    _capacityLabel = null\n    _detailsIcon = null\n    _icon = null\n    _isLoadingProducts = false\n    _rangeLink = null\n    _subCategories = []\n    _superCategories = []\n    _url = ''\n    _background_retina =\n        '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_XL.jpg'\n    _background_desktop =\n        '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_L.jpg'\n    _background_mobile =\n        '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_S.jpg'\n    _background_tablet = ''\n    _contrast = 'dark'\n    _isSegment = false\n\n    constructor(category, PageBuilderData) {\n        this._id = category.id || this._id\n        this._name = category.name || this._name\n        this._capacityLabel = category.capacityLabel || this._capacityLabel\n        this._description = category.description || this._description\n        this._detailsIcon = category.detailsIcon || this._detailsIcon\n        this._icon = category.icon || this._icon\n        this._rangeLink = category.rangeLink || this._rangeLink\n        this._subCategories = category.subCategories || this._subCategories\n        this._superCategories = category.superCategories || this._superCategories\n        this._url = category.url || this._url\n        this._background_desktop = PageBuilderData?.background_desktop || this._background_desktop\n        this._background_mobile = PageBuilderData?.background_mobile || this._background_mobile\n        this._background_retina = PageBuilderData?.background_retina || this._background_retina\n        this._background_tablet = PageBuilderData?.background_tablet || this._background_tablet\n        this._contrast = PageBuilderData?.contrast || this._contrast\n    }\n\n    get id() {\n        return this._id\n    }\n    get products() {\n        return this._products\n    }\n    set products(products) {\n        this._products = products\n    }\n    get isLoadingProducts() {\n        return this._isLoadingProducts\n    }\n    set isLoadingProducts(isLoadingProducts) {\n        this._isLoadingProducts = isLoadingProducts\n    }\n    get name() {\n        return this._name\n    }\n    get description() {\n        return this._description\n    }\n    get contrast() {\n        return this._contrast\n    }\n    get background_desktop() {\n        return this._background_desktop\n    }\n    get background_mobile() {\n        return this._background_mobile\n    }\n    get background_retina() {\n        return this._background_retina\n    }\n    get background_tablet() {\n        return this._background_tablet\n    }\n\n    isProductCategory() {\n        return !this._isSegment && this._products && this._products.length > 0\n    }\n}\n","import Category from '../../plp-core/models/Category.js'\n\nexport default class AccessoryCategory extends Category {\n    constructor(category, PageBuilderData) {\n        super(category, PageBuilderData)\n    }\n}\n","import { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nexport default class Product {\n    id = ''\n    sku = ''\n    longSku = ''\n    name = ''\n    name_custom = ''\n    available = true\n    description = null\n    hidePrice = false\n    image_alt_text = ''\n    image = ''\n    inStock = true\n    internationalId = ''\n    internationalName = ''\n    legacyId = ''\n    maxOrderQuantity = null\n    packagingType = null\n    price = null\n    pushRatingEnabled = false\n    ranges = []\n    salesMultiple = null\n    technologies = []\n    type = ''\n    unitQuantity = 50\n    url = ''\n    labels = []\n    category_name = ''\n    category = null\n    highlighted = false\n    strikethrough_price = ''\n    additional_message = ''\n    additional_message_icon = ''\n    additional_message_link = {}\n    api_override = null\n    view_details_label = ''\n    headline = ''\n\n    constructor(product) {\n        /* SKU */\n        this.sku = product.internationalId || this.sku\n        this.longSku = product.id || this.longSku\n        this.id = product.id || this.id\n        this.name = product.name || this.name\n        this.name_custom = product.name_custom || this.name_custom\n        this.available = product.available || this.available\n        this.description = product.description || this.description\n        this.hidePrice = isLoggedIn() ? false : product.hidePrice || this.hidePrice\n        this.image_alt_text = product?.image?.altText || this.image_alt_text\n        this.image = product?.image?.url || this.image\n        this.inStock = product.inStock\n        this.internationalId = product.internationalId || this.internationalId\n        this.internationalName = product.internationalName || this.internationalName\n        this.legacyId = product.legacyId || this.legacyId\n        this.maxOrderQuantity = product.maxOrderQuantity || this.maxOrderQuantity\n        this.packagingType = product.packagingType || this.packagingType\n        this.price = product.price ?? this.price\n        this.pushRatingEnabled = product.pushRatingEnabled || this.pushRatingEnabled\n        this.ranges = product.ranges || this.ranges\n        this.salesMultiple = product.salesMultiple || this.salesMultiple\n        this.technologies = product.technologies || this.technologies\n        this.type = product.type || this.type\n        this.unitQuantity = product.unitQuantity || this.unitQuantity\n        this.url = product.url || this.url\n        this.highlighted = product.highlighted || this.highlighted\n        this.strikethrough_price = product.strikethrough_price || this.strikethrough_price\n        this.additional_message = product.additional_message || this.additional_message\n        this.additional_message_icon =\n            product.additional_message_icon || this.additional_message_icon\n        this.additional_message_link =\n            product.additional_message_link || this.additional_message_link\n        this.api_override = product.api_override || this.api_override\n        this.view_details_label = product.view_details_label || this.view_details_label\n        this.headline = product.headline || this.headline\n        this.labels = product.labels || this.labels\n\n        // category_name\n        const categoryId = product.categoryId ? product.categoryId.split('/') : ['']\n        this.category_name = categoryId[categoryId.length - 1]\n        this.category = product.category || this.category\n    }\n}\n","import Product from '../../plp-core/models/Product.js'\n\nexport default class AccessoryProduct extends Product {\n    collections = ''\n    types = ''\n\n    constructor(product) {\n        super(product)\n\n        this.collections = product.collections\n        this.types = product.types\n\n        this.sku = this.internationalId || ''\n        this.longSku = this.id || ''\n    }\n}\n","import { COFFEE_ORIGINAL, COFFEE_VERTUO, COFFEE_PRO } from '@kissui/components/src/constants.mjs'\n\nexport default (nav_links, enabledCremaTechnologies, PageBuilderData) => {\n    // Do not change icon name. This is NC2 merger of menus from PB export and crema data\n    const ORIGINAL_ICON = 'coffee'\n    const VERTUO_ICON = 'gran-lungo-vertuo-capsule'\n    const PRO_ICON = 'brand_coffee_capsule_pro'\n\n    const { copywriting = {}, options = {} } = PageBuilderData\n\n    const transformCremaTechnologiesToLink = technologies => {\n        return technologies.map(({ id, url, name, isSelected }) => ({\n            link: url,\n            label: name,\n            seo_label: name,\n            icon_left: id ? getIconByTechnology(id.split('/').pop()) : '',\n            selected: isSelected\n        }))\n    }\n    const getIconByTechnology = technology => {\n        switch (technology) {\n            case COFFEE_VERTUO:\n                return VERTUO_ICON\n            case COFFEE_PRO:\n                return PRO_ICON\n            default:\n                return COFFEE_ORIGINAL\n        }\n    }\n    const filterDefaultTechnology = link => {\n        if (\n            link.icon_left !== ORIGINAL_ICON &&\n            link.icon_left !== VERTUO_ICON &&\n            link.icon_left !== PRO_ICON\n        ) {\n            return link\n        }\n    }\n\n    const replaceCremaTechnologies = () => {\n        if (!copywriting.all_products_navigation_label) {\n            return []\n        }\n        const selectedTechnology = enabledCremaTechnologies.find(t => t.isSelected)\n        if (!selectedTechnology) {\n            return []\n        }\n        return [\n            {\n                url: selectedTechnology.url,\n                name: copywriting.all_products_navigation_label,\n                isSelected: true\n            }\n        ]\n    }\n\n    let enabledTechnologies\n    if (options.hide_technologies_in_navigation) {\n        enabledTechnologies = replaceCremaTechnologies()\n    } else {\n        enabledTechnologies = enabledCremaTechnologies\n    }\n\n    if (!nav_links.length && enabledTechnologies.length) {\n        return transformCremaTechnologiesToLink(enabledTechnologies)\n    }\n\n    if (!enabledTechnologies.length) {\n        return nav_links\n    }\n\n    // Remove Page Builder data about technology links to use the one activated in Crema UI data\n    const navLinksWithoutTechnology = [...nav_links].filter(filterDefaultTechnology)\n\n    return [...transformCremaTechnologiesToLink(enabledTechnologies), ...navLinksWithoutTechnology]\n}\n","import { DEFAULT_BUBBLE_ICON } from '@kissui/components/src/constants.mjs'\nimport { isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\n\nexport default (bubbles, productGroups, categories, recommendation) => {\n    const productsGroup = productGroups\n        .filter(el => !isCategoryHidden(el.categoryId)) // For AB testing\n        .map(el => el.categoryId)\n    const bubblesFilteredAndSorted = []\n\n    const bubblesMathProductsGroup = bubbles\n        .map(bubble => {\n            const normalizedBubble = {\n                ...bubble,\n                link: bubble.link.replace('#', '')\n            }\n\n            if (productsGroup.includes(normalizedBubble.link)) {\n                return normalizedBubble\n            }\n        })\n        .filter(ele => typeof ele !== 'undefined')\n\n    productsGroup.forEach(categoryId => {\n        const bubble = bubblesMathProductsGroup.find(({ link }) => link === categoryId)\n        if (bubble) {\n            bubblesFilteredAndSorted.push(bubble)\n        } else {\n            const cremaCategory = categories.find(category => category.id === categoryId)\n            if (cremaCategory) {\n                const { name, id, icon } = cremaCategory\n                const cremaBubble = {\n                    link: id,\n                    tracking_label: name,\n                    label: name,\n                    visual: {\n                        src: icon?.url || DEFAULT_BUBBLE_ICON,\n                        alt: icon?.altText || name\n                    }\n                }\n                bubblesFilteredAndSorted.push(cremaBubble)\n            }\n        }\n    })\n\n    if (recommendation) {\n        bubblesFilteredAndSorted.unshift({\n            link: recommendation.id,\n            tracking_label: recommendation.name,\n            label: recommendation.name,\n            visual: {\n                src: recommendation.background_desktop,\n                alt: recommendation.name\n            }\n        })\n    }\n\n    return bubblesFilteredAndSorted\n}\n","/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nimport navigationLinks from './NavigationLinks'\nimport navigationBubbles from './NavigationBubbles'\nimport { getLabels, isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst MAX_INTENSITY_FALLBACK = 15\n\n/**\n * Prior to HMC supporting labels natively the hack was to use a category with the data\n * about the label held as JSON data in the description. This function will parse the\n * descriptions for each label once and store them as an object.\n */\nconst parseLabels = labels => {\n    labels.forEach(label => {\n        try {\n            label.parsedData = JSON.parse(label.description)\n        } catch (e) {\n            console.error(\n                'Wrong JSON format in HMC label categories',\n                label.id,\n                label.description,\n                e\n            )\n            return\n        }\n    })\n}\n\n/**\n * Labels data is now available natively in the HMC data. If any labels are specified in the\n * HMC data then this should overwrite the existing functionality. To allow support for both\n * the \"labels from categories\" should continue to be used if HMC data is not specified.\n *\n * Adds labels property to products containing each label's category data (JSON\n * parsed description property) assigned to it.\n * Labels are categories that have the label base category as parent.\n * To apply a label on a given product, the label has to contain the product.\n * This function has to clean the productGroups as well by removing the label ones\n *\n * @param eCommerceData\n */\nconst addLabels = ({ categories, productGroups, products }) => {\n    // Labels are already present in the products, skip.\n    // This can happen after merging lazy data like recommendations\n    if (products.some(product => product.labels?.length)) {\n        return\n    }\n\n    // Use HMC data, if available, create labels with data from highlightLabels\n    products.forEach(product => {\n        if (product.highlightLabels?.length) {\n            product.labels = product.highlightLabels.map(label => ({\n                name: label.text,\n                color: label.textColor,\n                bgColor: label.backgroundColor\n            }))\n        }\n    })\n\n    // Backward compatibility, fall back to using HMC categories if no native HMC labels are specified\n    const labels = getLabels(categories)\n    parseLabels(labels)\n\n    const labelGroups = productGroups.filter(group =>\n        labels.some(label => label.id === group.categoryId)\n    )\n\n    labelGroups.forEach(group => {\n        const label = labels.find(__label => __label.id === group.categoryId)\n        if (!label.parsedData) {\n            // Data could not be parsed so skip this label\n            return\n        }\n        group.productIds.forEach(productId => {\n            const prod = products.find(product => product.id === productId)\n            if (!prod || prod.highlightLabels?.length > 0) {\n                // Product not found or has native HMC labels\n                return\n            }\n            prod.labels = prod.labels || []\n            prod.labels.push(label.parsedData)\n        })\n    })\n\n    //remove label categories from productGroups\n    labelGroups.forEach(labelGroup => {\n        const indexToRemove = productGroups.findIndex(\n            productGroup => productGroup.categoryId === labelGroup.categoryId\n        )\n        productGroups.splice(indexToRemove, 1)\n    })\n}\n\nexport default (\n    plpData,\n    PageBuilderData,\n    Category,\n    Product,\n    colorFilterFunction,\n    recommendation\n) => {\n    if (!plpData.data) {\n        return\n    }\n\n    let { categories, productGroups, enabledTechnologies, products } =\n        plpData.data.configuration.eCommerceData\n\n    productGroups = getOverridenProductGroups(recommendation, productGroups)\n    applyRecommendationOverrides(recommendation, { Product, PageBuilderData })\n    applyProductsOverrides(products, PageBuilderData)\n    addLabels({ categories, productGroups, products })\n\n    // Don't filter the products until after the labels have been applied\n    if (colorFilterFunction) {\n        products = colorFilterFunction(products)\n    }\n\n    const overriddenCategories = applyCategoryOverrides(categories, productGroups, products, {\n        PageBuilderData,\n        Category,\n        Product\n    })\n\n    return {\n        categories: recommendation\n            ? [recommendation, ...overriddenCategories]\n            : overriddenCategories,\n        translations: plpData.data.configuration.translations,\n        enabledTechnologies,\n        nav_links: navigationLinks(\n            getPBProperty(PageBuilderData, 'nav_links'),\n            enabledTechnologies,\n            PageBuilderData\n        ),\n        bubbles: navigationBubbles(\n            getPBProperty(PageBuilderData, 'navigation_bubbles.bubbles'),\n            productGroups,\n            categories,\n            recommendation\n        ),\n        maxIntensity: {\n            original: MAX_INTENSITY_FALLBACK,\n            vertuo: MAX_INTENSITY_FALLBACK,\n            ...(plpData.data.configuration?.props?.maxIntensity ?? {})\n        },\n        categoriesExtraData: recommendation ? [recommendation, ...categories] : categories\n    }\n}\n\n/**\n * Get a property from the Page Builder data taking into\n * account the old/new schema\n */\nfunction getPBProperty(PageBuilderData, key) {\n    return key.split('.').reduce(\n        (acc, current) => acc?.[current],\n        // Backward compatibility to old schema\n        PageBuilderData?.copywriting ? PageBuilderData.copywriting : PageBuilderData\n    )\n}\n\nfunction applyProductsOverrides(products, PageBuilderData) {\n    products.forEach(product => {\n        product.view_details_label = getPBProperty(PageBuilderData, 'view_details_label')\n\n        if (isLoggedIn()) {\n            // The hide price attribute from Crema UI actually means \"hide price for anonymous users\"\n            product.hidePrice = false\n        }\n\n        const pbProduct = PageBuilderData?.products?.find?.(\n            pbProductData => pbProductData.sku && pbProductData.sku === product.legacyId\n        )\n\n        if (!pbProduct) {\n            return\n        }\n\n        const apiOverride = pbProduct.api_override || product.api_override\n\n        // Apply page builder overrides\n        Object.assign(product, {\n            highlighted: pbProduct.highlighted,\n            strikethrough_price: pbProduct.strikethrough_price,\n            additional_message: pbProduct.additional_message,\n            additional_message_icon: pbProduct.additional_message_icon,\n            additional_message_link: pbProduct.additional_message_link || {},\n            display_machine_range_name: pbProduct.display_machine_range_name || false,\n            name_custom: pbProduct.name_custom || '',\n            ...(apiOverride\n                ? {\n                      image: {\n                          url: apiOverride?.image || product.image?.url\n                      },\n                      name: apiOverride?.name || product.name,\n                      headline: apiOverride?.headline || product.headline,\n                      description: apiOverride?.description || product.description,\n                      api_override: apiOverride\n                  }\n                : {})\n        })\n    })\n}\n\nfunction applyCategoryOverrides(\n    categories,\n    productGroups,\n    products,\n    { PageBuilderData, Category, Product }\n) {\n    return categories\n        .map(category => {\n            const extraData = getPBProperty(PageBuilderData, 'categories').find(\n                catData => catData.category_id === category.id\n            )\n\n            const categoryObj = new Category(category, extraData)\n\n            productGroups.forEach(productGroup => {\n                if (\n                    isCategoryHidden(productGroup.categoryId) ||\n                    productGroup.categoryId !== category.id\n                )\n                    return\n\n                productGroup.productIds.forEach(productID => {\n                    const product = products.find(p => p.id === productID)\n                    if (product) {\n                        product.categoryId = category.id\n                        product.category =\n                            categories.find(c => c.id === product.ranges?.[0]) || null\n                        const productObj = new Product(product, PageBuilderData)\n                        categoryObj.products.push(productObj)\n                    }\n                })\n            })\n\n            return categoryObj.isProductCategory() ? categoryObj : null\n        })\n        .filter(Boolean)\n}\n\nfunction getOverridenProductGroups(recommendation, productGroups) {\n    return recommendation\n        ? [\n              {\n                  categoryId: recommendation.id,\n                  productIds: recommendation.products.map(product => product.legacyId)\n              },\n              ...productGroups\n          ]\n        : productGroups\n}\n\nfunction applyRecommendationOverrides(recommendation, { Product, PageBuilderData }) {\n    if (!recommendation) {\n        return\n    }\n\n    recommendation.products = recommendation.products.map(p => new Product(p, PageBuilderData))\n}\n","import AccessoryCategory from '../models/accessory.category'\nimport AccessoryProduct from '../models/accessory.product'\nimport MainDTO from '../../plp-core/models/MainDTO'\n\nexport default (plpData, PageBuilderData) => {\n    return MainDTO(plpData, PageBuilderData, AccessoryCategory, AccessoryProduct)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\n/**\n * @param {{}} [_filter]\n */\nexport default class Filter {\n    #type = ''\n    #key = ''\n    #iconFn = {}\n    #filterFn = {}\n    #title = ''\n    #values = []\n    #after = '</fieldset>'\n    #before = `<fieldset aria-labelledby=\"{key}\"><legend id=\"{key}\" aria-hidden=\"true\" class='${\n        viewportHelper.is.mobile ? 't-sm-700-sl' : 't-md-700-sl'\n    }'>{title}</legend>`\n    showalllabel = ''\n\n    constructor(_filter = {}) {\n        this.#type = _filter.type\n        this.#key = _filter.key\n        this.#iconFn = _filter.iconFn ? _filter.iconFn : null\n        this.#filterFn = _filter.filterFn ? _filter.filterFn : null\n        const title = _filter.title ? _filter.title.toLowerCase() : 'Filter'\n        this.#title = title.charAt(0).toUpperCase() + title.slice(1)\n        this.#before = _filter.before ? _filter.before : this.#before\n        this.#after = _filter.after ? _filter.after : this.#after\n        this.showalllabel = _filter.showalllabel ?? ''\n    }\n\n    set values(values) {\n        this.#values = values\n    }\n\n    set after(after) {\n        this.#after = after\n    }\n\n    get after() {\n        return this.#after\n    }\n\n    get values() {\n        return this.#values\n    }\n\n    get type() {\n        return this.#type\n    }\n\n    get filterFn() {\n        return this.#filterFn\n    }\n\n    get iconFn() {\n        return this.#iconFn\n    }\n\n    get key() {\n        return this.#key\n    }\n\n    get title() {\n        return this.#title\n    }\n\n    renderBefore() {\n        return this.#before.replace('{title}', this.#title).replaceAll('{key}', this.#key)\n    }\n\n    renderAfter() {\n        return this.#after\n    }\n\n    pushValues(value) {\n        this.#values.findIndex(x => x.value === value.value) === -1 && this.#values.push(value)\n    }\n}\n","/**\n * Filter chip type\n */\nexport default class DefaultFilterChipType {\n    #value = null\n    #label = null\n    #filterType = null\n    #filterKey = null\n    #icon = ''\n    #color = ''\n    #selected = false\n    #disabled = false\n\n    constructor({\n        value,\n        label,\n        filterType,\n        filterKey,\n        icon = '',\n        color = '',\n        selected = false,\n        disabled = false\n    }) {\n        if (!value) {\n            console.error('DefaultFilterChipType: value is required')\n            return\n        }\n        if (!label) {\n            console.error('DefaultFilterChipType: label is required')\n            return\n        }\n        if (!filterType) {\n            console.error('DefaultFilterChipType: filterType is required')\n            return\n        }\n        if (!filterKey) {\n            console.error('DefaultFilterChipType: filterKey is required')\n            return\n        }\n\n        this.#value = value\n        this.#label = label\n        this.#filterType = filterType\n        this.#filterKey = filterKey\n        this.#icon = icon\n        this.#color = color\n        this.#selected = selected\n        this.#disabled = disabled\n\n        this.productCount = null\n    }\n\n    set disabled(value) {\n        this.#disabled = !!value\n    }\n\n    get disabled() {\n        return this.productCount !== null ? this.productCount === 0 : this.#disabled\n    }\n\n    set selected(value) {\n        this.#selected = !!value\n    }\n\n    get selected() {\n        return this.#selected\n    }\n\n    get filterKey() {\n        return this.#filterKey\n    }\n\n    get filterType() {\n        return this.#filterType\n    }\n\n    get value() {\n        return Array.isArray(this.#value) ? this.#value.join(',') : this.#value\n    }\n\n    get label() {\n        return this.#label\n    }\n\n    get color() {\n        return this.#color\n    }\n\n    get icon() {\n        return this.#icon\n    }\n\n    // disabled=\"${isDisabled(e.type, v)}\"\n    render() {\n        const productCountLabel = this.productCount !== null ? ` (${this.productCount})` : ''\n\n        return `<nb-chip\n                    id=\"${this.#filterKey}-${this.#value}\"\n                    data-filter-value=\"${this.#value}\"\n                    data-filter-key=\"${this.#filterKey}\"\n                    data-filter-label=\"${this.#label}\"\n                    checked=\"${this.#selected}\"\n                    disabled=\"${this.#disabled}\"\n                    ${this.#icon ? `icon=\"${this.#icon}\"` : ''}\n                    ${this.#color ? `color=\"${this.#color}\"` : ''}\n                >${this.#label}${productCountLabel}</nb-chip>`\n    }\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\n\nconst getCategoryData = (categories, id) => {\n    // Restrict filter to NOT use categories containing the word \"label\"\n    const findCategory = categories?.find(\n        category => category.id === id && !category.id.includes('label')\n    )\n    return findCategory\n        ? {\n              // todo this icon should be fixed into the DTO product for all attributes\n              icon: findCategory.icon?.icon,\n              color: findCategory.cssColorCode ? findCategory.cssColorCode : null,\n              label: findCategory.name\n          }\n        : null\n}\n\nexport default (filterDefinition, categories, categoriesData) => {\n    if (!filterDefinition || !categories) {\n        console.error('CREATE_FILTER_DEFINITION_CATEGORY_NOT_FOUND')\n        return []\n    }\n\n    const filters = filterDefinition.map(filter => new Filter(filter))\n    categories\n        .reduce((acc, category) => acc.concat(category.products), [])\n        .forEach(product => {\n            filters.forEach(filter => {\n                const filterKey = filter.key\n                const filterType = filter.type\n                const fieldValue = product[filterKey]\n                typeof fieldValue === 'object'\n                    ? fieldValue.map(attribute => {\n                          const data = getCategoryData(categoriesData, attribute)\n                          if (data) {\n                              filter.pushValues(\n                                  new DefaultFilterChipType({\n                                      filterKey,\n                                      filterType,\n                                      value: attribute,\n                                      icon: filter.iconFn?.(attribute),\n                                      label: data.label,\n                                      color: data.color ?? null\n                                  })\n                              )\n                          }\n                      })\n                    : filter.pushValues(\n                          new DefaultFilterChipType({\n                              filterKey,\n                              filterType,\n                              value: fieldValue,\n                              icon: filter.iconFn?.(filterKey),\n                              label:\n                                  typeof filter.filterFn === 'function'\n                                      ? filter.filterFn(fieldValue)\n                                      : fieldValue\n                          })\n                      )\n            })\n        })\n\n    return filters\n}\n","import createFilter from '../../plp-core/filter/createFilter'\n\nexport const getMergedFilterData = (categories, PBprops, categoriesExtraData, translations) =>\n    createFilter(\n        [\n            {\n                type: 'default',\n                key: 'collections',\n                title: translations['productlistrespblock.filterlabels.collection']\n            },\n            {\n                type: 'default',\n                key: 'types',\n                title: translations['productlistrespblock.filterlabels.type']\n            }\n        ],\n        categories,\n        categoriesExtraData,\n        PBprops\n    )\n","/**\n *\n * @param PBprops\n * @returns {[\n *              {\n *                  checked: boolean,\n *                  id: string,\n *                  label: (string|*),\n *                  key: string,\n *                  order: asc|desc\n *              }\n *          ]}\n * Note: The first element is the default sort order\n * Note: The order of the sort array is important\n *\n */\nexport const getMergedSortData = PBprops => [\n    {\n        id: 'default',\n        label: PBprops.dropdown_recommended_option_label,\n        key: 'recommended',\n        order: 'asc',\n        checked: true\n    },\n    {\n        id: 'sortPriceAscending',\n        label: PBprops.dropdown_price_ascending_option_label,\n        key: 'price',\n        order: 'asc',\n        checked: false\n    },\n    {\n        id: 'sortPriceDescending',\n        label: PBprops.dropdown_price_descending_option_label,\n        key: 'price',\n        order: 'desc',\n        checked: false\n    },\n    {\n        id: 'sortNameAscending',\n        label: PBprops.dropdown_name_ascending_option_label || 'Name A-Z',\n        key: 'name',\n        order: 'asc',\n        checked: false\n    },\n    {\n        id: 'sortNameDescending',\n        label: PBprops.dropdown_name_descending_option_label || 'Name Z-A',\n        key: 'name',\n        order: 'desc',\n        checked: false\n    }\n]\n","import appData from './plp.data'\nimport {\n    POPIN_ID,\n    FILTER_MAIN_BLOCK_ID,\n    NAVIGATION_MAIN_BLOCK_ID,\n    PRODUCTS_LIST_MAIN_BLOCK_ID,\n    PRODUCTS_RESULTS_MAIN_BLOCK_ID,\n    CB_RESULTS_TOTAL_ID\n} from '../config/constants'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\n\nexport default {\n    onloadSuccess: function () {\n        const plpApp = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID).parentElement\n        plpApp.setAttribute('data-loaded', appData.sessionId)\n    },\n    /**\n     * State: list of products\n     */\n    readyForPlay: function () {\n        const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n        const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n        const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n        const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n\n        filter.setAttribute('data-request', appData.sessionId)\n        filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n        navigation.setAttribute('data-request', appData.sessionId)\n        productList.setAttribute('data-request', appData.sessionId)\n\n        filter.style.display = 'block'\n\n        navigation.style.display = 'block'\n\n        productList.style.display = 'block'\n\n        productsResults.style.display = 'none'\n\n        if (appData.get('hide_sort_and_filter')) {\n            filter.classList.add('hide-sort-and-filter')\n        }\n\n        document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID).style.display = 'none'\n    },\n    /**\n     * State: list of products filtered\n     */\n    readyForShowResults: function () {\n        const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n        const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n        const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n        const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n        const cbResultsTotalText = document.getElementById(CB_RESULTS_TOTAL_ID)\n\n        filter.style.display = 'block'\n        filter.setAttribute('data-request', appData.sessionId)\n        filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n\n        if (navigation) navigation.style.display = 'none'\n\n        if (productList) productList.style.display = 'none'\n\n        if (productsResults) {\n            productsResults.setAttribute('data-request', appData.filtersSelectedSerialized())\n            productsResults.style.display = 'block'\n        }\n        if (cbResultsTotalText) {\n            cbResultsTotalText.textContent = appData.productsFilteredCount()\n        }\n    },\n    /**\n     * State: filter popin opened\n     */\n    readyForFilter: function () {\n        // check if the popin is in the page\n        let plpFilterPopin = document\n            .getElementsByClassName('plp-app')[0]\n            ?.querySelector(`#${POPIN_ID}`)\n\n        if (!plpFilterPopin) {\n            // todo test performance of this & new Popin()\n            plpFilterPopin = setAttributes(\n                document.createElement('nb-popin', {\n                    is: customElements.get('Popin')\n                }),\n                {\n                    'data-request': appData.sessionId,\n                    id: POPIN_ID,\n                    popin_id: POPIN_ID,\n                    variation: 'before',\n                    bgcolor: 'white',\n                    heading: appData.translations['productlistrespblock.filter.label'],\n                    label_close: 'close',\n                    content:\n                        '<plp-filter-popin class=\"plp-filter-popin-content\"></plp-filter-popin>'\n                }\n            )\n            document.getElementsByClassName('plp-app')[0]?.appendChild(plpFilterPopin)\n            // todo wrong way to open the popin\n            dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n        } else {\n            // todo wrong way to open the popin\n            plpFilterPopin.querySelector('plp-filter-popin').setAttribute('data-refresh', 'true')\n            dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n        }\n    },\n    /**\n     * State: shows the error\n     */\n    showError: function (e) {\n        const errorMessage = e.detail.err || 'Error'\n        console.error(errorMessage)\n    }\n}\n","import PLPApp from '../plp-core/plp.app'\nimport { getMergedPLPData, getMergedFilterData, getMergedSortData } from './dataTransform'\nimport appStates from '../plp-core/store/plp.states'\n\nclass PLPAccessory extends PLPApp {\n    constructor() {\n        super()\n        this.plpType = 'accessory'\n        this.dataTransformService = getMergedPLPData\n        this.dataFiltersService = getMergedFilterData\n        this.dataSortService = getMergedSortData\n        this.appStates = appStates\n    }\n}\n\ncustomElements.get('nb-plp-accessory') || customElements.define('nb-plp-accessory', PLPAccessory)\n\nexport default PLPAccessory\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","BREAKPOINT_TABLET","BREAKPOINT_M","EVENT_POPIN_OPEN","EVENT_POPIN_CLOSE","EVENT_POPIN_CLOSED","EVENT_POPIN_KEY_DOWN","EVENT_SLIDER_READY","EVENT_SORT_BY_CHANGE","EVENT_SWIPED_DOWN","CONTRAST_LIGHT","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","force","_diff","elem","_getNodeType","node","nodeType","tagName","toLowerCase","_getNodeContent","childNodes","textContent","domNodes","Array","prototype","slice","call","templateNodes","count","parentNode","removeChild","forEach","index","appendChild","cloneNode","replaceChild","templateContent","fragment","document","createDocumentFragment","templateHTML","str","DOMParser","parseFromString","body","disconnectedCallback","onDestroy","helper","is","innerWidth","vw","devicePixelRatio","window","mobile","mobile_tablet","tablet","desktop","retina","lt","ref","parseHTML","tmp","implementation","createHTMLDocument","makeId","result","characters","i","charAt","Math","floor","random","removeEmptyValues","findText","key","value","text","includes","getHashLink","link","linkHash","linkNoHash","indexOf","replace","lazyLoad","url","inViewPort","setAttribute","cb","img","Image","src","onload","onerror","Error","test","navigator","userAgent","agent","start","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","stringifyForAttribute","escapeHtml","stringify","m","sanitizeString","toString","setAttributes","element","attrs","VARIATION_PLP","VARIATION_PDP","isPdp","variation","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","push","viewportHelper","renderLink","a11y_product_card","a11yProductName","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getProduct","sku","napi","catalog","trimSku","getTechnologyName","productData","techno","technologies","substring","isBundled","sales_multiple","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","unitQuantity","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","getFormattedPrice","async","price","priceFormatter","priceFormat","getPriceFormatter","currency","config","padl","namespace","dataLayer","app","html","short","getStrikethroughPriceElement","component","querySelector","renderStrikethroughPrice","strikethrough_price","strikethroughPrice","fetchStrikethroughPrice","then","payload","catch","e","style","display","getDataLayer","padlNamespace","getMarketCode","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","isLoggedIn","user","renderAddToCart","activeLongSku","activeSku","category_name","contact_cta","hidePrice","longSku","position","rendererName","show_view_details","view_details_label","disableTracking","buttonSize","getButtonSize","cta_url","cta_label","contact_cta_text","contact_url_anchor","is_b2b","isArray","some","tech","checkForB2B","skuProp","activeLongSkuProp","disableTrackingProp","getComputedProps","b2bLoggedIn","remainingCases","b2bNotLoggedIn","LABEL_CATEGORY_NAME","LABEL_CATEGORY_NAME_MACHINE","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","getLabels","categories","category","getCategoryRegEx","id","isLabel","categoryIdTail","RegExp","isCategoryHidden","categoryId","hideCategory","PLP_HIDE_CATEGORIES","findIndex","c","PLP_ONLY_SHOW_CATEGORIES","getMaxIntensity","INTENSITY_MAX_OL","getMergedProductCoffeeData","product","pageBuilderProductProps","pageBuilderProps","bundle_details","options","show_sleeve_price","isBundledResult","showCapsulePrice","price_per_capsule","final_price","bundled","type","round","getFinalPrice","option","intensity","capsuleProperties","max_intensity","show_capsule_price","apiOverride","pageBuilderData","images","headline","description","api_override","image","icon","main","VARIATION_CROSS_SELL","getCapsuleFeatures","acidity","bitterness","roastLevel","roast","getSkuQuickViewProp","popinId","skuData","componentType","mergedProductData","getMergedProductDataForComponentType","addToCartProps","getAddToCartProperties","isVariationOnPLP","getPlpQuickViewProps","getCrossSellQuickViewProps","matchedProduct","products","productPageBuilder","legacyId","getMergedProductData","variant","additional_message","additional_message_icon","additional_message_link","internationalId","unit_quantity","rangeData","label_range","rawPrice","image_alt_text","highlighted","dataTransformObjectProductType","getMergedProductMachineData","ratingsAndReviews","ratings","colors","max_colors","show_ratings","minimum_rating","getMergedProductAccessoryData","getMergedProductGiftCardData","_","default_image","getAddToCartProps","commonProps","label_capsules","capsule_price_label","capsule_price_syntax","show_sleeve","sleeve_syntax","number_of_sleeves","label_sleeves","label_sleeve","popin","popin_id","close","quick_view_plp","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","campaign","copywriting","sku_quick_view","pdpURLs","dispatchEvent","eventName","args","event","CustomEvent","detail","bubbles","Event","createEvent","initEvent","readEvent","emitCustomEvent","customEvent","cancelable","composed","eventsHelper","eventListeners","eventListener","addEventListener","listener","remove","removeEventListener","raisedByPB","raisedByWC","eventData","gtmDataObject","undefined","event_GA4","eventRaisedBy","event_raised_by","trackComponentInteraction","creative","actionType","internationalName","productType","technology","eventAction","component_name","action_type","item_id_event","item_name_event","item_category_event","item_technology_event","item_range_event","item_price_event","eventCategory","eventLabel","viewPromotion","ecommerce","Object","keys","ecommerceData","promotion_id","promotion_name","creative_slot","creative_name","handlePromoClick","cta_name","cleanedData","selectPromotion","getProductInfo","getProductPayload","actionField","unitPrice","inStock","item","split","pop","dimension44","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","productImpression","list","p","productInfo","productPayload","currencyCode","impressions","productClick","click","filterActionEvent","filterType","filterValues","clickLocation","dataType","getExplicitFilterEventData","NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING","experiment_action","filter_type","filter_values","click_location","Sku","isQuickViewPlp","boundOnPDPLinkClick","onPDPLinkClick","bind","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","show_view","renderVisual","renderHeader","renderInformation","renderQuickView","renderPricing","renderAction","renderFooter","bindEvent","renderHeaderDefault","renderLogos","alt_fair_trade","alt_organic","alt_vertuo_next","alt_rainforest","alt_sustainable","alt_q_certification_arabica","logos","renderVisualDefault","theme","hasAttribute","renderImage","renderClass","linkHref","trim","sleevePrice","hasPricePerSleeve","renderInformationDefault","renderLabelTechnology","label_technology","renderLabelRange","renderHeadline","is_headline_hidden","quick_view","tracking_list","tracking_position","campaign_creative","colorsSkusList","renderPricingDefault","isPortrait","renderPrice","giftcard_price","finalPrice","renderActionDefault","actionSlot","outerHTML","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","size","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","yi","handlePLPVariation","createElement","heading","rs","handleCrossSellVariation","more_info","parentElement","newQuickViewElement","getSkuQuickViewData","preventDefault","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","querySelectorAll","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","bus","_bus","register","callback","fire","EventBus$1","Cta","observedAttributes","boundHandleClick","handleClick","slot","aria_label","aria_label_after","aria_label_before","contrast","icon_left","icon_right","label_update","link_new_tab","long_sku","transparent","ariaLabel","textClass","removeListeners","addListeners","track","event_id","qs_id","EventBus","openQuantitySelector","campaign_id","campaign_name","campaign_position","campaign_instance_index","tracking_slot_prefix","sku_data","ctaOrPopin","slotContent","instanceIndex","cta_name_value","tabbed_component","componentName","attributeChangedCallback","setTimeout","LAZYLOAD_CUSTOM","PROFILES","sizes","Img","__privateAdd","_initLazyLoad","_setImPolicyQuery","_getRetinaWidth","_getImpolicyProfile","_getClosests","_setCssProperties","_setCssProperty","__privateMethod","initLazyLoad_fn","file","lazyload","fetchpriority","setImPolicyQuery_fn","setCssProperties_fn","parentClass","firstElementChild","WeakSet","#initLazyLoad","#setImPolicyQuery","aspect_ratio","force_width","force_height","impolicy","width","offsetWidth","w","h","finalWidth","getRetinaWidth_fn","getImpolicyProfile_fn","#getRetinaWidth","#getImpolicyProfile","exactFound","closests","getClosests_fn","tempDiff","diff","closest","#getClosests","every","profile","found","el","#setCssProperties","object_fit","placeholder_color_light","placeholder_color_dark","error_message","setCssProperty_fn","#setCssProperty","setProperty","Link","setClassHelper","bindEvents","image_alt","renderButton","tracking_label","a11y_label_new_tab","selected","phantom","cta_link_type","sizeClass","sku_colors","quickView","linkOrPopin","unbindEvents","Viewport","observer","IntersectionObserverEntry","onChange","threshold","rootMargin","Element","observables","observable","requestIdleCallback","runTrack","zoneTracking","tracking","ZoneTracking","destroy","getIom","hasIntersectionObserver","isObjectEmpty","Container","initTracking","initLazyLoad","getBgImgUrl","lazy_load","background_mobile","background_tablet","background_desktop","background_retina","styles","background_color","classname","element_class","contrastDefault","hasBgImage","renderBg","d","r","Chip","checkbox","computedSlot","computeSlot","onclick","content","background_image","filter_label_AA","rounded","checked","disabled","checkedAttr","disabledAttr","inputId","hash","charCodeAt","makeHash","getElementsByTagName","newValue","recursiveSwitchAriaHidden","componentOpenState","parent","brothers","children","brother","removeAttribute","focusin","loop","contains","lastFocused","firstFocusable","lastFocusable","focus","setFirstAndLastFocusable","focusable","Dropdown","isOpen","buttonElement","onClickOutside","aa_description","element_id","element_name","renderSelected","renderOptions","buttonElementValue","dropdownMenu","selectedOption","aa_listbox_description","aa_select_description","icon_option","boundHandleLabelClick","handleLabelClick","boundHandleMobileClose","handleMobileClose","boundFocus","boundFocusin","boundKeyNav","keyNav","toogleDropdown","selectedOptionId","dataset","reRender","selectedlabel","setSelected","dispatchChange","tmpSelected","open","switchAriaModal","openingSource","activeElement","prevOption","nextOption","firstOption","lastOption","prevSibling","previousElementSibling","nextSibling","nextElementSibling","ProductTracking","range","noImpression","getPLPCategory","getPLPData","configuration","eCommerceData","getCategoriesWithPlpData","cupSizes","flavors","ranges","Promise","categoryData","isTechnologyCategory","getCategories","supercategories","superCategory","getCategory","code","buildGTMProductObject","capitalize","s","toUpperCase","dimension130","productSelections","impressionsOnScrollData","dimension43","parseInt","AddToCart","elementID","addToCartCounter","isWindowNapiActive","getConfig","pushButton","getElementById","ui","module","productId","activated","resolve","productTracking","getProductData","getSkuKey","plpData","allKeys","currentKeyIndex","__publicField","_AddToCart","SLIDER_CHIPS_ID","PlpStickyBar","boundReinitSlider","reinitSlider","boundLinkClick","linkClick","dropdownButtons","navigation","navigation_bubbles","renderLinksSelect","renderChipsSlider","dropdown","navigationBubble","links","a11y_slider_previous_button","a11y_slider_next_button","selected_nav_link_label","forceSliderWidth","dropdownWidth","navigationBubbleWidth","initSlider","currentTarget","location","href","swipeEvents","stopEl","nwcSwipeEvents","scrollTopArray","scrollLeftArray","scrollTop","scrollLeft","memorizeStartElScrollPositions","startEl","timeDown","Date","now","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","innerHeight","defaultHorizontal","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","abs","checkScrollCondition","dir","touchType","xStart","xEnd","yStart","yEnd","isScrollable","scrollHeight","clientHeight","scrollWidth","clientWidth","attributeName","defaultValue","documentElement","attributeValue","String","Overlay","overlay","getElementsByClassName","STATE_OPEN","SCROLL_LOCK","Popin","ariaModal","isVideo","boundOpen","boundClose","boundEscapeClose","escapeClose","oldValue","hasEvent","subheading","bgcolor","label_close","heading_class","heading_id","checkIsVideo","parseBool","tempEl","addLock","removeLock","cancelBubble","openVideoPopin","swipeDown","swipeOverlayTogglePlayPause","boundSwipeDown","swipeOverlay","boundSwipeOverlayTogglePlayPause","CardLogos","logos_list","param","appendLogo","apply","logo","alt","hasLogo","logosList","logoName","slidesContainer","next","prev","colours","SliderMenu$1","boundNextClick","onNextClick","boundPrevClick","onPrevClick","onLinkClick","boundTouchEnd","onTouchEnd","disableAutoScroll","_entriesBounds","_element","_slides","_options","last_known_scroll_position","ticking","navBarTravelDirection","navBarTravelling","navBarTravelDistance","scrollAmount","buildIHM","setOverflowAttribute","initializeIndicatorPosition","_root","_container","_pnIndicator","_containerSlidesContent","hasContainer","constants","wrapItems","insertBefore","createIndicator","child","randId","tag","className","div","elements","from","pnAdvancerLeft","pnAdvancerRight","goToElement","goToSlide","showContent","contentId","deselectAllLinkBut","distance","boundingClientRect","scroll","left","behavior","sideScroll","speed","step","slideTimer","setInterval","clearInterval","moveIndicator","determineOverflow","container","containerMetrics","getBoundingClientRect","containerMetricsRight","right","containerMetricsLeft","contentMetrics","contentMetricsRight","contentMetricsLeft","textPosition","transform","link_plp_category_padding_x","backgroundColor","onResize","clearListeners","kill","intersection","disconnect","root","isInViewport","entryBound","SliderMenu","randomId","sliderMenu","boundOnResize","onLoad","debouncedOnResize","debounce","func","time","timer","clearTimeout","loadSwiper","SliderMenuLib","li","firstChild","itemTypes","itemDisplay","rootElement","slider","onNavigationClick","SliderNatural","_waitForSliderToBeSized","_set","_getOption","_setProperties","_render","_renderButtons","_renderButton","_renderNav","_renderBullet","_renderCounter","_renderGradients","_renderSafariFix","_calculateItemsPerSlide","_getSliderPositions","_setCss","_setCssSlideWidth","_setCssSlideMinHeight","_setCssSliderGap","_setCssFlexAuto","_setCssPlaceholder","_setCssItemsPerSlide","_applyCenteredLayout","_updateStates","_updateStatesScroll","_setActiveButtons","_setActiveBullet","_setCounter","_setActiveSlides","_gotoDefaultPosition","_onScroll","_getOpacityParams","_setOpacity","_switchBullets","_onPrevClick","_onNextClick","_onNavClick","_dispatchReady","_bindEvent","_unbindEvent","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","onPrevClick_fn","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","render_fn","testId","setProperties_fn","loops","waitForSliderToBeSized_fn","dispatchReady_fn","finally","wait","slidesElements","itemNumber","set_fn","item_width","items_per_slide","calculateItemsPerSlide_fn","setCssSlideWidth_fn","setCssItemsPerSlide_fn","setCssFlexAuto_fn","maxSlides","renderButtons_fn","renderNav_fn","renderCounter_fn","renderGradients_fn","applyCenteredLayout_fn","getSliderPositions_fn","getOpacityParams_fn","setOpacity_fn","updateStates_fn","bindEvent_fn","gotoDefaultPosition_fn","renderSafariFix_fn","updateSlider","instantly","currentIndex","carousel","scrollTo","sliderPositions","unbindEvent_fn","#waitForSliderToBeSized","reject","#set","normalisedValue","getOption_fn","convertToCamelCase","arr","match","low","k","#getOption","isNaN","parseFloat","#setProperties","a11y_labels","wrapper","property","buttonsContrast","setCssSlideMinHeight_fn","setCssSliderGap_fn","setCssPlaceholder_fn","#render","#renderButtons","prevButton","nextButton","renderButton_fn","#renderButton","pos","renderInCounter","buttonContrast","isPrev","buttonEl","counter","prepend","append","#renderNav","nav","bullets","renderBullet_fn","navElements","#renderBullet","#renderCounter","#renderGradients","gradientsWidth","setCss_fn","gradientsColor","#renderSafariFix","isSafari","safariFix","safariFixWidth","paddingCorrection","sliderGap","#calculateItemsPerSlide","itemWidth","#getSliderPositions","maxScroll","firstItemOffsetLeft","offsetLeft","#setCss","isRem","#setCssSlideWidth","itemWidthAuto","#setCssSlideMinHeight","slideMinHeight","#setCssSliderGap","#setCssFlexAuto","#setCssPlaceholder","placeholderBackground","#setCssItemsPerSlide","#applyCenteredLayout","#updateStates","setActiveButtons_fn","setActiveBullet_fn","setCounter_fn","setActiveSlides_fn","updateStatesScroll_fn","#updateStatesScroll","#setActiveButtons","#setActiveBullet","#setCounter","#setActiveSlides","tempIndex","#gotoDefaultPosition","#onScroll","isScrolling","carouselScrollLeft","switchBullets_fn","#getOpacityParams","getComputedStyle","getPropertyValue","itemWidthAdjusted","#setOpacity","scrollX","itemX","percentage","opacityPercentage","finalOpacity","#switchBullets","alreadyScrolled","#onPrevClick","#onNextClick","#onNavClick","#dispatchReady","#bindEvent","#unbindEvent","createRefs","extract","refs","$ref","refArray","getRefArray","getImpolicy","policy","rules","STATE_DISABLED","Bubble","setState","src_retina","visual","getResponsiveImpolicy","mobileWidth","tabletWidth","desktopWidth","retinaWidth","state","a11y_scrollto","renderLabel","setTheme","IntersectionObserverService","observers","Map","create","has","warn","targets","set","delete","destroyAll","clear","Deferred","promise","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","top","currentTime","initialTimestamp","performance","deltaScroll","resolveScrollDuration","viewportHeight","bodyHeight","finalTimestamp","requestAnimationFrame","currentTimestamp","moveStep","EVENT_NAVIGATION_SECTION_CHANGE","NB_SLIDES_STICKY","INTERSECTION_RATIOS_SECTION","SLIDER_CONFIG_DEFAULT","display_gradients","display_nav","placeholder_background","slide_min_height","slider_gap","NavigationBubbles","isMobile","scrollObserver","sticky","isSticky","isCenteredItems","is_centered_items","init","eventsListeners","bindSliderLinksEvents","geometry","getGeometry","onSliderLinkClick","$event","sectionId","finalLabel","plpListLabel","bubbleLabel","onSectionChange","updateBubbles","updateChips","createListeners","once","updateLayout","eventsManager","renderNavigation","getSliderOptions","flex_auto","gradients_color","gradients_width","slider_id","a11y_goto_slide","renderList","sliderOptions","sliderData","display_buttons","renderFunction","bubble","renderBubble","bubbleWithCampaign","renderChip","chip","bubbleId","chips","chipId","isChecked","_index","sliderChip","emit","header","stickyBarHeight","height","scrollOptions","preventScroll","$header","$stickyBar","headerRect","y","stickyBarRect","runningExperiments","Set","runningExperiment","experiment","EXPLICIT_FILTERS","FILTER_MAIN_BLOCK_ID","SORT_MENU_ID","POPIN_ID","NAVIGATION_MAIN_BLOCK_ID","PRODUCTS_LIST_MAIN_BLOCK_ID","PRODUCTS_RESULTS_MAIN_BLOCK_ID","CB_RESULTS_TOTAL_ID","MY_RECOMMENDATIONS_ID","QUERY_URL_PARAMETER_FILTERS","QUERY_URL_PARAMETER_SORT","appData","_productsFlat","sessionId","plpType","plpDataType","reload","initPriceFormatter","initCurrency","read","filters","productsList","getProducts","acc","concat","productsListFiltered","withSort","selectedFilters","filterPredicate","filterProductsByFilterType","doesProductMatchFilter","filterProductsByAllFilters","filteredList","sortCurrent","order","sorter","isAscending","a","b","createSorter","sort","sortProducts","productsFilteredCount","filtersUpdate","filterSelection","fireAll","f","setFilterValue","filterChipsUpdate","filtersUpdateMultiple","valueSelections","filtersSelected","filterValueIsEqual","filtersSelectedWithLabel","filterKey","filterValue","foundFilter","filterLabel","values","v","categoryTitle","title","filtersSelectedCount","filtersSelectedSerialized","filtersReset","filterChip","productCount","predicate","subscribe","fn","unsubscribe","fnToRemove","productPropValue","groups","current","groupFiltersByType","types","splice","fSelected","updateUrlVariable","variable","queryArray","path","updateQueryStringParameter","uri","re","separator","encodeURIComponent","pushState","getUrlVariable","queryString","search","URLSearchParams","decodeURIComponent","defaultTracking","getSortTracking","isSorted","sortKey","sortOrder","getFilterTracking","isFiltered","__crema_service__","pageStores","signalStore","ProductsList","signal","ProductDetails","HeaderNavigation","setPageHtml","getStore","pageHtml","getModuleData","moduleName","setModuleData","parser","loadFromUrl","cacheOnly","batch","store","debug","response","fetch","ok","status","statusText","fetchHtml","parseModuleData","moduleScript","scripts","script","parseHtml","lines","line","trimmed","startsWith","jsonString","parseProductScript","appStates","appEvents","process","handlePostEvent","appStatesHandler","err","loadFromPage","onReload","urlObj","URL","pathname","history","simulatePageChange","_data","onloadSuccess","nextState","onloadError","showError","onMergeData","filtersService","productService","dataSortService","recommendationService","recommendationInstance","mergeData","recommendation","readyToLoadProducts","loadProducts","newData","enabledTechnologies","isSelected","at","translations","nav_links","hide_sort_and_filter","maxIntensity","getTrackingData","mergeProductData","categoriesExtraData","mergeFilters","urlFilters","filterData","cleanFilterDataXSS","source","cleanData","sourceItem","isLast","urlSort","sortData","cleanSortDataXSS","setUrlOverrides","notCurrentTech","handleExperiments","trackLoad","switchProductsPage","readyForShowResults","readyForPlay","onMergeDataError","onFilter","grouped","replaceAll","groupSelectedFilters","groupKeys","filterTrackingFromPlpFilters","onSort","trackInteraction","onloadFilter","onloadFilterSuccess","readyForFilter","onloadFilterError","handleAppEvent","customEventName","eventFn","stateTransitionsManager","_SORT_MENU_ID","WeakMap","formatSortSeparator","componentUpdated","boundOnSortChange","onSortChange","__privateGet","sortButton","_filters","isDisabled","onStoreChanges","labelEl","getLabel","__privateSet","renderBefore","renderAfter","handleChipEvent","itemValue","CATEGORY_IDENTIFIER","a11y_see_result_number_label","getA11ySeeResultsText","see_result_number_label","see_result_number_label_one","filtersTracking","btnReset","btnResult","visibility","see_result_number_label_zero","eventPopinClsed","arguments","bubbleElement","oldVal","newVal","updateBubbleCounter","cta_filter_label","SLIDER_NAV_LINKS_ID","renderLinksList","label_sort_by","aa_description_sort_by","aa_listbox_description_sort_by","aa_select_description_sort_by","label_close_sort_by","_formatSortValue","updateComponent","HTML","filterLinks","service","stickyService","elementHeight","stickyElementSelector","magicIndex","initialize","updateSticky","offsetElement","isReady","offsetTop","offsetHeight","paddingTop","$element","$elementHeight","$stickyElementSelector","$magicIndex","updatePosition","offset","nav_link","data_navigation_bubbles","dataTransformNavigationBubbles","customEventAction","navLinks","dataTransformNavLinks","_isSticky","getNamedItem","navigationBar","a11y_label","colorHtml","renderProduct","getSkuComponentByType","is_machine_b2b","_headerSelector","_resetSelector","shouldHideHeader","productListBkp","headerMarkup","copywritingProps","a11y_header_result_label_button","a11y_header_result_label_reset","a11y_header_result_label_results","header_result_label","header_result_label_reset","header_result_label_results","header_result_label_results_one","header_result_label_results_zero","total","filterLabels","getResultLabel","arraysAreEqual","outerhtml","hasFilters","listName","resetClick","categoryProducts","PLPApp","dataTransformService","dataFiltersService","propChanged","valueChanged","defineTemplate","enabledExperiments","enableExperiment","info","itemsPerRow","items_per_row","Category","PageBuilderData","_id","_name","_description","_products","_capacityLabel","_detailsIcon","_icon","_isLoadingProducts","_rangeLink","_subCategories","_superCategories","_url","_background_retina","_background_desktop","_background_mobile","_background_tablet","_contrast","_isSegment","capacityLabel","detailsIcon","rangeLink","subCategories","superCategories","isLoadingProducts","isProductCategory","AccessoryCategory","Product","available","maxOrderQuantity","packagingType","pushRatingEnabled","altText","AccessoryProduct","collections","navigationLinks","enabledCremaTechnologies","VERTUO_ICON","PRO_ICON","transformCremaTechnologiesToLink","getIconByTechnology","COFFEE_ORIGINAL","hide_technologies_in_navigation","replaceCremaTechnologies","all_products_navigation_label","selectedTechnology","t","navLinksWithoutTechnology","navigationBubbles","productGroups","productsGroup","bubblesFilteredAndSorted","bubblesMathProductsGroup","normalizedBubble","ele","cremaCategory","cremaBubble","unshift","addLabels","highlightLabels","textColor","parsedData","parseLabels","labelGroups","group","__label","productIds","prod","labelGroup","indexToRemove","productGroup","MainDTO","colorFilterFunction","getOverridenProductGroups","applyRecommendationOverrides","getPBProperty","pbProduct","pbProductData","display_machine_range_name","applyProductsOverrides","overriddenCategories","extraData","catData","category_id","categoryObj","productID","productObj","Boolean","applyCategoryOverrides","original","vertuo","getMergedPLPData","Filter","_filter","_type","_key","_iconFn","_filterFn","_title","_values","_after","_before","showalllabel","iconFn","filterFn","before","after","pushValues","x","DefaultFilterChipType","_value","_label","_filterType","_filterKey","_color","_selected","_disabled","productCountLabel","getMergedFilterData","PBprops","filterDefinition","categoriesData","fieldValue","getCategoryData","findCategory","cssColorCode","createFilter","getMergedSortData","dropdown_recommended_option_label","dropdown_price_ascending_option_label","dropdown_price_descending_option_label","dropdown_name_ascending_option_label","dropdown_name_descending_option_label","productList","productsResults","cbResultsTotalText","plpFilterPopin","errorMessage","PLPAccessory"],"mappings":"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"}