{"version":3,"file":"index.es.min.js","sources":["../../../packages/components/src/colors/components/color/constants.mjs","../../../packages/helpers/src/props.helpers.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/components/src/constants.mjs","../../../packages/helpers/src/getCurrency.js","../../../packages/helpers/src/catalog.js","../../../packages/page-builder-sections/src/cross-sell/services/fetcher.service.js","../../../packages/components/src/colors/components/color/color.js","../../../packages/components/src/colors/colors.js","../../../packages/components/src/colors/constants.mjs","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/sku/fragments/heading.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/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/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/quickView.js","../../../packages/components/src/sku/fragments/price.js","../../../packages/helpers/src/colors.helpers.js","../../../packages/helpers/src/rating.service.js","../../../packages/components/src/sku-machine/fragments/ratings.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/sku-machine/sku-machine.js","../../../packages/helpers/src/energy-label.helpers.js","../../../packages/components/src/sku-machine/fragments/voltage.js","../../../packages/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/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-machine/models/machine.category.js","../../../packages/apps/src/plp-core/models/Product.js","../../../packages/apps/src/plp-machine/models/machine.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-machine/dataTransform/plp-machine.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-machine/dataTransform/plp-machine.filterPrice.dto.js","../../../packages/apps/src/plp-machine/dataTransform/plp-machine.filters.dto.js","../../../packages/apps/src/plp-machine/dataTransform/plp-machine.sort.dto.js","../../../packages/apps/src/plp-core/store/plp.states.js","../../../packages/apps/src/plp-machine/plp-machine.component.js"],"sourcesContent":["export const EVENT_COLOR_CLICKED = 'EVENT_COLOR_CLICKED'\n","const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n    const data = getData([...attributes])\n    const props = [...attributes]\n        .filter(attribute => attribute.nodeName !== 'data')\n        .reduce((all, attr) => {\n            return { ...all, [attr.nodeName]: attr.nodeValue }\n        }, {})\n\n    if (isNil(data)) {\n        return props\n    }\n\n    try {\n        return { ...props, ...JSON.parse(data.nodeValue) }\n    } catch (error) {\n        console.log('ERROR: No data', error, data?.nodeValue)\n    }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","export const dispatchEvent = ({ eventName, args, element }) => {\n    // Use the provided element or fallback to window if available\n    if (!element) {\n        if (typeof window !== 'undefined') {\n            element = window\n        } else {\n            throw new Error(\n                '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n            )\n        }\n    }\n\n    let event\n    if (args) {\n        event = new CustomEvent(eventName, { detail: args, bubbles: true })\n    } else {\n        if (typeof Event === 'function') {\n            event = new Event(eventName)\n        } else {\n            event = document.createEvent('Event')\n            event.initEvent(eventName, true, true)\n        }\n    }\n    element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n    if (!e.detail) {\n        return\n    }\n    return e.detail\n}\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n    default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n    us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n    uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566',\n    kr: 'https://apps.apple.com/kr/app/%EB%84%A4%EC%8A%A4%ED%94%84%EB%A0%88%EC%86%8C-%EB%B6%80%ED%8B%B0%ED%81%AC/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n    'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","export const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n    const techno = productData.technologies[0]\n    return techno.substring(\n        techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n    )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n    return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n    if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n        // Sleeve of original or vertuo\n        return product.sales_multiple / SLEEVE_OF_10\n    }\n\n    if (\n        product.sales_multiple !== 1 &&\n        getTechnologyNameFn(product) === COFFEE_VERTUO &&\n        isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n    ) {\n        // Sleeve of vertuo\n        return product.sales_multiple / SLEEVE_OF_7\n    }\n\n    if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n        // Bundle of original or vertuo\n        return product.unitQuantity / SLEEVE_OF_10\n    }\n\n    if (\n        product.sales_multiple === 1 &&\n        getTechnologyNameFn(product) === COFFEE_VERTUO &&\n        isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n    ) {\n        // Bundle of vertuo\n        return product.unitQuantity / SLEEVE_OF_7\n    }\n\n    return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n    // TODO: this function should not change the productData, but some components still need it\n    productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n    const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n    const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n    const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n    const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n    // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n    if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n        return false\n    }\n\n    // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n    return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n    const promises = []\n\n    if (!napi) {\n        return Promise.reject()\n    }\n\n    if (!Array.isArray(skus)) {\n        skus = [skus]\n    }\n\n    // Load manually the product to delete SKU fail\n    for (const sku of skus) {\n        promises.push(\n            getProductFn(sku)\n                .then(data => skus.splice(skus.indexOf(sku), 1, data))\n                .catch(() => {\n                    skus.splice(skus.indexOf(sku), 1)\n                    console.error(`getProduct fail on sku ${sku}`)\n                })\n        )\n    }\n\n    return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n    const priceFormatter = await getPriceFormatter()\n    const currency = getCurrency()\n\n    return priceFormatter.html\n        ? priceFormatter.html(currency, price)\n        : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n    const productDetails = await getProduct(sku)\n    const productCategories = productDetails ? productDetails.supercategories : []\n    const productCategoriesNew = await Promise.all(\n        productCategories.map(async categoryEncoded => {\n            const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n            return productCategoryData\n        })\n    )\n    return productCategoriesNew\n}\n","import {\n    getProduct,\n    getProductCategories,\n    ECAPI_TYPE_CAPSULE,\n    ECAPI_TYPE_GIFT_CARD\n} from '@kissui/helpers/src/catalog'\n\n/**\n * Api fetcher service\n *\n * @returns {object}\n */\nconst fetcher = () => {\n    const apiRatings = window.napi && window.napi.ratings\n    const apiPriceFormat = window.napi && window.napi.priceFormat\n    let priceFormatter = null\n\n    const loadPriceFormat = async () => {\n        priceFormatter = await apiPriceFormat()\n    }\n\n    const getApiProduct = async sku => await getProduct(sku)\n\n    /**\n     * Get all products merged with data coming from API\n     *\n     * @returns {Promise<array>}list of products\n     * @param productList\n     * @param withRating\n     */\n    const getAll = (productList, withRating) =>\n        Promise.all(\n            productList.map(async product => {\n                try {\n                    const fetchedProduct = await getOne(product, withRating)\n                    productList.splice(productList.indexOf(product), 1, fetchedProduct)\n                } catch (error) {\n                    productList.splice(productList.indexOf(product), 1)\n                }\n            })\n        )\n\n    /**\n     * Get product merged with data coming from API\n     *\n     * @returns {Promise} product\n     * @param product\n     * @param withRating\n     */\n    const getOne = async (product, withRating) => {\n        try {\n            return await fetchOne(product, withRating)\n        } catch (error) {\n            console.error(`Fetch for product ${product.sku} failed: ${error}`)\n            throw error\n        }\n    }\n\n    /**\n     * Fetch and merge product with data coming from API\n     *\n     * @param {object} product - base product from static data\n     * @param apiProduct\n     * @param withRating\n     * @param list\n     * @returns {Promise<object>} Product\n     */\n    const fetchOne = async (product, withRating) => {\n        const { api_override: { name = '', headline = '', description = '' } = {} } = product\n\n        const apiProduct = await getApiProduct(product.sku)\n        const productCategories = await getProductCategories(product.sku)\n\n        const overrides = {\n            name: name !== '' ? name : apiProduct.name,\n            headline: headline !== '' ? headline : apiProduct.headline,\n            description: description !== '' ? description : apiProduct.description,\n            longSku: apiProduct ? apiProduct.id : null,\n            price: apiProduct ? apiProduct.price : null,\n            pdp_urls: getValueObject(apiProduct, 'pdpURLs'),\n            images: apiProduct.images,\n            slides: apiProduct.slides,\n            technologies: apiProduct.technologies,\n            type: apiProduct.type,\n            productCategories\n        }\n\n        if (withRating && product.productRatings?.ratingEnabled) {\n            overrides.rating = await getRating(product, apiProduct)\n        }\n\n        if (apiProduct.type === ECAPI_TYPE_CAPSULE) {\n            overrides.bundled = apiProduct.bundled\n            overrides.intensity = apiProduct.capsuleProperties?.intensity || 0\n            overrides.unit_quantity = getValueNumber(apiProduct, 'unitQuantity', 1)\n            overrides.sales_multiple = getValueNumber(apiProduct, 'salesMultiple', 10)\n        }\n\n        if (apiProduct.type === ECAPI_TYPE_GIFT_CARD) {\n            if (!product.variant.giftcard_price) {\n                throw new Error('Gift Card amount price is not defined')\n            }\n\n            overrides.price = product.variant.giftcard_price\n            overrides.images = { icon: product.variant.default_image }\n        }\n\n        return { ...merge(product, apiProduct), ...overrides }\n    }\n\n    /**\n     * Merge products based on static product existing keys\n     * A shallow copy is made to prevent original object mutation\n     *\n     * @param {object} product\n     * @param {object} apiProduct\n     * @param {boolean} force Force property override\n     * @returns {object} Product\n     */\n    const merge = (product, apiProduct, force = false) => {\n        const mergedProduct = { ...product }\n\n        if (!apiProduct) {\n            return mergedProduct\n        }\n\n        for (const key of Object.keys(mergedProduct)) {\n            const empty = mergedProduct[key] === '' || mergedProduct[key] === '0'\n            if (key in apiProduct && (empty || force)) {\n                mergedProduct[key] = apiProduct[key]\n            }\n        }\n\n        return mergedProduct\n    }\n\n    /**\n     * @param {object} apiProduct\n     * @returns {number}\n     */\n    const getValueNumber = (apiProduct, key, defaultValue) =>\n        parseInt((apiProduct && apiProduct[key]) || defaultValue)\n\n    /**\n     * @param {object} apiProduct\n     * @returns {object}\n     */\n    const getValueObject = (apiProduct, key) => {\n        return apiProduct && Object.keys(apiProduct[key]).length > 0 ? apiProduct[key] : {}\n    }\n\n    /**\n     * @param {string} sku\n     * @returns {Promise<number>} Rating value\n     */\n    const getRating = async ({ sku }, apiProduct) => {\n        if (\n            !apiRatings ||\n            (apiProduct && apiProduct.productRatings && !apiProduct.productRatings.ratingEnabled)\n        ) {\n            return toFloat(0, 1)\n        }\n\n        try {\n            const { ratingAverage = 0 } = await apiRatings().summary(sku)\n            return toFloat(ratingAverage !== 0 ? ratingAverage : 0, 1)\n        } catch (error) {\n            console.error(`Product rating fetch failed on sku ${sku}`, error)\n            return toFloat(0, 1)\n        }\n    }\n\n    /**\n     * Get currency from datalayer\n     * @returns {string}\n     */\n    const _getCurrency = () => {\n        const { dataLayer = {} } = window[window.config.padl.namespace]\n        return dataLayer.app?.app?.currency\n    }\n\n    /**\n     * @returns {string}\n     * @param price\n     */\n    const formatPrice = price => {\n        const { short } = priceFormatter\n        return short(_getCurrency(), price)\n    }\n\n    /**\n     * @param {number} value\n     * @param {number} decimal\n     * @returns {number}\n     */\n    const toFloat = (value, decimal = 2) => parseFloat(value).toFixed(decimal)\n\n    return {\n        loadPriceFormat,\n        getApiProduct,\n        getAll,\n        getOne,\n        fetchOne,\n        merge,\n        formatPrice\n    }\n}\n\nexport default fetcher()\n","import { EVENT_COLOR_CLICKED } from './constants.mjs'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nclass color extends HTMLElement {\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n        this.createEventListeners()\n    }\n\n    createEventListeners() {\n        this.addEventListener('click', this.handleClick)\n    }\n\n    render() {\n        const { link, label, code, a11y_label = 'color', selected, size = 'large' } = this.props\n\n        const element = document.createElement(link ? 'a' : 'button')\n\n        if (link) {\n            element.setAttribute('href', link)\n        }\n        if (label) {\n            element.setAttribute('title', label)\n            element.setAttribute('aria-label', `${label} ${a11y_label}`)\n        }\n        if (selected === 'true') {\n            element.setAttribute('class', 'selected')\n        }\n\n        this.classList.add(size)\n\n        element.innerHTML = `\n            <div><span style=\"background-color: ${code}\"></span></div>\n        `\n        this.innerHTML = element.outerHTML\n    }\n\n    handleClick() {\n        const { sku } = this.props\n        dispatchEvent({\n            element: this,\n            eventName: EVENT_COLOR_CLICKED,\n            args: { sku }\n        })\n    }\n}\n\ncustomElements.get('nb-color') || customElements.define('nb-color', color)\n\nexport default color\n","import { EVENT_COLOR_CLICKED } from './components/color/constants.mjs'\nimport { DEFAULT_MAX_COLOR_COUNT, EVENT_COLOR_CHANGE } from './constants.mjs'\n\nimport createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport fetcherService from '@kissui/page-builder-sections/src/cross-sell/services/fetcher.service'\nimport './components/color'\n\nclass Colors extends HTMLElement {\n    constructor() {\n        super()\n        this._apiProducts = {}\n        this._colors = []\n        this._maxColors = DEFAULT_MAX_COLOR_COUNT\n    }\n\n    async connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.updateMaxColors()\n\n        await this.fetchColors()\n\n        this.render()\n        this.createEventListeners()\n    }\n\n    hasColorData() {\n        return this.props.colors && this.props.colors.every(this.hasAllProps)\n    }\n\n    hasAllProps(color) {\n        return color.sku != null && color.name != null && color.code != null\n    }\n\n    createEventListeners() {\n        this.addEventListener(EVENT_COLOR_CLICKED, this.onColorChange)\n    }\n\n    render() {\n        const { heading = '' } = this.props\n\n        this.innerHTML = `\n            ${heading ? `<p class=\"t-sm-400-sl\">${heading}</p>` : ``}\n            ${this.renderColors()}${this.renderExtraColors()}\n        `\n    }\n\n    renderColors() {\n        return this._colors.map(this.renderColor.bind(this)).join('')\n    }\n\n    renderColor(color) {\n        const { a11y_label = '', activeSku, size = 'large' } = this.props\n        const { code = '', name = '', link = '', sku = '' } = color\n        this.classList.add(size)\n\n        return `\n            <nb-color\n                code=\"${code}\"\n                label=\"${name}\"\n                link=\"${link}\"\n                sku=\"${sku}\"\n                selected=\"${sku === activeSku}\"\n                ${a11y_label ? `a11y_label=\"${a11y_label}\"` : ''}\n                size=\"${size}\"\n            ></nb-color>\n        `\n    }\n\n    renderExtraColors() {\n        const { colors = [], extra_url, extra_title } = this.props\n        const extraColorsLength = Math.max(0, colors.length - this._maxColors)\n        if (extraColorsLength <= 0 || !extra_url) {\n            return ''\n        }\n\n        return `\n            <nb-link\n                size=\"small\"\n                color=\"black\"\n                seo_label=\"${extra_title}\"\n                aria-label=\"${extra_title}\"\n                link=\"${extra_url}\"\n            >+${extraColorsLength}</nb-link>`\n    }\n\n    async fetchColors() {\n        if (this.hasColorData()) {\n            this._colors = this.clampColor(this.props.colors)\n            return\n        }\n        try {\n            const preparedColors = this.prepareColors(this._maxColors)\n            await Promise.all(preparedColors.map(this.fetchColor.bind(this)))\n        } catch (error) {\n            console.error(`Fetch for colors failed: ${error}`)\n        }\n    }\n\n    async fetchColor(color) {\n        const { prevent } = this.props\n        const apiProduct = await fetcherService.getApiProduct(color.sku)\n        const apiColor = {\n            code: apiProduct.colorShade.cssCode,\n            name: apiProduct.colorShade.name,\n            link: prevent === undefined ? apiProduct.pdpURLs.desktop : ''\n        }\n        this._apiProducts[color.sku] = apiProduct\n        this._colors.push({ ...color, ...apiColor })\n    }\n\n    prepareColors() {\n        const { colors = [] } = this.props\n        return this.clampColor(colors).filter(this.hasSKU)\n    }\n\n    clampColor(colors) {\n        return colors.slice(0, this._maxColors)\n    }\n\n    hasSKU(colorItem) {\n        return colorItem.sku != null && colorItem.sku !== ''\n    }\n\n    updateMaxColors() {\n        const { max_colors } = this.props\n        if (max_colors) {\n            this._maxColors = parseInt(max_colors)\n        }\n    }\n\n    onColorChange($event) {\n        const { sku } = readEvent($event)\n        const productData = { ...this._apiProducts[sku], sku }\n        if (productData) {\n            dispatchEvent({\n                element: this,\n                eventName: EVENT_COLOR_CHANGE,\n                args: { productData }\n            })\n        }\n    }\n}\n\n// Registers custom element\ncustomElements.get('nb-colors') || customElements.define('nb-colors', Colors)\n\nexport default Colors\n","export const DEFAULT_MAX_COLOR_COUNT = 4\nexport const EVENT_COLOR_CHANGE = 'EVENT_COLOR_CHANGE'\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLabels extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.labels = []\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        const { labels = [], direction = 'column' } = this.props\n        this.classList.add(`${direction === 'row' ? 'direction-row' : 'direction-' + direction}`)\n\n        if (labels.length === 0) {\n            return ''\n        }\n        this.labels = labels\n\n        this.innerHTML = `${this.renderLabels()}`\n    }\n\n    renderLabels() {\n        return this.labels\n            .map(label => {\n                const { name = '', bgColor = '', color = '' } = label\n                return `<mark class=\"t-3xs-500-caps-sl\"\n                            ${\n                                bgColor &&\n                                color &&\n                                `style=\"background: ${bgColor}; color: ${color}\"`\n                            }>\n                            <span>${name}</span>\n                        </mark>`\n            })\n            .join('')\n    }\n}\n\ncustomElements.get('nb-card-labels') || customElements.define('nb-card-labels', CardLabels)\n\nexport default CardLabels\n","export class NespressoElement extends HTMLElement {\n    constructor() {\n        super()\n        this.template = ''\n    }\n\n    connectedCallback() {\n        this.props = this._createProps()\n        this.onStart?.()\n        this.loadTemplate()\n        this.onReady?.()\n    }\n\n    /**\n     * Load the attributes and create the props object\n     * @returns {any}\n     * @private\n     */\n    _createProps(forceAttributes = null) {\n        const attributes = forceAttributes || this.attributes\n\n        const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n        let props\n        try {\n            props = [...attributes].reduce((all, attr) => {\n                return { ...all, [attr.nodeName]: attr.nodeValue }\n            }, {})\n\n            const data = getData([...attributes])\n\n            if (data === undefined || data === null) {\n                return props\n            }\n\n            return { ...props, ...JSON.parse(data.nodeValue) }\n        } catch (error) {\n            console.log(this.nodeName, 'ERROR: No data', error)\n        }\n    }\n\n    /**\n     * Render by DOM diff\n     */\n    render(force = false) {\n        if (force) {\n            // todo review the performance of this\n            this.innerHTML = ''\n        }\n        /**\n         * Convert a template string into HTML DOM nodes\n         * @param  {String} str The template string\n         * @return {Node}       The template HTML\n         */\n        const _stringToHTML = str => {\n            const parser = new DOMParser()\n            const doc = parser.parseFromString(str, 'text/html')\n            return doc.body\n        }\n\n        /**\n         * Compare the template to the UI and make updates\n         * @param  {Node} template The template HTML\n         * @param  {Node} elem     The UI HTML\n         */\n        const _diff = (template, elem) => {\n            /**\n             * Get the type for a node\n             * @param  {Node}   node The node\n             * @return {String}      The type\n             */\n            const _getNodeType = node => {\n                if (node.nodeType === 3) {\n                    return 'text'\n                }\n                if (node.nodeType === 8) {\n                    return 'comment'\n                }\n                return node.tagName.toLowerCase()\n            }\n\n            /**\n             * Get the content from a node\n             * @param  {Node}   node The node\n             * @return {String}      The type\n             */\n            const _getNodeContent = node => {\n                if (node.childNodes && node.childNodes.length > 0) {\n                    return null\n                }\n                return node.textContent\n            }\n\n            // Get arrays of child nodes\n            const domNodes = Array.prototype.slice.call(elem.childNodes)\n            const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n            // If extra elements in DOM, remove them\n            var count = domNodes.length - templateNodes.length\n            if (count > 0) {\n                for (; count > 0; count--) {\n                    domNodes[domNodes.length - count].parentNode.removeChild(\n                        domNodes[domNodes.length - count]\n                    )\n                }\n            }\n\n            // Diff each item in the templateNodes\n            templateNodes.forEach(function (node, index) {\n                // If element doesn't exist, create it\n                if (!domNodes[index]) {\n                    elem.appendChild(node.cloneNode(true))\n                    return\n                }\n\n                // If element is not the same type, replace it with new element\n                if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n                    domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n                    return\n                }\n\n                // If content is different, update it\n                const templateContent = _getNodeContent(node)\n                if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n                    domNodes[index].textContent = templateContent\n                }\n\n                // If target element should be empty, wipe it\n                if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n                    domNodes[index].innerHTML = ''\n                    return\n                }\n\n                // If element is empty and shouldn't be, build it up\n                // This uses a document fragment to minimize reflows\n                if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n                    const fragment = document.createDocumentFragment()\n                    _diff(node, fragment)\n                    domNodes[index].appendChild(fragment)\n                    return\n                }\n\n                // If there are existing child elements that need to be modified, diff them\n                if (node.childNodes.length > 0) {\n                    _diff(node, domNodes[index])\n                }\n            })\n        }\n\n        // todo - add support to reactivity\n        // this.template(this.state)\n        const templateHTML = _stringToHTML(this.template)\n        _diff(templateHTML, this)\n    }\n\n    /**\n     * Set the HTML to be used in the template\n     * @param {String} html The HTML to use\n     *\n     * This function is overwritten by the extended class to set the HTML\n     *\n     */\n    loadTemplate(template = '', force = false) {\n        this.template = template === '' ? this.template : `${template}`\n        this.render(force)\n    }\n\n    disconnectedCallback() {\n        this.onDestroy?.()\n    }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n    customElements.define('nb-nespresso-element', NespressoElement)\n","import { 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","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 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 viewportHelper from '@kissui/helpers/src/viewport.helpers'\nexport const renderHeadline = ({ headline = '', is_headline_hidden = false }) => {\n    if ((is_headline_hidden && viewportHelper.is.mobile) || !headline) {\n        return ''\n    }\n\n    return `<p class=\"cb-text t-sm-400-sl\">${headline}</p>`\n}\n","export const renderLabelTechnology = ({ label_technology }) => {\n    if (!label_technology) {\n        return ''\n    }\n\n    return `<p class=\"cb-technology t-xs-700-sl\">${label_technology}</p>`\n}\n","export const renderLabelRange = ({ label_range }) => {\n    if (!label_range) {\n        return ''\n    }\n\n    return `<p class=\"cb-range t-xs-500-sl\">${label_range}</p>`\n}\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n    return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n    return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n    if (!strikethrough_price) {\n        return ''\n    }\n\n    fetchStrikethroughPrice(strikethrough_price)\n        .then(payload => {\n            const element = getStrikethroughPriceElement(component)\n            if (!element) {\n                return\n            }\n\n            element.innerHTML = payload\n        })\n        .catch(e => {\n            console.error(`Error: Component SKU - Strike Through Price  - ${e}`)\n\n            const element = getStrikethroughPriceElement(component)\n            if (!element) {\n                return\n            }\n\n            element.style.display = 'none'\n        })\n\n    return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","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 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 { getTechnologyName } from '@kissui/helpers/src/catalog'\n\nexport const renderQuickView = ({\n    sku,\n    quick_view,\n    tracking_list,\n    tracking_position,\n    campaign_creative,\n    internationalId,\n    internationalName,\n    type,\n    technologies,\n    category,\n    rawPrice,\n    colors\n}) => {\n    if (!quick_view || !quick_view.label || !quick_view.popin_id) {\n        return ''\n    }\n\n    const skuData = JSON.stringify({\n        internationalId: internationalId,\n        internationalName: internationalName,\n        type: type,\n        technology: getTechnologyName({ technologies }),\n        category: category,\n        rawPrice: rawPrice\n    })\n    let colorsSkusList = []\n    if (typeof colors !== 'undefined') {\n        colors.map(color => {\n            colorsSkusList.push(color.sku)\n        })\n    }\n\n    return `<nb-link\n        color=\"gold\"\n        size=\"large\"\n        sku_colors=\"${colorsSkusList}\"\n        popin_id=\"${quick_view.popin_id}\"\n        sku='${sku}'\n        sku_data='${skuData}'\n        campaign_creative='${campaign_creative}'\n        tracking_list='${tracking_list}'\n        tracking_position='${tracking_position}'>${quick_view.label}</nb-link>`\n}\n","import { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\nexport const renderPrice = ({\n    price,\n    hidePrice,\n    giftcard_price,\n    price_per_capsule,\n    show_sleeve_price,\n    type\n}) => {\n    if ((!price && !giftcard_price) || hidePrice) {\n        return ''\n    }\n    let finalPrice = null\n    if (!show_sleeve_price && price_per_capsule) {\n        finalPrice = price_per_capsule\n    } else {\n        finalPrice = price\n    }\n    if (type !== ECAPI_TYPE_CAPSULE) {\n        finalPrice = price\n    }\n\n    return `<p class=\"cb-price-current\"><span>${finalPrice || giftcard_price}</span></p>`\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nconst DISPLAY_COLOR_MAX = 4\n\nexport const renderColors = props => {\n    if (!props) {\n        return ''\n    }\n\n    const {\n        colors,\n        sku,\n        max_colors = DISPLAY_COLOR_MAX,\n        a11y_extra_color = '',\n        url,\n        activeSku,\n        name\n    } = props\n\n    if (!colors) {\n        return ''\n    }\n\n    const colorData = stringifyForAttribute({\n        colors,\n        max_colors,\n        activeSku: activeSku || sku,\n        extra_url: url,\n        extra_title: name + ', ' + a11y_extra_color\n    })\n\n    const size = viewportHelper.is.mobile ? 'small' : 'large'\n\n    return `<nb-colors data=\"${colorData}\" size=\"${size}\"></nb-colors>`\n}\n","// Caching mechanism for ratings\nconst API_RATING_CACHE_TTL = 86400000 // 24 hrs\nconst API_RATING_CACHE_PREFIX = 'n-ratings-'\n\nconst setWithExpiry = (key, value) => {\n    const now = new Date()\n\n    // 'item' is an object which contains the original value\n    // as well as the time when it's supposed to expire\n    const item = {\n        value: value,\n        expiry: now.getTime() + API_RATING_CACHE_TTL\n    }\n    localStorage.setItem(key, JSON.stringify(item))\n}\n\nconst getWithExpiry = key => {\n    const itemStr = localStorage.getItem(key)\n    if (!itemStr) return undefined\n\n    const item = JSON.parse(itemStr)\n    const now = new Date()\n\n    // compare the expiry time of the item with the current time\n    if (now.getTime() > item.expiry) {\n        // If the item is expired, delete the item from storage and return null\n        localStorage.removeItem(key)\n        return undefined\n    }\n\n    return item.value\n}\n\nexport const getEncodedProductId = longSku => window.btoa(longSku)\n\nexport const getRatingDetails = async sku => {\n    const key = `${API_RATING_CACHE_PREFIX}${sku}`\n    let data = getWithExpiry(key)\n    if (data === undefined) {\n        // already expired or not cached\n        data = await window.napi.ratings().summary(sku)\n        setWithExpiry(key, data)\n    }\n    return data\n}\n\nexport const isRatingEnabled = product =>\n    product.productRatings && product.productRatings.ratingEnabled\n\nexport const isRated = (productRatings, minimum_rating) =>\n    productRatings.reviewCount > 0 &&\n    productRatings.ratingAverage > 0 &&\n    productRatings.ratingAverage >= minimum_rating\n\nexport const getRatingPercentage = ratingSpread => {\n    const ratingAverageSum = ratingSpread.reduce((partialSum, value) => partialSum + value, 0)\n\n    return ratingSpread.map(element => {\n        return (element / ratingAverageSum) * 100\n    })\n}\n\nexport const checkIfReviewsAvailable = ratingsResult => ratingsResult.reviewCount > 0\n\nexport const getProductReviews = async (\n    market,\n    language,\n    encodedProductId,\n    sort = 'highlightedFirst',\n    page = 0\n) => {\n    const url = `/ecapi/rating/v1/${market}/${language}/${encodedProductId}/read?platform=desktop&page=${page}&sort=${sort}`\n    const response = await fetch(url)\n\n    return response.json()\n}\n\nexport const postLike = async (market, language, encodedProductId, reviewId) => {\n    const url = `/ecapi/rating/v1/${market}/${language}/${encodedProductId}/${reviewId}/like`\n\n    const response = await fetch(url, {\n        method: 'POST'\n    })\n\n    return response.json()\n}\n\nexport const getNapiProductReviews = async (sku, sort = 'highlightedFirst', page = 0) => {\n    return window.napi.ratings().read(sku, sort, page)\n}\n\nexport const postNapiLike = async (sku, reviewId) => {\n    return window.napi.ratings().like(sku, reviewId)\n}\n","import { getRatingDetails, isRated } from '@kissui/helpers/src/rating.service'\n\nexport const renderRatings = ({ sku, minimum_rating = 0 }, component) => {\n    getRatingDetails(sku)\n        .then(ratings => {\n            const ratingElementBlock = component.querySelector('.cb-ratings-block')\n            if (!ratings || !isRated(ratings, minimum_rating)) {\n                if (ratingElementBlock) {\n                    ratingElementBlock.innerHTML = ''\n                }\n\n                return ''\n            }\n\n            if (ratingElementBlock) {\n                ratingElementBlock.innerHTML = `<nb-rating stars=\"${ratings.ratingAverage}\"></nb-rating>`\n            }\n        })\n        .catch(err => {\n            const ratingElementBlock = component.querySelector('.cb-ratings-block')\n            if (ratingElementBlock) {\n                ratingElementBlock.innerHTML = ''\n            }\n            console.error(err)\n        })\n\n    return ''\n}\n\nexport const renderRatingsWithData = props => {\n    const {\n        show_ratings,\n        minimum_rating = 0,\n        ratingAverage,\n        reviewCount,\n        review_cta,\n        reviews_cta\n    } = props\n\n    if (!show_ratings || !isRated(props, minimum_rating)) {\n        return ''\n    }\n\n    let link = ''\n    if (reviewCount && review_cta && reviews_cta) {\n        const ctaLabel = (reviewCount > 1 ? reviews_cta : review_cta).replace(\n            '{nb_review}',\n            reviewCount\n        )\n        if (ctaLabel) {\n            link = `<nb-link class=\"is-review\" icon_right=\"chevron-right\" size=\"small\" color=\"gold\">\n                        ${ctaLabel}\n                    </nb-link>`\n        }\n    }\n\n    const toInt = parseFloat(ratingAverage).toFixed(2)\n\n    return `<nb-rating stars=\"${toInt}\"></nb-rating>\n            ${link}`\n}\n","export default class Deferred {\n    constructor() {\n        this.promise = new Promise((resolve, reject) => {\n            this.reject = reject\n            this.resolve = resolve\n        })\n    }\n}\n","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n    if (typeof scrollTo === \"number\") {\n        return scrollTo\n    }\n\n    const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n    if (scrollToElement === null && typeof scrollTo === \"string\") {\n        throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n    }\n\n    return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n    const viewportHeight = window.innerHeight\n    const bodyHeight = document.body.clientHeight\n\n    if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n        return Math.abs(\n            scrollDuration +\n            scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n        )\n    }\n    return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n    const { scrollDuration: baseScrollDuration = 300 } = options\n    const deferred = new Deferred()\n\n    let scrollPosition: number = 0;\n\n    try {\n        scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n    }\n    catch (error) {\n        console.error(error)\n        return\n    }\n\n    let currentTime = 0\n    const initialTimestamp = window.performance.now()\n    const initialScroll = window.scrollY\n    const deltaScroll = initialScroll - scrollPosition\n\n    const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n    const finalTimestamp = initialTimestamp + scrollDuration\n\n    function step() {\n        const currentTimestamp = window.performance.now()\n        if (currentTimestamp < finalTimestamp) {\n            currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n            currentTime = --currentTime * currentTime * currentTime + 1\n            const moveStep = deltaScroll * currentTime\n            window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n            window.requestAnimationFrame(step)\n        } else {\n            window.scrollTo(0, scrollPosition)\n            setTimeout(() => deferred.resolve(undefined), 125)\n        }\n        return deferred.promise\n    }\n\n    window.requestAnimationFrame(step)\n    return deferred.promise\n}\n\nexport default scrollTo\n","import Sku from '@kissui/components/src/sku'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { renderLabelTechnology } from '@kissui/components/src/sku/fragments/labelTechnology'\nimport { renderLabelRange } from '@kissui/components/src/sku/fragments/labelRange'\nimport { renderHeadline } from '@kissui/components/src/sku/fragments/headline'\nimport { renderHeading } from '@kissui/components/src/sku/fragments/heading'\nimport { renderImage } from '@kissui/components/src/sku/fragments/image'\nimport { renderColors } from '@kissui/helpers/src/colors.helpers'\nimport { renderRatings, renderRatingsWithData } from './fragments/ratings'\nimport { renderEnergyLabel } from '@kissui/helpers/src/energy-label.helpers'\nimport { renderVoltage } from './fragments/voltage'\nimport { isRatingEnabled } from '@kissui/helpers/src/rating.service'\nimport { EVENT_COLOR_CLICKED } from '@kissui/components/src/colors/components/color/constants.mjs'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getProduct, getPriceFormatter, getCurrency } from '@kissui/helpers/src/catalog'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { apiOverride } from '@kissui/components/src/sku/services'\n\nclass SkuMachine extends Sku {\n    constructor() {\n        super()\n        this.type = 'machine'\n        this.reviewLink = null\n        this.boundOnColorClick = this.onColorClick.bind(this)\n        this.boundOnReviewLinkClick = this.onReviewLinkClick.bind(this)\n    }\n\n    renderHeader() {\n        return `${this.renderHeaderDefault()}\n                ${renderEnergyLabel(this.props)}`\n    }\n\n    renderInformation() {\n        const { variation } = this.props\n\n        if (variation === VARIATION_PDP) {\n            return this.renderInformationPDP()\n        }\n        if (variation === VARIATION_PLP) {\n            return this.renderInformationPLP()\n        }\n\n        return this.renderInformationDefault()\n    }\n\n    renderInformationDefault() {\n        return `${renderColors(this.props)}\n                ${renderLabelTechnology(this.props)}\n                ${renderLabelRange(this.props)}\n                ${renderHeading(this.props)}\n                ${\n                    this.props.show_ratings && isRatingEnabled(this.props)\n                        ? `<div class=\"cb-ratings-block\"><nb-loader></nb-loader></div> ${renderRatings(\n                              this.props,\n                              this\n                          )}`\n                        : ''\n                }\n                ${renderHeadline(this.props)}`\n    }\n\n    renderInformationPLP() {\n        return `${renderColors(this.props)}\n                ${renderLabelTechnology(this.props)}\n                ${renderLabelRange(this.props)}\n                ${renderHeading(this.props)}\n                ${\n                    this.props.show_ratings\n                        ? `<div class=\"cb-ratings-block\"><nb-loader></nb-loader></div> ${renderRatings(\n                              { ...this.props, sku: this.props.sku || this.props.legacyId },\n                              this\n                          )}`\n                        : ''\n                }\n                ${renderHeadline(this.props)}`\n    }\n\n    renderInformationPDP() {\n        const { showVoltage = {} } = this.props\n        return `${renderLabelTechnology(this.props)}\n                ${renderLabelRange(this.props)}\n                ${renderHeading(this.props)}\n                ${renderHeadline(this.props)}\n                ${renderRatingsWithData(this.props)}\n                ${renderVoltage(showVoltage)}\n                ${renderColors(this.props)}`\n    }\n\n    renderVisualDefault() {\n        const { variation } = this.props\n        if (variation === VARIATION_PDP) {\n            return ''\n        }\n\n        return renderImage(this.props)\n    }\n\n    onReviewLinkClick(e) {\n        e.preventDefault()\n        if (document.querySelector('nb-rating-reviews')) {\n            scrollTo(`nb-rating-reviews`)\n        }\n    }\n\n    onColorClick(e) {\n        const event = readEvent(e)\n        if (!event.sku) {\n            return\n        }\n\n        this.template = '<nb-loader></nb-loader>'\n        this.render()\n\n        return Promise.all([getPriceFormatter(), getProduct(event.sku)])\n            .then(([formatter, payload]) => {\n                if (!payload || !formatter) {\n                    return\n                }\n\n                const newLabels = this.props.colors?.find(c => c.sku === event.sku)?.labels\n\n                this.props = {\n                    ...this.props,\n                    ...payload,\n                    colors: this.props.colors,\n                    sku: payload.legacyId || '',\n                    longSku: payload.id || '',\n                    image: payload.responsiveImages?.standard || payload.images?.icon || '',\n                    image_alt_text: payload.name || '',\n                    price: formatter.short(getCurrency(), payload.price),\n                    activeSku: payload.legacyId || '',\n                    activeLongSku: payload.id || '',\n                    url: payload.pdpURLs?.desktop || '',\n                    labels: newLabels,\n                    ...apiOverride(payload, this.props)\n                }\n            })\n            .catch(() => {\n                console.error(`getProduct fail on sku ${event.sku}`)\n            })\n            .finally(() => {\n                this.loadTemplate()\n                this.onReady?.()\n            })\n    }\n\n    bindEvent() {\n        this.addEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n\n        this.reviewLink = this.querySelector('.is-review')\n        if (this.reviewLink) {\n            this.reviewLink.addEventListener('click', this.boundOnReviewLinkClick)\n        }\n    }\n\n    unbindEvent() {\n        this.removeEventListener(EVENT_COLOR_CLICKED, this.boundOnColorClick)\n\n        if (this.reviewLink) {\n            this.reviewLink.removeEventListener('click', this.boundOnReviewLinkClick)\n        }\n    }\n\n    disconnectedCallback() {\n        this.unbindEvent()\n    }\n}\n\ncustomElements.get('nb-sku-machine') || customElements.define('nb-sku-machine', SkuMachine)\n\nexport default SkuMachine\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderEnergyLabel = props => {\n    const { a11y_energy_label, energy_level } = props\n\n    if (!energy_level) {\n        return ''\n    }\n\n    const data = {\n        a11y_label: a11y_energy_label,\n        level: energy_level\n    }\n\n    return `<nb-energy-label data='${stringifyForAttribute(data)}'></nb-energy-label>`\n}\n","export const renderVoltage = props => {\n    if (!props) {\n        return ''\n    }\n\n    const { show_voltage, voltage_label, voltage_list, a11y_voltage_label } = props\n\n    if (!show_voltage || !voltage_label || !voltage_list || !voltage_list.length) {\n        return ''\n    }\n\n    const voltageItem = voltage_list\n        .map(({ label, url }) => {\n            if (url) {\n                return `<a href=\"${url}\" target=\"_self\"><span class=\"t-sm-400\">${label}</span></a>`\n            }\n\n            return `<div aria-current=\"page\"><span class=\"t-sm-700\">${label}</span></div>`\n        })\n        .join('')\n\n    return `<div class=\"cb-sku-tab\">\n        <span class=\"sr-only\">${a11y_voltage_label}</span>\n        <p class='t-sm-400' aria-hidden=\"true\">${voltage_label}</p>\n        ${voltageItem}\n    </div>`\n}\n","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 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 MachineCategory 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 MachineProduct extends Product {\n    colorFilter = []\n    energy_level = ''\n    a11y_energy_label = ''\n    show_ratings = false\n    minimum_rating = 3\n    show_view_details = false\n    slides = []\n    show_slider = false\n    display_machine_range_name = false\n\n    constructor(product) {\n        super(product)\n\n        this.colorFilter = []\n        if (product.colors) {\n            this.activeSku = product.legacyId\n            this.activeLongSku = product.id || ''\n            this.colors = product.colors\n            this.colorFilter = product.colors.map(color => color.colorCategoryId)\n        }\n\n        this.energy_level = product.energy_level\n        this.a11y_energy_label = product.a11y_energy_label\n        this.display_machine_range_name = !!product.display_machine_range_name\n        if (product.show_ratings !== undefined) {\n            this.show_ratings = product.show_ratings\n        }\n        if (product.minimum_rating !== undefined) {\n            this.minimum_rating = product.minimum_rating\n        }\n        if (product.a11y_extra_color !== undefined) {\n            this.a11y_extra_color = product.a11y_extra_color\n        }\n        if (product.show_view_details !== undefined) {\n            this.show_view_details = product.show_view_details\n        }\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 MachineCategory from '../models/machine.category'\nimport MachineProduct from '../models/machine.product'\nimport MainDTO from '../../plp-core/models/MainDTO'\n\nconst getPageBuilderData = (PageBuilderData, field) =>\n    PageBuilderData.options ? PageBuilderData.options[field] : PageBuilderData[field]\n\nexport default (plpData, PageBuilderData) => {\n    const { colorFilters, products, categories } = plpData.data.configuration.eCommerceData\n\n    // Make the CSS filter color from HMC available inside the category for use later to display the filter\n    if (colorFilters.length) {\n        colorFilters.forEach(color => {\n            const category = categories.find(categoryHmc => categoryHmc.id === color.id)\n            category.cssColorCode = color.cssColorCode\n        })\n    }\n\n    products.forEach(product => {\n        const pbProduct =\n            PageBuilderData.products &&\n            PageBuilderData.products.find(\n                pbProductData => pbProductData.sku && pbProductData.sku === product.legacyId\n            )\n\n        product.show_ratings = getPageBuilderData(PageBuilderData, 'show_ratings')\n        product.minimum_rating = getPageBuilderData(PageBuilderData, 'minimum_rating')\n        product.show_view_details = getPageBuilderData(PageBuilderData, 'show_view_details')\n        product.display_machine_range_name = getPageBuilderData(\n            PageBuilderData,\n            'display_machine_range_name'\n        )\n        product.name_custom = product.display_machine_range_name ? product.category?.name ?? '' : ''\n        product.view_details_label = PageBuilderData.copywriting?.view_details_label\n\n        if (pbProduct) {\n            product.energy_level = pbProduct.energy_level\n            product.a11y_energy_label = PageBuilderData.options.a11y_energy_label\n        }\n\n        const productsOtherColors = products.filter(productSameRanges => {\n            return productSameRanges.ranges.some(productSameRange =>\n                product.ranges.includes(productSameRange)\n            )\n        })\n        if (productsOtherColors && productsOtherColors.length) {\n            product.colors = productsOtherColors.map(otherProductColor => {\n                return {\n                    colorCategoryId: otherProductColor.colorCategories\n                        ? otherProductColor.colorCategories[0]\n                        : '',\n                    sku: otherProductColor.legacyId,\n                    name: otherProductColor.colorShade?.name,\n                    code: otherProductColor.colorShade?.cssColorCode\n                }\n            })\n        }\n    })\n\n    const colorFilterFunction = products => {\n        // Product is for each color\n        // need to display one card for all colors\n        const displayedRanges = []\n        let productRange = null\n        const filteredProduct = products.filter(product => {\n            productRange = product?.ranges[0]\n            const isDisplayed = !displayedRanges.includes(productRange)\n            displayedRanges.push(productRange)\n            return isDisplayed\n        })\n        const productBySku = sku => products.find(product => product.legacyId === sku)\n        filteredProduct.map(product => {\n            product.colors.map(color => {\n                color.labels = productBySku(color.sku).labels\n            })\n        })\n        return filteredProduct\n    }\n\n    return MainDTO(plpData, PageBuilderData, MachineCategory, MachineProduct, colorFilterFunction)\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","/**\n * Price filter\n * We want to get 3 chips, low-price range, mid-price range, high-price range.\n * For this, take the list of unique prices, sort, and divide into thirds.\n * This ensures that all products will fall within one of the three price ranges.\n * Using unique prices ensures that there are not overlaps between ranges (will\n * also work even if prices have decimal values).\n */\nimport Filter from '../../plp-core/filter/filter'\nimport DefaultFilterChipType from '../../plp-core/filter/types/DefaultFilterChipType'\n\nconst MIDDLE_THIRD_MIN_RATIO = 0.33\nconst MIDDLE_THIRD_MAX_RATIO = 0.66\n\nexport const getPriceFilter = (categories, PBprops, translations, priceHelper) => {\n    if (!categories) {\n        console.error('plp-machine.filterPrice.dto.js categories is not defined')\n        return []\n    }\n\n    const uniquePrices = categories\n        .map(category => category.products.map(product => product.price))\n        .flat()\n        .sort((a, b) => parseFloat(a) - parseFloat(b))\n        .filter((price, index, arr) => arr.indexOf(price) === index)\n\n    if (uniquePrices.length < 3) {\n        console.error('plp-machine.filterPrice.dto.js not enough unique prices for filter')\n        return []\n    }\n\n    const min = 0\n    const max = -1\n    const middleBottom = Math.round(uniquePrices.length * MIDDLE_THIRD_MIN_RATIO) - 1\n    const middleTop = Math.round(uniquePrices.length * MIDDLE_THIRD_MAX_RATIO) - 1\n\n    /**\n     * @description\n     * define the filter object data\n     */\n    const priceFilter = new Filter({\n        type: 'default',\n        key: 'priceFilter',\n        title: translations['productlistrespblock.filterlabels.price']\n    })\n\n    const PRICE_RANGES = [\n        {\n            min: uniquePrices.at(min),\n            max: uniquePrices.at(middleBottom),\n            label: PBprops.copywriting.filter_group_price_low || 'Low {range}',\n            value: 'low-price'\n        },\n        {\n            min: uniquePrices.at(middleBottom + 1),\n            max: uniquePrices.at(middleTop),\n            label: PBprops.copywriting.filter_group_price_medium || 'Mid {range}',\n            value: 'mid-price'\n        },\n        {\n            min: uniquePrices.at(middleTop + 1),\n            max: uniquePrices.at(max),\n            label: PBprops.copywriting.filter_group_price_high || 'High {range}',\n            value: 'high-price'\n        }\n    ]\n\n    PRICE_RANGES.forEach(price => {\n        priceFilter.pushValues(\n            new DefaultFilterChipType({\n                value: [price.value],\n                label: price.label.replace(\n                    '{range}',\n                    ` ${priceHelper.priceFormatter.short(\n                        priceHelper.currency,\n                        price.min\n                    )} - ${priceHelper.priceFormatter.short(priceHelper.currency, price.max)}`\n                ),\n                filterType: priceFilter.type,\n                filterKey: priceFilter.key\n            })\n        )\n    })\n\n    // Add the priceFilter array to each product\n    // Todo: confirm if unique prices will be used then this can be added as a string with just\n    //       one value, if overlaps will be allowed then an array of ranges will be needed.\n    categories.forEach(category => {\n        category.products.forEach(product => {\n            product.priceFilter = PRICE_RANGES.reduce((acc, range) => {\n                if (product.price >= range.min && product.price <= range.max) {\n                    acc.push(range.value)\n                }\n                return acc\n            }, [])\n        })\n    })\n\n    return [priceFilter]\n}\n","import createFilter from '../../plp-core/filter/createFilter'\nimport { getPriceFilter } from './plp-machine.filterPrice.dto'\n\nexport const getMergedFilterData = (\n    categories,\n    PBprops,\n    categoriesExtraData,\n    translations,\n    priceHelper\n) => {\n    const colorFilter = categoriesExtraData.some(ele => ele.cssColorCode)\n    if (!colorFilter) {\n        return [...getPriceFilter(categories, PBprops, translations, priceHelper)]\n    }\n    return [\n        ...createFilter(\n            [\n                {\n                    type: 'default',\n                    key: 'colorFilter',\n                    title: translations['productlistrespblock.filterlabels.color'] || 'Color'\n                }\n            ],\n            categories,\n            categoriesExtraData,\n            PBprops\n        ),\n        ...getPriceFilter(categories, PBprops, translations, priceHelper)\n    ]\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.copywriting.dropdown_recommended_option_label,\n        key: 'recommended',\n        order: 'asc',\n        checked: true\n    },\n    {\n        id: 'sortPriceAscending',\n        label: PBprops.copywriting.dropdown_price_ascending_option_label,\n        key: 'price',\n        order: 'asc',\n        checked: false\n    },\n    {\n        id: 'sortPriceDescending',\n        label: PBprops.copywriting.dropdown_price_descending_option_label,\n        key: 'price',\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'\nclass PLPMachine extends PLPApp {\n    constructor() {\n        super()\n        this.plpType = 'machine'\n        this.dataTransformService = getMergedPLPData\n        this.dataFiltersService = getMergedFilterData\n        this.dataSortService = getMergedSortData\n        this.appStates = appStates\n    }\n}\n\ncustomElements.get('nb-plp-machine') || customElements.define('nb-plp-machine', PLPMachine)\n\nexport default PLPMachine\n"],"names":["EVENT_COLOR_CLICKED","createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","dispatchEvent","eventName","args","element","window","Error","event","CustomEvent","detail","bubbles","Event","document","createEvent","initEvent","readEvent","e","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","getCurrency","config","padl","namespace","dataLayer","app","currency","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getPriceFormatter","async","napi","priceFormat","getProduct","sku","catalog","replace","trimSku","getTechnologyName","productData","techno","technologies","substring","indexOf","isBundled","sales_multiple","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","unitQuantity","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","fetcherService","fetcher","apiRatings","ratings","apiPriceFormat","priceFormatter","getApiProduct","getOne","product","withRating","fetchOne","api_override","name","headline","description","apiProduct","productCategories","productDetails","supercategories","Promise","map","categoryEncoded","getCategory","getProductCategories","overrides","longSku","id","price","pdp_urls","getValueObject","images","slides","type","productRatings","ratingEnabled","rating","getRating","bundled","intensity","capsuleProperties","unit_quantity","getValueNumber","variant","giftcard_price","icon","default_image","merge","force","mergedProduct","key","Object","keys","empty","defaultValue","parseInt","length","toFloat","ratingAverage","summary","value","decimal","parseFloat","toFixed","loadPriceFormat","getAll","productList","fetchedProduct","splice","formatPrice","short","_getCurrency","color","HTMLElement","connectedCallback","this","render","createEventListeners","addEventListener","handleClick","link","label","code","a11y_label","selected","size","createElement","setAttribute","classList","add","innerHTML","outerHTML","customElements","get","define","Colors","constructor","_apiProducts","_colors","_maxColors","updateMaxColors","fetchColors","hasColorData","colors","every","hasAllProps","onColorChange","heading","renderColors","renderExtraColors","renderColor","bind","join","activeSku","extra_url","extra_title","extraColorsLength","Math","max","clampColor","preparedColors","prepareColors","fetchColor","prevent","apiColor","colorShade","cssCode","undefined","pdpURLs","desktop","push","hasSKU","slice","colorItem","max_colors","$event","CardLabels","super","labels","direction","renderLabels","bgColor","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","_diff","elem","_getNodeType","node","nodeType","tagName","toLowerCase","_getNodeContent","childNodes","textContent","domNodes","Array","prototype","call","templateNodes","count","parentNode","removeChild","forEach","index","appendChild","cloneNode","replaceChild","templateContent","fragment","createDocumentFragment","templateHTML","str","DOMParser","parseFromString","body","disconnectedCallback","onDestroy","helper","is","innerWidth","vw","devicePixelRatio","mobile","mobile_tablet","tablet","retina","lt","ref","parseHTML","tmp","implementation","createHTMLDocument","makeId","result","characters","i","charAt","floor","random","removeEmptyValues","findText","text","includes","getHashLink","linkHash","linkNoHash","lazyLoad","url","inViewPort","cb","img","Image","src","onload","onerror","test","navigator","userAgent","agent","start","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","stringifyForAttribute","escapeHtml","stringify","m","sanitizeString","toString","setAttributes","attrs","renderImage","image_alt_text","image","quick_view_plp","theme","renderClass","show_view","linkHref","trim","VARIATION_PLP","VARIATION_PDP","isPdp","variation","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","viewportHelper","renderLink","a11y_product_card","a11yProductName","renderHeadline","is_headline_hidden","renderLabelTechnology","label_technology","renderLabelRange","label_range","getStrikethroughPriceElement","component","querySelector","fetchStrikethroughPrice","strikethroughPrice","html","getFormattedPrice","getDataLayer","padlNamespace","getMarketCode","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","isLoggedIn","user","renderAddToCart","activeLongSku","category_name","contact_cta","hidePrice","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","isLabel","categoryIdTail","RegExp","isCategoryHidden","categoryId","hideCategory","PLP_HIDE_CATEGORIES","findIndex","c","PLP_ONLY_SHOW_CATEGORIES","getMaxIntensity","INTENSITY_MAX_OL","getMergedProductCoffeeData","pageBuilderProductProps","pageBuilderProps","bundle_details","options","show_sleeve_price","isBundledResult","showCapsulePrice","price_per_capsule","final_price","round","getFinalPrice","option","max_intensity","show_capsule_price","apiOverride","pageBuilderData","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","strikethrough_price","additional_message","additional_message_icon","additional_message_link","internationalId","rangeData","rawPrice","highlighted","dataTransformObjectProductType","getMergedProductMachineData","ratingsAndReviews","show_ratings","minimum_rating","getMergedProductAccessoryData","getMergedProductGiftCardData","_","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","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","campaign","copywriting","sku_quick_view","emitCustomEvent","customEvent","cancelable","composed","eventsHelper","eventListeners","eventListener","listener","remove","removeEventListener","raisedByPB","raisedByWC","eventData","gtmDataObject","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","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","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","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","hasAttribute","sleevePrice","hasPricePerSleeve","renderInformationDefault","quick_view","tracking_list","tracking_position","campaign_creative","colorsSkusList","renderPricingDefault","isPortrait","renderStrikethroughPrice","then","payload","catch","style","display","renderPrice","finalPrice","renderActionDefault","actionSlot","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","Ai","handlePLPVariation","_s","handleCrossSellVariation","more_info","parentElement","newQuickViewElement","getSkuQuickViewData","preventDefault","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","querySelectorAll","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","DISPLAY_COLOR_MAX","a11y_extra_color","getRatingDetails","itemStr","localStorage","getItem","Date","getTime","expiry","removeItem","getWithExpiry","setWithExpiry","setItem","isRated","reviewCount","renderRatings","ratingElementBlock","err","Deferred","promise","resolve","reject","scrollTo","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","getBoundingClientRect","top","currentTime","initialTimestamp","performance","now","deltaScroll","resolveScrollDuration","viewportHeight","innerHeight","bodyHeight","clientHeight","abs","finalTimestamp","requestAnimationFrame","step","currentTimestamp","moveStep","setTimeout","reviewLink","boundOnColorClick","onColorClick","boundOnReviewLinkClick","onReviewLinkClick","a11y_energy_label","energy_level","level","renderEnergyLabel","renderInformationPDP","renderInformationPLP","showVoltage","review_cta","reviews_cta","ctaLabel","renderRatingsWithData","show_voltage","voltage_label","voltage_list","a11y_voltage_label","renderVoltage","formatter","newLabels","responsiveImages","standard","finally","bus","_bus","register","callback","fire","EventBus$1","Cta","observedAttributes","boundHandleClick","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","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","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","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","categoryData","isTechnologyCategory","getCategories","superCategory","buildGTMProductObject","capitalize","s","toUpperCase","dimension130","productSelections","impressionsOnScrollData","dimension43","AddToCart","elementID","addToCartCounter","isWindowNapiActive","getConfig","pushButton","getElementById","ui","module","productId","activated","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","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","defaultHorizontal","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","checkScrollCondition","dir","touchType","xStart","xEnd","yStart","yEnd","isScrollable","scrollHeight","scrollWidth","clientWidth","attributeName","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","slideTimer","setInterval","clearInterval","moveIndicator","determineOverflow","container","containerMetrics","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","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","sliderPositions","unbindEvent_fn","#waitForSliderToBeSized","#set","normalisedValue","getOption_fn","convertToCamelCase","arr","match","low","k","#getOption","isNaN","#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","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","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","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","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","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","MachineCategory","Product","available","maxOrderQuantity","packagingType","pushRatingEnabled","altText","MachineProduct","colorFilter","show_slider","display_machine_range_name","colorCategoryId","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","applyProductsOverrides","overriddenCategories","extraData","catData","category_id","categoryObj","productID","productObj","Boolean","applyCategoryOverrides","original","vertuo","getPageBuilderData","field","getMergedPLPData","colorFilters","categoryHmc","cssColorCode","productsOtherColors","productSameRanges","productSameRange","otherProductColor","colorCategories","displayedRanges","productRange","filteredProduct","isDisplayed","productBySku","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","createFilter","filterDefinition","categoriesData","fieldValue","getCategoryData","findCategory","getPriceFilter","PBprops","priceHelper","uniquePrices","flat","min","middleBottom","middleTop","priceFilter","PRICE_RANGES","filter_group_price_low","filter_group_price_medium","filter_group_price_high","getMergedFilterData","getMergedSortData","dropdown_recommended_option_label","dropdown_price_ascending_option_label","dropdown_price_descending_option_label","productsResults","cbResultsTotalText","plpFilterPopin","errorMessage","PLPMachine"],"mappings":"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"}